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
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
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.
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
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.
Hallo, also, ich setze: INT2 = 1; //Interrupt 2 aktiviert (GCIR Register) und ISC2 = 1; // Interrupt 2 reagiert auf steigende Flanke (MCUCSR Register)
Mit Deinem Codefragment kann man nicht viel anfangen. Da fehlen prktisch alle Randbedingungen (v.a. sei() und eingebundene Header). Vollständigen Code bitte!
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.