Forum: Mikrocontroller und Digitale Elektronik ATxmega128A1 Port Interrupt


von needhelp (Gast)


Angehängte Dateien:

Lesenswert?

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!

von Hmm (Gast)


Lesenswert?

Spendiere mal ein IRET statt eines RET.

von Hmm (Gast)


Lesenswert?

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.

von needhelp (Gast)


Angehängte Dateien:

Lesenswert?

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

von Hmm (Gast)


Lesenswert?

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

von needhelp (Gast)


Lesenswert?

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

von needhelp (Gast)


Angehängte Dateien:

Lesenswert?

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 :/.

von Hmm (Gast)


Lesenswert?

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

von Hmm (Gast)


Lesenswert?

Wozu eigentlich die "txt"-Dateierweiterung?
Assembler-Dateien haben die Erweiterung "asm".
Hoffentlich stolpert das AVRStudio da nicht d'rüber.

von needhelp (Gast)


Lesenswert?

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.

von Hmm (Gast)


Lesenswert?

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.

von needhelp (Gast)


Lesenswert?

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

von Hmm (Gast)


Lesenswert?

>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
Noch kein Account? Hier anmelden.