root / branches / autonomous_recharging / code / projects / autonomous_recharging / archs / I2c test / main.c @ 355
History | View | Annotate | Download (3.69 KB)
1 | 355 | bneuman | #include <avr/io.h> |
---|---|---|---|
2 | #include <avr/io.h> |
||
3 | #include <avr/interrupt.h> |
||
4 | #include <avr/sleep.h> |
||
5 | #include "ring_buffer.h" |
||
6 | #include "i2c.h" |
||
7 | |||
8 | |||
9 | // for i2c_byte coming from charge board
|
||
10 | //I2C Message Codes
|
||
11 | #define I2C_MSG_ACKNOWLEDGE 'A' |
||
12 | #define I2C_MSG_BATTERY_CHARGING 'C' |
||
13 | #define I2C_MSG_DATA 'D' |
||
14 | #define I2C_MSG_CONTACT_ERROR 'E' |
||
15 | #define I2C_MSG_BATTERY_FULL 'F' |
||
16 | #define I2C_MSG_NO_CONTACT 'N' |
||
17 | #define I2C_MSG_REQUEST_DATA 'R' |
||
18 | #define I2C_MSG_GO_TO_SLEEP 'Y' |
||
19 | #define I2C_MSG_ENTERING_SLEEP 'Z' |
||
20 | #define I2C_MSG_HOMING 'H' |
||
21 | |||
22 | |||
23 | #define SW0 PA6
|
||
24 | #define HOMING_PIN PA7
|
||
25 | |||
26 | #define DEBUG 0 |
||
27 | #define USE_I2C 1 |
||
28 | |||
29 | |||
30 | #define MAX_T 300 |
||
31 | #define MIN_T 730 |
||
32 | //range is 0 to 45 C
|
||
33 | //cal tests:
|
||
34 | //room temp - 25
|
||
35 | //value ~500, varies from battery to battery, but is consistent on one battery
|
||
36 | //freezer 737
|
||
37 | //heat gun at a distance 461
|
||
38 | |||
39 | #define MAX_DT -4 //this is the LOWEST ACCEPTABLE ADC value |
||
40 | #define MAX_DT_ABS 400 |
||
41 | #define VOLT_PLATEAU 50 |
||
42 | |||
43 | |||
44 | //The following times are in seconds
|
||
45 | #define MAX_FAST_TIME 5400 |
||
46 | #define MAX_TRICKLE_TIME 600 |
||
47 | |||
48 | //debug pins
|
||
49 | #define debug_time PA3
|
||
50 | #define debug_curr PA4
|
||
51 | #define debug_volt PA5
|
||
52 | #define debug_temp PA6
|
||
53 | #define debug_12in PA7
|
||
54 | |||
55 | //be sure admux also sets the MUX5 bit which is in ADCSRB
|
||
56 | #define ADMUX_I
|
||
57 | #define ADMUX_V
|
||
58 | #define ADMUX_T
|
||
59 | |||
60 | #define ROBOT_TX PB1
|
||
61 | #define ROBOT_RX PB2
|
||
62 | #define PWM PB3
|
||
63 | #define DETECT_12V PB6
|
||
64 | |||
65 | #define LED1 PB4 //Green |
||
66 | #define LED2 PB5 //Red |
||
67 | |||
68 | |||
69 | //LED States:
|
||
70 | //Red - Fast Charging
|
||
71 | //Green - Trickle Charging
|
||
72 | //Both steady - done charging
|
||
73 | //Both Blinking - Error
|
||
74 | |||
75 | #define INT_COUNT 2 //interrupts per second |
||
76 | #define AVG_COUNT 64 //number of times to count current |
||
77 | |||
78 | //To enable the PWM write : TCCR1B = (_Bv(CS10));//enable PWM
|
||
79 | |||
80 | uint8_t interrupt_count = INT_COUNT; |
||
81 | |||
82 | volatile uint32_t abs_time=1; // start at one second so it doesnt do the minute checks right away |
||
83 | volatile uint8_t new_second=0; //only used as a boolean |
||
84 | |||
85 | volatile uint8_t error=0; |
||
86 | volatile uint8_t status;
|
||
87 | |||
88 | volatile uint8_t steady_current = 0; |
||
89 | |||
90 | //DT must be triggered twice in a row
|
||
91 | volatile uint8_t last_DT = 0; |
||
92 | //same for DV
|
||
93 | volatile uint8_t last_DV = 0; |
||
94 | |||
95 | #define FAST_CHARGE 1 |
||
96 | #define TRICKLE_CHARGE 2 |
||
97 | |||
98 | |||
99 | void setup(void) |
||
100 | { |
||
101 | DDRA = _BV(PA3); |
||
102 | PORTA = 0x00;
|
||
103 | DDRB = (_BV(ROBOT_TX)|_BV(PWM)|_BV(LED1)|_BV(LED2)); //confiure output pins
|
||
104 | PORTB = 0x00;
|
||
105 | /*
|
||
106 | ADCSRA = (_BV(ADEN)|_BV(ADPS2)|_BV(ADPS1)); //start ADC with a division factor of 64
|
||
107 | |||
108 | TCCR0B = (_BV(CS01)); //set timer 0 for realtime mode
|
||
109 | TCCR0A = (_BV(TCW0));
|
||
110 | TIMSK = (_BV(TOIE0)); //enable overflow interrupts
|
||
111 | |||
112 | TCCR1A = (_BV(COM1B1)|_BV(PWM1B)|_BV(COM1A1)|_BV(PWM1A)); //clear timer 1 on compare, set at 0x00. Fast PWM mode
|
||
113 | TCCR1B |= _BV(CS10); //leave timer on and set compare to 0 to make output off
|
||
114 | |||
115 | //hack stuff so it will run in continuous mode
|
||
116 | TIMSK |= _BV(TOIE1); //enable overflow interrupt for timer 1
|
||
117 | |||
118 | OCR1B = 0;
|
||
119 | OCR1A = 0;
|
||
120 | |||
121 | |||
122 | sei();*/
|
||
123 | } |
||
124 | |||
125 | |||
126 | int main(void) |
||
127 | { |
||
128 | setup(); |
||
129 | |||
130 | i2c_init(); |
||
131 | setup(); |
||
132 | |||
133 | OCR1B=0;
|
||
134 | |||
135 | sei(); |
||
136 | |||
137 | |||
138 | PORTB|=_BV(LED2); |
||
139 | PORTB|=_BV(LED1); |
||
140 | delay_ms(500);
|
||
141 | PORTB&=~_BV(LED2); |
||
142 | PORTB&=~_BV(LED1); |
||
143 | |||
144 | i2c_putpacket(0x01,"a ", 2); |
||
145 | |||
146 | delay_ms(500);
|
||
147 | PORTB|=_BV(LED2); |
||
148 | PORTB|=_BV(LED1); |
||
149 | |||
150 | while(1); |
||
151 | |||
152 | return 1; |
||
153 | } |
||
154 | |||
155 | ISR(TIMER0_OVF_vect) |
||
156 | { |
||
157 | if(error)
|
||
158 | PORTB ^= (_BV(LED1)|_BV(LED2)); |
||
159 | |||
160 | interrupt_count--; |
||
161 | if(interrupt_count==0) |
||
162 | { |
||
163 | abs_time++; |
||
164 | new_second=1;
|
||
165 | |||
166 | interrupt_count=INT_COUNT; |
||
167 | } |
||
168 | } |
||
169 | |||
170 | ISR(TIMER1_OVF_vect) |
||
171 | { |
||
172 | //wait(2); //wait a bit so we know the ouput gets set (which happens at timer = 0)
|
||
173 | |||
174 | TCNT1 = 0;//156; // start out at 156. Now OCR1B - 156 = duty cycle |
||
175 | } |
||
176 | |||
177 | ISR(PCINT_vect){;} //so the interrupt doesnt go to the reset vector |