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:
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
Sorry das ichs nicht kommentiert hab, da bin ich noch nicht zu gekommen.

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