Forum: Mikrocontroller und Digitale Elektronik Atmega16 Power Down INT2 Problem


von Roman (Gast)


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

von Michael U. (amiga)


Lesenswert?

Hallo,

ich frage mich gerade etwas besorgt: wie kommt man auf die Idee, einen 
Interrupt-EINGANG auf OUTPUT (also AUSGANG) zu programmieren und dann 
noch zu hoffen, das da was passiert???

Gruß aus Berlin
Michael

von (prx) A. K. (prx)


Lesenswert?

Powerup geht evtl. nur pegelgetriggert.

von Johannes M. (johnny-m)


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.

von Roman (Gast)


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

von Johannes M. (johnny-m)


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.

von Roman (Gast)


Lesenswert?

Hallo,

also, ich setze:

INT2 = 1; //Interrupt 2 aktiviert (GCIR Register)

und

ISC2 = 1; // Interrupt 2 reagiert auf steigende Flanke (MCUCSR Register)

von Johannes M. (johnny-m)


Lesenswert?

Mit Deinem Codefragment kann man nicht viel anfangen. Da fehlen prktisch 
alle Randbedingungen (v.a. sei() und eingebundene Header). Vollständigen 
Code bitte!

von Checker (Gast)


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.

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.