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: ........
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
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
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. ...
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. ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.