]> www.fi.muni.cz Git - bike-lights.git/blobdiff - lights.c
ADC-driven PWM
[bike-lights.git] / lights.c
index 18eef189e6ca9d3134613a906deedfcf5b661aac..653e8d4f7e7b3dcd1e550120f637652b7d82f2e4 100644 (file)
--- a/lights.c
+++ b/lights.c
@@ -1,8 +1,55 @@
 #include <avr/io.h>
+#include <avr/eeprom.h>
 #include <util/delay.h>
+#include <avr/sleep.h>
+#include <avr/interrupt.h>
+
+uint16_t pwmee EEMEM;
 
 int main(void)
 {
+       char seen = 0;
+
+       TCCR1C = _BV(COM1D0) | _BV(COM1D1) | _BV(PWM1D);
+       TCCR1A = _BV(PWM1A) | _BV(PWM1B);
+       TCCR1B = 0x80| _BV(CS13) | _BV(CS11);
+       TC1H  = 0x03;
+       OCR1C = 0xFF;
+       OCR1D = 0x20;
+       TCNT1 = 0;
+       DDRB |= _BV( PB5 );
+       PORTB &= ~_BV( PB5 );
+
+       ADCSRA = _BV(ADEN) | _BV(ADATE) | _BV(ADPS1) | _BV(ADPS0);
+       ADMUX = _BV(REFS1) | _BV(MUX0);
+       // ADCSRB = _BV(REFS2); 
+       DIDR0 = _BV(ADC1D) | _BV(AREFD);
+
+       while (1) {
+               uint16_t pwm;
+               unsigned char pwmhi, pwmlo;
+
+               ADCSRA |= _BV(ADSC);
+
+               _delay_ms(100);
+
+               pwm = ADCW;
+               if (!seen) {
+                       seen = 1;
+                       eeprom_write_word(&pwmee, pwm);
+               }
+               if (pwm > 0x3C0)
+                       pwm = 0x3C0;
+               if (pwm < 1)
+                       pwm = 1;
+               pwmhi = pwm >> 8;
+               pwmlo = pwm & 0xFF;
+
+               TC1H = pwmhi;
+               OCR1D = pwmlo;
+       }
+
+       sleep_mode();
     DDRA |= _BV( PA0 );
     while( 1 ) { 
         PORTA |=  _BV( PA0 );