Napisałem prosty program do fazowej regulacji napięcia za pomocą triaka przy uzyciu pilota (rc5).
Program działa tak że w wyniku zewnętrznego przerwaniana INT1 , timer1 jest ładowany wartościa odpowiedniego opóźnienia, z którym ma byc odpalony triak.
Wartośc 'czas' jest zwiekszana lub zmniejszana w zalezności od wcisniętego przycisku na pilocie.
Problem polega na tym że zmienna 'czas' zaktualizuje się jedynie wtedy jeżeli odrazu po dokonaniu na niej zmiany załaduję ją do timer'a (mam na mysli linijkę z TCNT1 = czas;) Bez tej linijki zmienna czas pozostaje bez zmian tak jak została zadeklarowana na początku programu. Dlaczego tak się dzieje?
#define F_CPU 8000000L
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "rc5.h"
volatile int16_t czas=65379;
SIGNAL (SIG_OVERFLOW1)
{
sei();
PORTB |= 1<<PB0; // ON
_delay_us(9);
PORTB &= ~(1<<PB0); // OFF
}
SIGNAL (SIG_INTERRUPT1){
sei();
TCNT1 = czas;
}
int main (void)
{
DDRB |= 1<<PB0;
PORTB &= ~(1<<PB0); // oFF
MCUCR |= (1<<ISC11); // na jaki edge reagowac
GIMSK |= (1<<INT1); // odpal zew. przerwanie
TCCR1B |= (1 << CS02); //time run with prescaler 256
TIMSK |= (1 << TOIE1); // odpal przerwanie licznika
rc5_init (RC5_ALL);
sei();
while (1)
{
if (rc5.flip >= 0)
{
switch (rc5.code)
{
case 0x20:
czas+= 5;
TCNT1 = czas;
rc5.flip = -1;
break;
case 0x21:
czas -= 5;
TCNT1 = czas;
rc5.flip = -1; //
break;
}
}
rc5.flip = -1;
}
}Program działa tak że w wyniku zewnętrznego przerwaniana INT1 , timer1 jest ładowany wartościa odpowiedniego opóźnienia, z którym ma byc odpalony triak.
Wartośc 'czas' jest zwiekszana lub zmniejszana w zalezności od wcisniętego przycisku na pilocie.
Problem polega na tym że zmienna 'czas' zaktualizuje się jedynie wtedy jeżeli odrazu po dokonaniu na niej zmiany załaduję ją do timer'a (mam na mysli linijkę z TCNT1 = czas;) Bez tej linijki zmienna czas pozostaje bez zmian tak jak została zadeklarowana na początku programu. Dlaczego tak się dzieje?
