--- /dev/null
+#include "adc.h"
+
+#define BIT(n) (1<<(n))
+
+void adc_init()
+{
+ // TODO Adjust ADPS bits according to F_CPU
+ ADMUX = BIT(REFS0);
+ ADCSRA = BIT(ADEN) | BIT(ADIE) | BIT(ADPS2) | BIT(ADPS1) | BIT(ADPS0);
+ ADCSRB = 0;
+ DIDR0 = 0x3F;
+}
+
+void adc_read_async(uint8_t chan)
+{
+ ADMUX = (ADMUX&0xF0) | (chan&0x0F);
+ ADCSRA |= BIT(ADSC);
+}
--- /dev/null
+#ifndef ADC_H_
+#define ADC_H_
+
+#include <avr/interrupt.h>
+
+#define ADC_SET_CALLBACK(f) \
+ ISR(ADC_vect) \
+ { \
+ uint16_t v = ADCL; \
+ v |= ADCH<<8; \
+ f(v); \
+ }
+
+void adc_init();
+void adc_read_async(uint8_t);
+
+#endif
if(num==0)
{
if(period<0x100)
- {
cs = BIT(CS00);
- }
else if(period<0x800)
{
cs = BIT(CS01);
OCR0A = period;
TIMSK0 = BIT(OCIE0A);
}
- if(num==1)
+ else if(num==1)
{
if(period<0x10000)
- {
cs = BIT(CS10);
- }
else if(period<0x80000)
{
cs = BIT(CS11);
OCR1AL = period;
TIMSK1 = BIT(OCIE1A);
}
+ else if(num==2)
+ {
+ if(period<0x100)
+ cs = BIT(CS20);
+ else if(period<0x800)
+ {
+ cs = BIT(CS21);
+ period /= 8;
+ }
+ else if(period<0x2000)
+ {
+ cs = BIT(CS21) | BIT(CS20);
+ period /= 32;
+ }
+ else if(period<0x4000)
+ {
+ cs = BIT(CS22);
+ period /= 64;
+ }
+ else if(period<0x8000)
+ {
+ cs = BIT(CS22) | BIT(CS20);
+ period /= 128;
+ }
+ else if(period<0x10000)
+ {
+ cs = BIT(CS22) | BIT(CS21);
+ period /= 256;
+ }
+ else
+ {
+ cs = BIT(CS22) | BIT(CS21) | BIT(CS20);
+ period /= 1024;
+ if(period>0xFF)
+ period = 0xFF;
+ }
+ TCCR2A = BIT(WGM21);
+ TCCR2B = cs;
+ OCR2A = period;
+ TIMSK2 = BIT(OCIE2A);
+ }
}
void timer_start_hz(uint8_t num, uint32_t freq_p, uint8_t freq_q)
TCCR1B = 0;
TIMSK1 = 0;
}
+ else if(num==2)
+ {
+ TCCR2B = 0;
+ TIMSK2 = 0;
+ }
}