Forum: Mikrocontroller und Digitale Elektronik Attiny13 + Sleep Mode + taster zum aufwachen


von Chris (Gast)


Lesenswert?

Hallo zusammen,

ich bin gerade dabei einen Würfel zu bauen, der Würfel ist nicht das 
Thema, aber ich habe Schwierigkeiten den Sleep Modus zu steuern.

Der Sleep Modus, also die Powerdown Methode ist ok, das funktioniert, 
nur wie bekommt der µC das mit, dass er wieder aufwacht?

hier mal ein Code Beispiel womit ich üben wollte:

"µC schaltet nach dem Sleep Mode eine LED an für 2 Sekunden..."
1
#include <avr/io.h>
2
#include <avr/sleep.h>
3
#include <avr/interrupt.h>
4
#include <util/delay.h>
5
6
7
// Main programm
8
int main (void)
9
{
10
    // IO configure
11
    // PB4 is an input pin
12
    DDRB &=~ (1<<PB4);
13
14
    // Use the internal pullup resistor
15
    PORTB |= (1<<PB4);
16
17
    // activate the leds and bring up the PB0...PB3 to high!
18
    // this will looks like a led test :-)
19
    DDRB |= ((1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3));
20
21
    // set the register PB0...PB3 to high level
22
    PORTB |= ((1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3));
23
24
    // wait ~ 1 second before deactivate the leds
25
    _delay_ms(1000);
26
27
    // lights off
28
    PORTB &=~ ((1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3));
29
30
    // Sleep enable
31
    MCUCR |= (1<<SE);
32
33
    // ADC deactivate
34
    ADCSRA &=~ (1<<ADEN);
35
36
    // Set the sleep mode "power down"
37
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
38
39
    // loop 
40
    while(1)
41
    {
42
      // disable int0
43
      //GIMSK &= ~(1<<INT0);
44
45
      // configure external interrupt
46
      GIMSK |= (1 << PCINT4);
47
48
      // go to sleep
49
      sleep_mode();
50
51
      // LED for 2 seconds on
52
     PORTB |= (1 << PB3);
53
     _delay_ms(2000);
54
     PORTB &= ~(1 << PB3);
55
    }
56
    // int main return
57
    return 0;
58
}
59
60
ISR(INT0_vect)
61
{
62
  // Sleep disable
63
  MCUCR &= ~(1<<SE);
64
65
  // ADC activate
66
  ADCSRA |= 1<<ADEN;
67
68
  // Sleep enable
69
  MCUCR |= (1<<SE);
70
71
}

Noch habe ich nicht verstanden, wie ich dem AVR mitteile, dass bei einem 
PIN Change PCINT4 er wieder aufwachen soll und an der Stelle 
weitermachen soll wo er sich schlafen gelegt hat. Hier würde höchstens 
die LED eingeschaltet werden für 2 Sekunden, aber das passiert nicht.

Ein Messgerät teilt mir mit, dass der µC überhaupt nicht reagiert.

Vielleicht eine Rechtfertigung:
Vieles ist aus einigen Büchern kopiert und aus anderen Codebeispielen.
Wahrscheinlich habe ich wieder zuviel gelesen und nichts verstanden.

Ich hoffe es erbarmt sich Jemand einmal kurz zu erläutern ?

Vielen Dank auch wenns nervt nur so Kleinigkeiten wie ein Sleep Mode 
einem Newbie zu erläutern.

Grüße aus dem Münsterland.

von Eumel (Gast)


Lesenswert?

An der Stelle weiter machen wo du warst geht nicht direkt. Es wird 
erstmal die ISR zum entsprechenden Interrupt aufgerufen.

von MWS (Gast)


Lesenswert?

Evtl. mal das Datenblatt durchlesen und ein paar Grundlagen üben. GIMSK 
kennt kein PCINT4, mehrere PCINTs benutzen immer einen Vektor, die 
INT0-ISR gehört nicht zu den PCINTs, die Interrupts sind nicht global 
erlaubt und falls tatsächlich ein PCINT verwendet werden soll, muss auch 
noch PCMSK gesetzt werden..
Da fehlen einfach zu viele Kenntnisse. Gibt's hier auf der Webseite kein 
Beispiel zum Durcharbeiten ?
Wenn alles richtig konfiguriert ist, reicht das Ausführen des 
Interruptvektors aus, um aus Power Down aufzuwachen, d.h. die ISR kann 
prinzipiell leer bleiben. Erst wird die ISR ausgeführt und danach der 
nächste Befehl nach Power Down.

von Chris (Gast)


Lesenswert?

Hallo zusammen,

MWS schrieb:
> Evtl. mal das Datenblatt durchlesen und ein paar Grundlagen üben. GIMSK
> kennt kein PCINT4, mehrere PCINTs benutzen immer einen Vektor, die
> INT0-ISR gehört nicht zu den PCINTs, die Interrupts sind nicht global
> erlaubt und falls tatsächlich ein PCINT verwendet werden soll, muss auch
> noch PCMSK gesetzt werden..
Okay, das heißt, INT0 wird dann anstelle von PCINT4 genutzt, dann 
verstehe ich das so, dass der µC auf jeden PIN reagieren müsste?

> Da fehlen einfach zu viele Kenntnisse.
Keine Frage, deswegen auch meine Frage! ;-)

> Gibt's hier auf der Webseite kein Beispiel zum Durcharbeiten ?
Ist mein Zielbeispiel so schwer zu erreichen?
Okay ich suche mir mal ein Beispiel, aber wenn ich Beispielsweise "das 
Knight Rider lauflicht" nehme verstehe ich gar nichts mehr.

> Wenn alles richtig konfiguriert ist, reicht das Ausführen des
> Interruptvektors aus, um aus Power Down aufzuwachen, d.h. die ISR kann
> prinzipiell leer bleiben. Erst wird die ISR ausgeführt und danach der
> nächste Befehl nach Power Down.
Ist es hilfreich wenn ich erst andere Sleep Modes verwende?
Ich probiere mal weiter.

Danke bis hier hin.

von MWS (Gast)


Lesenswert?

Mach kleinere Schritte und schau dass Du mit einem externen Interrupt 
INT oder PCINT eine LED schalten kannst.

von Chris (Gast)


Lesenswert?

MWS schrieb:
> Mach kleinere Schritte und schau dass Du mit einem externen Interrupt
> INT oder PCINT eine LED schalten kannst.
Mach ich, ich melde mich wieder wenn ich nicht weiterkomme.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Mir fehlt da auch noch ein sei().
Es reicht übrigens eine leere Pinchange Interrupt Routine. Also mit 
avr-libc:
1
EMPTY_INTERRUPT(PCINT0_vect);
2
// Dann in main()
3
4
PCMSK = (1 << PCINT4); // Mein Pin
5
GIMSK = (1 << PCIE); // PC Int freigeben
6
sei();  // globale Interrupts freigeben
7
8
while(1) {
9
// Set the sleep mode "power down" just before we sleep
10
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
11
    sleep_mode();
12
// continue after keypress
13
    cast_my_dice();
14
}

von Chris (Gast)


Lesenswert?

Hallo Matthias Sch.,

es funktioniert.
Danke, aber jetzt muss ich nur noch ins Datenblatt schauen und 
nachvollziehen warum ich das übersehen habe bzw. nicht auf anhieb 
funktioniert hat.

Grüße!

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.