Soooo
hab die Platine jetzt nochmal neu aufgebaut. Sie läuft jetzt fast, der Rest scheint jetzt Software zu sein. Der "restliche" Fehler lag auf dem Steckbrett auch schon vor ist mir aber nicht aufgefallen.
Mein Programm hat jetzt ganz am Anfang eine kurze Blink routine, damit ich sehe wann der µC neu startet. Ich poste erstmal den Quellcode:
Sorry das ichs nicht kommentiert hab, da bin ich noch nicht zu gekommen.Code:$regfile = "m48def.dat" $crystal = 8000000 Config Pinb.1 = Output Config Pinb.2 = Output Config Pinb.0 = Output Config Pinb.4 = Output Mg1 Alias Portb.1 Mg2 Alias Portb.2 Mg3 Alias Portb.3 Mg4 Alias Portb.4 Dim I As Byte For I = 0 To 2 Portb.1 = 0 Waitms 150 Portb.1 = 1 Waitms 150 Next Dim Mg1flag As Byte Dim Mg2flag As Byte Dim Mg3flag As Byte Dim Mg4flag As Byte Dim Mg1time As Integer Dim Mg2time As Integer Dim Mg3time As Integer Dim Mg4time As Integer 'Dim I As Byte Dim State As Byte Dim Signal As Word Config Timer0 = Timer , Prescale = 64 Const Timervorgabe = 131 On Timer0 Timer_irq Enable Timer0 Config Timer1 = Timer , Prescale = 8 Enable Timer1 Timer1 = 0 On Int1 Messen Enable Int1 Config Int1 = Rising Enable Interrupts Mg1flag = 0 Mg2flag = 0 Mg3flag = 0 Mg4flag = 0 Mg1time = 0 Mg2time = 0 Mg3time = 0 Mg4time = 0 Do Print Signal If Signal < 1500 Then State = 0 Mg1 = 0 Mg2 = 0 Mg3 = 0 Mg4 = 0 Else State = 1 End If Loop End Messen: If Timer1 = 0 Then Start Timer1 Disable int1 Config Int1 = Falling Enable int1 Else Signal = Timer1 Stop Timer1 Disable int1 Config int1 = Rising Enable int1 Timer1 = 0 End If Return Timer_irq: Timer0 = Timervorgabe Disable Interrupts Disable Timer1 If State = 1 Then If Mg1time = 0 Then If Mg1flag = 1 Then Do ' Auszeit I = Rnd() Loop Until I < 10 Mg1time = I + 46 ' Auszeit Mg1 = 0 Mg1flag = 0 Print I Else Mg1time = 10 ' Anzeit Mg1 = 1 Mg1flag = 1 End If End If If Mg2time = 0 Then If Mg2flag = 1 Then Do ' Auszeit I = Rnd() Loop Until I < 10 Mg2time = I + 91 ' Auszeit Mg2 = 0 Mg2flag = 0 Print I Else Mg2time = 10 ' Anzeit Mg2 = 1 Mg2flag = 1 End If End If If Mg3time = 0 Then If Mg3flag = 1 Then Do ' Auszeit I = Rnd() Loop Until I < 10 Mg3time = I + 71 ' Auszeit Mg3 = 0 Mg3flag = 0 Print I Else Mg3time = 20 ' Anzeit Mg3 = 1 Mg3flag = 1 End If End If If Mg4time = 0 Then If Mg4flag = 1 Then Do ' Auszeit I = Rnd() Loop Until I < 10 Mg4time = I + 71 ' Auszeit Mg4 = 0 Mg4flag = 0 Print I Else Mg4time = 10 ' Anzeit Mg4 = 1 Mg4flag = 1 End If End If Decr Mg1time Decr Mg2time Decr Mg3time Decr Mg4time Enable Interrupts Enable Timer1 End If Return
Nun wie ihr seht springt das Programm jede 1ms in die Interrupt routine. Je nach Empfängersignal blinken die Led´s. Mein Problem ist jetzt, das der µC wenn das Empfängersignal unter 1,5ms ist sauber durchläuft und wenn es über 1,5ms ist die Led´s nur eine kurze Zeit ca. 2sekunden blinken. Danach startet der µC neu. Wenn die Led´s nicht blinken, bleibt er an und läuft sauber weiter.
Ich hab leider im Moment keine Idee woran das liegen kann, ausser das irgendwie ein Timer überläuft und was unvorhergesehenes passiert. Oder das die beiden Interrupts sich behindern.
Der Watchdog ist aus. Jedenfalls wenn damit das Fuse "Watchdog timer always on" = unchecked im Burnomat gemeint ist.
Danke
Gruß Daniel
Lesezeichen