]> git.tdb.fi Git - model-railway-devices.git/blobdiff - firmware/s88w-r.c
Change the input filtering for better suitability for unreliable track circuits
[model-railway-devices.git] / firmware / s88w-r.c
index f64445d81c5a33f12b8f82ef1cae2ea21c7fba5d..730ac10f3a5337ba2ec31e51ef79a3e8fbac27b6 100644 (file)
@@ -27,6 +27,7 @@ D5 - S88 RESET
 #include <avr/interrupt.h>
 #include "lcd.h"
 #include "serial.h"
+#include "delay.h"
 
 #define DATA_OUT PORTD2
 #define CLOCK    PIND3
@@ -43,7 +44,8 @@ volatile uint8_t rx_buf[7];
 volatile uint8_t rx_fill = 0xFF;
 volatile uint8_t input[128] = { 0 };
 volatile uint8_t latch[128] = { 0 };
-uint8_t log_pos = 0;
+uint8_t log_row = 0;
+uint8_t log_col = 0;
 
 int main()
 {
@@ -51,20 +53,22 @@ int main()
        uint8_t bits = 0;
        uint8_t n_bits = 8;
        uint8_t offset = 0;
+       uint8_t i;
 
-       DDRD = 0x06;  // 00000110
-       PIND = 0xC0;  // 11000000
-       DDRB = 0x20;  // 00100000
-       PINB = 0x1F;  // 00011111
+       DDRD = 0x06;   // 00000110
+       PORTD = 0xC0;  // 11000000
+       DDRB = 0x20;   // 00100000
+       PORTB = 0x1F;  // 00011111
 
        serial_init(9600);
-       serial_set_callback(receive);
        lcd_init();
-       lcd_on();
-       lcd_clear();
 
        sei();
 
+       lcd_clear();
+       for(i=0; i<20; ++i)
+               lcd_write('0');
+
        while(1)
        {
                uint8_t d_pins;
@@ -140,13 +144,10 @@ void receive(uint8_t c)
                                        input[j/2] = (input[j/2]&~(0xF<<shift)) | (bits<<shift);
                                        latch[j/2] = input[j/2];
                                }
-                       }
 
-                       lcd_gotoxy(0, 0);
-                       for(i=10; i--;)
-                       {
-                               lcd_write(hexdigit(input[i]>>4));
-                               lcd_write(hexdigit(input[i]));
+                               lcd_gotoxy(19-offset-nibbles, 0);
+                               for(i=0; i<=nibbles; ++i)
+                                       lcd_write(rx_buf[3+i]);
                        }
                }
                rx_fill = 0xFF;
@@ -159,15 +160,22 @@ void receive(uint8_t c)
                        rx_fill = 0xFF;
        }
 
-       lcd_gotoxy(log_pos%20, 1+log_pos/20);
+       lcd_gotoxy(log_col, 1+log_row);
        lcd_write(c);
-       ++log_pos;
-       if(log_pos>=60)
-               log_pos = 0;
-       lcd_gotoxy(log_pos%20, 1+log_pos/20);
+       ++log_col;
+       if(log_col>=20)
+       {
+               log_col = 0;
+               ++log_row;
+               if(log_row>=3)
+                       log_row = 0;
+               lcd_gotoxy(log_col, 1+log_row);
+       }
        lcd_write(255);
 }
 
+SERIAL_SET_CALLBACK(receive)
+
 uint8_t hexdigit(uint8_t n)
 {
        n &= 0xF;