Hallo Leute! Habe ein Problem mit dem global-interrupt flag. Ich setze es zwar im Reset, aber es wird seltsamerweise jedesmal nach der Instruction sbrs disabled... Habe ich einen Fehler bei der Initialisierung oder liegt es an etwas anderen? Vielen Dank für die Hilfe schon im Voraus!
Ich weiss ja nicht wieviele Einträge Du hier schon gelesen hast oder ob Du schon gezielt nach Tastenabfrage mit Interrupt gesucht hast. Deswegen der Hinweis: Tastenabfrage per Interrupt ist Igittigit. Die Gründe sind hier in mehr als ausreichendem Maße beschrieben.
Hat leider keine Veränderung bewirkt... Die ISR beende ich gepflegt mit reti... desweiteren sichere ich das Statusregister, damits da nix haben kann. Aber wie bereits erwähnt. Sobald die Instruction sbrs ausgeführt wird, verliere ich das global interrupt flag... ich springe also nie in die ISR
>Hat leider keine Veränderung bewirkt...
Nun. Falsch war es in jedem Fall und es hätte auch erklärt, warum das
globale Interrupt Flag auf einmal gelöscht ist.
Allerdings hätte das vorausgesetzt, das Deine Beschreibung nicht
wortwörtlich zutraf, da der SBRS Befehl in keinem Fall das Interrupt
Flag beeinflussen kann.
Dann muss Dein Problem woanders liegen. Aber nicht in dem gezeigten
Quellcode-Abschnitt.
Wie stellst Du eigentlich fest, ob das Flag gesetzt ist? Im Simulator?
Dann gäbe es da noch die Falle, das der Simulator nicht immer korrekt
arbeitet.
Poste am besten das ganze Projekt und sage was zu den Einstellungen.
Welcher Prozessor? Welche Entwicklungsumgebung?
Vielleicht findet sich ja jemand, der sich die Mühe macht, das mal zu
laden.
Ich habe noch die gute alte Version 4 vom AVRStudio geladen.
Ich will mit diesem Interrupt das Prellen der Tasten veranschaulichen. Sobald eine Taste gedrückt wird rufe ich eine Delay-Schleife auf. In der ISR erhöhe ich nun einen counter, der mir zeigt wie oft eine fallende Flanke kommt (also das Prellen des Tasters). Allerdings scheitert es bei sbrs...
Hmm schrieb: > Dann muss Dein Problem woanders liegen. Aber nicht in dem gezeigten > Quellcode-Abschnitt. Anbei nun der Source-Code. Ich benutze Atmel Studio 6, debuggen tu ich mit AVR Dragon über JTAG. Hmm schrieb: > da der SBRS Befehl in keinem Fall das Interrupt > Flag beeinflussen kann. genau deshalb kenn ich mich nicht mehr aus :). Aber ich finde sonst auch keinen Fehler :/.
>Wie stellst Du eigentlich fest, ob das Flag gesetzt ist? Im Simulator? >Dann gäbe es da noch die Falle, das der Simulator nicht immer korrekt >arbeitet. >... und sage was zu den Einstellungen.
Wozu eigentlich die "txt"-Dateierweiterung? Assembler-Dateien haben die Erweiterung "asm". Hoffentlich stolpert das AVRStudio da nicht d'rüber.
Hmm schrieb: > Wozu eigentlich die "txt"-Dateierweiterung? Hoppla... macht der Gewohnheit. Ist natürlich ein *.asm Datei! Also zur Simulation: Wie gesagt ich verwende für das Debuggen den AVR Dragon über JTAG. Zu den Einstellungen, kann ich leider nicht viel sagen, hab keine anderen getroffen außer dem Standard. Ich sehe ob das Flag gesetzt ist im Processor-View. Dort wird das Status-Register angezeigt und welche Bits in ihm gesetzt sind.
Dem Code nach verfolgst Du zwei Zwecke gleichzeitig. Einerseits willst Du über den Interrupt und den Zähler das Prellen erfassen andererseits einen Tastendruck erkennen um dadurch ausgelöst die Zählerstände der Variablen counter_reg und des Timers 0 auszugeben. (Solch eine Beschreibung sollte eigentlich von Dir kommen). Das ist evtl. kontraprodktiv im konkreten Fall und auch im Allgemeinen. Ich empfehle Dir erstmal nur die Flankenerkennung zu implementieren. Was aber noch wichtiger ist: Du hast ja bereits ein Ereignis, nämlich den Interrupt, der Dir sagt, das eine Taste betätigt wurde. In diesem Interrupt setzt Du Dir einfach eine Variable, die in main abgefragt wird und dann die Aufrufe der Subroutinen 1 und 2 auslöst. Die Delays solltest Du Dir in jedem Fall schenken. Ich sehe nicht wozu die eigentlich gut sein sollen. Im Allgemeinen wirst Du sowieo so schnell die LEDs nicht ablesen können wie sie aktualisiert werden. (Soll dafür das Delay sein)? Da hilft nur ein Logikanalyser oder eine Ausgabe auf eine Schnittstelle. >Also zur Simulation: Wie gesagt ich verwende für das Debuggen den AVR >Dragon über JTAG. Also das sollten wir klarstellen: Simulation oder Debugger? Was die Einstellungen betrifft, so gibt es für das Projekt, den Simulator und evtl. auch den Debugger getrennte Einstellungen für den CPU-Typ. Wie das konkret beim Studio 6 ist, weiss ich nicht. Sollte sich aber in der Doku finden lassen.
Hmm schrieb: > Also das sollten wir klarstellen: Simulation oder Debugger? Debugger. Hmm schrieb: > Du hast ja bereits ein Ereignis, nämlich > den Interrupt, der Dir sagt, das eine Taste betätigt wurde DANKE für dieses Satz :). Vollkommen klar... hab aber irgendwie nicht daran gedacht!...eieiei... Funktioniert jetzt... Trotzdem verstehe ich leider nicht warum ich das interrupt-flag bei sbrs verloren habe...
>Trotzdem verstehe ich leider nicht warum ich das interrupt-flag bei sbrs >verloren habe... >Funktioniert jetzt... Was hast Du denn geändert? Zeig mal den gegenwärtigen Code. Hast Du an den Einstellungen was geändert?
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.