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