Impuls jest sterowany przez zmienną t, która waha się w przedziale od 0.6 do 2.4ms co jest zgodne ze specyfikacja serwa i powinno powodować jego wychylenie od -90 do 90 stopni. t jest zwiększane i zmniejszane o stałą offset (tu: 0.05)
Problem polega na tym ze sygnal wyjsciowy na D jest inny niz zaprogramowany.
Kod: Zaznacz cały
#define F_CPU 4000000L
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
double t = 1.5;
double offset = 0.05;
double period = 20.0;
/* Wszystkie linie portu D będą wyjściami */
DDRD = 0xFF;
(1) //t = t + offset; <--- INSTRUKCJA DODAWANIA W TYM MIEJSCU DZIALA POPRAWNIE
/* Początek nieskończonej pętli */
while(1)
{
if ((t<=0.6)||(t>=2.4)) offset = -offset;
PORTD = 0xAA; //1010 1010
_delay_ms(t);
PORTD = 0x55; //0101 0101
_delay_ms(period-t);
(2) t = t + offset; <--- TA INSTRUKCJA ZMIENIA OKRES PETLI
}
}
Program prawidłowo dodaje offset w miejscu (1). Po odkomentowaniu instrukcji (1) t zostaje zwiększone prawidłowo.
Problem pojawia się natomiast gdy t jest zmieniane w pętli np. w miejscu (2). Wówczas występuje to "przesunięcie" i rozciągniecie okresów.
Procesor ustawiony jest na zewnętrzny kwarc o częstotliwości 4MHz.
Stawiam pierwsze kroki w programowaniu AVR i będę wdzięczny za wyjaśnienie tej anomalii