2 #include <avr/eeprom.h>
3 #include <util/delay.h>
5 #include <avr/interrupt.h>
7 volatile uint16_t adcval;
8 unsigned char pwmval = 0x10;
9 volatile uint16_t adc_exp = 0x10;
10 unsigned char led_is_on = 0;
11 volatile unsigned char adccount = 0;
21 static void inline led_on()
27 static void inline led_off()
31 // ADCSRA &= ~(_BV(ADIE) | _BV(ADIF));
34 /* ------------ Logging/Debugging ----------- */
36 unsigned char debug_state EEMEM;
38 static void inline debug_setstate(unsigned char val)
40 eeprom_write_byte(&debug_state, val);
44 uint16_t log_buffer[LOG_BUFFER] EEMEM;
45 unsigned char log_buffer_count;
46 uint16_t log_buffer2[LOG_BUFFER];
47 volatile unsigned char stop = 0;
49 static void inline init_log()
55 static void log_word(uint16_t word) {
56 if (log_buffer_count >= LOG_BUFFER)
59 // eeprom_write_word(&log_buffer[log_buffer_count], word);
60 log_buffer2[log_buffer_count] = word;
63 if (log_buffer_count == LOG_BUFFER) {
65 for (i=0; i < LOG_BUFFER; i++) {
66 eeprom_write_word(&log_buffer[i],
73 /* ------------ Timer ----------- */
75 volatile uint16_t clock = 0;
77 static void inline init_tmr()
80 TCCR0B = _BV(CS02) | _BV(CS00); // 1 kHz
88 static void inline tmr_handler()
90 unsigned char c = clock & 0x1F;
91 unsigned char c1 = clock & 0xFF;
95 if (c == 10 || c == 30)
98 if (c == 20 || c == 40)
102 if (c == 0x02 || c == 0x08)
104 if (c == 0x05 || c == 0x0b)
107 if ((clock & 0x7F) == 0x1F) {
116 if (led_is_on && adcval != 0xFFEE) {
119 ADCSRA |= _BV(ADIF) | _BV(ADIE) | _BV(ADSC);
124 ISR(TIMER0_COMPA_vect)
129 /* ------------ PWM ----------- */
131 static void inline init_pwm()
134 PLLCSR = _BV(LSM) | _BV(PLLE);
136 while (PLLCSR & _BV(PLOCK) == 0)
140 TCCR1C = _BV(COM1D0) | _BV(COM1D1) | _BV(PWM1D);
141 TCCR1A = _BV(COM1A0) | _BV(COM1A1) | _BV(COM1B0) | _BV(COM1B1) | _BV(PWM1A) | _BV(PWM1B);
142 // TCCR1B = 0x80| _BV(CS13) | _BV(CS11);
143 TCCR1B = _BV(7) // PWM1X: PWM inversion mode
144 | _BV(CS10) // no clock prescaling
146 OCR1C = 0xFF; // TOP value
147 OCR1D = OCR1B = OCR1A = pwmval;
149 // DDRB |= _BV( PB5 );
150 PORTB &= ~(_BV( PB5 ) | _BV( PB1 ) | _BV( PB3 ));
153 // TIMSK |= _BV(TOIE1);
157 static void inline pwm_handler()
159 // TIMSK &= ~_BV(TOIE1);
169 /* ------------ A/D Converter ----------- */
171 static void inline init_adc()
173 ADCSRA = _BV(ADEN) // enable
174 | _BV(ADPS1) | _BV(ADPS0) // CLK/8 = 125 kHz
175 // | _BV(ADPS2) // CLK/16 = 62.5 kHz
177 ADMUX = _BV(REFS1) // 1.1V internal reference
178 | _BV(MUX4)|_BV(MUX3) // port ADC5-6, gain 1
180 // ADCSRB = _BV(REFS2);
182 // Disable digital input on all bits used by ADC
183 DIDR0 = _BV(ADC5D)|_BV(ADC6D) | _BV(AREFD);
187 static void inline adc_handler()
189 uint16_t new_pwm = pwmval;
190 uint16_t old_pwm = pwmval;
191 uint16_t old_adc = adcval;
195 // log_word(((adcval & 0x3FC) << 6) | pwmval);
196 log_word(((adcval & 0xFF) << 8) | pwmval);
200 // adcval = (adcval + 3*old_adc)/4;
202 // ADCSRA &= ~(_BV(ADIE) | _BV(ADIF));
206 } else if (adcval > adc_exp) {
207 new_pwm = old_pwm*adc_exp/adcval;
208 } else if (adcval < adc_exp && 2 * adcval > adc_exp) {
209 new_pwm = old_pwm*adc_exp/adcval;
210 } else if (adcval < adc_exp) {
211 new_pwm = 2 * old_pwm;
214 new_pwm = (3*old_pwm + new_pwm) / 4;
215 if (new_pwm > 0x60) { // odpojeno?
218 if (new_pwm < 2) { // zkrat?
222 // if (new_pwm < 15*old_pwm/16 || new_pwm > 17*old_pwm/16) {
226 // ADCSRA |= _BV(ADSC);
253 PORTA &=~ _BV( PA0 );