ATmega169 "EIMSK" nicht ansprechbar

OP #2899129
Lesenswert?

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
#2899152
Lesenswert?

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?
OP #2899535
Lesenswert?

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
}

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