Tekkis vajadus programmijupi järele, mis tekitaks impulsslaiusmoduleeritud signaali. Seejuures peaksid olema nii sagedus kui ka suhteline lülituskestus muudetav. Et prescaler-st jääb sageduse muutmisel väheks ning võimalusel väldiks ka katkestusi taimer-loenduri "TOP"-väärtuse saavutamisel (katkestuse mõte seisneks mingisuguse väärtuse registrisse TCNTn kirjutamises vähendades antud viisil loendamise ulatust, mis omakorda suurendab PWM sagedust), oli plaanis kasutada 16-bitise taimer-loenduri registrit ICRn "TOP"-väärtuse omistamiseks.
Kirjutatud katse- ja kontrollotstarbeline programm on alljärgnev.
.include "m162def.inc"
.def Temp = r16
.def Temp1 = r17
.org 0x0000
rjmp Reset
Reset:
sbi DDRD, 5
ldi Temp1, 0b00000000
ldi Temp, 0b11001100
out ICR1H, Temp1
out ICR1L, Temp
ldi Temp, 0b11000010
ldi Temp1, 0b00000000
out OCR1AH, Temp1
out OCR1AL, Temp
ldi Temp, 0b11000010
out TCCR1A, Temp
ldi Temp, 0b00011001
out TCCR1B, Temp
rjmp Loop
Loop:
rjmp Loop
Lähtudes bittidest WGMn3:0 = 0b1110 peaks taimer-loendur lugema alates väärtusest "0" ("BOTTOM") kuni väärtuseni, mis paikneb registris IRC1L ("TOP" vastavalt tabelile "Waveform Generation Mode Bit Description", tabel 56, ATmega162 andmelehel) ning jätkama uuesti väärtusest "0". AVRStudio (ver. 4.12) simulatsioon aga näitab, et loendamine toimub väärtuseni 0b111111111 ning sealt tagasi nulli.
Antud toime vastab režiimile "PWM, Phase Correct, 9-bit" (WGMn3:0 = 0010). Seadistades bitid WGMn3:2 nulliks töötab programm vastavalt andmelehel kirjeldatule.
Kas on midagi olulist programmist välja jäänud (ehkki olen kasutatud registrite sisu mitu korda üle kontrollinud, ei välistaks ka "inimlikku süstemaatilist viga") või tõesti simuleerib AVRStudio vigaselt?
Kui kellelgi on ka mõistele timer/counter parem eestikeelne vaste kui "taimer-loendur", siis ei ütleks ka selle teada saamisest ära...
Kirjutatud katse- ja kontrollotstarbeline programm on alljärgnev.
.include "m162def.inc"
.def Temp = r16
.def Temp1 = r17
.org 0x0000
rjmp Reset
Reset:
sbi DDRD, 5
ldi Temp1, 0b00000000
ldi Temp, 0b11001100
out ICR1H, Temp1
out ICR1L, Temp
ldi Temp, 0b11000010
ldi Temp1, 0b00000000
out OCR1AH, Temp1
out OCR1AL, Temp
ldi Temp, 0b11000010
out TCCR1A, Temp
ldi Temp, 0b00011001
out TCCR1B, Temp
rjmp Loop
Loop:
rjmp Loop
Lähtudes bittidest WGMn3:0 = 0b1110 peaks taimer-loendur lugema alates väärtusest "0" ("BOTTOM") kuni väärtuseni, mis paikneb registris IRC1L ("TOP" vastavalt tabelile "Waveform Generation Mode Bit Description", tabel 56, ATmega162 andmelehel) ning jätkama uuesti väärtusest "0". AVRStudio (ver. 4.12) simulatsioon aga näitab, et loendamine toimub väärtuseni 0b111111111 ning sealt tagasi nulli.
Antud toime vastab režiimile "PWM, Phase Correct, 9-bit" (WGMn3:0 = 0010). Seadistades bitid WGMn3:2 nulliks töötab programm vastavalt andmelehel kirjeldatule.
Kas on midagi olulist programmist välja jäänud (ehkki olen kasutatud registrite sisu mitu korda üle kontrollinud, ei välistaks ka "inimlikku süstemaatilist viga") või tõesti simuleerib AVRStudio vigaselt?
Kui kellelgi on ka mõistele timer/counter parem eestikeelne vaste kui "taimer-loendur", siis ei ütleks ka selle teada saamisest ära...
Comment