Bug in Bascom?

Gast #2343932
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.
Angehängte Dateien:
#2344020
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.
Gast #2344170
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.