www.mikrocontroller.net

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


Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach, jetzt versteh ich.
Du willst auch gleich noch ein Fading mit einbauen.

Vorschlag: Bring erst mal die normale PWM zum laufen.

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.
timer1_compare:
    push temp
    in temp, SREG
    push temp

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

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

int_ende:    
    pop temp
    out SREG, temp
    pop temp
    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!

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hhmm. Stimmt ich hätte das ganze etwas Binärer betrachten sollen.

Danke dir

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.