Například v tomto kódu, který jsem z větší části zkopíroval z Knihy AVR. Mám problém, že když se změní ADC hodnota a má dojít ke změně intervalu blikání musí se nejprve dokončit pauza která zrovna probíhá, ale mě by zajímalo, jak se to dá udělat, aby změna intervalu blikání reagovala ihned.
Kód: Vybrať všetko
#include <avr/io.h>
#include <avr/interrupt.h>
volatile int analog_value;
volatile unsigned int i;
void delay_ms(unsigned int time);
// pretečenie počítadla TCNT0 - nastane každých 100us
ISR (TIMER0_OVF_vect){
// nastavenie počiatočnej hodnoty počítadla
TCNT0 = 156;
i++;
}
//vlastná čakacia funkcia s využitím čítača/časovača 0
void delay_ms(unsigned int time){
TCNT0 = 156;
i=0;
// cakaj pokial prebehne i krat pretecenie
while(i != time*10);
}
ISR(ADC_vect) // přerušení po ukončení A/D převodu
{
analog_value = ADCH;
}
int main(){
DDRD=0b11111111; //Nastavení výstupů a výstupů
PORTD=0b00000000; //Aktivace pull-up
DDRC = 0x00;
PORTC = 0b11111110;
sei();
TCCR0 = 2; //předdělička 8
// prerušenie pri pretečení TCNT0
TIMSK |= (1 << TOIE0);
sei(); //povol globálne prerušenia
ADMUX = 0b01100000; // reference Ucc
ADCSRA = 0b10001111;
PORTD = 0x00;
while(1)
{
ADCSRA |= 0b01000000; // spuštění ad převodu
delay_ms(50);
if (analog_value < 50)
{
PORTD ^= 0b10000000; //invertuj PD7
delay_ms(100);
}
else
{
PORTD ^= 0b10000000;
delay_ms(1000);
}
}
return 0;
}