10-Bit Soft-PWM geht nicht

OP Persönliche Seite #1455734
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:
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
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.
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.