]> git.tdb.fi Git - model-railway-devices.git/blobdiff - firmware/s88w-t.c
Change the input filtering for better suitability for unreliable track circuits
[model-railway-devices.git] / firmware / s88w-t.c
index 70c646c19984fb5583899d6a2b1a45c6ecab83b7..b39fd796fb762199ef311cbada24b5016689a481 100644 (file)
@@ -52,6 +52,7 @@ uint8_t rx_fill = 0xFF;
 volatile uint8_t nibbles = 2;
 volatile uint8_t offset = 0;
 volatile uint16_t state = 0;
+volatile uint8_t time_since_send = 0;
 
 int main()
 {
@@ -68,23 +69,25 @@ int main()
        PORTB = 0x3F;  // 00111111
 
        serial_init(9600);
-       timer_start_hz(1, 1, 2);
+       timer_start_hz(1, 100, 1);
 
        sei();
 
        while(1)
        {
-               uint8_t i;
+               uint8_t i, j;
                uint16_t input = 0;
                uint16_t valid = 0xFFF;
 
                for(i=0; i<100; ++i)
                {
-                       uint16_t pins;
+                       uint16_t pins = 0;
+                       for(j=0; j<100; ++j)
+                               pins |= ~((PIND>>2) | ((PINB&0x3F)<<6));
 
-                       pins = ~((PIND>>2) | ((PINB&0x3F)<<6));
                        if(i==0)
                                input = pins;
+
                        valid &= ~(pins^input);
                }
 
@@ -92,7 +95,7 @@ int main()
                input |= state&~valid;
                input &= (1<<(nibbles*4))-1;
 
-               if(input!=state)
+               if(input!=state && time_since_send>5)
                {
                        state = input;
                        send_state();
@@ -138,6 +141,7 @@ SERIAL_SET_CALLBACK(receive)
 void send_state(void)
 {
        uint8_t i;
+
        serial_write(':');
        serial_write(hexdigit(offset>>8));
        serial_write(hexdigit(offset>>4));
@@ -145,9 +149,18 @@ void send_state(void)
        for(i=nibbles; i--;)
                serial_write(hexdigit(state>>(i*4)));
        serial_write('.');
+
+       time_since_send = 0;
+}
+
+void timer(void)
+{
+       ++time_since_send;
+       if(time_since_send>200)
+               send_state();
 }
 
-TIMER_SET_CALLBACK(1, send_state)
+TIMER_SET_CALLBACK(1, timer)
 
 uint8_t hexdigit(uint8_t n)
 {