Forum: Mikrocontroller und Digitale Elektronik Mega8 2.PWM Problem


von Sebastian F. (snake080)


Lesenswert?

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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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

von Sebastian F. (snake080)


Lesenswert?

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...

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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

von Sebastian F. (snake080)


Lesenswert?

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
Noch kein Account? Hier anmelden.