PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt aus Interruptroutine heraus??



Baui
25.04.2005, 13:55
Hallo,
habe folgenden Aufbau:
Ich möchte meine MEga8 bei einem High Pegel auf INT1 in die Routine Interrupt springen lassen. In dieser Routine soll er dann auf 5 Bytes vom Uart warten (mit weiterem Interrupt) dabei soll er jedoch bei einer Zeitüberschreitung aus der Routine wieder herausspringen



on int1 interrupt
on urxc serialin

interrupt:
var=1
count=0

do
waitms 2
count=count+1
if count=20 then return 'wenn eine Zeit überschritten wird dann routine verlassen
loop until var=5

return

serialin:
inputbin(var)
count=0
var=var+1
return


Wie kann ich das bewerkstelligen? WEil der Mega sperrt innerhalb einer Interruptroutine ja sämtliche andere Interrupts.
Es geht übrigens nicht, dass ich das von Anfang an gleich ohne den INT! mache. Der muss zu allererst aufgerufen werden.

Bin über jede Hilfe dankbar

Gruß
Baui

JanB
25.04.2005, 14:06
Hallo,
du kannst die Interrupts problemlos verschachteln
so wie Unterprogrammaufrufe.
Du musst nur beachten das der Stack passend dimensioniert ist.

Die Interrupts kannst du mit dem Assemblerbefehle "sei" auch
innerhalb einer Interruptroutine wieder freigeben.
Vorsicht nur bei Pegelgesteuerten Interrupts,
die werden sofort wieder aufgerufen, wenn du die Interrupts wieder freigibst,
und dann läuft dir schnell der Stack über...
Evtl. den entsprechernden INT im Control Register sperren,
oder sogar alle sperren und nur den INT freigeben, denn du haben willst.

Gruß Jan

Baui
25.04.2005, 18:26
Hallo Jan,
erstmal danke für deine antwort. Mit dem Interrupt funktioniert es bei mir nicht in meinem Testprojekt und auch nicht im richtige.
Wie würdest du das ganze ohne Interrupt aufziehen? Also ich möchte, dass der Prozessor wieder aus der Empfangsroutine (welche durch den HIGH Pegel auf INT1 ausgelöst wird) herausspringt, wenn innerhalb von 40ms oder ähnlich nichts empfangen wrude.



var=1
count=0

Do
If Ischarwaiting() = 1 Then
Inputbin Datain(var)
var=var+1
count=0
End If

'Falls keine Daten eintreffen
Waitus 100
Count = Count + 1
If Count = 400 Then return
Loop Until var=5

Count = 0
Var = 1


Gruß
Baui

Baui
06.05.2005, 15:15
Hi,
also ich bräuchte jetzt wirklich nochmal eure Hilfe.

Und zwar muss ich es halt irgendwie hinbekommen, dass ich fünf Bytes einlese, und dabei auf die verstrichene Zeit zwischen den Bytes achte. Überschreitet die dann zum Beispiel 100ms dann soll der µC wieder sein Hauptprogramm abarbeiten.

Ich bekomme es einfach nicht hin zwei INterrupts (funktionstüchtig)ineinander zu verschachteln. Gibts noch eine andere Lösung. Kann man in Bascom die Inputbin funktion irgendwie abbrechen?

Würde mich wirklich über Hilfe freuen. Irgenwann werd ich an diesem RS485-Bus nochmal verzweifeln

Gruß
baui