Hallo
Ich programmiere selten mit Bascom und habe das jetzt mal mit dem Simulator überprüft:
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..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 ...
[Edit]
Weil ich auch was sehen will habe ich das Programm an meinen asuro (8 MHz Mega8) angepasst:
Ausgabe auf dem Bascom-Terminal: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
VerblüffendCode: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
btw. muss es Toggle PORTx.y lauten...
[Edit2]
So scheint es zu funktionieren:
Code:Disable Interrupts I = Rnd(10) Enable Interrupts







Zitieren
Lesezeichen