Witam
Piszę program, który ma sterować wypełnieniem PWM. Timer 1 skonfigurowałem następująco.
Problem dla mnie pojawił się ze zrozumieniem wektorów przerwań które obsługują timer1. W dokumentacji jest tabela na stronie 46
http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf
Do obsługi Timera1 są 4 wektory i nie wiem, które aktywować, co wpisać w procedurze odwołującej się, czy w ogóle jest taka potrzebna. Czy wystarczy tylko uruchomić te przerwanie i sygnał będzie generowany automatycznie ?
Kolejna sprawa podczas pisania programu potrzebowałem wykonać następujące działanie w przerwaniu Int0.
Podczas debugowania, okazywało się, że takie działanie wpisuje jakieś pierdoły do r16 i r17 mimo tego, że zmienna pwm była wcześniej wyzerowana w bajcie młodszym i starszym. Konkretnie kompilator pokazywał w rejestrze r17 = 0x06
Dopiero takie działanie wpisywało do rejestrów wartości prawidłowe
Czyli wpisywanie wartości z adresu, a nie przez zmienną. Skąd wynika ta różnica ? Czy to kompilator coś przekombinował, a praktycznie to nie ma znaczenia, albo przyczyna leży w czym innym ? Teoretycznie nie powinno być różnicy, ale avr studio pokazuje co innego.
ps. wiem, że są tematy w dziale na ten temat. Przeczytałem wiele, ale nic nie wyczytałem co z tymi wektorami przerwań.
Piszę program, który ma sterować wypełnieniem PWM. Timer 1 skonfigurowałem następująco.
Cytat:;konfiguracja rej TRCA1, TRCB1 zgodnie z mode 8 w nocie katalogowej Tabela 39,
; preskaler 8 kwarc 8Mhz. Zliczenie 1600 impulsów daje częstotliwośc 5kHz
ldi r16 , ((1<<WGM13) | (0<<CS12) | (1<<CS11) | (1<<Cs10))
out TCCR1B , r16 ; wpisanie zawartosci r16 do TRCB1
ldi r16 , ((0<<WGM11)|(0<<WGM10)) ; praca w trybie Fast PWM WGM11 = 0 , WGM10 = 1
out TCCR1A , r16 ; zapisz konfiguracje do rejestru
; mode 8 powoduje, że wartośc wypelnienia będzie w rejestrze ICR1A
; Timer1 bedzie zliczał do wartości z rejestru OCR1A
ldi r16,low(1600) ; jako że rejestr OCR1A składa się z LMB i HMB
ldi r17,high(1600) ; potrzeba dwoch rej roboczych do zaladowania jego wartosci
out OCR1AL, r16
out OCR1AH, r17
Problem dla mnie pojawił się ze zrozumieniem wektorów przerwań które obsługują timer1. W dokumentacji jest tabela na stronie 46
http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf
Do obsługi Timera1 są 4 wektory i nie wiem, które aktywować, co wpisać w procedurze odwołującej się, czy w ogóle jest taka potrzebna. Czy wystarczy tylko uruchomić te przerwanie i sygnał będzie generowany automatycznie ?
Kolejna sprawa podczas pisania programu potrzebowałem wykonać następujące działanie w przerwaniu Int0.
Cytat:
ldi r16 , low(pwm) ; zmienna pwm to 2 bajtowa liczba określa wypełnienie
ldi r17 , high(pwm)
ldi r18 , low(1600) ; zapis stałej 1600
ldi r19 , high(1600)
cp r16 , r18 ; porównanie z przeniesieniem
cpc r17 , r19
Podczas debugowania, okazywało się, że takie działanie wpisuje jakieś pierdoły do r16 i r17 mimo tego, że zmienna pwm była wcześniej wyzerowana w bajcie młodszym i starszym. Konkretnie kompilator pokazywał w rejestrze r17 = 0x06
Dopiero takie działanie wpisywało do rejestrów wartości prawidłowe
Cytat:
lds r16 , 0x60 ; zapis zmiennej pwm dwu bajtowej do rej. roboczych przez adr
lds r17 ,0x61 ;
ldi r18 , low(1600) ; zapis stałej 1600 rej roboczych
ldi r19 , high(1600)
cp r16 , r18 ; porównanie z przeniesieniem
cpc r17 , r19
Czyli wpisywanie wartości z adresu, a nie przez zmienną. Skąd wynika ta różnica ? Czy to kompilator coś przekombinował, a praktycznie to nie ma znaczenia, albo przyczyna leży w czym innym ? Teoretycznie nie powinno być różnicy, ale avr studio pokazuje co innego.
ps. wiem, że są tematy w dziale na ten temat. Przeczytałem wiele, ale nic nie wyczytałem co z tymi wektorami przerwań.
