Witam!!
Napotkałem się na dosyć dziwny problem... Dotyczy on zliczania impulsów i ustawieniu wyjścia po przejściu warunku. Poniżej przedstawiam kod który dotyczy tego problemu.
Zasada działania jest taka, iż timer0 generuje impulsy o pewnej częstotliwości(nie jest ona ważna) , które podaję na przerwanie zewnętrzne int0. Na każdą zmianę impulsu z timera generowane jest przerwanie które zwiększa zmienną x o 1. W docelowym projekcie tym sposobem zliczam kąt wykonany przez silnik krokowy - 1impuls 1krok-0,9stopnia, dlatego dalej obliczam kat=x*0.9. Dalej sprawdzam czy kat jest równy 91.8(przykładowo) jeśli tak to zmienia wartość portu A na przeciwny i zeruje x i kat. Cały problem jest w tym że co jakieś wartości zmiennej kat +/-0.9 ustawia wyjście portu A przy innych znowu nie. Np. przy podanej wartości 91.8 nie ustawia a z kolei przy 92.7 ustawia. Kolejne 2 wartości znowu ustawi, przy następnych 3 znowu nie i tak różnie raz ustawi, raz nie. Na pewno problem nie tkwi w częstotliwości timera0 bo to sprawdziłem, ani też w ustawieniach przerwania int0. Ostatecznie rozwiązać to można mnożeniem całości(*9) i porównanie całości(918) wtedy działa tak jak powinno(mam nadzieję że wtedy wystarczy mi zmienna typu long double...;/ do dokładnych przeliczeń) Czy ma ktoś może jakiś pomysł dlaczego tak się dzieje?? Będę bardzo wdzięczny za pomoc.
Pozdrawiam.
Napotkałem się na dosyć dziwny problem... Dotyczy on zliczania impulsów i ustawieniu wyjścia po przejściu warunku. Poniżej przedstawiam kod który dotyczy tego problemu.
#include <avr/io.h>
#include <avr/interrupt.h>
int imp=0;
#define tau 251;
double kat=0.0,x=0.0;
unsigned int licznik=250;
ISR(INT0_vect)
{
x++;
kat=x*0.9;
if(kat==(91.8)) {PORTA^=0x01;x=0;kat=0;}
}
ISR(TIMER0_OVF_vect)
{
TCNT0=tau;
if(--licznik==0)
{
PORTA^=0x06;
licznik=250;
}
TIFR=1<<TOV0;
}
int main(void)
{
TCCR0=4;
TCNT0=tau;
TIMSK=1<<TOIE0;
DDRD=0x00;
PORTD=0x04;
DDRA=0x07;
MCUCR=0x01;
GICR=1<<INT0;
sei();
while(1)
{}
}
Zasada działania jest taka, iż timer0 generuje impulsy o pewnej częstotliwości(nie jest ona ważna) , które podaję na przerwanie zewnętrzne int0. Na każdą zmianę impulsu z timera generowane jest przerwanie które zwiększa zmienną x o 1. W docelowym projekcie tym sposobem zliczam kąt wykonany przez silnik krokowy - 1impuls 1krok-0,9stopnia, dlatego dalej obliczam kat=x*0.9. Dalej sprawdzam czy kat jest równy 91.8(przykładowo) jeśli tak to zmienia wartość portu A na przeciwny i zeruje x i kat. Cały problem jest w tym że co jakieś wartości zmiennej kat +/-0.9 ustawia wyjście portu A przy innych znowu nie. Np. przy podanej wartości 91.8 nie ustawia a z kolei przy 92.7 ustawia. Kolejne 2 wartości znowu ustawi, przy następnych 3 znowu nie i tak różnie raz ustawi, raz nie. Na pewno problem nie tkwi w częstotliwości timera0 bo to sprawdziłem, ani też w ustawieniach przerwania int0. Ostatecznie rozwiązać to można mnożeniem całości(*9) i porównanie całości(918) wtedy działa tak jak powinno(mam nadzieję że wtedy wystarczy mi zmienna typu long double...;/ do dokładnych przeliczeń) Czy ma ktoś może jakiś pomysł dlaczego tak się dzieje?? Będę bardzo wdzięczny za pomoc.
Pozdrawiam.