10-Bit Soft-PWM geht nicht

OP Persönliche Seite #1455734
Lesenswert?

Hallo Leute,

aus Langerweile versuche ich mal wieder Assembler zu lernen :)
Nun habe ich als "kleine" Übung mal versucht eine 10-Bit Software PWM zu 
programmieren. Leider funktioniert das nicht wirklich wie 
gewollt...quasi garnicht.

Momentan ist es so dass alle drei Kanäle (LEDs) komplett hell leuchten.

Vieleicht wäre ja einer von euch so nett mal nen kurzen Blick über mein 
Programm zu werfen.


Danke schonmal
Angehängte Dateien:
#1455785
Lesenswert?

Robin Tönniges schrieb:
> Ich hatte das so gedacht das ich pwm_count1 bis zum Überlauf zählen
> lasse also 255 und dann pwm_count2 erhöre das ganze 4 mal also 1023 =>
> 10 Bit.

Äh nein.
Deine Compare ISR macht ganz was anderes und wozu du dann in der anderen 
ISR die beiden miteinander multiplizierst erklärt das auch noch immer 
nicht.

Lass doch den einen Counter von 0 bis 255 zählen.
Wenn dann 255 überschritten wird, wird der Counter wieder auf 0 gesetzt 
und dafür der andere um 1 höher.

Die beiden Register gehören zusammen! Nur gemeinsam bilden sie ein 16 
Bit Register. Du brauchst nichts anderes tun als den Übertrag von einem 
Register in das andere mit einzurechnen und das wars. Gewöhnlich benutzt 
man dazu das Carry Bit, denn das wird von der inc bzw add Operation 
automatisch beim Überlauf gesetzt.
1
timer1_compare:
2
    push temp
3
    in temp, SREG
4
    push temp
5

6
  ; das 16 Bit Register pwm_count  um 1 erhöhen
7
    add pwm_count1, 1
8
    adc pwm_count2, 0
9

10
    cpi pwm_count2, 4   ; Überlauf ins 'elfte' Bit?
11
    bne int_ende        ; wenn nein -> alles fertig
12
    clr pwm_count1      ; wenn ja, zurücksetzen
13
    clr pwm_count2
14

15
int_ende:    
16
    pop temp
17
    out SREG, temp
18
    pop temp
19
    reti

Du möchtest dir vielleicht auch überlegen, dass man beim Ausstieg aus 
einer Funktion den Stack wieder so hinerlassen sollte, wie man ihn 
vorgefunden hat. Insbesondere muss alles was man selber auf den Stack 
geschoben hat auch wieder von dort runterholen. Und zwar in allen 
Fällen!
OP Persönliche Seite #1456033
Lesenswert?

Karl heinz Buchegger schrieb:
> Lass doch den einen Counter von 0 bis 255 zählen.
> Wenn dann 255 überschritten wird, wird der Counter wieder auf 0 gesetzt
> und dafür der andere um 1 höher.

Ich dachte das ich genau das tue :)
Zumindest wollte ich das.
Aber ok das mit dem Add with Carry leuchtet mir ein ich werde es 
versuchen.

P.S.: Multipliziert habe ich die beiden Zahlen um die 10-Bit Zahl zu 
bekommen.
#1456406
Lesenswert?

Robin Tönniges schrieb:

> P.S.: Multipliziert habe ich die beiden Zahlen um die 10-Bit Zahl zu
> bekommen.

Die hast du doch schon. Die steht in den Registern pwm_count1 und 
pwm_count2


Wenn du im Dezimalsystem 2 Stellen hast 8 und 7, von denen das eine die 
Zehner und das andere die Einer sind, dann lautet die komplette Zahl 87 
und nicht 8*7=56

Fass die beiden Register als 'Zehner' und 'Einer' auf. Bei dir laufen 
halt die Einer von 0 bis 255 und die Zehner von 0 bis 3. Aber das 
Prinzip ist dasselbe!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren