PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : BASCOM Uhr und PWM: Timer stolpern...



malthy
27.04.2009, 23:33
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:


$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

python_rocks
28.04.2009, 09:41
Hallo Malte!

Nur als kleiner Versuch: Erhöhe diese Werte auf 100:

$framesize = 32
$swstack = 32
$hwstack = 32
Es ist wirklich nur ein Versuch. Aber probieren sollte man es trotzdem.

mfg
Gerold
:-)

malthy
28.04.2009, 12:30
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

python_rocks
28.04.2009, 14:38
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_bascom_avr_kurs/speicher_hwstack_swstack_frame/

mfg
Gerold
:-)

malthy
28.04.2009, 19:27
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

clear
03.05.2009, 22:04
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