Hallo zusammen, ich versuche, die Pin Change Interrupts beim ATmega169 zu nutzen. Aber der Befehl EIMSK = (1<<PCIE1); funktioniert nicht. Das Register EIMSK ist danach immer noch =Null (habe es testweise ausgelesen) und die Interrupts laufen nicht. Im Debugger geht es einwandfrei. Der Oszillator läuft, andere Interrupts, z.B. Timer funktionieren. Selbst wenn ich das Programm auf wenige Zeilen zusammenkürze, ich kann EIMSK nicht beschreiben. Auch ohne Compileroptimierung ändert sich nichts. Was kann man noch tun? Danke und Grüße Martin
:
Verschoben durch Moderator
Interrupts laufen nicht, oder Register wird nicht beschrieben? Gewisse grosse Megas haben einen Kompatibilitätsmodus. Mein ähnliches Problem kürzlich war darauf zurückzuführen. Keine Ahnung, ob das auf den 169 zutrifft. Mal im Datenblatt schauen?
Andere Interrupts laufen, aber nicht die externen (PCINT). Deshalb habe ich alles mögliche überprüft und gefunden, dass das EIMSK Register nicht beschrieben wird. Wie gesagt, im Debugger geht es. Zum Kompatibilitätsmodus finde ich im Datenblatt nichts.
Hab gerade mal in ein altes Projekt Mega 169 geschaut, da hab ich EIMSK ohne Probleme schreiben können. Ist auch kein doppelt verwendetes Register. Poste doch mal den Code. Gruss
Martin N/a schrieb: > Wie gesagt, im Debugger geht es. Diese Aussage hat keinen Sinn. Vermutlich wolltest du schreiben "im Simulator geht es". Das hilft dir aber gar nichts, denn du willst ja nicht mit dem Simulator arbeiten ... Wodurch hast du denn das ausgelesene Bit verifiziert? JTAG-Debugger?
Hi
>Andere Interrupts laufen, aber nicht die externen (PCINT).
Auch die PINs in PCMSK1 freigegeben?
MfG Spess
Ja, ich meine den Simulator. Das Überprüfen habe ich nur zur Fehlersuche eingeschoben. Pins in PCMSK1 sind freigegeben. Hier mal der Code, an PB4..6 sind Taster gegen Masse (normal einlesen über PINB geht), PE6 ist ein Testausgang.
1 | #define F_CPU 1000000
|
2 | |
3 | #include <avr/io.h> |
4 | #include <avr/interrupt.h> |
5 | |
6 | ISR(SIG_PIN_CHANGE1); |
7 | |
8 | int main(void) |
9 | {
|
10 | DDRE = (1<<PE6); |
11 | PORTB = (1<<PB4)|(1<<PB5)|(1<<PB6); |
12 | |
13 | EIMSK = (1<<PCIE1); |
14 | PCMSK1 = (1<<PCINT12)|(1<<PCINT13)|(1<<PCINT14); |
15 | if(EIMSK) PORTE |= (1<<PE6); // zur Fehlersuche, EIMSK ist hier leider Null |
16 | sei(); |
17 | |
18 | while(1) |
19 | {
|
20 | asm("nop"); |
21 | }
|
22 | }
|
23 | |
24 | ISR(SIG_PIN_CHANGE1) |
25 | {
|
26 | PORTE |= (1<<PE6); |
27 | }
|
ISR(SIG_PIN_CHANGE1); Was soll der Quatsch? Du brauchst keinen Prototypen für einen Interrupt.
Schadet das mit dem Prototypen? Sollte der Übersichtlichkeit dienen. Die falsche HEX zu brennen ist mir wirklich schon passiert, in diesem Fall aber nicht.
Schau mal hier ´rein, vielleicht hast Du ja einen Mega169PA... http://www.atmel.com/Images/doc8295.pdf
Knut: "...doc8295.pdf" Super, danke! Das war es. Es ist aber ungünstig, dass die zwei die gleiche Signatur haben. Die hatte ich extra überprüft. Danke und schönen Sonntag Martin
In der Tat. Bei anderen AVR-Controllern wird signaturmäßig zumindest zwischen P und xA Varianten unterschieden. Wahrscheinlich hat hier die Entwicklungsabteilung einfach das Marketing überholt ;-)
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.