merge

Sat, 03 Dec 2011 11:11:06 +0100

author
Malte Bayer <mbayer@neo-soft.org>
date
Sat, 03 Dec 2011 11:11:06 +0100
changeset 32
b83d239fe719
parent 31
a8f082503782 (diff)
parent 27
3e617fcf999a (current diff)
child 33
c261350bb394

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 (;;);
         }

mercurial