Forum: Mikrocontroller und Digitale Elektronik Interrupt 8Bit AVR


von Interrupt 8Bit AVR (Gast)


Lesenswert?

Hallo,

nutze einen Atmega64M1

Versuche den Externen Interrupt 0 zu nutzen. Und zwar an PIN 14 (PD6)
1
ISR (INT0_vect) {
2
  cli();
3
  PORTB ^= 1 << PORTB3;
4
  sei();
5
}
6
7
8
void main(void) {
9
// Externer Interrupt
10
EICRA = (1 << ISC00);    // Any logic change...
11
EIMSK = (1 << INT0);    // External Interrupt Request 0 Enable
12
PCICR = (1 << PCIE2);    // Pin Change Enable 2 (PCINT23:16)
13
PCMSK2 = (1 << PCINT22);  // INT22 - PIN: PD6
14
DDRD &= ~(1<<6);    // PD6 als Eingang
15
PORTD|= (1<<6);      // Pullup aktivieren
16
17
PORTB = 0x00;
18
19
sei();        // Global Interrupts aktivieren
20
}

Was mache ich falsch? Kann das ganze kompilieren. Timer Interrupt 
funktioniert.

Würde mich über Hilfe sehr freuen.

von Felix A. (madifaxle)


Lesenswert?

Zunächst sollte PORTB auch als Ausgang konfiguriert werden.

Und dann solltest du cli() und sei() aus dem Interrupt entfernen, da das 
I-Bit automatisch gelöscht werden sollte. Siehe auch Datenblatt.

von Timmo H. (masterfx)


Lesenswert?

Das cli bzw sei in der ISR ist nicht notwendig. In der Main nach sei 
solltest du aber eine while(1); machen.
DDRB solltest du pin3 auf output setzen oder willst du nur den pullup 
aktivieren.?

von Christian S. (vivus)


Lesenswert?

Ausgang ist gesetzt:
PORTB = 0x00;

Ich hab an dem Port ne LED. Anderweitig klappt das mit dem togglen :) 
Dh. es muss am Interrupt liegen.

while(1) hab ich auch drin, wollte es nur etwas übersichtlicher halten.

cli() und sei() aus ISR() löschen bringt leider nichts.

von Felix A. (madifaxle)


Lesenswert?

DDRB muss konfiguriert werden!

von amsel (Gast)


Lesenswert?

Interrupt 8Bit AVR schrieb im Beitrag #4347289:
> Was mache ich falsch? Kann das ganze kompilieren. Timer Interrupt
> funktioniert.

Ohne zu erklären, was denn jetzt dein Problem ist, kannst du das auch in 
dein Tagebuch schreiben.

von Christian S. (vivus)


Lesenswert?

Versuche den Externen Interrupt 0 zu nutzen. Und zwar an PIN 14 (PD6)
Wenn ich ein high pegel anlege, wird die ISR() nicht ausgeführt. Die LED 
an PIN PB3 funktioniert. Dh. es muss an meiner Konfiguration des 
externen Interrupts liegen.

von M. K. (sylaina)


Lesenswert?

Interrupt 8Bit AVR schrieb im Beitrag #4347289:
> EICRA = (1 << ISC00);    // Any logic change...
> EIMSK = (1 << INT0);    // External Interrupt Request 0 Enable
> PCICR = (1 << PCIE2);    // Pin Change Enable 2 (PCINT23:16)
> PCMSK2 = (1 << PCINT22);  // INT22 - PIN: PD6

Willst du jetzt den externen Interrupt benutzen oder den Pin Change 
Interrupt? Entscheide dich ;)

von Christian S. (vivus)


Lesenswert?

Ah ok,

dh. für Externen Int nur

EICRA = (1 << ISC00);    // Any logic change...
EIMSK = (1 << INT0);    // External Interrupt Request 0 Enable

Aber wie sage ich dem MCU, dass er nur PIN PD6 gucken soll?

von Felix A. (madifaxle)


Lesenswert?

Die externen Interrupts sind festgelegt auf bestimmte Pins. Die lassen 
sich nicht umbiegen.

INT0 auf PD0, INT1 auf PD1 ...

von Felix A. (madifaxle)


Lesenswert?

Sonst musst du die PinChange-Interrupts nutzen. Das geht aber nicht über 
den INT0_vect.

von JackFrost (Gast)


Lesenswert?

Der INT0 geht nur am PD6. Den kann man nicht auf einen anderen Pin legen

von Felix A. (madifaxle)


Angehängte Dateien:

Lesenswert?

Hier mal die Pinbelegung laut Datenblatt PD0 ist INT0.

von JackFrost (Gast)


Lesenswert?

Felix A. schrieb:
> Hier mal die Pinbelegung laut Datenblatt PD0 ist INT0.

Der TO hat geschrieben er hat nen Atmega64*fett*M1 und da ist es laut 
Datenblatt der PD6

Gruß JackFrost

von M. K. (sylaina)


Lesenswert?

Felix A. schrieb:
> Hier mal die Pinbelegung laut Datenblatt PD0 ist INT0.

Falscher Atmega. Der TE schreibt er benutzt einen Atemga64M1 und nicht 
einen Atmega64!

Christian S. schrieb:
> Aber wie sage ich dem MCU, dass er nur PIN PD6 gucken soll?

Brauchst du nicht, das macht ja der externe Interrupt für dich. Dafür 
sind die ja da, um es dir einfacher zu machen.

von Felix A. (madifaxle)


Lesenswert?

Ah, ich dachte, es wäre das Gehäuse gemeint. Da gibt es die SMD-Variante 
M1.

von Christian S. (vivus)


Lesenswert?

Nu gehts, glaub es lag daran, dass das Kabel was ich an PD6 gehalten hab 
nit ganz i.O. war ... entschuldigt!

Danke für eure Hilfe!

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.