Forum: Mikrocontroller und Digitale Elektronik Probleme INT in BASCOM


von AVR Newbie (Gast)


Lesenswert?

Hallo zusammen,
habe hier ein kleines Problem:
Sobald in meinem Prog ein bestimmtes ereignis vorkommt aktiviere ich
INT1 und gebe über pind.6 daten aus. Die Daten sollen immer geschickt
werden wenn ich an INT1 eine steigende Flanke habe. Das Funktioniert
auch ganz gut nur arbeitet der Controller ja im Hintergrund weiter so
dass es zu Fehlern bei der ausgabe kommen kann.

Meine Frage: Kann man es irgendwie schaffen dem Controller zu sagen
dass er nur die ISR auszuführen hat und sonst nix anderes?
Konkret nochmal: Ich will dass, sobald die ISR aktiviert ist dass der
Controller nur diese Ausführt (und sonst nix) bis in meinem Fall X=68
ist und danach per Goto in ne andere Sub.

Bin ziemlich am verzweifeln.
Freu mich schon auf eure antworten.
Gruß
AVR Newbie


hier mal ein Codestück:

Config Int1 = Rising
On Int1 Geben
Enable Interrupts

......

Reset Portd.5
Enable Int1


Geben:
Incr X
Portd.6 = G(x)

If X = 68 Then
Set Portc.0
Set Portd.5
Disable Int1
Goto Rto
End If

Return
Return

rto:
........

von Tobi (Gast)


Lesenswert?

wusste noch garnicht, dass ein avr 2 sachen gleichzeitig ausführen
kann...
der uC macht immer nur eine sache zur gleichen zeit, alles andere wird
solange eingefroren und nach dem int fortgesetzt

von AVR Newbie (Gast)


Lesenswert?

Hi,
ja schon nur reagiert, d.h. die ISR wird ja nur ausgeführt wenn sich am
INT ne steigende Flanke ergibt.
wenn diese Ausgeführt ist geht er wieder dahin zurück wo man ihn
rausgeholt hat.
Ich will jetzt aber, dass sobald einmal die ISR aktiviert ist NUR noch
diese ausgeführt wird bis X=68.
Also bei jeder Flanke in die ISR ansonnsten nix tun.

Gruß
AVRNewbie

von ...HanneS... (Gast)


Lesenswert?

Da spielen noch andere Faktoren eine Rolle.

- Gibt es noch andere Interrupts im Programm? (z.B. Timer)
- Wie schnell hintereinander kann so ein Ext.-INT anliegen?
- Wie wird der Int erzeugt? (doch nicht etwa von einem mechanischen
  Schalter?)

Viele meiner Programme sehen im Hauptprogramm so aus:

main: rjmp main ;Nix tun...

Denn wenn nicht allzuviele Dinge (quasi-) gleichzeitig zu tun sind,
dann läuft die eigentliche Arbeit in einem Timer-Int. Man muss nur
darauf achten, dass "sich die Katze nicht in den Schwanz beißt", also
das Programm nicht länger dauert als der Inerruptabstand ist. Sind dann
noch andere zeitkritische Int's erforderlich, dann mach' ich diese
ISRs extrem kurz und setze im Timer-Int das I-Flag, worauf andere Ints
höhere Priorität haben, den Timer-Int also unterbrechen können.

Das geht aber nur, wenn man selbst die Übersicht über die Ressourcen
behält, also besonders in ASM. Überlässt man das einem Compiler, behält
man die Übersicht nur, wenn man den Compiler und seine Arbeitsweise sehr
gut kennt.

...

von ...HanneS... (Gast)


Lesenswert?

Dann setze in der ISR ein Flag,
werte dieses im Hauptprogramm aus und verzweige in deine
Ausgaberoutine. Setze das Flag erst zurück, wenn diese Arbeit erledigt
ist.

...

von Günter (Gast)


Lesenswert?

Hallo

..oder schaue dir mal das Beispiel INT0.BAS (wird in dem Ordner
Samples von BASCOM mitgeliefert) an.

Gruß

Günter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.