Forum: Mikrocontroller und Digitale Elektronik 10-Bit Soft-PWM geht nicht


von Robin T. (rotoe) Benutzerseite


Angehängte Dateien:

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

von Karl H. (kbuchegg)


Lesenswert?

Verrätst du mir, was du eigentlich mit pwm_count1 und pwm_count2 
bezweckst? Warum multiplizierst du die beiden? Und warum erhöhst du die 
beiden so seltsam im Compare Interrupt?

von Karl H. (kbuchegg)


Lesenswert?

Ach, jetzt versteh ich.
Du willst auch gleich noch ein Fading mit einbauen.

Vorschlag: Bring erst mal die normale PWM zum laufen.

von Robin T. (rotoe) Benutzerseite


Lesenswert?

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.

von Robin T. (rotoe) Benutzerseite


Lesenswert?

Normale PWM? Wenn du damit den Timer meinst das hab ich schon. Die 8 Bit 
Soft-PWM könnt ich mal machen haste recht.

von Karl H. (kbuchegg)


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!

von Robin T. (rotoe) Benutzerseite


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.

von Karl H. (kbuchegg)


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!

von Robin T. (rotoe) Benutzerseite


Lesenswert?

Hhmm. Stimmt ich hätte das ganze etwas Binärer betrachten sollen.

Danke dir

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.