Forum: Mikrocontroller und Digitale Elektronik Interrupt, Umschaltung von MCUCR


von iGast (Gast)


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;
}

von Peter D. (peda)


Lesenswert?


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
Noch kein Account? Hier anmelden.