- Labornetzteil AliExpress         
Ergebnis 1 bis 2 von 2

Thema: ATtiny2313 in den Sleep-Mode versetzen?

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    01.06.2010
    Beiträge
    6

    ATtiny2313 in den Sleep-Mode versetzen?

    Anzeige

    E-Bike
    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<<DDB 6)|(1<<DDB7));//Register
    B output enable
    DDRD
    |=((1<<DDB0)|(1<<DDB1)|(1<<DDB2)|(1<<DDB3)|(1<<DDB 4)|(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
    }
    }
    }
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken c_code.png   taster.png   uc.png  

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    Code:
    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/artic...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/p...ts/doc2543.PDF )

    Code:
    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.
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen