PWM mit timer0, Einstellung der Einschaltdauer durch interrupt störbar?

    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!

    • tschoeatsch schrieb:

      monkye schrieb:

      Und zwei Interrupts auf eine ISR geht wirklich nicht?
      doch, code aus #54 läuft einwandfrei


      monkye schrieb:

      Bei kleinen Sachen in der ISR mache ich das fast immer zu Fuß in ASM.
      wenn man's kann, ich kann's nicht ;(
      ohhhh, sorry - hab den Code nicht aufgeklappt....

      Aber gut zu wissen das es so geht.

      Assembler habe ich vor gefühlten 500 Jahren gelernt, nachdem damals ich den Eprom zu Fuß (2kB) mit einer bescheidenen Pseudotastatur in den Z80 Nachbau Rechner gehämmert hatte (nach zig Wiederholungen, weil ich mich vertippt hatte).

      Gerne mach´ ich es auch nicht, aber es verschafft mir Kontrolle wenn ich unsicher bin
      Aus datenschutzrechtlichen Gründen befindet sich die Kontaktdaten auf der Rückseite dieses Beitrages.
    • Z80 hab' ich auch mal kurzzeitig mit Assembler programmiert. Dann mit Pascal. Jetzt, in bascom Assemblercode einbauen, ich hab' noch keinen Einstieg dazu gefunden. Wenn ich zB eine sub in Assembler machen wollerte, in welchen Registern finde ich übergebene Werte und so Zeugs. Auch wenn ich die libs betrachte, ähnlicher Fall, es fehlt mir der Einstieg. Ich muss aber auch nicht alles können, es gibt bei Fragen ein Forum. :thumbsup:
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Nochmal nachhaken, wie kommt man mit Bordmitteln (bascom-Hilfe) zu dieser Erkenntnis?

      Mitch64 schrieb:

      Ich habe dir übrigens eine viel einfachere Configuration für Timer 0.

      Config Timer0 = Timer , Prescale = 1024 , PWM = On , Compare_B_Pwm = Clear_Up , Clear Timer = 1

      'OCR0A = &hFF ' Frequenz
      'Set TCCR0B.WGM02 ' Bit setzen, wenn Frequenz über OCR0A einstellbar sein soll

      Das ergibt genau das was du in die Register TCCR0x schreibst
      Ich meine es so, wo finde ich in der bascom-Hilfe Infos, um auf obiges zu kommen? Diese config-Zeile, nicht das Setzen der Register direkt. PWM=on finde ich nur bei den 8bit-timern erwähnt, nicht beschrieben, bei timer1 nicht mal erwähnt. Ich kann mir zwar denken, das hängt wohl mit PWM zusammen, aber werden damit gleich die outputs aktiviert, oder wie, oder was?

      Mitch64 schrieb:

      Clear Timer sorgt bei PWM dafürm dass der Timer nicht Rückwärts zählt, sondern bei 0 wieder anfängt. wenn der TOP-Wert erreicht wird.
      das jetzt clear timer plötzlich nicht bei Erreichen des compare-Wertes auf 0 springt, sondern am Ende, was ich im timer-Betrieb eigentlich voraussetze, wo finde ich das?
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Das findest du wahrscheinlich nirgendwo in der Hilfe, weil es eigentlich nicht so gedacht ist.

      Wenn du einen CTC Timer machen möchtest, wird dazu Clear_timer=1 angegeben. Dies setzt die WGM Bits auf CTC, was in der Regel - oder immer? - Mode 2 ist, also hier 010.
      Normales PWM ist Mode 1. Mit der Config von Mitch setzt der Compiler beides, was dann 011 ergibt (weil immer verodert wird). Das ist zufällig Fast-PWM.
      Mit dem Config Befehl werden immer die OCnx Ausgänge konfiguriert, wenn im Config Timer die Outputs angegeben sind.
    • Guenther schrieb:

      Das findest du wahrscheinlich nirgendwo in der Hilfe, weil es eigentlich nicht so gedacht ist.
      Wo habt ihr das dann her? Alles ausprobiert?
      Raum für Notizen

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

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

      Ich meine es so, wo finde ich in der bascom-Hilfe Infos, um auf obiges zu kommen? Diese config-Zeile, nicht das Setzen der Register direkt. PWM=on finde ich nur bei den 8bit-timern erwähnt, nicht beschrieben, bei timer1 nicht mal erwähnt. Ich kann mir zwar denken, das hängt wohl mit PWM zusammen, aber werden damit gleich die outputs aktiviert, oder wie, oder was?
      Das findest Du hier: LINK.

      Und was mich angeht: Häufig werfe ich die OBJ-Datei dem AVR-Studio vor und dann sehe ich was damit in ASM passiert - aber das ist jetzt nicht "universell"...
      Aus datenschutzrechtlichen Gründen befindet sich die Kontaktdaten auf der Rückseite dieses Beitrages.
    • Eben, da steht diesbezüglich nicht viel drin. Ich finde
      CLEAR TIMER will clear the timer on a compare A match
      das bringt mich nicht weiter, dass das eine fast Pwm einstellen kann. Pwm=on wird garnicht erwähnt.
      Raum für Notizen

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

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

      Nochmal nachhaken, wie kommt man mit Bordmitteln (bascom-Hilfe) zu dieser Erkenntnis?

      Mitch64 schrieb:

      Ich habe dir übrigens eine viel einfachere Configuration für Timer 0.

      Config Timer0 = Timer , Prescale = 1024 , PWM = On , Compare_B_Pwm = Clear_Up , Clear Timer = 1

      'OCR0A = &hFF ' Frequenz
      'Set TCCR0B.WGM02 ' Bit setzen, wenn Frequenz über OCR0A einstellbar sein soll

      Das ergibt genau das was du in die Register TCCR0x schreibst
      Ich meine es so, wo finde ich in der bascom-Hilfe Infos, um auf obiges zu kommen? Diese config-Zeile, nicht das Setzen der Register direkt. PWM=on finde ich nur bei den 8bit-timern erwähnt, nicht beschrieben, bei timer1 nicht mal erwähnt. Ich kann mir zwar denken, das hängt wohl mit PWM zusammen, aber werden damit gleich die outputs aktiviert, oder wie, oder was?

      Mitch64 schrieb:

      Clear Timer sorgt bei PWM dafür dass der Timer nicht Rückwärts zählt, sondern bei 0 wieder anfängt. wenn der TOP-Wert erreicht wird.
      das jetzt clear timer plötzlich nicht bei Erreichen des compare-Wertes auf 0 springt, sondern am Ende, was ich im timer-Betrieb eigentlich voraussetze, wo finde ich das?
      Hallo Tschoeatsch

      Wie komme ich auf die Konfiguration.
      Config Timer0 ...

      Kurz gesagt durch etwas probieren und und schauen, welche Option in der Configuration welche Bits setzt.

      Also ich habe das nicht direkt der aus der Bascom-Hilfe. Die ist gelinde ausgedrückt unter aller Sau.
      Das ist auch kompliziert zum erklären. Da bräuchte es fast ein eigenen Lexikon-Eintrag. Die Timer-Konfiguration ist sehr komplex mit den ganzen Modis.

      Ich glaube das müsste ich mal an einem Beispiel erklären. Das wird so auf die schnelle nichts. Das ist auch wiederum vom Controller abhängig etc.

      Ich gehe aber meist den Weg, dass ich die Bascom-Konfiguration verwende, soweit die intuitiv angegeben werden kann.
      Für spezielle Modi (z.B. PWM mit TOP-Wert im ICRx) muss ich im Datenblatt schauen, welche Bits noch fehlen und noch gesetzt werden müssen.

      Die Konfiguration habe ich durch probieren herausgefunden, weil ich wusste, was in den Registern TCCR0A und TCCR0B am ende stehen sollte.

      Auf das
      'Set TCCR0B.WGM02 ' Bit setzen, wenn Frequenz über OCR0A einstellbar sein soll

      bin ich gekommen, weil ich gesehen habe, dass nach deiner Configuration die Frequenz (61 Hz) nicht durch Ändern des Registers OCR0A geändert werden konnte.
      Der Timer war so eingestellt, dass der TOP-Wert $FF war. Ein Blick ins Datenblatt ergab, dass da nur ein Bit fehlt, um die Frequenz Einstellbar zu machen.