Hallo
Ich programmiere selten mit Bascom und habe das jetzt mal mit dem Simulator überprüft:
Code:
...
Dim I As Integer
Dim J As Integer
Dim Led1 As Byte
Dim Led2 As Byte
Const Timervorgabe = 131
On Timer0 Timer_irq
Enable Timer0
Enable Interrupts
Led1 = 51
Led2 = 86
J = 0
Do
I = Rnd(10)
Incr J
Loop
End
...
Tatsächlich zeigt der Simulator im Watch-Modus nach immer der selben Anzahl von J-Durchläufen einen I-Wert von über 9! In der ersten Variante ohne J war der I-Wert über 9 aber wiederrum ganz anders. Interessanterweise funktioniert rnd() scheinbar richtig, wenn man den Timer0-Interrupt nicht freigibt oder alle Interrupts gesperrt sind. Vielleicht verwendet rnd() irgendwie den Timer0? Seltsam und wieder typisch Bascom..
[Edit]
Weil ich auch was sehen will habe ich das Programm an meinen asuro (8 MHz Mega8) angepasst:
Code:
$regfile = "m8def.dat"
$crystal = 8000000
$baud = 2400
Config Timer0 = Timer , Prescale = 64
Config Pind.2 = Output
Config Pind.3 = Output
Dim I As Integer
Dim J As Integer
Dim Led1 As Integer
Dim Led2 As Integer
Const Timervorgabe = 131
On Timer0 Timer_irq
Enable Timer0
Enable Interrupts
Led1 = 51
Led2 = 86
J = 0
Print "Hallo"
Print
Do
I = Rnd(10)
Incr J
If I > 9 Then
Print "I: " ; I
Print "J: " ; J
Print
J = 0
End If
Loop
End
Timer_irq:
Timer0 = Timervorgabe
If Led1 > 0 Then
Decr Led1
Else
Toggle Portd.2
If Pind.2 = 1 Then
Led1 = 500 ' Anzeit
Else
Led1 = 500 ' Auszeit
End If
End If
If Led2 > 0 Then
Decr Led2
Else
Toggle Portd.3
If Pind.3 = 1 Then
Led2 = 200
Else
Led2 = Rnd(400) + 500
End If
End If
Return
Ausgabe auf dem Bascom-Terminal:
Code:
Hallo
I: 4767
J: 13
I: 61
J: 1
I: 116
J: 9
I: 172
J: 28
I: 59
J: 5
I: 10
J: 53
I: 180
J: 6
I: 176
J: 38
I: 14
J: 2
I: 164
J: 10
I: 157
J: 14
I: 46
J: 57
I: 71
J: 63
I: 113
J: 16
Verblüffend
btw. muss es Toggle PORTx.y lauten...
[Edit2]
So scheint es zu funktionieren:
Code:
Disable Interrupts
I = Rnd(10)
Enable Interrupts
Lesezeichen