Witam
Mam problem ze zrozumieniem kodu, oraz ze znalezieniem błędu w nim. Program (jak w temacie) napisany na ATmega8, ma służyć do generowania przebiegu sinusoidalnego za pomocą PWM z filtrem uśredniającym na wyjściu.
Oto kod programu:
Wiem że to jakaś operacja na tablicy, ale prosiłbym o dokładne wytłumaczenie.
Ponadto podczas generowania sinusa wyskakuje w pewnym momencie przerwa w generacji sygnału (tak jakby cofnięcie się do wcześniejszego elementu w tablicy). Byłbym wdzięczny za podanie powodu takiego zachowania. Z góry dziękuję za odpowiedź.
Proszę używać znaczników [code] - uzupełniłem.
[zumek]
Mam problem ze zrozumieniem kodu, oraz ze znalezieniem błędu w nim. Program (jak w temacie) napisany na ATmega8, ma służyć do generowania przebiegu sinusoidalnego za pomocą PWM z filtrem uśredniającym na wyjściu.
Oto kod programu:
.INCLUDE "m8def.inc"
.CSEG
.ORG $0400
SINUS: .db 128, 136, 144, 152, 160, 168, 175, 182, 190, 197, 203, 210, 216, 221, 227, 232, 236, 240, 244, 247, 250, 252, 254, 255, 256, 256, 256, 255, 254, 252, 250, 247, 244, 240, 236, 232, 227, 221, 216, 210, 203, 197, 190, 182, 175, 168, 160, 152, 144, 136, 128, 120, 112, 104, 96, 88, 81, 74, 66, 59, 53, 46, 40, 35, 29, 24, 20, 16, 12, 9, 6, 4, 2,1,0,0,0,1,2,4,6,9,12,16,20,24,29,35,40,46,53,59,66,74,81,88,96,104,112,120
.ORG $0000 ;reset
RJMP RESETaddr ;skok do programu po resecie
.ORG $0009
RJMP T0OVF ;skok do podprogramu z obsługą przerwania po przepełnieniu timera0
.ORG $0013
RESETaddr: LDI R16,High(RAMEND)
OUT SPH,R16
LDI R16,Low(RAMEND)
OUT SPL,R16
LDI R16,1
OUT SFIOR,R16
SBI DDRB,1
LDI R17,0x00
OUT OCR1AH,R17
LDI R17,0x00
OUT OCR1AL,R17
LDI R17,0x81
OUT TCCR1A,R17
LDI R17,0x09
OUT TCCR1B,R17
LDI R16,1
OUT TCCR0,R16
LDI R16,1
OUT TIMSK,R16
SEI
LDI R18,100
LDI ZH,high(SINUS<<1)
LDI ZL,low(SINUS<<1)
KONIEC: RJMP KONIEC
T0OVF: LPM R16,Z+
LDI R17,0x00
OUT OCR1AH,R17
OUT OCR1AL,R16
CPSE R18,ZL
RETI
LDI ZH,high(SINUS<<1)
LDI ZL,low(SINUS<<1)
RETI
Nie rozumiem tych instrukcji:
LDI ZH,high(SINUS<<1)
LDI ZL,low(SINUS<<1)
Wiem że to jakaś operacja na tablicy, ale prosiłbym o dokładne wytłumaczenie.
Ponadto podczas generowania sinusa wyskakuje w pewnym momencie przerwa w generacji sygnału (tak jakby cofnięcie się do wcześniejszego elementu w tablicy). Byłbym wdzięczny za podanie powodu takiego zachowania. Z góry dziękuję za odpowiedź.
Proszę używać znaczników [code] - uzupełniłem.
[zumek]
