Atmega16 Power Down INT2 Problem

Gast #1131408
Lesenswert?

Hallo,

ich möchte zwischendurch um strom zu sparen, den Atmega16 in Power Down 
Modus versetzen. Dies klappt auch mit folgender Funktion, die ich nach 
einer bestimmten Ruhezeit aufrufe.

void powerdown(void)
{
    GICR  = 0x20;      // NUR INT2 ist aktiv
   MCUCSR = MCUCSR | 0b01000000;   // INT2 Reagiert auf steigende Flanke
   MCUCR = MCUCR | 0b01100000;    //power down modus UND SE-Bit (sleep 
enable) gesetzt
   NOP();
   NOP();
   asm("SLEEP"); // Ab hier in POWER DOWN, Reaktivierung durch steigende 
flanke am INT2
}


Was ich nicht funktioniert, nämlich bekomme ich keine Reaktion auf 
steigende Flanke am INT2. Ich konfiguriere den ensprechenden Pin, wie in 
der Beschreibung von Atmega16 beschrieben als OUTPUT. Hab noch einen 5k 
Widerstand als Pulldown. Wenn ich aber 5V an den Pin anlege, reagiert 
der µC nicht. (Habe im Debug modus an der entsprechender Interrupt 
funktion einen Breakpoint (AVR Studio))

Weiß vieleicht jemand, wo ich einen Denkfehler habe? Würde mich sehr auf 
einen Tip freuen.

Grüße
Roman
#1131498
Lesenswert?

A. K. wrote:
> Powerup geht evtl. nur pegelgetriggert.
INT2 ist asynchron, sollte also an sich klappen.

@Roman:
Wirf mal einen Blick ins Tutorial und gewöhne Dir schleunigst das 
Beschreiben der Steuerregister mit 0b-irgendwas ab! Die Bits haben Namen 
und ich habe keine Lust, im Datenblatt die einzelnen Bitpositionen 
rauszupfriemeln.
Gast #1131553
Lesenswert?

Hallo,

@Michael U.
im Datenblatt von Atmega16 (Seite 66): "The External Interrupts are 
triggered by the INT0, INT1, and INT2 pins. Observe that, if
enabled, the interrupts will trigger even if the INT0..2 pins are 
configured as outputs.
This feature provides a way of generating a software interrupt."

Interrupt 2 reagiert beim Atmega nur auf die Pegeländerung, nicht auf 
Konstantes pegel.

@Johannnes


Die Register haben beim Atmega16 folgende Bedeutung:

MCU Control and Status
Register – MCUCSR:
JTD ISC2 – JTRF WDRF BORF EXTRF PORF

The Asynchronous External Interrupt 2 is activated by the external pin 
INT2 if the SREG I-bit and the corresponding interrupt mask in GICR are 
set. If ISC2 is written to zero, a falling edge on INT2 activates the 
interrupt. If ISC2 is written to one, a rising edge on INT2 activates 
the interrupt. Edges on INT2 are registered asynchronously

GCIR:

INT1 INT0 INT2 – – – IVSEL IVCE GICR
#1131590
Lesenswert?

Roman wrote:
> Die Register haben beim Atmega16 folgende Bedeutung:
Das ist mir soweit klar, aber Du sollst in Deinem Code die Bitnamen 
verwenden und nicht die Binärschreibweise. Imho gibt es für 0b... nur 
einen einigermaßen sinnvollen Anwendungsfall (zumindest bei Leuten, die 
Probleme haben, sich aus einer Hexadezimalzahl im Kopf das Bitmuster 
zurechtzulegen), nämlich die tatsächliche Ausgabe von Bitmustern an 
Ports.
Gast #1131714
Lesenswert?

> Observe that, if enabled, the interrupts will trigger even if the INT0..2 > pins 
are configured as outputs.
> This feature provides a way of generating a software interrupt."

Dan must aber du mit deinem Programm dafür sorgen, dass du an deinem 
Outputpin die Flanke erzeugts.
Wen du aber auf ein "externes" Ereigniss aufwachen willst, muss der Pin 
auf Input stehen.

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