X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=firmware%2Fs88w-t.c;h=b7d0a94f74a7ce89b8152aaf4a5bc5cd53f30c06;hb=a99e18c8e7ec3276ba6a881d1eaccf2d7fc26ea6;hp=e394d603032fe07b14047f554abc633afb451c7a;hpb=d8a31ed675778c08ca781beb62863c62d6f0bd94;p=model-railway-devices.git diff --git a/firmware/s88w-t.c b/firmware/s88w-t.c index e394d60..b7d0a94 100644 --- a/firmware/s88w-t.c +++ b/firmware/s88w-t.c @@ -1,6 +1,6 @@ /* $Id$ -This file is part of the MSP Märklin suite +This file is part of R²C² Copyright © 2010 Mikkosoft Productions, Mikko Rasa Distributed under the GPL @@ -17,9 +17,21 @@ D6 - input 5 D7 - input 6 B0 - input 7 B1 - input 8 +B2 - input 9 +B3 - input 10 +B4 - input 11 +B5 - input 12 Inputs are pulled high by internal pull-up resistors. Connect to GND to activate. + +The module can be configured by sending a string of form ":Shhh." over the +serial port, where hhh is a hex number. Lower two bits indicate the number of +inputs (00=4, 01=8, 10=12, 11=16) and upper ten bits indicate offset of lowest +input in multiples of 4 bits. At the moment there are no provisions for +having 16 physical inputs. + +Example: ":S016." would configure the module to have 12 inputs at offset 20. */ #include @@ -40,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() { @@ -52,29 +65,29 @@ int main() DDRD = 0x02; // 00000010 PORTD = 0xFC; // 11111100 - DDRB = 0x20; // 00000000 + DDRB = 0x00; // 00000000 PORTB = 0x3F; // 00111111 serial_init(9600); - serial_set_callback(receive); - timer_init(1, 2); - timer_set_callback(send_state); + 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); } @@ -82,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(); @@ -123,9 +136,12 @@ void receive(uint8_t c) } } +SERIAL_SET_CALLBACK(receive) + void send_state(void) { uint8_t i; + serial_write(':'); serial_write(hexdigit(offset>>8)); serial_write(hexdigit(offset>>4)); @@ -133,8 +149,19 @@ 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, timer) + uint8_t hexdigit(uint8_t n) { n &= 0xF;