Sat, 03 Dec 2011 11:11:06 +0100
merge
--- a/carrerashark/Makefile Sat Dec 03 09:26:20 2011 +0100 +++ b/carrerashark/Makefile Sat Dec 03 11:11:06 2011 +0100 @@ -9,7 +9,7 @@ F_CPU = 8000000 -BAUD=38400 +BAUD=115200 ISP_BAUD = 115200 #SRC = main.c seriald.c driver/ADC.c driver/clock.c driver/timer.c
--- a/carrerashark/README Sat Dec 03 09:26:20 2011 +0100 +++ b/carrerashark/README Sat Dec 03 11:11:06 2011 +0100 @@ -5,7 +5,7 @@ PD2 = Controller Input |>o = Inv Schmitt Trigger for signal buffering (74hc14) - [RAIL+] ------[33kohm]------+-----|>o--|>0----[PD2] + [RAIL+] ------[33kohm]------+-----|>o--|>o----[PD2] | --[10kohm]--- |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/carrerashark/TRACE Sat Dec 03 11:11:06 2011 +0100 @@ -0,0 +1,48 @@ +Normal CU output idle: (LED3 an) +-------------------------------- +0x1821 0x3c8 0x80 0x220 0x320 0x260 0x360 0x2a0 0x80 0x2e0 * +0x1825 0x3d8 0x80 0x220 0x320 0x260 0x360 0x2a0 0x80 0x2e0 * +0x1820 0x3c8 0x80 0x220 0x320 0x260 0x360 0x2a0 0x80 0x2e0 * +0x1824 0x3d8 0x80 0x220 0x320 0x260 0x360 0x2a0 0x80 0x2e0 * +0x1822 0x3c8 0x80 0x220 0x320 0x260 0x360 0x2a0 0x80 0x2e0 * +0x1826 0x3d8 0x80 0x220 0x320 0x260 0x360 0x2a0 0x80 0x2e0 * + + +Pacecar Taste gedrückt (pacecar packet ändert sich): + LED2 an: 0x3ce fuer 10 sec + LED4 an: 0x3ca fuer 5 sec + +Start Taste gedrückt: + 1x Prog: 0x1a03, danach wieder der normale "idle progwortbetrieb" + -> ab jetzt wird auf allen autos geschwindigkeit = 0 übertragen + -> Spurwechseltasten werden auch ignoriert + -> pacecar packet = permanent 0x3e0 + Alle 5 LEDs leuchten + Tanken + Pacecartaste wird in dem Status ignoriert + +Start Taste zweites mal gedrückt: + LEDs zählen im Sekundentakt hoch (1-5) bis alle leuchten + Dann alle LEDS aus bis auf mittlere und rennstart: + dann folgende Progsequenz: + 0x1403 + <2 zyklen wait> + 0x1c03 + <2 wait> + 0x1203 + <2 wait> + 0x1a03 + <2 zyklen wait> --> RENNSTART HIER: + 0x1023 + 0x1003 + <idle zyklen starten hier> + + +FEHLSTARTVERHALTEN: + LED des controllers blinkt schnell welcher den Fehlstart verursacht hat + Geschwindigkeitswerte werden nicht an die Autos verschickt + Das Auto mit dem fehlstart wird markiert per programmwort: + zb 0x1926 anstatt 0x1826 + + +TANKSTAND: + Die alte CU gibt den Komponenten keinerlei Möglichkeit einer Antwort (die antwort-Peaks fehlen!!!)
--- a/carrerashark/main.c Sat Dec 03 09:26:20 2011 +0100 +++ b/carrerashark/main.c Sat Dec 03 11:11:06 2011 +0100 @@ -57,23 +57,32 @@ volatile uint8_t bitbuf_len = 0; volatile uint16_t bitbuf = 0; +volatile uint16_t sysclock = 0; +ISR ( TIMER0_OVF_vect ) { + PORTD ^= _BV(PD6); + if (sysclock != 0xffff) sysclock++; +} + ISR ( INT0_vect ) { - writeBit(PORTD, 5, 1); + PORTD ^= _BV(PD3); + if (sysclock<10) { + // this is the answer slot start bit?? + PORTD ^= _BV(PD7); + } else { GICR &= ~_BV(INT0) ; // Disable INT0 - // Startsignal erkannt, ab hier den Timer2 starten, - // der liest dann alle 50µs den Zustand ein und schreibt das - // empfangene Bit in den Puffer - bitbuf = 0; // init - bitbuf_len = 0b10000000; // init 1 pulse received - TCNT2 = 0; - TIMSK |= _BV(OCIE2); //enable timer2 interrupt - writeBit(PORTD, 5, 0); + // Startsignal erkannt, ab hier den Timer2 starten, + // der liest dann alle 50µs den Zustand ein und schreibt das + // empfangene Bit in den Puffer + bitbuf = 0; // init + bitbuf_len = 0b10000000; // init 1 pulse received + TCNT2 = 0; + TIMSK |= _BV(OCIE2); //enable timer2 interrupt + } } ISR ( TIMER2_COMP_vect ) { - writeBit(PORTD, 4, 0); - + PORTD ^= _BV(PD4); uint8_t clock; uint8_t state; uint8_t state2; @@ -89,8 +98,10 @@ data_len = (bitbuf_len & 0b00111111); if (data_len == 13) PORTD ^= _BV(6); // debug sync output on program packets TIMSK &= ~_BV(OCIE2); //disable timer2 interrupt - GICR |= _BV(INT0) ; // Enable INT0 + GICR |= _BV(INT0); // Enable INT0 + GIFR &= ~_BV(INTF0); // clear int0 irq flag data = bitbuf; // output data + sysclock = 0; // reset system clock counter } else { bitbuf_len++; // increment bit counter bitbuf = bitbuf << 1; // shift bits @@ -105,9 +116,6 @@ bitbuf_len &= ~_BV(6); // store new state } } - - - writeBit(PORTD, 4, 1); } @@ -115,24 +123,29 @@ int main(void) { uint8_t i; - unsigned char s[30]; + unsigned char s[10]; + uint16_t tmp; + uint16_t cycle[11]; // setup data bit timer TCCR2 = (1<<CS21) | (1<<WGM21); //divide by 8, set compare match OCR2 = TIMER2_50US; TIMSK |= 1<<OCIE2; //enable timer2 interrupt + // setup system timer + TCCR0 = (1<<CS21); //divide by 8 + TIMSK |= 1<<TOIE0; //enable timer0 interrupt + + MCUCR = _BV(ISC00); // falling edge +// MCUCR = _BV(ISC00) | _BV(ISC01); // rising edge GICR = _BV(INT0) ; // Enable INT0 - writeBit(DDRD, 4, 1); - writeBit(DDRD, 5, 1); - writeBit(DDRD, 6, 1); - + DDRD |= _BV(PD3) | _BV(PD4) | _BV(PD5) | _BV(PD6) | _BV(PD7); + PORTD |= _BV(PD7); RS232_init(); // initialize RS232 interface - RS232_puts_p(PSTR("CarreraShark 1.0 - INIT OK\n")); - //RS232_puts_p(PSTR("Receiving one complete cycle:\n")); + RS232_puts_p(PSTR("CarreraShark 1.2\n")); sei(); i = 0; @@ -141,17 +154,24 @@ if (data != 0) { if (data_len > 5) { + tmp = data; + data = 0; if (data_len == 13) { // sync to first packet - i = 1; - RS232_puts("\n"); - } else if (i!=0) i++; - if (i>0) { - itoa( data, s, 16); - data = 0; - RS232_puts("0x"); - RS232_puts( s ); - RS232_putc(' '); + PORTD ^= _BV(PD5); + for (i=0; i<10;i++ ) { + // output previous cycle data + itoa( cycle[i], s, 16); + RS232_putc('0'); + RS232_putc('x'); + RS232_puts( s ); + RS232_putc(' '); + } + RS232_putc('*'); + i = 0; + PORTD ^= _BV(PD5); } + cycle[i] = tmp; + i++; } //if (i==10) for (;;); }