www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega16 Power Down INT2 Problem


Autor: Roman (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Powerup geht evtl. nur pegelgetriggert.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Roman (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Roman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

also, ich setze:

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

und

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Checker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.