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.