car004f/main.c

Fri, 27 Dec 2013 11:43:40 +0100

author
mbayer
date
Fri, 27 Dec 2013 11:43:40 +0100
changeset 153
80d869ac365b
parent 152
e787f47c084b
child 154
46822de910ff
permissions
-rw-r--r--

added accel and brake parameters to car firmware

147
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
1 #include <avr/interrupt.h>
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
2 #include <avr/io.h>
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
3 #include <avr/wdt.h>
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
4 #include <avr/eeprom.h>
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
5 #include <stdlib.h>
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
6 #include <stdint.h>
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
7 #include <avr/pgmspace.h>
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
8
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
9 #include "main.h"
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
10 #include "util/delay.h"
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
11
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
12
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
13 ISR ( USART_RXC_vect ) {
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
14 }
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
15
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
16 #define PULSE_PORT PORTD
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
17 #define PULSE_BIT PD2
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
18
148
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
19 typedef struct {
152
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
20 uint8_t calibration; // AVR Chip calibration byte written by avrdude
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
21 uint8_t initialized; // if 0xff, reset config to defaults on first boot
148
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
22 uint8_t slot;
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
23 uint8_t light;
153
80d869ac365b added accel and brake parameters to car firmware
mbayer
parents: 152
diff changeset
24 uint8_t brake;
80d869ac365b added accel and brake parameters to car firmware
mbayer
parents: 152
diff changeset
25 uint8_t accel;
149
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
26 uint8_t program; // 0xff = inactive ; programming mode active on slot X
148
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
27 } config_t;
153
80d869ac365b added accel and brake parameters to car firmware
mbayer
parents: 152
diff changeset
28 config_t EEMEM eeconfig = {0,0xff,0,0,15,15,0};
149
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
29 config_t config;
147
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
30
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
31 volatile uint16_t data = 0;
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
32 volatile uint8_t data_len = 0;
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
33 volatile uint8_t bitbuf_len = 0;
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
34 volatile uint16_t bitbuf = 0;
152
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
35 volatile uint8_t car_speed[MAX_SLOTS];
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
36 volatile uint8_t car_switch[MAX_SLOTS];
153
80d869ac365b added accel and brake parameters to car firmware
mbayer
parents: 152
diff changeset
37 volatile uint8_t car_act[MAX_SLOTS];
148
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
38
152
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
39 volatile uint8_t car_timeout[MAX_SLOTS];
148
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
40 volatile uint8_t timeout = 0;
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
41 volatile uint8_t brake_timeout = 0;
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
42
152
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
43 uint8_t old_switch[MAX_SLOTS];
147
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
44
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
45 uint8_t my_switch;
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
46 uint8_t my_speed;
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
47
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
48 ISR ( INT0_vect ) {
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
49 GICR &= ~_BV(INT0) ; // Disable INT0
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
50 // Startsignal erkannt, ab hier den Timer2 starten,
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
51 // der liest dann alle 50µs den Zustand ein und schreibt das
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
52 // empfangene Bit in den Puffer
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
53 bitbuf = 0; // init
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
54 bitbuf_len = 0b10000000; // init 1 pulse received
152
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
55
153
80d869ac365b added accel and brake parameters to car firmware
mbayer
parents: 152
diff changeset
56 //TCNT2 = 10;
80d869ac365b added accel and brake parameters to car firmware
mbayer
parents: 152
diff changeset
57 TCNT2 = 9;
147
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
58 TIMSK |= _BV(OCIE2); //enable timer2 interrupt
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
59 }
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
60
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
61 ISR ( TIMER2_COMP_vect ) {
153
80d869ac365b added accel and brake parameters to car firmware
mbayer
parents: 152
diff changeset
62 // TCNT2 = 0;
147
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
63 uint8_t clock;
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
64 uint8_t state;
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
65 uint8_t state2;
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
66 if ((bitbuf_len & 0b10000000) == 0) clock = 0; else clock = 0xff;
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
67 if ((bitbuf_len & 0b01000000) == 0) state = 0; else state = 0xff;
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
68 if ((PIN(PULSE_PORT) & _BV(PULSE_BIT)) == 0) state2 = 0xff; else state2 = 0;
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
69
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
70 if (clock) {
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
71 bitbuf_len &= ~_BV(7); // switch clock to low
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
72 // second pulse of bit
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
73 if ((state==state2) & state2) {
152
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
74 TIMSK &= ~_BV(OCIE2); //disable timer2 interrupt
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
75
147
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
76 // two cycles high: packet end received
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
77 data_len = (bitbuf_len & 0b00111111);
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
78
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
79 //data = bitbuf; // output data
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
80 // write data of controllers to array
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
81 if (data_len == 10) { // controller data packet
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
82 clock = (bitbuf >> 6) & 0b00000111;
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
83 car_speed[clock] = (bitbuf >> 1) & 0x0F;
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
84 car_switch[clock] = (bitbuf >> 5) & 1;
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
85 // current response for this car?
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
86 /*
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
87 if (response != 0) {
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
88 if ( ((response & 0b00001110) >> 1) == clock) {
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
89 // add our ID to response:
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
90 send_response(response | self_id << 6);
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
91 response = 0;
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
92 }
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
93 }
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
94 */
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
95 }
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
96
152
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
97 GICR |= _BV(INT0) ; // Enable INT0
147
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
98
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
99 } else {
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
100 bitbuf_len++; // increment bit counter
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
101 bitbuf = bitbuf << 1; // shift bits
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
102 if (state2 == 0) bitbuf |= 1; // receive logic one
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
103 }
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
104 } else {
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
105 bitbuf_len |= _BV(7); // switch clock to high
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
106 // first pulse of bit
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
107 if (state2) {
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
108 bitbuf_len |= _BV(6); // store new state
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
109 } else {
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
110 bitbuf_len &= ~_BV(6); // store new state
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
111 }
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
112 }
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
113 }
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
114
148
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
115 ISR (INT1_vect) {
147
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
116 }
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
117
148
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
118 ISR (TIMER0_OVF_vect) {
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
119 TCNT0 = 100; // TIMER0 vorladen mit 100
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
120 if (brake_timeout > 1) brake_timeout--;
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
121 if (timeout > 1) timeout--;
152
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
122 for (uint8_t i=0; i<MAX_SLOTS; i++)
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
123 if (car_timeout[i] > 1) car_timeout[i]--;
147
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
124 }
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
125
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
126 #define LIGHT_PORT PORTC
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
127 #define LIGHT_FRONT 2
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
128 #define LIGHT_BRAKE 4
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
129
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
130 #define IR_PORT PORTB
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
131 #define IR_LED 3
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
132
149
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
133 #define LIGHT_MODES 1 // anzahl der lichtmodi (ohne den modus "aus")
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
134 #define BRAKE_OFF_TIMEOUT 60 // value * 10ms
147
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
135
151
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
136 //#define CAR_DEBUG 1
149
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
137 #define EE_CONFIG_ADDR 64
151
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
138 #define DOUBLE_CLICK_TIMEOUT 50 // 500ms
147
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
139
148
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
140 void config_save(void) {
149
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
141 eeprom_write_block( &config, &eeconfig, sizeof(config_t) );
148
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
142 }
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
143
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
144
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
145 void brake_on(void) {
153
80d869ac365b added accel and brake parameters to car firmware
mbayer
parents: 152
diff changeset
146 OCR1A = (int) ((float)0xff * (float)((float)config.brake / (float)15));
148
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
147 LIGHT_PORT |= _BV(LIGHT_BRAKE); // brake light on
152
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
148 DDRB |= _BV(1); // PB1 PWM Output enable
149
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
149 brake_timeout = BRAKE_OFF_TIMEOUT;
148
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
150 }
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
151
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
152 void brake_off(void) {
153
80d869ac365b added accel and brake parameters to car firmware
mbayer
parents: 152
diff changeset
153 OCR1A = 0;
148
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
154 LIGHT_PORT &= ~_BV(LIGHT_BRAKE); // brake light off
151
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
155 DDRB &= ~_BV(1); // PB1 PWM Output disable
148
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
156 brake_timeout = 0;
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
157 }
147
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
158
151
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
159 uint8_t set_id(void) {
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
160 _delay_ms(100); // short wait
149
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
161 uint8_t temp;
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
162 timeout = 1;
151
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
163 brake_timeout = 0xff;
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
164 // wait for key press and assign on double click
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
165 while ((car_speed[config.slot] == 0) && (brake_timeout > 1)) {
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
166 temp = car_switch[config.program];
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
167 if (temp == 0) {
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
168 // wait for second key press within timeout period to assign successfully
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
169 brake_timeout = DOUBLE_CLICK_TIMEOUT;
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
170 timeout = 1;
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
171 while (brake_timeout > 1) {
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
172 if (temp != car_switch[config.program]) {
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
173 temp = car_switch[config.program];
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
174 if (temp == 0) {
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
175 config.slot = config.program;
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
176 return 1;
149
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
177 }
151
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
178 }
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
179 // toggle lights if timeout
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
180 if (timeout == 1) {
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
181 LIGHT_PORT ^= _BV(LIGHT_FRONT);
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
182 timeout = 5;
149
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
183 }
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
184 }
151
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
185 return 0;
149
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
186 }
151
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
187
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
188 // toggle lights if timeout
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
189 if (timeout == 1) {
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
190 LIGHT_PORT ^= _BV(LIGHT_FRONT);
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
191 timeout = 10;
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
192 }
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
193 }
149
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
194 return 0;
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
195 }
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
196
147
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
197 int main(void)
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
198 {
152
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
199 // config (from eeprom!)
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
200 eeprom_read_block( &config, &eeconfig, sizeof(config_t) );
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
201
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
202 // set the internal calibration byte
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
203 OSCCAL = config.calibration;
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
204 // TODO: Vielleicht den internen Takt des AVR anhand der Bitclock auf den Schienen synchronisieren???
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
205 // Das Calibration byte scheint nicht zu stimmen
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
206
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
207 if (config.initialized == 0xff) {
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
208 config.slot = 0;
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
209 config.light = 0;
153
80d869ac365b added accel and brake parameters to car firmware
mbayer
parents: 152
diff changeset
210 config.brake = 15;
80d869ac365b added accel and brake parameters to car firmware
mbayer
parents: 152
diff changeset
211 config.accel = 15;
152
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
212 config.program = 0xff;
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
213 config.initialized = 0;
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
214 config_save();
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
215 }
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
216
149
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
217 uint8_t temp;
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
218
147
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
219 // setup data bit timer2
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
220 TCCR2 = (1<<CS21) | (1<<WGM21); //divide by 8, set compare match
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
221 OCR2 = TIMER2_50US;
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
222
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
223
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
224 // enable both external interrupts
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
225 // int 0 = data RX
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
226 MCUCR = _BV(ISC00) | _BV(ISC01) | _BV(ISC10) | _BV(ISC11); // INT0/1 rising edge
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
227 GICR = _BV(INT0) | _BV(INT1) ; // Enable INT0 + INT1
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
228
148
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
229
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
230 DDR(LIGHT_PORT) |= _BV(LIGHT_FRONT) | _BV(LIGHT_BRAKE);
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
231
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
232 TCCR1A = (1<<WGM10)|(1<<COM1A1) // Set up the two Control registers of Timer1.
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
233 |(1<<COM1B1); // Wave Form Generation is Fast PWM 8 Bit,
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
234
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
235 TCCR1B = (1<<WGM12)|(1<<CS10); // OC1A and OC1B are cleared on compare match
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
236 // and set at BOTTOM. Clock Prescaler is 1.
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
237
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
238
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
239 //OCR1A = 63; // Dutycycle of OC1A = 25%
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
240 //OCR1B = 127; // Dutycycle of OC1B = 50%
153
80d869ac365b added accel and brake parameters to car firmware
mbayer
parents: 152
diff changeset
241 OCR1A = 0; // brake PWM!
151
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
242 OCR1B = 0; // Motor drive PWM
149
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
243 DDRB &= ~_BV(2); // PB2 PWM Output disable
151
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
244 DDRB &= ~_BV(1); // PB1 PWM Output disable
148
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
245
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
246 // configure TIMER0 to overflow every 10ms at 4 MHz
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
247 TIMSK = _BV(TOIE0); // Timer0 Overflow INT erlauben
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
248 TCNT0 = 100; // TIMER0 vorladen mit 100
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
249 TCCR0 = _BV(CS02) ; // Vorteiler auf 256, ab hier läuft der TIMER0
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
250
147
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
251 sei();
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
252
149
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
253
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
254 if ((config.program != 0xff) || (config.slot > 5 )) {
151
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
255 temp = set_id();
149
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
256 config.program = 0xff;
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
257 config_save();
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
258 if (temp == 1) {
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
259 // acknowledge with the engine
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
260 OCR1B = 25;
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
261 DDRB &= ~_BV(2); // PB2 PWM Output disable
151
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
262 for (temp = 128; temp > 0; temp--) {
149
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
263 DDRB ^= _BV(2); // PB2 PWM Output toggle
151
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
264 _delay_ms(2);
149
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
265 DDRB ^= _BV(2); // PB2 PWM Output toggle
151
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
266 _delay_ms(3);
149
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
267 }
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
268
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
269 }
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
270 timeout = 0;
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
271 }
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
272
147
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
273
153
80d869ac365b added accel and brake parameters to car firmware
mbayer
parents: 152
diff changeset
274 float my_accel;
151
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
275 my_switch = car_switch[config.slot]; // initialize
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
276 my_speed = car_speed[config.slot]; // initialize
153
80d869ac365b added accel and brake parameters to car firmware
mbayer
parents: 152
diff changeset
277 my_accel = (float)config.accel / (float)15;
151
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
278
147
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
279 while (1) {
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
280 // main loop
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
281
149
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
282 if (brake_timeout == 1) brake_off();
148
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
283
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
284 if (my_speed != car_speed[config.slot]) {
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
285 my_speed = car_speed[config.slot];
153
80d869ac365b added accel and brake parameters to car firmware
mbayer
parents: 152
diff changeset
286 OCR1B = (int) ((float)0xff * (float)((float)my_speed / (float)15) * my_accel );
148
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
287 if (my_speed == 0) {
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
288 DDRB &= ~_BV(2); // PB2 PWM Output disable
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
289 brake_on();
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
290 } else {
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
291 brake_off();
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
292 DDRB |= _BV(2); // PB2 PWM Output enable
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
293 }
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
294 }
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
295
147
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
296 // Light cycle if switch pressed without speed
148
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
297 if (car_speed[config.slot] == 0) {
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
298 if (my_switch != car_switch[config.slot]) {
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
299 my_switch = car_switch[config.slot];
151
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
300 if (my_switch == 0) {
147
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
301 // cycle light
152
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
302 if (config.light >= LIGHT_MODES) config.light = 0; else config.light++;
149
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
303 config_save();
147
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
304 }
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
305 }
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
306 }
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
307
152
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
308 // check any car switch for a double click and speed = 0
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
309 for (temp = 0; temp<MAX_SLOTS; temp++) if (car_switch[temp] != old_switch[temp]) {
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
310 old_switch[temp] = car_switch[temp];
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
311 if ((car_speed[temp] == 0) && (old_switch[temp] == 0)) {
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
312 // key pressed
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
313 if (car_timeout[temp] > 1) {
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
314 // second key press within timeout, enter program mode for this key
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
315 config.program = temp;
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
316 config_save();
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
317 car_timeout[temp] = 0xff; // the car has to be reset within this timeout
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
318 } else {
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
319 car_timeout[temp] = DOUBLE_CLICK_TIMEOUT;
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
320 }
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
321 }
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
322
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
323 if (car_timeout[temp] == 1) {
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
324 if (config.program == temp) {
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
325 // cancel ID programming mode
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
326 config.program = 0xff;
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
327 config_save();
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
328 }
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
329 car_timeout[temp] = 0;
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
330 }
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
331 }
e787f47c084b finished car id programming and brake function
mbayer
parents: 151
diff changeset
332
148
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
333 switch (config.light) {
147
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
334 case 0:
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
335 LIGHT_PORT &= ~_BV(LIGHT_FRONT); // switch lights off
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
336 break;
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
337 case 1:
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
338 LIGHT_PORT |= _BV(LIGHT_FRONT); // switch lights on
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
339 break;
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
340 }
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
341
148
08cb88614d69 car firmware: finished pwm drive and lights switching
Malte Bayer <mbayer@neo-soft.org>
parents: 147
diff changeset
342
149
1c3425af9aa0 car firmware suspended, avr chip not responding after fuse error (note to self, never program an avr when powered via the SCK line :-)
Malte Bayer <mbayer@neo-soft.org>
parents: 148
diff changeset
343 // timeout reset
151
0e71b51c83a5 car: finished set_id function
mbayer
parents: 149
diff changeset
344 if (timeout == 1) timeout = 0;
147
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
345 } // main loop end
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
346 };
f66c5b3b3ed2 started firmware for car004f hardware
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
347

mercurial