Forum: Mikrocontroller und Digitale Elektronik Bug in Bascom?


von Alex A. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe ein seltsames Problem.
Hier ist der Codeschnipsel:
1
X= &HB0
2
3
Senden3 &HA0 , &H09 , &H00
4
5
Abfrage:
6
7
Do
8
Waitms 1
9
Loop
10
11
Int_mcp:
12
Gosub Lesen
13
Return
14
15
Lesen:
16
Disable Interrupts
17
18
19
Mcp2515_read_register Rxb0d0
20
Wert1 = Canin
21
Mcp2515_read_register Rxb0d1
22
Wert2 = Canin
23
Mcp2515_read_register Rxb0d2
24
Wert3 = Canin
25
26
27
If Wert1 = &H10 And Wert2 = &H00 And Wert3 = &H01 Then
28
Gosub Bestaetigen
29
End If
30
Enable Interrupts
31
Goto Abfrage
32
33
Bestaetigen:
34
If X = &HBF Then
35
X = &HB0
36
End If
37
X = X + 1
38
Senden1 X
39
Return

und zwar soll da folgendes passieren:
erst mal werden 3 Bytes "A0 09 00" gesendet
(Senden1 bzw.3 ist ein Subprogram, das sauber funktioniert. 1 bzw. 3 
nach dem "Senden" ist die Datenlänge)

wenn ein Interrupt auftritt sollen die Daten ausgelesen werden.
Dann werden die verglichen. Wenn alles passt, geht das Programm nach 
"Bestätigen"

Das funktioniert aber nicht ganz.
Siehe Screenshot 1


Wenn ich aber
1
Senden3 &HA0 , &H09 , &H00
2
gosub Bestaetigung
3
Abfrage:
schreibe dann kommt das Richtige raus.

Das heisst, ich empfange zuerst
A0 09 00 dann
B1
wie es auch sein soll.

Verstehe nicht, wieso das mit dem ersten Code nicht klappt.
Kann das ein Bug von Bascom sein?

Danke
Gruss Alex S.

von Karl H. (kbuchegg)


Lesenswert?

Alex S. schrieb:

> Do
> Waitms 1
> Loop
>
> Int_mcp:

Ich gehe mal davon aus, dass es sich hierbei um eine Interrupt Service 
Routine handelt

> Gosub Lesen
> Return
>
> Lesen:
> Disable Interrupts

Lass die Interrupts in Ruhe. Du bist schon in einer INterrupt Service 
Routine. Interrupts sind da sowieso gesperrt.
>
>
> Mcp2515_read_register Rxb0d0
> Wert1 = Canin
> Mcp2515_read_register Rxb0d1
> Wert2 = Canin
> Mcp2515_read_register Rxb0d2
> Wert3 = Canin
>
>
> If Wert1 = &H10 And Wert2 = &H00 And Wert3 = &H01 Then
> Gosub Bestaetigen
> End If
> Enable Interrupts

Gaaaaanz schlecht.
Du bist in einer ISR. Wenn du jetzt die Interrupts frei gibst kann es 
sein, dass sofort die ISR schon wieder aufgerufen wird

> Goto Abfrage

Noch viiiel schlechter.
AUs einer ISR geht es niemals mit einem GOTO raus. Du musst aus einer 
ISR mit einem Return aussteigen!

> Kann das ein Bug von Bascom sein?

Als Faustregel kannst du dir merken.
Da muss noch viel Wasser die Donau runterfliessen, ehe du zum ersten mal 
auch nur in die Nähe der Entdeckung eines Bugs in deinem Compiler 
kommst. In 80% aller Fehlerfälle sitzt das Problem vor dem Bildschirm. 
Bei Anfängern kann man diese Zahl getrost auf 99% erhöhen.

Und als allererstes solltest du dir selber ein generelles GOTO Verbot 
auferlegen. Zumindest solange bis du mehr Erfahrung hast und die 
tatsächlichen Einsatzfälle eines GOTO kennst. Viel mehr Erfahrung. Ganz 
viel mehr Erfahrung.

von Alex A. (Gast)


Lesenswert?

Danke.
Es ist immer ein Genuss Deine Beiträge zu lesen.
Das Problem scheint aber irgendwo anders zu sein.
Wenn ich das ausführe:
1
Abfrage:
2
3
Do
4
Waitms 1
5
Loop
6
7
Int_mcp:
8
Senden1 &HB1
9
Gosub Lesen
10
Mcp2515_write_register Canintf , &B00000000       'interrupt zuruecksetzen
11
Return
12
13
Lesen:
14
Return
funktioniert alles.


ABER so funktioniert das NICHT
1
Abfrage:
2
3
Do
4
Waitms 1
5
Loop
6
7
Int_mcp:
8
Gosub Lesen
9
Mcp2515_write_register Canintf , &B00000000       'interrupt zuruecksetzen
10
Return
11
12
Lesen:
13
Senden1 &HB1
14
Return

Was könnte das zum Teufel sein?

Danke
Gruss Alex S.

von Alex A. (Gast)


Lesenswert?

Ach ja, mit "Funktioniert nicht" meine ich, dass ich die falschen Daten 
bekomme zum Beispiel
00 statt B1
oder 03.

Total komisch.

Gruss Alex

von Alex A. (Gast)


Lesenswert?

Problem durch wildes Ausprobieren gefunden.
$hwstack = 40 auf 400 erweitert.

So ein Mist, halben Tag dafür gebraucht.

Gruss Alex S.

von keks (Gast)


Lesenswert?

Nicht nur Du :-)), aber nach 8 Jahren Bascom kann ich nicht klagen und 
ich habe kein Bug gefunden...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.