PWM-Timer1 Programmierung zu Fuß

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • PWM-Timer1 Programmierung zu Fuß

      Hallo User,
      ich versuche mich an der Timer1 Einstellung für den PWM-Modus über das Setzen der entsprechenden Registerbits, also zu Fuß; aber ich bekomme kein dauerhaftes Signal an OC1/PB.1, nur nach einem Reset sehe ich ein einziges Mal einen Impuls (mit Oszilloskop). Ich arbeite gerade mit einem ATmega m328p mit 16Mhz und erwarte, dass ein permanentes Impulssignal zu sehen ist, da der Timer1 entsprechend Datenbuch (WGM-Mode 15) gesetzt ist, und der Wert vom OCR1A-Register vorgibt, wann Timer1 zurückgesetzt wird. Zweck ist es, durch Variation von OCR1A die Frequenz zur Laufzeit zu ändern.

      Habe mit der Suche hier im Forum nichts Adäquates finden können. Hat jemand solches schon programmiert und erkennt den Grund, warum kein Signal dauerhaftes Signal zu sehen ist?
      Im Anhang ist mein kleines Programm gelistet.

      Gruß
      Ulrich
      Dateien
      • m328 PWM -1.bas

        (1,26 kB, 42 mal heruntergeladen, zuletzt: )
    • Mit den Registern hab' ich's noch nicht gemacht. Um die Überlaufzeit mit compare zu ändern, um dann einen interrupt auszulösen, hat bei mir gut geklappt. ZB bei meinem Textgebläse.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • tschoeatsch schrieb:

      Mit den Registern hab' ich's noch nicht gemacht. Um die Überlaufzeit mit compare zu ändern, um dann einen interrupt auszulösen, hat bei mir gut geklappt. ZB bei meinem Textgebläse.
      hallo Tschoeatsch,

      ich wollte ohne Interrupt auskommen, da ich den Timer0 via Bascom-Befehlen auf einer festen Frequenz einstelle, und zusätzlich den Timer1 durch einen leichten Frequenzversatz, 0,1Hz--4Hz zum Timer0, zur Ansteuerung einer LED-Kette in Funktion eines Stroboskops verwenden möchte. Stichwort: Slow Motion Frame (SlomoFrame)

      Diesen Frequenzversatz wollte ich durch Variation von OCR1A variabel einstellen.

      Gruß
      Ulrich
    • Ei, sowas ?



      Was macht jetzt timer0? Die Blitzfrequenz? Und timer1 die Blitzdauer?
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von tschoeatsch ()

    • Meiner Frau gefallen die Filmchen über so was.
      Ich hab's jetzt auch kapiert, timer1 braucht man für die langsame Bewegung. Timer0 erzeugt die Schwingung des Objekts. Man braucht eine 'Schwebung'
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Aber warum ohne interrupt?

      Ich könnte mir das so vorstellen:
      80 'Bilder'/S das folgende passiert 80x in der Sekunde
      timer fängt an, beim 1. compare wird ein Ausgang geschaltet, der die Magnetspule bestromt.
      ein neuer compare-Wert wird durch Addition erzeugt und bei Erreichen wird der Strom wieder abgestellt. Jetzt hat man Zeit (etwas weniger wie 1/80tel Sekunde) um mit eine weiteren Addition einen compare-Wert zu erzeugen, der die Led einschaltet, nochmal einen Betrag addieren zum Ausschalten der Led und Rücksetzen des timers.. Der Betrag zwischen Spulenstrom aus und Led ein wird variiert und erzeugt die Schwebung.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von tschoeatsch ()

    • Hallo Hero,
      das werde ich morgen checken, danke für den Hinweis.

      @'tschoeatsch
      es freut mich sehr, wenn ich dein Interesse an diesem neuen Projekt geweckt habe, dann sind wir schon zu zweit. Ja, es gibt es auch andere Möglichkeiten; aber wenn man sich einmal damit (PWM zu Fuß) befasst und es nicht so funktioniert, wie man es laut Datenblatt vermutet, so möchte man (ich) doch gerne wissen, was falsch gelaufen ist.
      Werde mich melden, wenn es funktioniert.

      Gruß
      Ulrich
    • Um mal beim Thema zu bleiben, hier ein Auszug aus dem Datenblatt

      16.3 Accessing 16-bit Registers
      The TCNT1, OCR1A/B, and ICR1 are 16-bit registers that can be accessed by the AVR CPU via the 8-bit data
      bus. The 16-bit register must be byte accessed using two read or write operations. Each 16-bit timer has a
      single 8-bit register for temporary storing of the high byte of the 16-bit access. The same temporary register is
      shared between all 16-bit registers within each 16-bit timer. Accessing the low byte triggers the 16-bit read or
      write operation. When the low byte of a 16-bit register is written by the CPU, the high byte stored in the
      temporary register, and the low byte written are both copied into the 16-bit register in the same clock cycle.
      When the low byte of a 16-bit register is read by the CPU, the high byte of the 16-bit register is copied into the
      temporary register in the same clock cycle as the low byte is read.
      Not all 16-bit accesses uses the temporary register for the high byte. Reading the OCR1A/B 16-bit registers
      does not involve using the temporary register.
      To do a 16-bit write, the high byte must be written before the low byte. For a 16-bit read, the low byte must be
      read before the high byte.

      The following code examples show how to access the 16-bit Timer Registers assuming that no interrupts
      updates the temporary register. The same principle can be used directly for accessing the OCR1A/B and ICR1
      Registers. Note that when using "C", the compiler handles the 16-bit access.

      Das rote passt nicht mit deinem code zusammen, bzw umgekehrt

      BASCOM-Quellcode

      1. $regfile = "m328pdef.dat"
      2. $crystal = 16000000
      3. $hwstack = 32
      4. $swstack = 32
      5. $framesize = 32
      6. '-------------Hardware PWM mit Timer1---------
      7. '(
      8. Waveform-Mode 15 = Fast PWM /Top OCR1A
      9. Bit 7 6 5 4 3 2 1 0
      10. --------------------------------------------------------------
      11. | Com1A1 | Com1A0 | Com1B1 | Com1B0 | -- | -- | WGM11 | WGM10 |
      12. --------------------------------------------------------------
      13. TCCR1A = 1 0 1 0 0 0 1 1
      14. Bit 7 6 5 4 3 2 1 0
      15. --------------------------------------------------------------
      16. | ICNC1 | ICES1 | -- | WGM13 | WGM12 | CS12 | CS11 | CS10 |
      17. --------------------------------------------------------------
      18. TCCR1B = 0 0 0 1 1 0 1 1
      19. |...... 64 ........|
      20. | Prescaler |
      21. ')
      22. Config Portb.1 = Output 'Timer1--OC1A/Pin-15
      23. Tccr1a = &B10100011 'WGM-Mode 15
      24. Tccr1b = &B00011011
      25. Ocr1al = 255
      26. Ocr1ah = 40
      27. 'Compare1a = 10200
      28. Do
      29. nop
      30. Loop
      31. End
      Alles anzeigen
      Zeile 33 und 34

      Muss der timer nicht noch irgendwie gestartet werden?

      Hab' gerade noch das gefunden
      Depending on the mode of operation used, the counter is cleared, incremented, or decremented at each timer
      clock (clkT1). The clkT1 can be generated from an external or internal clock source, selected by the Clock Select
      bits (CS12:0). When no clock source is selected (CS12:0 = 0) the timer is stopped. However, the TCNT1 value
      can be accessed by the CPU, independent of whether clkT1 is present or not. A CPU write overrides (has priority
      over) all counter clear or count operations.

      Das würde meine Befürchtungen bestätigen, wenn ich die Programmzeile 24 betrachte.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • hero schrieb:

      Hallo tschoeatsch,
      die CS-bits stehen doch auf &b011, also clock/64. Deshalb läuft der Timer.
      CS12:0 = 0 ist die Kurzform von CS12, CS11, und CS10, also alle drei müssen 0 sein.
      Das sind so die Feinheiten, die mich immer mal in's Stolpern bringen 8|

      Aber weil ich dich grad dran hab', wieso muss man einen dutycycle laden und das auf dem anderen Kanal? Wenn ich den compare-Stand lade, ergibt sich doch das Verhältnis und alles ist gesagt.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Hallo tschoeatsch,
      wenn du einen der PWM Modi benutzt, in denen OCR1A als Top Wert angegeben ist, dann hast du den Kanal nicht mehr zur Verfügung.
      Du kannst dann zwar Compare1A = 100 schreiben, aber das ist dann nicht der Compare-Wert (Duty cycle) sondern der Top Wert.
      Mit Compare1B lädst du dann den Compare-Wert für Kanal B und hast an OC1B das Ausgangssignal liegen.
      Dies ist genau dazu da, wofür Ulrich es benutzen will, nämlich die anpassbare Frequenz der PWM.
      Ansonsten hast du nur die festen Frequenzen, die sich durch die Top-Werte &HFF, &H1FF oder &H3FF ergeben.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von hero ()

    • Habe heute ein wenig getestet, und mit Timer1 ohne Interrupt-Nutzung das Programm angepasst, sodaß mit ICR1 die Frequenz eingestellt und variiert werden kann, und mit Compare1A=(OCR1A Low/High-Byte) die Impulsbreite variert werden kann, ohne dass sich die Frequenz dabei ändert.

      Im folgenden ist das Programm gelistet. Des weiteren habe ich mal eine kleine Grafik beigefügt, die zeigen soll, wie das ganze funktioniert.

      Help: wie kann ich die Bilder hier einfügen, sodass sie hier sichtbar werden? Bei mir erscheint beim "Einfügen" immer nur dieses m328 PWM via ICR1-V2.bas

      Gruß
      Ulrich

      P.S. Auch wird das Programm nur als Anhang sichtbar?
      Dateien
      • Zyklus-1.pdf

        (131,22 kB, 26 mal heruntergeladen, zuletzt: )
    • forumseditor.PNG
      der rechte Pfeil deutet auf die Möglichkeit code-Zeilen in einem Scrollfenster zu zeigen.
      Der untere Pfeil deutet auf 'Dateianhänge', hier können Bilder und Dateien, die nicht in das Scrollfenster passen eingefügt werden. Youtube-Filmchen kannst du einfach durch Einfügen des links im normalen Textfenster sichtbar machen.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Wie @tschoeatsch schon geschrieben hat auf Dateianhänge klicken, dann auf "Hochladen" -> Datei auswählen und dann auf "Öffnen" klicken, fertig.
      Bei Bildern solltest du auf das Dateiformat achten (jpg, png usw) und die kannst du dann über Button unter dem Bild in den Editor einfügen.
      Quellcode kannst du direkt über </> einfügen (Code kopieren und in das Quellcode-Fenster einfügen) und alle anderen Dateien werden nur als Anhänge gezeigt.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Ich versuchs mal:

      BASCOM-Quellcode

      1. '(
      2. Datum: 24.11.2017
      3. -------------Hardware PWM mit Timer1---------
      4. Frequenzgenerator ohne Interrupt-Einsatz:
      5. -- Impulsbreiten-Einstellung des Timer1 unabhängig von der Frequenzvorgabe
      6. -- Timer/Counter(TCNT1)-Maximum durch Wert in ICR1 (Low und High Byte)
      7. -- hier Impulsbreiteneinstellung durch:
      8. obere Schwelle = Compare1A, untere Schwelle = Compare1B
      9. Soll Frequenz zur Laufzeit geändert werden, ist ICR1 in die Do/Loop Schleife
      10. zu übernehmen
      11. Zur Beachtung: oberer Schwellwert (Compare1A) muss immer kleiner
      12. sein als der Wert in ICR1
      13. ')
      14. $regfile = "m328pdef.dat"
      15. $crystal = 16000000
      16. $hwstack = 32
      17. $swstack = 32
      18. $framesize = 32
      19. '(
      20. Waveform-Mode 8 = Phase Correct with ICR1A /Atmega328p Manual/Seite 172
      21. Bit 7 6 5 4 3 2 1 0
      22. --------------------------------------------------------------
      23. | Com1A1 | Com1A0 | Com1B1 | Com1B0 | -- | -- | WGM11 | WGM10 |
      24. --------------------------------------------------------------
      25. TCCR1A = 1 1 1 1 0 0 0 0
      26. Bit 7 6 5 4 3 2 1 0
      27. --------------------------------------------------------------
      28. | ICNC1 | ICES1 | -- | WGM13 | WGM12 | CS12 | CS11 | CS10 |
      29. --------------------------------------------------------------
      30. TCCR1B = 0 0 0 1 0 0 1 0
      31. |...... 8 ........|
      32. Prescaler
      33. ')
      34. Config Portb.1 = Output 'Timer1--OC1A/Pin-15
      35. Config Portb.2 = Output 'Timer1--OC1B/Pin-16
      36. Tccr1a = &B11110000 'WGM-Mode 8
      37. Tccr1b = &B00010010
      38. Icr1h = 63 'ICR1A-gesamt= 16378
      39. Icr1l = 250
      40. Do
      41. Compare1a = 14000 'obere Schwelle
      42. Compare1b = 1500 'untere Schwelle
      43. Waitms 200
      44. Loop
      45. End
      Alles anzeigen