- Labornetzteil AliExpress         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 17 von 17

Thema: Mehrere Software Pwm auf einem µC

  1. #11
    Benutzer Stammmitglied
    Registriert seit
    22.03.2005
    Beiträge
    91
    Anzeige

    Praxistest und DIY Projekte
    So hatte eben mein o.g. Proggi mal für mein At90S8515 Board geändert mit dem selben Ergebnis wie auf dem Mega32

    habe dann nochmal ein altes Progg ausgegraben, das auch den Prescaler wert umschaltet und das funzt einwandfrei...

    Code:
    '16-bit Timer als Rechteckgenerator
    'mit Voreinstellung
    'Achtung: bei kleinen Zeiten ist die Zeit zur Rettung der Register nicht zu vernachlässigen
    'Nosave bringt, wenn möglich eine starke Verbesserung
    '$sim
    $regfile = "8515DEF.DAT"
    $crystal = 4000000
    
    'Hier werden die Variablen deklariert
    Dim Zaehler As Byte , Timervorgabe1 As Word , A As Byte
    
    'Hier werden die Variablen definiert
    
    Readeeprom A , 1                                            'read byte back
    If A = 255 Then
       A = 10
    End If
    Zaehler = 0
    
    
    'Hier wird der Timer und der Teiler festgelegt
    Config Timer0 = Timer , Prescale = 1024
    Config Timer1 = Timer , Prescale = 8
    
    'Der Portc wird als Ausgang programmiert
    Config Pinc.0 = Output
    Config Pinc.2 = Output
    Config Pinc.3 = Output
    Config Pinc.4 = Output
    Config Pinc.5 = Output
    Config Pinc.7 = Output
    Config Pind.7 = Input                                       'Taster_up
    Config Pind.6 = Input                                       'Taster_down
    Config Pind.4 = Input                                       'Taster_store
    
    Config Debounce = 40                                        'Tastenentprellung 25ms
    'Interne Pullup Widerstände einschalten
    Portd.7 = 1
    Portd.6 = 1
    Portd.4 = 1
    
    'Hier geben wir der Definition einen schöneren Namen
    Led0 Alias Portc.0
    Led2 Alias Portc.2
    Led3 Alias Portc.3
    Led4 Alias Portc.4
    Led5 Alias Portc.5
    Led7 Alias Portc.7
    
    
    'Hier wird das Unterprogramm festgelegt, das
    'in dem eingestellten Intervall aufgerufen wird
    On Timer0 Timer0_irq
    On Timer1 Timer1_irq
    
    'Diese Vorgabe wurde berechnet um die genaue Intervallfrequenz zu erreichen
    Const Timervorgabe0 = 61
    Timervorgabe1 = 45536
    
    'Hier werden die Timer aktiviert
    Enable Timer1
    Enable Timer0
    Enable Interrupts
    
    'Hier ist die Programmhauptschleife
    Do
     'Hauptprogramm
      Gosub Taster_up
      Gosub Taster_down
      Gosub Taster_store
    
      If A = 0 Then
       A = 1
      Elseif A = 1 Then
       Config Timer1 = Timer , Prescale = 256                   'Ausgabe 0,5Hz
       Timervorgabe1 = 49911
      Elseif A = 2 Then
       Config Timer1 = Timer , Prescale = 256                   'Ausgabe 1Hz
       Timervorgabe1 = 57724
      Elseif A = 3 Then
       Config Timer1 = Timer , Prescale = 256                   'Ausgabe 1,5Hz
       Timervorgabe1 = 60328
      Elseif A = 4 Then
       Config Timer1 = Timer , Prescale = 64                    'Ausgabe 2Hz
       Timervorgabe1 = 49911
      Elseif A = 5 Then
       Config Timer1 = Timer , Prescale = 64                    'Ausgabe 2,5Hz
       Timervorgabe1 = 53036
      Elseif A = 6 Then
       Config Timer1 = Timer , Prescale = 64                    'Ausgabe 3Hz
       Timervorgabe1 = 55119
      Elseif A = 7 Then
       Config Timer1 = Timer , Prescale = 64                    'Ausgabe 3,5Hz
       Timervorgabe1 = 56607
      Elseif A = 8 Then
       Config Timer1 = Timer , Prescale = 64                    'Ausgabe 4Hz
       Timervorgabe1 = 57724
      Elseif A = 9 Then
       Config Timer1 = Timer , Prescale = 64                    'Ausgabe 4,5Hz
       Timervorgabe1 = 58592
      Elseif A = 10 Then
       Config Timer1 = Timer , Prescale = 64                    'Ausgabe 5Hz
       Timervorgabe1 = 59286
      Elseif A = 11 Then
       Config Timer1 = Timer , Prescale = 64                    'Ausgabe 5,5Hz
       Timervorgabe1 = 59854
      Elseif A = 12 Then
       Config Timer1 = Timer , Prescale = 64                    'Ausgabe 6Hz
       Timervorgabe1 = 60327
      Elseif A = 13 Then
       Config Timer1 = Timer , Prescale = 64                    'Ausgabe 6,5Hz
       Timervorgabe1 = 60728
      Elseif A = 14 Then
       Config Timer1 = Timer , Prescale = 64                    'Ausgabe 7Hz
       Timervorgabe1 = 61072
      Elseif A = 15 Then
       Config Timer1 = Timer , Prescale = 64                    'Ausgabe 7,5Hz
       Timervorgabe1 = 61369
      Elseif A = 16 Then
       Config Timer1 = Timer , Prescale = 64                    'Ausgabe 8Hz
       Timervorgabe1 = 61630
      Elseif A = 17 Then
       Config Timer1 = Timer , Prescale = 64                    'Ausgabe 8,5Hz
       Timervorgabe1 = 61859
      Elseif A = 18 Then
       Config Timer1 = Timer , Prescale = 64                    'Ausgabe 9Hz
       Timervorgabe1 = 62064
      Elseif A = 19 Then
       Config Timer1 = Timer , Prescale = 64                    'Ausgabe 9,5Hz
       Timervorgabe1 = 62247
      Elseif A = 20 Then
       Config Timer1 = Timer , Prescale = 64                    'Ausgabe 10Hz
       Timervorgabe1 = 62411
      Elseif A = 21 Then
       Config Timer1 = Timer , Prescale = 64                    'Ausgabe 10,5Hz
       Timervorgabe1 = 62559
      Elseif A = 22 Then
       Config Timer1 = Timer , Prescale = 64                    'Ausgabe 11Hz
       Timervorgabe1 = 62695
      Elseif A = 23 Then
       Config Timer1 = Timer , Prescale = 64                    'Ausgabe 11,5Hz
       Timervorgabe1 = 62818
      Elseif A = 24 Then
       Config Timer1 = Timer , Prescale = 64                    'Ausgabe 12Hz
       Timervorgabe1 = 62932
      Elseif A = 25 Then
       Config Timer1 = Timer , Prescale = 64                    'Ausgabe 12,5Hz
       Timervorgabe1 = 63036
      Elseif A = 26 Then
       Config Timer1 = Timer , Prescale = 64                    'Ausgabe 13Hz
       Timervorgabe1 = 63132
      Elseif A = 27 Then
       Config Timer1 = Timer , Prescale = 64                    'Ausgabe 13,5Hz
       Timervorgabe1 = 63221
      Elseif A = 28 Then
       Config Timer1 = Timer , Prescale = 64                    'Ausgabe 14Hz
       Timervorgabe1 = 63304
      Elseif A = 29 Then
       Config Timer1 = Timer , Prescale = 64                    'Ausgabe 14,5Hz
       Timervorgabe1 = 63381
      Elseif A = 30 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 15Hz
       Timervorgabe1 = 48869
      Elseif A = 31 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 15,5Hz
       Timervorgabe1 = 49407
      Elseif A = 32 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 16Hz
       Timervorgabe1 = 49911
      Elseif A = 33 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 16,5Hz
       Timervorgabe1 = 50384
      Elseif A = 34 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 17Hz
       Timervorgabe1 = 50830
      Elseif A = 35 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 17,5Hz
       Timervorgabe1 = 51250
      Elseif A = 36 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 18Hz
       Timervorgabe1 = 51647
      Elseif A = 37 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 18,5Hz
       Timervorgabe1 = 52023
      Elseif A = 38 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 19Hz
       Timervorgabe1 = 52378
      Elseif A = 39 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 19,5Hz
       Timervorgabe1 = 52716
      Elseif A = 40 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 20Hz
       Timervorgabe1 = 53036
      Elseif A = 41 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 20,5Hz
       Timervorgabe1 = 53341
      Elseif A = 42 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 21Hz
       Timervorgabe1 = 53631
      Elseif A = 43 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 21,5Hz
       Timervorgabe1 = 53908
      Elseif A = 44 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 22Hz
       Timervorgabe1 = 54172
      Elseif A = 45 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 22,5Hz
       Timervorgabe1 = 54425
      Elseif A = 46 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 23Hz
       Timervorgabe1 = 54666
      Elseif A = 47 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 23,5Hz
       Timervorgabe1 = 54897
      Elseif A = 48 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 24Hz
       Timervorgabe1 = 55119
      Elseif A = 49 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 24,5Hz
       Timervorgabe1 = 55332
      Elseif A = 50 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 25Hz
       Timervorgabe1 = 55536
      Elseif A = 51 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 25,5Hz
       Timervorgabe1 = 55732
      Elseif A = 52 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 26Hz
       Timervorgabe1 = 55920
      Elseif A = 53 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 26,5Hz
       Timervorgabe1 = 56102
      Elseif A = 54 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 27Hz
       Timervorgabe1 = 56277
      Elseif A = 55 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 27,5Hz
       Timervorgabe1 = 56445
      Elseif A = 56 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 28Hz
       Timervorgabe1 = 56607
      Elseif A = 57 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 28,5Hz
       Timervorgabe1 = 56764
      Elseif A = 58 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 29Hz
       Timervorgabe1 = 56915
      Elseif A = 59 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 29,5Hz
       Timervorgabe1 = 57061
      Elseif A = 60 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 30Hz
       Timervorgabe1 = 57203
      Elseif A = 61 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 30,5Hz
       Timervorgabe1 = 57339
      Elseif A = 62 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 31Hz
       Timervorgabe1 = 57471
      Elseif A = 63 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 31,5hz
       Timervorgabe1 = 57599
      Elseif A = 64 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 32Hz
       Timervorgabe1 = 57723
      Elseif A = 65 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 32,5Hz
       Timervorgabe1 = 57844
      Elseif A = 66 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 33Hz
       Timervorgabe1 = 57960
      Elseif A = 67 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 33,5Hz
       Timervorgabe1 = 58073
      Elseif A = 68 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 34Hz
       Timervorgabe1 = 58183
      Elseif A = 69 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 34,5Hz
       Timervorgabe1 = 58289
      Elseif A = 70 Then
       Config Timer1 = Timer , Prescale = 8                     'Ausgabe 34,5Hz
       Timervorgabe1 = 58393
    
      End If
    
    Loop
    
    Taster_store:
    'Debounce Pina.0 , 1 , Pr 'try this for branching when high(1)
      Debounce Pind.4 , 1 , Aus_store , Sub                     'Taster offen
      Debounce Pind.4 , 0 , Ein_store , Sub                     'Taster gedrückt
    
    Return
    
    Taster_up:
    'Debounce Pina.0 , 1 , Pr 'try this for branching when high(1)
      Debounce Pind.7 , 1 , Aus_up , Sub                        'Taster offen
      Debounce Pind.7 , 0 , Ein_up , Sub                        'Taster gedrückt
    
    Return
    
    Taster_down:
    'Debounce Pina.0 , 1 , Pr 'try this for branching when high(1)
      Debounce Pind.6 , 1 , Aus_down , Sub                      'Taster offen
      Debounce Pind.6 , 0 , Ein_down , Sub                      'Taster gedrückt
    
    Return
    
    Ein_store:
       Led7 = 0
       Writeeeprom A , 1                                        'store at first position
    
    Return
    
    Aus_store:
       Led7 = 1
    Return
    
    'Unterprogramm Rückstellen mit Taste Down
    Ein_down:
       If A > 0 Then
          Decr A
       Else
          A = 255
       End If
    
    Return
    
    'Unterprogramm Ausgaberoutine Taste Down
    Aus_down:
    
    Return
    
    'Unterprogramm Rückwärtszählen mit Taste Up
    Ein_up:
      If A <= 255 Then
       Incr A
      Else
       A = 0
      End If
    
    Return
    
    'Unterprogramm Ausgaberoutine Taste Up
    Aus_up:
    
    Return
    
    'Dies ist der Programmteil, der in dem gewählten
    'Intervall aufgerufen wird
    Timer0_irq:
      Timer0 = Timervorgabe0
    
    'Beliebige IRQ-Routine
    'Dabei sollte man darauf achten das diese nicht mehr Zeit
    'benötigt, als das Intervall zuläßt
       If Zaehler < 100 Then
          Toggle Led4
          Incr Zaehler
       Elseif Zaehler > 100 And Zaehler < 255 Then
          Led4 = 1
          Incr Zaehler
       Elseif Zaehler < 255 Then
          Incr Zaehler
       Else
          Toggle Led3
          Zaehler = 0
       End If
    
    'Der Zustand der LED wir umgekehrt, wodurch sich blinken in der halben Frequenz ergibt
    'Hohe Frequenzen sind natürlich nicht mehr sichtbar
       Toggle Led2
    
       Return
    
    Timer1_irq:
      Timer1 = Timervorgabe1
    
    'Hier könnte nun ihre beliebige IRQ-Routine stehen
    'Dabei sollte man darauf achten das diese nicht mehr Zeit
    'benötigt, als das Intervall zuläßt
    
    'Der Zustand der LED wir umgekehrt, wodurch sich blinken in der halben Frequenz ergibt
    'Hohe Frequenzen sind natürlich nicht mehr sichtbar
       Toggle Led0
    
       Return
    Jetzt kapier ich gar nix mehr...da muss irgendwo nen Fehler hängen...sehs abba net

  2. #12
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.12.2004
    Alter
    70
    Beiträge
    277
    Zitat Zitat von ACsenf
    Mich würde es brennend interessieren, warum das nicht klappt??? Vielleicht packt mal jemand das programm auf seinen Chip.
    Packe mal die beiden ISRs ganz an das Ende des Codes. Soweit ich mich dunkel erinnern kann, gab es bei ISRs "mittendrin" bei mir schon mal Schwierigkeiten. Irgendwo steht diese Empfehlung auch in den Tiefen der Bascom Dokumentationen. Ist aber ein Schuss ins Blaue.

    Apropos Ende: Ein END am Ende Der Programmhauptschleife kann auch nicht schaden.

    Ich kann Dir nur versichern, daß mein gepostetes Beispiel und auch einige andere in denen ich Prescale umkonfiguriere sowohl auf M8, M168, M32 und M128 ohne Schwierigkeiten korrekt laufen. An einem Fehler im Compiler liegt es also mit Sicherheit nicht.

    Deinen Code kann ich bei mir im Augenblick nicht ausprobieren, ist alles belegt.

    Grüße
    Henrik

  3. #13
    Benutzer Stammmitglied
    Registriert seit
    22.03.2005
    Beiträge
    91
    Hi Henrik!

    Habs korrigiert. Funktioniert trotzdem nicht. D.h. die Version mit schreiben inTCCR1B übernimmts nicht. Und nach deinem Beispiel kommen nun nur noch mHz raus...ich glaube ich gebs auf...

  4. #14
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.12.2004
    Alter
    70
    Beiträge
    277
    Zitat Zitat von ACsenf
    Hi Henrik!

    Habs korrigiert. Funktioniert trotzdem nicht. D.h. die Version mit schreiben inTCCR1B übernimmts nicht. Und nach deinem Beispiel kommen nun nur noch mHz raus...ich glaube ich gebs auf...
    Also wie Du siehst, geht es ja bei richtiger Programmierung. Mir fallen in Deinem Code (auch wenn er ohne meckern compiliert wird) reichlich syntaktische Fehler auf. Subs ohne leere Klammern, wenn keine Parameter übergeben werden, gehöhren mit dazu. Auch lädt der Code mit seiner leicht spaghettiförmigen Struktur nicht eben zur Untersuchung ein .

    Sind denn Deine Stacks ausreichend bemessen? Setze alle drei mal gleich auf 128. Du gehst nicht gerade schonend mit den Ressourcen um.

    Fang doch mal klein an, meide zunächst Single, beschränke Dich auf das Wesentliche. Dann schrittweise erweitern und immer wieder im realen System, nicht im Simulator zwischenprüfen.

    Sonst wird das nix. Und schimpfe nicht auf Bascom, das findet nicht jeden Fehler, den der Programmierer macht. Andere Hochsprachen auch nicht.

    Grüße
    Henrik

  5. #15
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    Hmm ... ich hab eigentlich was gegen Basecom und werde daher hier sicherlich nicht die Lösung in nem Basiclisting liefern. Allerdings hab ich mal nen paar Denkansätze zu diesem Problem.
    1. generell benötigt man nur einen Timer für dieses Problem.
    2. nehmen könnte man z.B. den Timer 1 des Mega 32 (so einer sollte doch genommen werden oder)
    3. diesen Timer betreibt man in dem Fall wohl am bestem im Mode 4 - CTC -> Datenblatt Seite 107
    4. Die Frequenz wird in dem Fall über das Register OCR1A geändert ... höherer Wert -> kleinere Frequenz
    5. Eine Bereichswahl wäre z.B. über den Prescaler möglich ... höherer Wert -> kleinerer Frequenzbereich
    6. Das Tastverhältniss würde ich in einem Register (einer Variable) speichern .. für deinen Fall dürfte 128 der richtige Wert sein.
    7. die 3 Offsetwerte für die Phasenverschiebung in 3 weitere Register ( Variablen)
    8. des weiteren ist noch eine Variable als PWM Zähler notwendig ... (Wertebereich: 8 Bit)
    9. in der ISR des Timers wir die PWM inklusive der Offsets verarbeitet
    10. in der Hauptschleife werden die Frequenz, der Frequenzbereich, das Tastverhältniss sowie die Offsetwerte angepasst.
    11. ansonsten kann ich nur empfehlen mal nen Blick in den Angehängten PAP für die ISR zu werfen.


    Grüße, da Hanni.
    Angehängte Dateien Angehängte Dateien

  6. #16
    Benutzer Stammmitglied
    Registriert seit
    22.03.2005
    Beiträge
    91
    Hallo Hanni!

    Bin gerade an der Soft-PWM dran.

    Danke erstmal für deine Ideen! Klar braucht man nur einen Timer!
    Wie ich den Timer konfiguriere, denke ich weiß ich. Allerdings hängt der PWM-Zähler in unmittelbarem Zusammenhang mit der gewünschten PWM-Frequenz. Wenn man eine Soft PWM macht gibt man nicht mit dem Timer eine Frequenz vor und macht dann nen Zähler dazu...
    Man wählt eine Timerauflösung und inkrementiert einen PWM- Zähler, durch die Timerauflösung und die gewünschte Frequenz ergibt sich die mögliche Schrittweite, oder liege ich da falsch?
    In deinem Struktogramm ist grundlegender Denkfehler, wenn man den Offset jedesmal dazuaddiert, erhältst du 4 verschiedene Frequenzen, ausserdem muss der PWM Zähler weiterzählen können als nötig, wodurch es auch noch Probleme gibt. Aber die Idee an sich hat mir den entscheidenden Tipp gegeben
    Der Offset muss dazu verwendet werden um die 3 anderen PWM-Zähler mit einem Delay zu starten.
    Wenns klappt hau ich heut abend mal den Code hier rein.

    Gruß

    Sven

  7. #17
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    Zitat Zitat von ACsenf
    In deinem Struktogramm ist grundlegender Denkfehler, wenn man den Offset jedesmal dazuaddiert, erhältst du 4 verschiedene Frequenzen
    nicht 4 Frequenzen sondern 4 verschiedenene Puls Pausenverhälnisse ... ist mir auch grad beim durchguggn noch mal klar geworden ...

    Aber ich freue mich, das es dir zumindest den Denkanstoß gegeben hat, der dir fehlte

    Zitat Zitat von ACsenf
    Allerdings hängt der PWM-Zähler in unmittelbarem Zusammenhang mit der gewünschten PWM-Frequenz
    Ja und nein ... der PWM Zähler beeinflusst nur die Auflösung der PWM, also in wievielen Schritten du die einstellen kannst und hat damit sicherlich (allerdings nur indirekt) einen Einfluss auf die Frequenz.

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

Solar Speicher und Akkus Tests