- LiFePO4 Speicher Test         
Ergebnis 1 bis 6 von 6

Thema: BASCOM Uhr und PWM: Timer stolpern...

  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von malthy
    Registriert seit
    19.04.2004
    Ort
    Oldenburg
    Beiträge
    1.379

    BASCOM Uhr und PWM: Timer stolpern...

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo!

    Ich habe ein großes Problem mit einer kleinen Schaltung...

    Ich beschreibe zunächsteinmal die Hardware. Ein Schaltbild existiert bisher nicht, die Schaltung ist aber simpel, insofern hoffe ich, dass das Problem auch so diskutierbar ist. Sollte das nicht der Fall sein, liefere ich die nötigen Infos natürlich gerne nach. Mir ging es darum, eine zeitabhängige Helligkeitssteuerung von high-power-LEDs mittels eines AVRs zu realiseren. An OC1A eines mega8 hängt dazu ein logic-level-MOSFET (IRL 3803), dieser schaltet einen Strang von sechs Osram Platinum Dragon LEDs (700mA, 3.6V je). Über Timer1 soll die Helligkeit der LEDs per PWM gestuert werden. Um auf dem AVR eine Uhr zu realisieren, hängt an TOSC1 und TOSC2 des AVRs ein Uhrenquarz (32768kHz). An Port B.0 ist eine LED angeschlossen, außerdem habe ich mittels MAX232 eine RS232 angebaut. Das ist die ganze Schaltung. Programmiert habe ich in Bascom - das geht bei mir nach wie vor am schnellsten. Hier mal ein einfacher Testcode, bei dem das Problem, das ich gleich beschreiben will, auftritt:

    Code:
    $regfile = "m8def.dat"
    $crystal = 8000000
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    $baud = 9600
    
    '************* init **************
    
    Config Portb.0 = Output
    Config Portb.1 = Output                                     ' oc1a
    Config Portb.2 = Output                                     ' oc1b
    
    Config Clock = Soft , Gosub = Sectic
    Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Up , Prescale = 8
    
    Config Serialin = Buffered , Size = 16
    Config Serialout = Buffered , Size = 16
    
    Dim I As Byte
    Dim S As Single
    Dim W As Word
    Dim P As Byte
    
    Enable Interrupts
    
    '************ main **************
    
    Do
       For I = 0 To 100
          S = 1.07 ^ I
          W = Int(s)
          Compare1a = W
          If P = 1 Then
             Print Time$
             P = 0
          End If
       Next
    Loop
    
    End
    
    '************* isr **************
    
    Sectic:
       Toggle Portb.0
       P = 1
    Return
    Das Problem ist nun, dass der AVR sporadisch und unvorhersehbar - mal nach 15 Minuten Lauf des obigen Programms, mal auch erst nach 60 Minuten - ins Stolpern gerät. Es passiert folgendes: manchmal fällt die PWM aus, obwohl die ISR der Uhr (sectic) dabei weiterläuft (erkennbar am Toggeln der LED), mal läuft die PWM weiter (power-LEDs faden), und die ISR wird nichtmehr ausgeführt. Manchmal - auch nicht immer - fängt sich das Gesamtsystem nach so einem schluckauf wieder, und läuft weiter, als sei nicht gewesen. D. h. es kommt offenbar nicht zu einem Komplettabsturz des Prozessors, sondern nur die Timer werden irgendwie gestört. Sorry für die armselige Problembeschreibung, aber da es so selten auftritt, konnte ich auch noch keine näheren Beobachtungen machen...

    Im Moment gehe ich davon aus, dass die "Leistungs-PWM" (sind ja "immerhin" 700 mA bei insg. ca 22V) irgendwie in den AVR einkoppelt - die Schaltung ist nämlich recht kompakt aufgebaut. Ein anderes Indiz, als dass ich keinen anderen Fehler finde, habe ich dafür aber auch nicht...
    Ich will mit diesem Posting erstmal sicherstellen, dass ich nicht Tomaten auf den Augen habe, und möglicherweise irgendeinen Fehler im Code habe, oder sonstetwas AVR- oder BASCOM-spezifisches nicht bedacht habe. Falls das nicht der Fall ist, bin ich natürlich für jeden Hinweis dankbar, der mich weiterbringen könnte - ich fummel nämlich schon seit ein paar Tagen an der Sache rum und trete irgendwie auf der Stelle - das ist langsam ziemlich frustrierend...

    Ganz vielen Dank für jede Hilfe!

    Gruß,
    Malte

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.08.2007
    Ort
    Oberhofen im Inntal (Tirol)
    Alter
    49
    Beiträge
    377
    Hallo Malte!

    Nur als kleiner Versuch: Erhöhe diese Werte auf 100:
    Code:
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    Es ist wirklich nur ein Versuch. Aber probieren sollte man es trotzdem.

    mfg
    Gerold
    :-)

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von malthy
    Registriert seit
    19.04.2004
    Ort
    Oldenburg
    Beiträge
    1.379
    Hallo!

    Danke für den Hinweis, ich werde das heute Abend probieren... Hast Du denn irgendeine "Theorie" warum das nützen könnte? Mir leuchtet das nämlich nicht so recht ein... aber probieren tu ich's!

    Gruß,
    Malte

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.08.2007
    Ort
    Oberhofen im Inntal (Tirol)
    Alter
    49
    Beiträge
    377
    Zitat Zitat von malthy
    Hast Du denn irgendeine "Theorie" warum das nützen könnte?
    Hallo Malte!

    Weil du einen Interrupt nutzt und den HWSTACK nur auf 32 hast. Vielleicht läuft bei dir ein Stack oder Frame über und überschreibt sporadisch etwas. CLOCK braucht sicher auch etwas an STACK-/FRAME-Speicher. Aber genauer habe ich mir dein Programm nicht angesehen.

    Siehe: http://halvar.at/elektronik/kleiner_...swstack_frame/

    mfg
    Gerold
    :-)

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von malthy
    Registriert seit
    19.04.2004
    Ort
    Oldenburg
    Beiträge
    1.379
    Hallo Gerlod!

    Habe Deinen Hinweis befolgt und bisher läuft die Schaltung seit etwa 1.5 Stunden - augenscheinlich - fehlerfrei. Der Fehler trat ja bisher nur sehr unregelmäßig auf, außerdem könnte es sein, dass ich ihn übersehe (weil ich die Schaltung nicht pausenlos beobachten kann). Deshalb will ich mich erstmal nicht zu früh freuen. Bis jetzt sieht es aber schonmal sehr gut aus. Ich werde noch weiter testen und dann hier Rückmeldung geben. Bis hierher schonmal ganz vielen Dank an Dich!

    Gruß
    Malte

  6. #6
    Hallo Malthy!

    Läuft deine Uhr exakt?
    In deinem Code ist $crystal = 8000000.
    Sollte das nicht dem Uhrenquarz 32768kHz angepasst werden.
    Also $crystal = 32768, oder liege ich da falsch?

    Gruß clear

Berechtigungen

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

LiTime Speicher und Akkus