Hallo allerseits, folgendes Problem beschäftigt mich seit gestern Abend: In AVR-Studio (4.09) funktioniert das Programm wie gewünscht. Wird es auf den uC übertragen, fällt dieser sofort in den Sleep-Mode und lässt sich über INT0 nicht mehr aufwecken. Woran könnte das liegen ? -----------------<< CODEANFANG >>----------------- ;****************************************************************** ;* * ;* Beschreibung: * ;* * ;* Programm zur Demonstration des 'Power-Down'-Modus * ;* * ;* Direkt nach dem Power-On-Reset fällt der 2313 in den Sleep-Mode* ;* Betätigen von T1 bewirkt ein 'aufwachen' * ;* Betätigen von T2 -> wieder in Sleep-Mode fallen * ;* * ;* Hardware: * ;* * ;* T1 - PD2 (INT0), aufwachen * ;* T2 - PD3 (INT1), schlafen * ;* Die Taster werden über Pull-Down-Widerstände (5k) angeschlossen* ;* * ;* AT90S2313 @ 4MHz an 5V * ;* Die Stromaufnahme wird mit Hilfe eines Multimeters kontrolliert* ;* * ;* Keine sonstige Hardware ist angeschlossen (Programmer, LEDs, ..* ;* * ;****************************************************************** ;* * ;* Autor: Alexander Nießen * ;* Datum: 18.06.2004 * ;* * ;****************************************************************** ; .include "2313def.inc" .def temp1 = r16 ;------------------------------------------------------------------ .cseg ; Resetvektoren initialisieren rjmp reset rjmp ext_int0 rjmp ext_int1 ;------------------------------------------------------------------ ext_int0: ldi temp1, 0b00001111 ; SM nicht zugelassen out MCUCR, temp1 reti ;------------------------------------------------------------------ ext_int1: ldi temp1, 0b00111111 ; SM zulassen out MCUCR, temp1 reti ;------------------------------------------------------------------ reset: ldi temp1, LOW(RAMEND) ; Stackpointer init. out SPL, temp1 ; beide Ports als Ausgang definieren ldi temp1, 0b11111111 out DDRB, temp1 out DDRD, temp1 ldi temp1, 0b11000000 out GIMSK, temp1 ; INT0 und INT1 Enable ldi temp1, 0b00111111 ; SE, SMode, ISC out MCUCR, temp1 sei ; IRQs freigeben loop: sleep ; schlafen gehen ?! rjmp loop ;------------------------------------------------------------------ ------------------<< CODEENDE >>------------------ Grüße, Alex
Hat keiner eine Idee woran das liegen koennte ? Egal - Ich habe mir beholfen, indem ich den Controller über den Reset wieder ins Leben zurückrufe. Grüße, Alex
Hallo Alex, mal scauen was ich hier lernen kann. Verstehe ich das richtig? Schaltest Du beide Ports auf Ausgang, obwohl Du INT0 (PD2) und INT1 (PD3) als Eingänge brauchst? Gruß Quark
Hallo Alex, nochmal eine (hofentlich nicht zu Dumme) Frage. Im 2313 Manual auf Seite 25 steht doch, das die INT-Eingänge Low Aktiv sind, habe jetzt nicht Deine MCUCR Einstellungen nachgeschaut, ob Du auf Flanke "Interruptst". Da wären die Taster mit Pull-Down Rs doch fehl am Platze, oder? Gruß Quark P.S. "mal scauen was ich hier lernen kann." und "nochmal eine (hofentlich nicht zu Dumme) Frage." könnten Dir und anderen ironisch oder so vorkommen, dem ist aber nicht so, bin selber Anfänger und weiß es auch noch nicht so richtig. Morgen teste ich es mal.
Hallo Quark. Die Interrupts sind auf Rising Edge eingestellt. Das funktioniert ganz gut so, obwohl beide Datenrichtungsregister auf Ausgang stehen. ... und weil ich nicht verstehe wieso der MC nicht aufwacht habe ich in der Interrupt Service Routine für INT0 mal zum 'debuggen' eine LED eingeschaltet und mit INT1 ausgeschaltet (Natürlich ohne Sleep Mode. Wollte nur sehen, ob die Interrupts richtig funktionieren.) Das ging ... Nur das mit dem aufwecken über INT funktioniert nicht. Naja - war eh' nur, um den Stromverbrauch im normalen Modus und im Sleep Modus zu verifizieren. In der Schaltung, die ich gerade für meine Frau bastel, wird der MC über einen normalen Reset aus dem Tiefschlaf geholt. Ist halt Batteriebetrieben. Da kam ich um den SM diesmal net drumherum ;) Grüße, Alex
--- interessiert das überhaupt noch jemanden?? --- g Hallo Alex, wollte es ja "Morgen" testen, hatte aber leider keine Zeit. Es ist wohl so, das es zwei Sleep-Modes gibt. Aus dem "Power-Down"-Mode kann nur ein Level-Interrupt die mcu aufwecken (MCUCR = 0b00111100). Wenn man den "Idle"-Mode nimmt (Bit4 = 0, im MCUCR), geht es auch mit dem "edge"-interrupt (MCUCR = 0b00101111) (Seite 25-27) . Habe dazu mit hilfe Timer0 ein LED blinken lassen, und den Timer int. zugelassen wenn kein "Sleep enabled" war, und gesperrt wenn "Sleep enabeld" war. Danke für Deine Frage, habe durch das Testen was gelernt! Gruß Quark
Sicher interessiert das noch g Ich hab' auch nochwas hinzugelernt: Keinen 7805 in Batteriebetriebenen Geräten einzusetzen. Dieser verursacht einen dauernden Strom von knapp 3mA :-O Grüße, Alex
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.