X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=lights.c;h=aa018d977d61d8156b43e3f64e29a837d388b8b7;hb=330fb23b8a14ad41bef2997f8093ea9894467e19;hp=0bedc53e2e059f070a82bdcee6e00381adeca255;hpb=e1211bd691c284824463728051ab22d0cf461b06;p=bike-lights.git diff --git a/lights.c b/lights.c index 0bedc53..aa018d9 100644 --- a/lights.c +++ b/lights.c @@ -1,26 +1,97 @@ #include #include #include +#include +#include -char dbg[5] __attribute__((section(".eeprom"))); +uint16_t pwmee EEMEM; +volatile uint16_t adcval; + +volatile struct +{ + uint8_t tmr_int: 1; + uint8_t adc_int: 1; + uint8_t rx_int: 1; +} +intflags; + + +unsigned char debug EEMEM = 1; + +ISR(ADC_vect) +{ + adcval = ADCW; + ADCSRA &= ~_BV(ADIE); /* disable ADC interrupt */ + intflags.adc_int = 1; +} + +ISR(TIMER1_OVF_vect) +{ + TIMSK &= ~_BV(TOIE1); + intflags.tmr_int = 1; +} int main(void) { + char seen = 0; + TCCR1C = _BV(COM1D0) | _BV(COM1D1) | _BV(PWM1D); - TCCR1A = _BV(PWM1A) | _BV(PWM1B); - TCCR1B = 0x80 | _BV(CS13) | _BV(CS12); + TCCR1A = _BV(COM1A0) | _BV(COM1A1) | _BV(COM1B0) | _BV(COM1B1) | _BV(PWM1A) | _BV(PWM1B); + TCCR1B = 0x80| _BV(CS13) | _BV(CS10); + TC1H = 0x03; OCR1C = 0xFF; - OCR1D = 0x20; - TCNT1 = 3; - DDRB |= _BV( PB5 ); - PORTB &= ~_BV( PB5 ); - - _delay_ms(1000); - eeprom_write_byte(&dbg[0], TCNT1); - eeprom_write_byte(&dbg[1], OCR1C); - eeprom_write_byte(&dbg[2], OCR1D); - eeprom_write_byte(&dbg[3], TIFR); - eeprom_write_byte(&dbg[4], TCCR1B); + OCR1D = OCR1B = OCR1A = 0x40; + TCNT1 = 0; + DDRB |= _BV( PB5 ) | _BV( PB1 ) | _BV( PB3 ); + PORTB &= ~(_BV( PB5 ) | _BV( PB1 ) | _BV( PB3 )); + TIMSK = _BV(TOIE1); + + ADCSRA = _BV(ADEN) | _BV(ADATE) | _BV(ADPS1) | _BV(ADPS0); + ADMUX = _BV(REFS1) | _BV(MUX0); + // ADCSRB = _BV(REFS2); + DIDR0 = _BV(ADC1D) | _BV(AREFD); + + sei(); + while (1) { + unsigned char pwmhi, pwmlo; + + if (intflags.adc_int) { + intflags.adc_int = 0; + + if (adcval > 0x3C0) + adcval = 0x3C0; + if (adcval < 1) + adcval = 1; + pwmhi = adcval >> 8; + pwmlo = adcval & 0xFF; + + TC1H = pwmhi; + OCR1D = pwmlo; + + TC1H = pwmhi; + OCR1B = pwmlo; + + TC1H = pwmhi; + OCR1A = pwmlo; + + TIMSK |= _BV(TOIE1); + } + + if (intflags.tmr_int) { + intflags.tmr_int = 0; + ADCSRA |= _BV(ADIE) | _BV(ADSC); + } + + sleep_mode(); + +#if 0 + if (!seen) { + seen = 1; + eeprom_write_byte(&debug, 2); + } +#endif + } + DDRA |= _BV( PA0 ); while( 1 ) { PORTA |= _BV( PA0 );