PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATtiny2313 in den Sleep-Mode versetzen?



ledi
01.06.2010, 08:59
Hallo!
Mit dem ATtiny2313 steuere ich einen LED-Treiber mittels PWM (über Port
PB3) an und möchte, da die Schaltung mit 4 AA-Batterien versorgt wird,
den UC in den Power-Down-Mode versetzen sobald die LED über den Taster
an Pin PB0 ausgeschaltet wird.
Da ich noch selbst Anfänger bin, komme ich hier auch nach intesivem
Datenblattstudium nicht zurecht. PWM funktioniert aber einwandfrei.

Ich bitte um Hilfestellung! DANKE!!!


Hier der C-Code für das Testprogramm:

//************************************************** **
//* Testprogramm Sleep-Mode ATtiny 2313 *
//* Funktion: Taster = on --> LED = on *
//* Taster = off --> LED = off *
//* LED an PORTB3, Taster an PORTB0 *
//************************************************** **

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>

//********************board************************* **
#define button_down (PINB & (1<<PIN0))

int main(void)
{

uint16_t taste=0;

ACSR |= (1<<ACD); //Analogcomparator OFF

DDRB |= (1 << DDB3); //led output enable
DDRB
|=((1<<DDB1)|(1<<DDB2)|(1<<DDB4)|(1<<DDB5)|(1<<DDB6)|(1<<DDB7));//Register
B output enable
DDRD
|=((1<<DDB0)|(1<<DDB1)|(1<<DDB2)|(1<<DDB3)|(1<<DDB4)|(1<<DDB5)|(1<<DDB6));//Register
B output enable
PORTD = 0xFF; // enable Pull-up

MCUCR = 0b00100000; // sleep-mode enable (SE-Bit = 1)

sei(); //enable Interrupts

while (1)
{
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_mode();

if (button_down)
{
PORTB = (1<<3); // LED ON
taste=1;
}
else
{
PORTB = (0<<3); // LED OFF
}
}
}

BurningWave
01.06.2010, 11:30
while (1)
{
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_mode();

if (button_down)
{
PORTB = (1<<3); // LED ON
taste=1;
}
else
{
PORTB = (0<<3); // LED OFF
}
}

Kann nicht funktionieren, da du den AVR zwar erfolgreich in den Power-Down-Mode versetzt, aber nicht mehr aufweckst. Zum Aufwecken benutzt man Interrupts, wenn sie ausgelöst werden, wird der µC wieder reaktiviert.
Durch dein sei() kann ich entnehmen, dass du das auch vohattest, aber noch nicht wirklich weißt, wie es funktioniert. Für Interrupts deklariert man nämlich eine eigene Interruptbehandlungsroutine.
(siehe: http://www.rn-wissen.de/index.php/Avr-gcc#Interrupts und http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmieren_mit_Interrupts )
Welcher Sleep-Mode sich für deinen Zweck eignet (nicht alle können durch einen spezifischen Interrupt beendet werden) kannst du dem Datenblatt unter Power Management entnehmen (siehe: http://www.atmel.com/dyn/resources/prod_documents/doc2543.PDF )


MCUCR = 0b00100000; // sleep-mode enable (SE-Bit = 1)

Das brauchst du nicht.

Außerdem benutze bitte für deine nächsten Codes, die du postest die Code-Tags ([code ] und [/code ] (ohne Leerzeichen), damit es übersichtlicher wird.