PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : BASCOM Mega32 und Interrupt



Kurt-b
03.05.2008, 08:48
Hallo Leute,

das hier macht doch sicherlich Probleme, wie kann ich diese Falle umgehen.
Ich möchte ein im Kreis laufendes (wartendes) Unterprogramm einfach abwürgen und mit dem Hauprprogramm neu beginnen.


Mega32 - BASCOM




'--------------------------------------------------------
'----------------- (Timer 0 Interrupt)-------------------
'--------------------------------------------------------

Int_einsprung:

Incr Takt_zaehler

If Takt_zaehler > 10000 Then
Takt_zaehler = 0
Goto Int_aussprung
End If


Return

' -----------------------------------------------------


Int_aussprung:

'??? Stack-reparatur

Goto Anfang



Kurt

for_ro
03.05.2008, 10:15
Ich möchte ein im Kreis laufendes (wartendes) Unterprogramm einfach abwürgen und mit dem Hauprprogramm neu beginnen.


Dein im Kreis laufendes Unterprogramm ist doch nicht die Timer0 ISR, oder?
Die wird ja unabhängig vom Restprogramm regelmäßig aufgerufen.
Per 'Goto' rausspringen geht gar nicht, du musst über ein 'Return' drüber.
Du kannst anstatt des Sprungbefehls ein Flag setzen, z.B.
Goto_Anfang_flag=1
und dann im Hauptprogramm dieses abfragen und entsprechend springen. Dazu musst du aber regelmäßig über diese Abfrage kommen.
Zeig doch mal mehr von deinem Programm.

Gruß

Rolf

Kurt-b
03.05.2008, 15:12
Hallo Rolf,






Ich möchte ein im Kreis laufendes (wartendes) Unterprogramm einfach abwürgen und mit dem Hauprprogramm neu beginnen.





Dein im Kreis laufendes Unterprogramm ist doch nicht die Timer0 ISR, oder?


nein nein.

Ich hab eine Hauptschleife die mehrere Unterprogramme nacheinander anspringt.

Diese UP sind es die ev. nicht zurückkommen weil sie auf eine Eingabe der in ihnen abgefragten Soft-ser warten.
Ich finde keinen Weg um hier Zeichenpuffer einzurichten.
Darum muss ich einfach warten bis Zeichen kommen.
Und das kann halt dauern.

Drum hab ich mir den Zähler in der IS-Rutine eingerichtet.
Wenn der erreicht wird soll das UP einfach abgebrochen, und das Hauptprogramm von Vorne begonnen werden.
Hier kann ich dann entscheiden welches UP als nächstes bedient wird.




Die wird ja unabhängig vom Restprogramm regelmäßig aufgerufen.
Per 'Goto' rausspringen geht gar nicht, du musst über ein 'Return' drüber.

Eben, daum gehts.
Es müsste aber auch gehen das man einfach die Rücksprungadresse verbiegt und dann am Programmanfang landet.
Das würde reichen wenn die anderen Var unangetastet blieben.




Du kannst anstatt des Sprungbefehls ein Flag setzen, z.B.
Goto_Anfang_flag=1
und dann im Hauptprogramm dieses abfragen und entsprechend springen. Dazu musst du aber regelmäßig über diese Abfrage kommen.
Zeig doch mal mehr von deinem Programm.


Die Abfrage geht ja erst wenn ich aus dem wartendem UP raus bin.
Und das geht nicht weil die Returnadresse mich immer wieder dahin zurückbefördert.

Im UP lauter Abfragen einzurichten ist halt sehr aufwendig.

Das wär alles kein Problem wenn ein Zeichenpuffer machbar wäre.

Sowohl bei OPEN "COMBx, xx
als auch bei SERIN xxx
hab ich keinen Weg gefunden das einzurichten.
Dann wärs einfach mit einer Abfrage des Puffers festzulegen ob das UP überhaupt angesprungen wird oder nicht.


Kurt

PicNick
03.05.2008, 15:25
Verwendest du die Hw-UART ?

Kurt-b
03.05.2008, 21:08
Verwendest du die Hw-UART ?


Hier zur Hauptkommunikation mit dem Zielsystem.

Das Ziel ist mehrere SER- Signale einzulesen und gemeinsam weiterzugeben.
Da ich auch mal mehr als zwei einlesen können will hab ich die Soft-UART eingerichtet.

Naja so direkt scheints nicht zu gehen weil keine Puffer vorhanden sind.
Ich machs wahrscheinlich anders.
Werd einfach die Signale nacheinander auf den HW-UART legen,
damit düften die Probleme beeitigt sein.
Denn da kann ich den Puffer auf -genügend Zeichen- abfragen und wenn nichts kommt einfach ins Hauptprogramm zurückkehren.


Gruss Kurt

stefan_Z
06.05.2008, 13:18
Nimm einen AVR mit mehreren COMs, dann haben die auch Interrupt und Puffer...

Kurt-b
07.05.2008, 23:08
Nimm einen AVR mit mehreren COMs, dann haben die auch Interrupt und Puffer...

Was ist denn das so gängig?
Gibs vielleicht welche mit vier Kanälen?


Kurt

stefan_Z
08.05.2008, 02:13
Ja gibts. Aber sind die gaaaanz dicken Brummer...
ATmega640, ATmega1280, ATmega2560