Interrupt, Umschaltung von MCUCR

Gast #3936808
Lesenswert?
• ▲
▼
Hallo,

habe eine Schaltung mit nur einem Taster an INT0. Mit diesem Taster 
möchte ich den Controller in den Schlafmodus (Modus=0) versetzen. Beim 
weiteren Drücken soll der Moduszähler immer um 1 erhöht werden. Befindet 
sich der Modus > 1 dann soll bei längerem Betätigen der Controller in 
den Modus=0 wechseln und wieder ruhen im Power Down Mode. Habe schon 
sehr vieles versucht, jedoch noch keine Code erzeugen können, der dies 
ermöglicht.

Befehle die als Kommentar ausgeführt sind, habe ich schon an dieser 
Stelle getestet, jedoch ohne Erfolg.

Hat jemand eine Idee oder Erklärung wie das funktioniert? Ich muss ja 
sicherlich im Programm die MCUCR ändern oder?


/*
 * LED_Cube_Attiny26.c
 *
 * Created: 22.12.2014 17:44:25
 *  Author:
 */

#define F_CPU 16000000

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

int modus=0;
ISR(INT0_vect)
  {

    if (modus=0)
    {
      modus=1;
    }
    else
    {
      _delay_ms(500);
      if ((!(PINB & (1<<PINB6))) && (modus>=1) && (modus<=2))
      {
        modus++;
      }
      else
      {
        modus=0;

      }

    }


  }



int main(void)
{
    //IO Konfiguration
  DDRA=0xff;
  DDRB=0x0f;

  //MCUCR = 0x30; //Aktiveierung des Power Downs



  //sei(); //Interrupts freigeben
  //GIMSK |= (1 << INT0); //Ext. Interrupt aktivieren




  while(1)
    {

    if (modus==0)
    {
      GIMSK &= ~(1 << INT0); //Ext. Interrupt deaktivieren
      cli();
      MCUCR = 0x30;
      sei();
      GIMSK |= (1 << INT0);

      PORTA=0xff;
      PORTB=0x01;
      _delay_ms(200);
      PORTA=0x00;
      PORTB=0x0e;
      //_delay_ms(500);
      set_sleep_mode(SLEEP_MODE_PWR_DOWN);
      sleep_mode();

      GIMSK &= ~(1 << INT0); //Ext. Interrupt deaktivieren
      cli();
      MCUCR=0x02;
      sei();
      GIMSK |= (1 << INT0); //Ext. Interrupt aktivieren

    }
    if (modus==1)
    {

      PORTB=0x01;
      PORTA=0x11;
    }

    if (modus==2)
    {
      PORTB=0x01;
      PORTA=0x11;
      _delay_ms(100);
      PORTB=0x0e;
      PORTA=0x00;
      _delay_ms(100);

    }
    if (modus==3)
    {
      PORTB=0x03;
      PORTA=0xff;
    }
    }


  return 0;
}

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.