-
        

Ergebnis 1 bis 6 von 6

Thema: Softwar PWM

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    19.02.2005
    Alter
    29
    Beiträge
    470

    Softwar PWM

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hi leute, ich hab mit die aufgabe gestellt einen erweiterbaren ( Kannäle ) Soft-PWM zu schrieben, hier mal mein ergebnis:

    Code:
    ;µC-Typ bestimmen
    
    .include "2313def.inc"                ; AT90S2313
    
    
    ;Register definition
    
    .def tmp = r16                        ; Allgem. Arbeitsregister
    .def pwm = r17                        ; PWM Vergleichswert
    .def cout = r18                       ; Zähler
    
    ;Interupt Config. I 
    
    .org 0000 
    rjmp start 
    
    .org OVF1addr                         ; Sprungvektoren einrichten
    rjmp ovf1 
    
    Start:
     
    ;IO Config.
    
    ldi tmp, (1<<PB0)                     ; Pinb.0 als Ausgan setzen
    out ddrb, tmp
    
    
    ;Interupt Config II 
    
    ldi tmp, (1<<TOIE1)                   ; Timer1 Interrupt 
    out timsk, tmp                        ; aktivieren
    
    clr tmp                               ; TCCR1 High auf 0
    out tccr1a,tmp
     
    ldi tmp,(1<<ICNC1)|(1<<CS10)          ; Noiscanceler deaktiv.
    out tccr1b,tmp                        ; Timer1 Clock = Clock
    
    ldi tmp,0xff                          ; Timervorgabewerte:
    out tcnt1h, tmp                       ; Highbyte= 0xff
    ldi tmp,0xfa                          ; Lowbyte = 0xfa
    out tcnt1l, tmp    
    
    sei                                   ; Interuptts freigeben
    
    
    ;Hauptprogramm
    
    main:
    ldi pwm, 255
    rjmp main
    
    
    ;Timer1 Overflow Interrupt
    
    ovf1:
      push tmp
      in tmp, sreg
      push tmp
    
      
      ldi tmp,0xff                        ; Timervorgabewerte:
      out tcnt1h, tmp                     ; Highbyte= 0xff
      ldi tmp,0xfa                        ; Lowbyte = 0xfa
      out tcnt1l, tmp     
    
      cpi cout,255
      brne notzero
      
      cbi portb, pinb0
      
      notzero:
      cp cout,pwm
      brne noteq
    
      sbi portb, pinb0
      
      noteq:
      dec cout                             ; Zählerwert erhöhen
    
      
      pop tmp
      out sreg,tmp
      pop tmp
    reti
    Jetztz das prob, ich kann ja nur geringe PWM frequenzen erzeugen, gäbs ne bessere Lösung? Wie ist mein Code? Kann man noch was verbessern?

    Grezzles teslanikola

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    Jo, es gibt bessere Lösungen.
    Deine Routine der PWM Erzeugung doch etwas ineffizient.

    hier mal nen kleines Beispiel, wie man es noch machen könnte:

    Code:
    clr output
    cp cout, pwm
    ror output
    out PORTB, output
    Soll das ganze nun nichtinvertiert ausgegeben werden, sind lediglich 2 weitere Zeilen fällig:

    Code:
    clr output
    cp cout, pwm
    ror output
    com output
    andi output,0b00000001
    out PORTB, output
    Diese Beispiele gelten allerdings nur, wenn wenn der Rest des Ports nicht belegt ist oder als Eingang definiert wurde (wie in diesem Fall)

    Desweiteren hat der Code den Nachteil, das das ganze mit den Werten 0 & 255 nicht so recht funktionieren dürfte ...
    Allerdings kann man damit auch mal eben ne 8 Kanal Software PWM realisieren ...

    BTW: leg dir nen Tiny 2313 zu .. damit wirste mehr freude haben ... der AT90S2313 zählt zu den Chips, die nicht mehr für neue Designs verwendet werden sollten.


    Grüße, da Hanni.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    19.02.2005
    Alter
    29
    Beiträge
    470
    BTW: leg dir nen Tiny 2313 zu .. damit wirste mehr freude haben ... der AT90S2313 zählt zu den Chips, die nicht mehr für neue Designs verwendet werden sollten.
    hmm wenn du ca. 15 90s2313 rumfahren hättest und du dich mit deren Registern und so schon einigermansen auskennst was würdest du machen? Sie wegschmeißen? Jo klar das es den Tiny gibt aber ich werde da wohl erst noch meine 2313er verschaffen, befohr ich mir neue kaufe.

    Danke für deinen Tipp, die ROR befehl kannte ich noch nicht.

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    Hehe, kein Problem ... diese Variante hab ich auch in nem Forum gefunden, wieso also net weitergeben

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.02.2005
    Ort
    Erfurt
    Alter
    52
    Beiträge
    134
    Habe gerade zu diesem Thema etwas veröffentlicht:

    http://www.mikrocontroller.net/forum/read-4-335961.html

    Bei 16 MHz Takt eine 40KHz PWM, allerdings ohne Timer, denn der bremst zu stark, braucht zu viele Takte.

    Bernhard

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    Mag sein ... nur, in den seltensten fällen brauch ich nur ne PWM ...
    Übrigens, ne reine Hardware PWM schafft beim Mega 8 @ 16 MHz immernoch 62.5 kHz ....

    Im übrigen geht es hier ja nicht nur um einen Kanal ... wo du sicherlich überlegen bist (von der Frequenz her) sondern um was erweiterbares ...
    Ich kann von mir zumindest behaupten, das meine PWM mit 8 Kanälen immernoch mit der selben Frequenz läuft ....

    BTW: welche Auflösung hat deine PWM (also wieviele Schritte)

    Nachtrag: Wenn man wirklich ne richtig schnelle PWM braucht kann man diverse Tinys verwenden, die dicke 400 kHz schaffen ...

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •