www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Software-PWM


Autor: Andy11 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe jetzt eine Software-PWM geschrieben und weiß nicht warum sie 
nicht funktioniert:

;**********************************Header**************************************
;* Projektname:                                  *
;* Name des Erstellers:                              *
;* Zuletzt aktualisiert:                            *
;*                                        *
;*                                        *
;******************************************************************************


;*****************************Initialisierungen********************************
.include "m16def.inc" ;Definitionsdatei des Mega16

;Stackpointer-init***********
  ldi r16, High(Ramend)
  out SPH, r16

  ldi r16, Low(Ramend)
  out SPL, r16

;ADC-init***********

;*****************Deklarierete Funktionen und Subroutinen**********************

;*************************Variablendeklarationen*******************************

;*****************************Ein-Ausgänge*************************************
  ser r16      ;Setze Registerinhalt auf 255 (ldi r16, 255)
  out DDRB, r16   ;Portb als Ausgabeport

;******************************************************************************

clr r16 
;*****************************Hauptprogramm************************************
Hauptprogramm:
Rauf:  inc r16        ;Zähler raufzählen
    
    cpi r16, 127
    brsh setzeBit    ;wenn r16 >= 127 ist dann setze Bits in PORTB 
    
    cpi r16, 255    ;Vergleiche ob Zahl schon maximum
    brne Rauf       ;wenn nein dann zähle weiter hoch
  
Runter:  dec r16        ;wenn ja dann zähle runter

    cpi r16, 127
    brlo loescheBit    ;wenn r16 <= 127 ist dann lösche Bits in PORTB 

    cpi r16, 0      ;Vergleiche ob 0
    brne Runter      ;wenn nicht null dann zählew weiter runter

jmp Hauptprogramm      ;wenn null dann fang wieder neu an


;***********************Unterprogramme/Funktionen******************************

setzeBit:
  push r16
    ldi r16, 255
    out PORTB, r16
  pop r16
ret

loescheBit:
  push r16
    ldi r16, 0
    out PORTB, r16
  pop r16
ret


Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Unterprogramme werden nicht mit branch bzw. jump angesprungen, 
sondern mit call aufgerufen... :-o
Nur dann funktioniert auch der ret

Warum zählst du rauf und runter?
PWM wird üblicherweise so gemacht: ein Zähler zählt von 0 bis zum 
Endwert. Solange der Zähler kleiner ist als ein Grenzwert, wird eine 1 
ausgegeben, sonst eine 0.

Autor: Andy11 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Unterprogramme werden nicht mit branch bzw. jump angesprungen,
>sondern mit call aufgerufen... :-o
>Nur dann funktioniert auch der ret
;**********************************Header**************************************
;* Projektname:                                  *
;* Name des Erstellers:                              *
;* Zuletzt aktualisiert:                            *
;*                                        *
;*                                        *
;******************************************************************************


;*****************************Initialisierungen********************************
.include "m16def.inc" ;Definitionsdatei des Mega16

;Stackpointer-init***********
  ldi r16, High(Ramend)
  out SPH, r16

  ldi r16, Low(Ramend)
  out SPL, r16

;ADC-init***********

;*****************Deklarierete Funktionen und Subroutinen**********************

;*************************Variablendeklarationen*******************************

;*****************************Ein-Ausgänge*************************************
  ser r16      ;Setze Registerinhalt auf 255 (ldi r16, 255)
  out DDRB, r16   ;Portb als Ausgabeport

;******************************************************************************

clr r16 
;*****************************Hauptprogramm************************************
Hauptprogramm:

Rauf:  inc r16        ;Zähler raufzählen
    
    cpi r16, 250
    brsh setzeBit    ;wenn r16 >= 127 ist dann setze Bits in PORTB 

Weiter1:
    
    cpi r16, 255    ;Vergleiche ob Zahl schon maximum
    brne Rauf       ;wenn nein dann zähle weiter hoch
  
Runter:  dec r16        ;wenn ja dann zähle runter

    cpi r16, 250
    brlo loescheBit    ;wenn r16 <= 127 ist dann lösche Bits in PORTB 

Weiter2:

    cpi r16, 0      ;Vergleiche ob 0
    brne Runter      ;wenn nicht null dann zählew weiter runter

jmp Hauptprogramm      ;wenn null dann fang wieder neu an


;***********************Unterprogramme/Funktionen******************************

setzeBit:
  push r16
    ldi r16, 255
    out PORTB, r16
  pop r16
jmp Weiter1

loescheBit:
  push r16
    ldi r16, 0
    out PORTB, r16
  pop r16
jmp Weiter2


so funktioniert es aber

>Warum zählst du rauf und runter?
>PWM wird üblicherweise so gemacht: ein Zähler zählt von 0 bis zum
>Endwert. Solange der Zähler kleiner ist als ein Grenzwert, wird eine 1
>ausgegeben, sonst eine 0.

das wäre natürlich auch eine möglichkeit, ich hab das hier bildlich dem 
timer nachgeschrieben, timer zählt mit frequenz rauf und mit frequenz 
runter

jedoc dnke für deinen Einwand, das hat mir zum Lösungsweg verholfen

lg andy

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum verwendest du nicht eines der anderen Register?
;**********************************************************************
clr r16 
clr r0        ; alles 0
ser r1        ; alles 1
;***********************Hauptprogramm**********************************
Hauptprogramm:

Rauf:  inc r16        ;Zähler raufzählen
    cpi r16, 250
    brlo Weiter1    ;wenn r16 >= 127 ist dann setze Bits in PORTB !!!!!!!! falscher Kommentar !!!!!
                    ;!!!!! Zahlenwerte niemals in Kommentare schreiben  !!!!!!!!!!!!!
    out PORTB, r1
Weiter1:
    cpi r16, 255    ;Vergleiche ob Zahl schon maximum
    brne Rauf       ;wenn nein dann zähle weiter hoch
  
Runter:  dec r16        ;wenn ja dann zähle runter
    cpi r16, 250
    brsh Weiter2    ;wenn r16 <= 127 ist dann lösche Bits in PORTB 
    out PORTB, r0
Weiter2:
    cpi r16, 0      ;Vergleiche ob 0
    brne Runter      ;wenn nicht null dann zählew weiter runter

jmp Hauptprogramm      ;wenn null dann fang wieder neu an

Autor: Andy11 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Warum verwendest du nicht eines der anderen Register?

ist es denn nicht besser wenn ich mit einem auskomme?
außerdem find ich es ist übersichtlicher

lg andy

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ist es denn nicht besser wenn ich mit einem auskomme?
Du hast die anderen Register auch gekauft und mitbezahlt. Warum solltest 
du sie dann nicht verwenden? Oder verwendest du im Auto auch nur den 3. 
Gang?  :-o

> außerdem find ich es ist übersichtlicher
Naja....
BTW: C-Compiler machen es gerne auch so, dass Register mit "üblichen" 
Werten vorbelegt werden. In deinem Programm sind 0x00 und 0xFF "üblich".

Autor: Andy11 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Du hast die anderen Register auch gekauft und mitbezahlt. Warum solltest
>du sie dann nicht verwenden? Oder verwendest du im Auto auch nur den 3.
>Gang?  :-o

ich werde auch nicht mein ganzes Leben nur diesen einem Programm witmen, 
da gibt es auch umfangreichere Sachen und daher mein einwand!

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.