/* tutorial TinyAVR 1-Series * ADC3 - c) free-running mód 8bit (overclocking) * aplikace čeká na sestupnou hranu trigru (PC0) a pak spustí dávku 200 převodů * s frekvencí 192ksps, 8bit data ukládá do pole "adc_data" * na PB2 indikuje čas potřebný pro zpracování dat * analogový signál se přivádí na AIN9 (PB4) */ /* Ve fuses zvolen 20MHz oscilátor */ #define F_CPU 20000000UL #include #include void clock_20MHz(void); void init_adc(void); volatile uint8_t adc_data[200]; // tady ukládáme výsledky převodu (zabírá 78% RAM) volatile uint8_t idx=0; // index v poli s výsledky int main(void){ clock_20MHz(); // taktujeme na plný výkon PORTB.PIN4CTRL = PORT_ISC_INPUT_DISABLE_gc; // PB4 vstup pro ADC (vypnout vstupní buffer) PORTB.DIRSET = PIN2_bm; // PB2 indikuje rutinu přerušení od ADC PORTC.DIRCLR = PIN0_bm; // PC0 vstup pro trigger signál PORTC.PIN0CTRL = PORT_PULLUPEN_bm; // PC0 může být i odpojený... takže pullup init_adc(); // konfigurovat ADC a referenci sei(); // globální povolní přerušení while (1){ while(!(PORTC.IN & PIN0_bm)){} // čekej dokud je na triggeru log.0 while(PORTC.IN & PIN0_bm){} // čekej dokud je na triggeru lo.1 // přišla sestupná hrana, spusť první převod (další se už spouští samy) ADC0.COMMAND = ADC_STCONV_bm; // dokud je místo v poli, čti a ukládej výsledky převodu for(idx=0;idx