Guten morgen,
ich versuche auf einem AtMega8 2 PWM zum laufen zu bekommen. Die erste
funktioniert einwandfrei. Bei dem 2. Kanal klappt das irgendwie nicht.
Alle möglichen Varianten und suchen waren bisher Erfolglos. Vielleicht
kann mir jemand den Fehler sagen.
Es soll für den 2. Kanal einfach ein NTC ausgelesen und der Wert in das
Register geschrieben werden. Ich lasse mir den Wert auf nem Display
anzeigen. Das passt auch. Nur wird der Wert nicht vernünftig übergeben.
Wenn allerdings in "luftaus" oder "luftvoll" gesprungen wird passt es...
nur eben die Regelung nicht...
Initialisierung:
pwmset1:
ldi temp1, 0b10000010
out TCCR1A, temp1
ldi temp1, 0b00011001
out TCCR1B, temp1
;
ldi temp1, 0x00
out ICR1H, temp1
ldi temp1, 0xff
out ICR1L, temp1
;
ldi temp1, 0x00
out OCR1AH, temp1
ldi temp1, 0x30
out OCR1AL, temp1
pwmset2:
ldi temp1, 0b01101001
out TCCR2, temp1
;
ldi temp1, 0xfe
out OCR2, temp1
--------------------------------
luft:
sbi PORTC,4
ldi temp1, 0b11100101
out ADMUX, temp1
sbi ADCSRA, ADSC
luft1:
sbis ADCSRA, ADIF
rjmp luft1
in ZH, ADCH
mov temp1, ZH
mov temp2, temp1
subi temp1, 0xa0
brcc luftaus
clz
clc
mov temp1, temp2
subi temp1, 0x46
brcs luftvoll
mov temp2,temp1
add temp1, temp2
add temp1, temp2
com temp1
mov temp2, temp1
rcall lcd_clear
rcall lcd_number
mov temp1, temp2
out OCR2, temp1
clc
ret
luftaus:
ldi temp1, 0x01
out OCR2, temp1
clc
ret
luftvoll:
cbi PORTC,4
ldi temp1, 0xfe
out OCR2, temp1
clc
ret
Was berechnest du hier?
1 | mov temp2,temp1 ; <=== Fischig! temp2 = adcwert - 0x46 |
2 | ; erwarte mov temp1,temp2 |
3 | add temp1, temp2 ; temp1 += (adcwert - 0x46) |
4 | add temp1, temp2 ; temp1 += (adcwert - 0x46) |
5 | com temp1 ; temp1 = ~temp1 ??? |
6 | mov temp2, temp1 ; temp1 retten? |
7 | ; Ausgabe temp1 (was passiert mit temp2 in den lcd_...?) |
8 | mov temp1, temp2 ; temp1 restaurieren? |
9 | out OCR2, temp1 |
Hi, zuerst sichere ich meinen adc wert in temp2 durch die vorherige subtraktion habe ich maximal einen Wert von 70d. Mit nem Faktor 3 komme ich so auf 210d. Ich habe also den 8-Bit Bereich so ca abgedeckt. Für nen Lüfter reicht das schon. Die letzten beiden mov sind nur um 100% sicherzugehen, dass nirgends irgendwas verfälscht wird oder anderer Fehler sind. Normalerweise bräuchten die nicht rein...
Also Zwischenstand zusammengefasst: Der Wert für die 2. PWM wird nach deinen Beobachtungen bzw. Ausgabe in lcd_... richtig berechnet (max. 210d) und er wird in OCR2 gesetzt, aber es wird keine PWM erzeugt. An welchem Portpin soll die PWM erzeugt werden und ist der Portpin richtig initialisiert? Wie kontrollierst du, ob eine PWM erzeugt wird? Sind diese Bitmonster bereits kontrolliert? 0b10000010 ; TCCR1A 0b00011001 ; TCCR1B 0b01101001 ; TCCR2
Die PWM wird an PB3 ausgegeben. Das lustige ist: Jetzt funktioniert's!? Ich habe nur den OCR2 Wert nach schreiben ausgelesen und aufs Display ausgegeben...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.