ATxmega128A1 Port Interrupt

Gast #2974386
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!
Angehängte Dateien:
Gast #2974404
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.
Gast #2974417
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
Angehängte Dateien:
Gast #2974425
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.
Gast #2974426
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...
Gast #2974437
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 :/.
Angehängte Dateien:
Gast #2974467
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.
Gast #2974484
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.
Gast #2974516
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...
Gast #2974525
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren