Witam...Dlaczego przerwania z Timera0 generowane nie sa zgodnie z dokumentacja? chciałbym zrealizować generator sterujący pinami portu PC0-7...w taki sposób aby wartości z tabeli --- unsigned char GenTab[12]; ---- były kolejno podawane na port PC z kazdym przerwaniem TIMERA0....
wiec na poczatku w main() wykonuje ponizsze instrukcje :
wiec dla kazdego przerwania dla portu C wpisywany jest kolejny bajt tabeli oraz bit0 portuD powinien generowac fale prostokatna polowe czestotliwosc zegara 16MHz?...
ATMega32 jest taktowana kwarcem zewnętrznym 16MHz...i teraz moje pytanie:
Dlaczego generowany sygnal mierzony oscyloskopem na bit(0) portuD ma czestotliwość 250kHz...skoro przerwanie powinno byc generowane przy TCNT0==0xFF
? przy obsludze kazdego przerwania ustawiam TCNT0 na 0xFE a OCR0 jest 0xFF..wiec po jednej imkrementacji licznika powinno byc generowane przerwanie?
250KHz probek z tablicy o dlugosci 12 to jest jakies 21KHz.....!! jak to zwiekszyc??
wystarczyloby aby przerwanie bylo wykonywane ok 500kHz dla zegara 16MHz...to by zostalo kilka cykli dla wyswietlacz i klawiatury...
a potrzebuje zrobic 3 kanalowy , analogowy (dokladnosc 2bit - na drabince R) generator fali prostokatnej z modulowana szerokoscia impulsu. Zmiana czestotliwosci dla kazdego kanalu niezalezna...jak juz uda sie wykonac przerwanie 500 razy/s to chyba kolejne kanaly beda zrealizowane niezaleznie...
generator raczej lepiej jak jest na przerwaniach gdyz obsuguje jeszcze w main wyswietlacz i klawiature.
Nie wiem czy mam dobrze skonfigurowane rejestry timera0 bo wyswietlacz podlaczony do portu B gdzie jest pin OCR0 czasami wywala krzaki gdy zmienam warotsc TCNT0 chcac regulowac czestotliwosc...dziwne jest to, ze od TCNT0=255 do 216 klawiatura reaguje wolniej a wyswietlacz prawidlowo....jak zmieniam TCNT0 ponizej 216 to odczyt klawiatury w main() smiga max szybko a wyswietlacz sie wykrzacza....
Prosze bardzo o pomoc bo juz kolejna analiza dokumentacji Atmegi32 nie przyniosla rezultatu.....jak powinienem ustawic rejesrtry i jak zmieniac TCNT0 aby przerwania byly wywolywane najszybciej...
wiec na poczatku w main() wykonuje ponizsze instrukcje :
DDRC = 0xFF; // port C jako wyjscie 11111111
CLI(); //disable all interrupts
TIMSK = 0x01; //timer interrupt sources
TCCR0 = 0x00; //stop
OCR0 = 0xFF;
TCNT0 = 0xFE;//set count
TCCR0 = 0x01; //start timera bez prescalera clock zegara
SEI(); //re-enable interrupts
taki kod wywoluje przerwanie dla Timera0...a procedura obslugi jest taka:
#pragma interrupt_handler timer1_ovf_isr:12
void timer1_ovf_isr(void)
{
TCNT0 = 0xFE; //reload counter value
Licznik++;
if (Licznik>11) Licznik=0;
PORTC = GenTab[Licznik];
PORTD ^= BIT(0); // !! to tak dodatkowo by zmierzyc czestotliwosc na oscyloskopie
}
wiec dla kazdego przerwania dla portu C wpisywany jest kolejny bajt tabeli oraz bit0 portuD powinien generowac fale prostokatna polowe czestotliwosc zegara 16MHz?...
ATMega32 jest taktowana kwarcem zewnętrznym 16MHz...i teraz moje pytanie:
Dlaczego generowany sygnal mierzony oscyloskopem na bit(0) portuD ma czestotliwość 250kHz...skoro przerwanie powinno byc generowane przy TCNT0==0xFF
? przy obsludze kazdego przerwania ustawiam TCNT0 na 0xFE a OCR0 jest 0xFF..wiec po jednej imkrementacji licznika powinno byc generowane przerwanie?
250KHz probek z tablicy o dlugosci 12 to jest jakies 21KHz.....!! jak to zwiekszyc??
wystarczyloby aby przerwanie bylo wykonywane ok 500kHz dla zegara 16MHz...to by zostalo kilka cykli dla wyswietlacz i klawiatury...
a potrzebuje zrobic 3 kanalowy , analogowy (dokladnosc 2bit - na drabince R) generator fali prostokatnej z modulowana szerokoscia impulsu. Zmiana czestotliwosci dla kazdego kanalu niezalezna...jak juz uda sie wykonac przerwanie 500 razy/s to chyba kolejne kanaly beda zrealizowane niezaleznie...
generator raczej lepiej jak jest na przerwaniach gdyz obsuguje jeszcze w main wyswietlacz i klawiature.
Nie wiem czy mam dobrze skonfigurowane rejestry timera0 bo wyswietlacz podlaczony do portu B gdzie jest pin OCR0 czasami wywala krzaki gdy zmienam warotsc TCNT0 chcac regulowac czestotliwosc...dziwne jest to, ze od TCNT0=255 do 216 klawiatura reaguje wolniej a wyswietlacz prawidlowo....jak zmieniam TCNT0 ponizej 216 to odczyt klawiatury w main() smiga max szybko a wyswietlacz sie wykrzacza....
Prosze bardzo o pomoc bo juz kolejna analiza dokumentacji Atmegi32 nie przyniosla rezultatu.....jak powinienem ustawic rejesrtry i jak zmieniac TCNT0 aby przerwania byly wywolywane najszybciej...
