Probleme INT in BASCOM

Gast #138954
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:
........
Gast
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
Gast
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
Gast
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.

...
Gast
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.

...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.