Problem mit Prozedurparametern

Hier können Sie Hilfe erhalten.
Antworten
Heinrichs
Beiträge: 101
Registriert: Do 21. Okt 2010, 16:31

Problem mit Prozedurparametern

Beitrag von Heinrichs » Di 15. Jan 2013, 10: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 :o .

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

'**********************************************************


Norbert
Beiträge: 2
Registriert: Mo 19. Mär 2012, 12:06

Re: Problem mit Prozedurparametern

Beitrag von Norbert » Mo 4. Mär 2013, 12:53

Hier meine Vermutung:
Das Problem ist wahrscheinlich die Voreinstellung von
HWstack und SWstack
Interrupt, Call (By val) und dann noch Printbin das summiert sich!
Und die 128 Bytes des TINY2313 sind schnell verbraucht.
Ich experimentiere in einem aktuellen Projekt gerade mit den folgenden Einstellungen
$hwstack = 32
$swstack = 5
$framesize = 20

Etwas Hilfe zu dem Thema habe ich hier gefunden:
http://halvar.at/elektronik/kleiner_bas ... ack_frame/

Gruß Norbert

Heinrichs
Beiträge: 101
Registriert: Do 21. Okt 2010, 16:31

Re: Problem mit Prozedurparametern

Beitrag von Heinrichs » Mo 11. Mär 2013, 20:25

Vielen Dank, Norbert, für Deinen Beitrag!

Nach der Vermutung von Norbert habe ich noch ein wenig experimentiert. Hier die Ergebnisse:

1. Ohne eine Veränderung von hwstack etc. funktioniert mein Programm, wenn man beim Interrupt das standardmäßige Sichern der Register mit dem Parameter nosave unterbindet; das entlastet offensichtlich den Stapel.

2. Auch ohne den Parameter nosave funktioniert das Programm, wenn man den Wert von hwstack groß genug wählt, z. B.

$hwstack = 40
$swstack = 15
$framesize = 9

Die Standardeinstellung (bei der das Programm nicht korrekt arbeitete) war übrigens:

$hwstack = 32
$swstack = 8
$framesize = 24

3. Der Printbin-Befehl schluckt im Gegensatz zum Print-Befehl nicht so viele Ressourcen und kann auch nicht primär die Probleme hervorrufen; ersetzt man nämlich die Printbin-Befehle durch simple Port-Befehle, zeigen sich dieselben Phänomene.

Antworten