PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Rücksprungposition nach einem ext.Interrupt



lejcko
25.01.2006, 20:40
Hallo habe da ein Problem,

ich möchte gerne das mein Programm nach einem Ext.Interrupt wieder an Anfang meines Programmes zurückkehrt und nicht da wo der Interrupt ausgelöst worden ist.

$regfile = "m32def.dat"
$baud = 9600
$crystal = 8000000


Config Int0 = Rising
On Int0 Irq0
Enable Int0

Enable Interrupts


Do

Print "1"
Wait 1
Print "2"
Wait 1
Print "3"
Wait 1
Print "4"
Wait 1
Print "5"
Wait 1
Print "6"


Loop

Irq0:
Print "interrup"
Return

End


wie schafe ich es das er wieder bei Print "1" anfängt?

mfg
Lejcko

PicNick
26.01.2006, 07:59
Nun, es gibt einige üble Tricks, die aber in deinem Falle irgendwie über-drüber wären
Mach doch:


...
DIM zahl as byte

Do
incr zahl
disable interrupts
if Zahl > 4 then Zahl = 1
Print str(Zahl)
enable interrupts
Wait 1
Loop

Irq0:
Print "interrup"
zahl = 0
Return

End

Das mit disable/enable ist notwendig, sonst zeigt er vielleicht Kraut und Rüben

lejcko
26.01.2006, 18:50
Hallo Robert,

erstmal danke für deine Antwort.
Wahrscheinlich war mein Code bischen doof gewählt wolte nur mein Problem vereinfacht darstellen in Wirklichkeit ist mein Program eine
Ablaufsteuerung für eine vollautomatische Bohrmaschine mit vielen Sub's und Verzweigungen.
Was ich erreichen wollte ist das wenn ich nun Stoptaste(IRQ0) betätige
soll der Ablauf sofort unterbrochen werden und das Programm zum Anfang springen und auf einen neuen Startbefehl warten.
Im MOment ist es so daß die Maschine zwar sofort anhält, aber an der Rücksprungstelle weiter machen will.
Zur Zeit mache ich es so, dass ich einen Hilfsmerker während des Interrups setze und dann weiter im Programm zu hilfe nehme ala If..Then Goto Anfang usw. Ist halt umständlich in jede Abfrage dann auch diesen Hilfsmerker mit abzufragen (bläht den ganze Code auf).

mfg.
Lejcko

PicNick
26.01.2006, 20:08
Naja, mit ein wenig Assembler und ein paar programmtechnische Schweinereien kann man das schon machen. uiuiui.
Müßt ich mir durchdenken und kann dir dann was vorschlagen.
Einen vollen Reset GANZ nach vorn kannst du nicht brauchen ?

lejcko
26.01.2006, 22:10
WEnn du meinst einen Softwarereset das währe auf jedenfall eine alternative da habe ich noch gar nicht drüber nachgedacht.
Leider bin ich Bascomneuling also würde mich freuen wenn du mir da helfen würdest.
Die Lösung Assemb. & Co. wird zu kompliziert.

mfg
Lejcko

PicNick
27.01.2006, 08:33
Software -Reset wäre
GOTO &H0000 (in deiner Interrupt-Routine)

SprinterSB
27.01.2006, 09:19
MIt der Goto-Lösung für einen Reset muss man aber bedenken, daß dadurch die Hardware nicht so initialisiert ist wie nach einem "richtigen" Reset mit Zurücksetzen aller SFRs etc. Das kann beim Neustart u.U. zu Problemen führen oder mann muss rechtzeitig die Register "von Hand" zurücksetzen.

Alternativ kann man den Watchdog dazu verwenden, einen Reset zu triggern. Allerdings geht das nicht sofort, sondern es braucht schon 15ms oder so, also eine halbe Ewigkeit...

lejcko
27.01.2006, 16:30
Danke an euch beide für die Info,

werde es auf jeden Fall mit dem Gotobefehl ausprobieren,
unabhängig davon würde ich gern natürlich auch die watch dog Variante austesten, aber wie schon weiter oben zugegeben, bin ich noch nicht besonders gut mit Bascom unterwegs, kurz und schmerzlos "wie geht dem"? Schätze das "Watch dog" kein Syntax von Bascom ist also mus man sich das selber irgend wie aus dem Bascomcode zusammen basteln. - Timer ....etc ?

mfg.
Lejcko

PicNick
27.01.2006, 16:40
CONFIG WATCHDOG

Type "Help" for help

lejcko
27.01.2006, 17:21
Prima danke das müste funktionieren
die 16ms kann ich verkraften.
Nochmals vielen dank für die Unterstützung.


mfg.
Lejcko