Problem mit Prozedurparametern
Verfasst: Di 15. Jan 2013, 11:29
BASCOM hat offensichtlich Probleme mit Prozedurparametern, wenn der Prozeduraufruf innerhalb einer Interruptserviceroutine erfolgt. In dem folgenden Beispiel wird durch einen Taster ein INT0-Interrupt ausgelöst. Dadurch springt das Programm zur Marke "Test". In dieser wird die (globale) Variable "Anzahl" mit dem Wert 123 als Parameter an die Prozedur "Ausgeben" übergeben. Beim ersten Printbin-Befehl wird noch der korrekte Wert 123 am Terminal angezeigt; beim zweiten Printbin-Befehl erhält man den Wert 1, was sicherlich nicht richtig ist .
Ich vermute, dass hier der Return-Stapel nicht richtig verwaltet wird. Weiß jemand Genaueres?
Ich vermute, dass hier der Return-Stapel nicht richtig verwaltet wird. Weiß jemand Genaueres?
Code: Alles auswählen
' Attiny-Platine von E. Eube, G. Heinrichs und U. Ihlefeldt
' Wenn innerhalb einer Interruptserviceroutine ein Unterprogramm mit einem
' Parameter aufgerufen wird, dann verliert dieser Parameter bei der 2. Benutzung
' seinen Wert.
' In diesem Programm wird der Parameter 123 übergeben. Beim ersten Printbin wird
' er noch korrekt ausgegeben, danach wird die Zahl 1 ans Terminalprogramm gesendet.
'----------------------------------------------------------------------------
$regfile = "attiny2313.dat" 'Attiny2313
$crystal = 4000000 '4 MHz
$baud = 9600
'**********************************************************
'******************* Deklarationen ************************
Dim Anzahl As Byte
Declare Sub Ausgeben(a As Byte)
'****************** Initialisierung ***********************
Ddrb = &B11111111 'Port B als Ausgangsport
Ddrd = &B01110000 'D4, D5, D6 als Ausgang; Rest als Eingang
Portd = &B10001111 'Eingänge auf high legen
Waitms 20 'Kondensator bei Ta0 laden
Enable Int0
Config Int0 = Falling
On Int0 Test 'Wenn Ta0 gedrückt wird...
Enable Interrupts
'**********************************************************
'******************** Hauptprogramm ***********************
Anzahl = 123
Do
Loop
'**********************************************************
'******************* Unterprogramme ***********************
Sub Ausgeben(a As Byte)
Printbin A
Printbin A
End Sub
'**********************************************************
'******************Interruptroutinen***********************
Test:
Call Ausgeben(anzahl)
Return
'**********************************************************