- LiTime Speicher und Akkus         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: PWM Auflösung im laufenden Programm ändern

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.03.2005
    Ort
    OWL
    Beiträge
    216

    PWM Auflösung im laufenden Programm ändern

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo!
    Ich möchte die Auflösung einer Fast-PWM in einem INT0-Interrupt ändern und habe folgendes versucht:

    Code:
    INT0_ISR:
    
        If Full_current Then
            Icr1h = 0
            Icr1l = 63
        Else
            Icr1h = 0
            Icr1l = 255
        End If
    
        ........weiterer Code......
    
    Return
    Leider funktioniert es nicht auf diese Weise. Darf man die Register nicht direkt im laufenden Programm setzen? Oder muss noch etwas anderes beachtet werden? Im Datenblatt des Controllers (ATMega konnte ich keine weiteren Hinweise finden!

    Vielen Dank!

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    35
    Beiträge
    826
    Mh ... ich versuchs jetzt einfach mal als Schuß ins blaue, da ich eigentlcih keine Ahnung von Basic für die µC hab:

    Ist Full_current bekannt und zugriffsbereit in dem Interrupt?

    Andun
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.03.2005
    Ort
    OWL
    Beiträge
    216
    Hi,
    logisch ist Full_current bekannt, sonst hätte ich wohl ganz andere Probleme....
    Dass Du keine Ahnung von Basic hast, spielt ja grundsätzlich keine Rolle für das Problem. Wenn das ganze in Assembler funktionieren würde, bekomme ich es hier auch hin.

    Ruppi

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    25.04.2007
    Beiträge
    9
    Also in dem Code sehe ich keinen Fehler, und es funktioniert auch so.
    Ich hab es schon mal zum laufen bekommen (ATMega32).
    Es kommt nun noch drauf an wie du deinen Timer initialisiert hast!?
    Kannst du das mal kurz schreiben?

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.03.2005
    Ort
    OWL
    Beiträge
    216
    Moin!
    Ok, hier mal die Initialisierung des Timers:
    Code:
    Config Timer1 = Pwm , Prescale = 1 , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up
    Tccr1a = &B10100010
    Tccr1b = &B00011001
    Hier würde jetzt noch das Setzen der Register ICR kommen, was ich ja aber im Programm machen möchte. Auf diese Weise erzeugt man Fast-PWM mit einer Frequenz von 250kHz (bei 16MHz Quarz und 6Bit Auflösung).
    Könnte es sein, dass der aktuelle Zählwert des Timers uzrückgesetzt wird, wenn man die ICR-Register neu beschreibt?

    Vielen Dank, Ruppi

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    25.04.2007
    Beiträge
    9
    Versuch mal das PWM Signal nicht mit Bascom Befehlen zu initialisieren, sondern indem du die Bits in den Registern direkt setzt. Das geht auch in Bascom.
    Du sagst auf der einen Seite, dass du eine variable Auflösung haben möchtest und setzt das Register, aber auf der anderen Seite initialisierst du das PWM mit 8Bit.
    So wird das nicht funktionieren.
    Schau einfach mal im Datenblatt in der Tabelle nach, und setzte die Bits "manuell".

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.03.2005
    Ort
    OWL
    Beiträge
    216
    Du täuscht Dich, das funktioniert. Es läuft ja wunderbar. Ich erzeuge exakt 150kHz Frequenz, wenn ich es so schreibe. Wenn ich die ICR-Register zu Programmbeginn beschreibe, ist auch alles in Ordnung. Das Ändern im Interrupt ist das einzige, was nicht geht.

    Danke, Ruppi

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    25.04.2007
    Beiträge
    9
    Also laut deinem Code schriebst du zu Beginn die Register
    Tccr1a = &B10100010
    Tccr1b = &B00011001

    Oder hast du da dann gleich mal auch das Register ICR1 beschrieben???

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.03.2005
    Ort
    OWL
    Beiträge
    216
    Ja, hatte ja geschrieben, dass ich anfangs zu Programmbeginn ICR1 beschrieben habe. Es taucht im Beispielcode nur nicht auf, weil ich die Register ja später im Interrupt beschreibe.

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    25.04.2007
    Beiträge
    9
    Dann versuch mal vor dem Beschreiben "Disable Timer1" und nach dem Beschreiben wieder "Enable Timer1".
    Wenn das nicht geht, dann weiß ich leider auch nicht weiter...

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

LiTime Speicher und Akkus