Forum: Mikrocontroller und Digitale Elektronik PowerDown ATTiny44


von Lokus P. (derschatten)


Lesenswert?

Sehe ich das richtig das ich beim ATTiny44 nur den PCINTO (Pin 13) dazu 
verwenden kann um den AVR aus dem Power-down zu wecken?
Oder kann ich auch zb. PCINT7 (Pin6) dazu verwenden mittels eines 
Tastendrucks den AVR aus dem Power-down zu wecken?

Wie ist dieser Satz hier zu verstehen:
"Only an External Reset, a Watchdog Reset, a Brown-out
Reset, an external level interrupt on INT0, or a pin change interrupt 
can wake up the MCU."

Was ist ein PIN change interrupt?

von boka loka (Gast)


Lesenswert?

PCINT0 != INT0

von Tante Eulalia (Gast)


Lesenswert?

Wer Datenblätter liest, hat mehr vom Bauteil...

von Lokus P. (derschatten)


Lesenswert?

Wo glaubst du hab ich den text her? Aus dem Finger gesogen?

Läßt sich der Sleep-Mode auch so benutzen das der AVR nicht nur bei 
einer Steigenden oder Fallenden Flanke schläft, sondern wenn ein PIN den 
Zustand HI hat?

Also wenn der erste AVR dem zweiten ein HI schickt soll dieser in den 
Sleep-Mode wechseln und sollange dort bleiben bis der PIN auf LO 
wechselt.
Oder die andere Variante:
Ein Impuls normal-Modus, noch ein Impuls, Sleep-Modus.
Also den AVR nicht dauerhaft in den Sleep-Modus schicken, wenn nichts 
passiert.

von Thomas E. (thomase)


Lesenswert?

Lokus Pokus schrieb:
> Ich probiere da lieber stundenlang herum bevor ich mich stundenlang in
> etwas reinlese und nicht verstehe.
> Ist so wie mit den Bedienungsanleitungen. Die werden bei mir sauber in
> den Schrank gelegt und da bleiben sie dann auch.
> Praxis macht mehr Spass als Theorie und man lernt auch was dabei.

Falk Brunner schrieb:
 > Du bist ein echter Spaßvogel. Viel Spaß noch beim Rumeiern. Aber 
bitte
> verschone uns mit deinen Anfragen!

Lokus Pokus schrieb:
> So schlimm wird's ja dann auch wieder nicht sein. Ich frage hier eh
> höchstens alle 2 Jahre mal etwas.

Demnach hätten wir doch jetzt 2 Jahre Ruhe vor deinen blöden Fragen. 
Also verschone uns auch damit. Lies dich in die Thematik ein und lerne 
die Grundlagen oder such dir ein anderes Hobby.

mfg.

von Johannes O. (jojo_2)


Lesenswert?

> Beiträge   435
Folglich bist du etwa 870 Jahre alt?


Lokus Pokus schrieb:
> Also wenn der erste AVR dem zweiten ein HI schickt soll dieser in den
> Sleep-Mode wechseln und sollange dort bleiben bis der PIN auf LO
> wechselt.

Steht sehr gut im Datenblatt beschrieben wie das geht und mit welchen 
Pins usw....
Du wirst doch wohl auch irgendein Testboard haben auf dem du das 
ausprobierne kannst, oder?

von Lokus P. (derschatten)


Lesenswert?

Ohne Testboard gings ja gar nicht.

Wie ich den Sleep-Mode aktiviere weiß ich ja schon.
1
void powerdown(void)
2
{
3
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
4
5
  PCMSK0 |= (1 << PCINT7);
6
  GIMSK |= (1 << PCIE0);
7
8
  sleep_enable();
9
  sei();
10
  sleep_cpu();
11
}

Ich möchte nun das dieser mit einer Falneknänderung deaktiviert wird.
Muß ich mir dazu eine eigene Funktion basteln, oder kann ich das direkt 
über den Interrupt steuern?

Wie würdet ihr das machen?

von Falnekn (Gast)


Lesenswert?

Lokus Pokus schrieb:
> Wie ich den Sleep-Mode aktiviere weiß ich ja schon.
>
> Ich möchte nun das dieser mit einer Falneknänderung deaktiviert wird.

Geht nicht.

von boka loka (Gast)


Lesenswert?

Falnekn schrieb:
> einer Falneknänderung

Wasn das?

von Lokus P. (derschatten)


Lesenswert?

Ok, andersrum:

Was gibt es für möglichkeiten einen AVR von einem anderen AVR aus zu 
de-/aktivieren?
Ich könnte ihm mit einem Relais einfach den Saft abdrehen. Aber ich 
möchte gerne das vorher noch ein paar LED's leuchten.

von Johannes O. (jojo_2)


Lesenswert?

Lokus Pokus schrieb:
> Ich könnte ihm mit einem Relais einfach den Saft abdrehen. Aber ich
> möchte gerne das vorher noch ein paar LED's leuchten.

Dann schalt die LEDs (OHNE APOSTROPH!!) halt an, kurz bevor du den Strom 
abschaltest. -.-

Was hast du eigentlich schon wieder vor? Das sieht schon wieder alles so 
nach ziellosem Gefrickel aus. Es gibt ein paar (nicht viele!) Gründe, 
dass man 2 Controller auf einem Board hat. Ich schätze mal so einer 
dürfte bei dir nicht vorliegen.

von Lokus P. (derschatten)


Lesenswert?

Ich verwende mehrere Drehencoder und jeder wird von einem eigenen AVR 
ausgelesen.
2 Encoder davon steuern die gleiche Hardware an, mit unterschiedlichen 
Funktionen.
Warum ich jetzt dafür 2 AVR verwende hat schon seine Gründe.
Wird nun am ersten AVR eine Taste betätigt, soll der zweite deaktiviert 
werden. Mit der gleichen Taste wieder aufgeweckt.

So siehts aus.

von Lokus P. (derschatten)


Lesenswert?

Also ich kann den AVR problemlos in den Schlafmodus schicken.
1
void powerdown(void)
2
{
3
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);              // Schlaf-Modus definieren
4
5
  PCMSK0 |= (1 << PCINT7);
6
  GIMSK |= (1 << PCIE0);
7
8
  sleep_enable();                          // aktiviert Schlaf-Modus
9
  sei();
10
  sleep_cpu();                          // In den Schlaf-Modus wechseln
11
}

Mit einer Flankenänderung an PA7 wacht er auch wieder auf und bleibt in 
dem Zustand.
Da man nun einen PIN nicht auf eine Flankenänderung abfragen kann, was 
gibt es sonst für eine Möglichkeit den AVR auf Befehl in den Schlafmodus 
zu setzen und wieder aufzuwecken?
Ich möchte dies eben über einen einzelnen PIN steuern.

von Lokus P. (derschatten)


Lesenswert?

Laut Datenblatt sollte der ATTiny im PowerDown Mode nur 0,1 μA bei 1.8V 
ziehen.
Meiner läuft mit 5V und benötigt 4,5 mA.

Woran kann das liegen?

von Johannes O. (jojo_2)


Lesenswert?

Lokus Pokus schrieb:
> Woran kann das liegen?

Dass er nicht im PowerDown Mode ist.

von Peter D. (peda)


Lesenswert?

Hier wird ja ganz schön rumgeeiert.
Das Geheimnis ist:
Der PCINT gruppiert meistens 8 Pins.
Also egal, welcher Pin in der Maske freigegeben ist, es landet alles auf 
dem gleichen Vector.

Ich finde das von Atmel auch völlig daneben.
Es gehörte mindestens noch ein Register dazu, welcher Pin nun die Flanke 
ausgelöst hat.
So ist der PCINT bestenfalls nur zum Aufwachen brauchbar.

von Schnucki (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Ich finde das von Atmel auch völlig daneben.
> Es gehörte mindestens noch ein Register dazu, welcher Pin nun die Flanke
> ausgelöst hat.

Wieso, das gibts doch und nennt sich Port Input Register...

von Lokus P. (derschatten)


Lesenswert?

Also keine Chance, damit den AVR in den Schlafmodus zu versetzen?

von Hannes L. (hannes)


Lesenswert?

Schnucki schrieb:
> Wieso, das gibts doch und nennt sich Port Input Register...

Das kann aber zum Zeitpunkt der ISR-Abarbeitung aber schon wieder ganz 
anders aussehen. Peter meint ein "Schnappschuss-Register" ähnlich der 
ICP-Register beim Timer-Input-Capture-Interrupt.

...

von Coder (Gast)


Lesenswert?

Wenn der MCU eh (fast)aus sein kann, warum nicht komplett stromlos 
machen,falls raminhalt unwichtig ist.

von Lokus P. (derschatten)


Lesenswert?

Wie gesagt hätte ich gern noch eine LED-Sequenz vor dem abschalten.

Aber falls sonst niemand eine andere Lösung dafür hat, werde ich wohl 
auf diese Möglichkeit zurückgreifen und den AVR mittels Relais 
abschalten.

von Avr (Gast)


Lesenswert?

Lokus Pokus schrieb:
> Möglichkeit zurückgreifen und den AVR mittels Relais
> abschalten.

Super Idee....grins

von Falk B. (falk)


Lesenswert?

@ Lokus Pokus (derschatten)

>Aber falls sonst niemand eine andere Lösung dafür hat, werde ich wohl
>auf diese Möglichkeit zurückgreifen und den AVR mittels Relais
>abschalten.

Jaja, das ist das Ergebnis deiner überragenden Lernstrategie. Jeder 
"Normalo" hätte daen Artikel Sleep Mode und das Datenblatt gelesen 
und schon vor Tagen den AVR in den Tiefschlaf geschickt.

von Coder (Gast)


Lesenswert?

Eine andere Frage waere wieviel mehr Laufzeit bringt die der Power Down 
Modus. Vielleicht reicht ein weniger sparsamer Schlaf-Modus. Meist 
verbraucht die Schaltun drumherum mehr Strom als der mcu.

von Cyblord -. (cyblord)


Lesenswert?

Mein Gott, frage einen Pin ab, wenn der gesetzt ist, schick den Tiny in 
den Sleep Mode. Wecke ihn periodisch mittels Watchdog auf (je nach dem 
wie schnell er reagieren muss) und prüfe dann den Zustand des Pins. Wenn 
dieser auf "aufwachen" steht, dann kann er anfangen zu arbeiten, 
ansonstne wieder ab in den Tiefschlaf. Dann hast du deine Funktionalität 
mittels Pin.

Anders geht es halt nicht. Im Sleep Mode läuft halt dein Programm nicht. 
Also entweder generierst ein Event welches den Controller aufweckt 
(Datenblatt) oder du musst es wie oben beschrieben machen.

So ein Aufstand wegen so einem trivialen Quatsch.

gruß cyblord

von Hannes L. (hannes)


Lesenswert?

Coder schrieb:
> Vielleicht reicht ein weniger sparsamer Schlaf-Modus.

Naja, man kann ja auch bei laufendem Programm mit Sleep arbeiten. Am 
Ende der Mainloop fällt die CPU eben in den Sleep.

Im Normalfall wird der Mode "idle" eingestellt, damit die Timer weiter 
klappern können und deren Interrupts die CPU wieder wecken.

Wird nach Abarbeitung aller Jobs (also auch der LED-Sequenz) 
"Tiefschlaf" gewünscht, dann schaltet man den zum Wecken vorgesehenen 
Interrupt scharf (z.B. PCI) und ändert einfach den Sleep-Mode in den 
gewünschten Tiefschlaf-Modus. Das Programm läuft dann noch bis zum Ende 
der Mainloop und geht dann in den Sleep, aus dem es dann mit dem 
vorbereiteten Weck-Interrupt (oder einfach Reset als Start-Taster) 
geweckt wird.

Die Weck-ISR schaltet dann den Sleep-Mode wieder auf "idle" um 
(aktiviert also den Takt für die Timer während des nächsten 
Sleep-Zustandes) und deaktiviert den Weck-Interrupt.

Somit kann das Programm wieder normal arbeiten: Der Timer-Int. weckt die 
CPU, nach der ISR wird die Mainloop abgearbeitet, sind alle Jobs der 
Mainloop erledigt, wird bis zum nächsten Timer-Int. (mit laufenden 
Timern) gepennt.

Man sollte dazu allerdings weniger in Schleifen, Prozeduren und 
Funktionen denken, sondern mehr in Zuständen und Ereignissen.

...

von Coder (Gast)


Lesenswert?

@Hannes Lux.

Mir stellt sich die Frage, ob er denn diesen ultrasparsamen Sleep Modus 
braucht? Immerhin verballert er ordentlich Strom mit seiner LED Sequenz, 
will aber dann richtig strom Sparen. Und die restschaltung ganz zu 
schweigen.
( sein LDO hat warscheinlich ein vielgrößeren Ruchestrom... )

von Johannes O. (jojo_2)


Lesenswert?

Coder schrieb:
> ( sein LDO hat warscheinlich ein vielgrößeren Ruchestrom... )

Ist doch egal. Das weiß er eh nicht, da ihn Datenblätter nicht 
interessieren. Stattdessen wird herumgefrickelt und dumme Fragen 
gestellt.

von Hannes L. (hannes)


Lesenswert?

Coder schrieb:
> diesen ultrasparsamen Sleep Modus

So ultrasparsam ist der auch nicht. Ich hatte auch mal gedacht, dass man 
sich damit den Batterieschalter sparen kann. Ich habe dann später 
freiwillig einen Batterieschalter nachgerüstet, weil die Akkus nach zwei 
Wochen leer waren. Es handelte sich um einen Mega48 in dieser Bastelei:
http://www.hanneslux.de/avr/mobau/7ksend/7ksend02.html

...

von Peter D. (peda)


Lesenswert?

Hannes Lux schrieb:
> So ultrasparsam ist der auch nicht. Ich hatte auch mal gedacht, dass man
> sich damit den Batterieschalter sparen kann. Ich habe dann später
> freiwillig einen Batterieschalter nachgerüstet, weil die Akkus nach zwei
> Wochen leer waren.

Dann liegt ein Fehler im Programm vor.

Wie gesagt, der PCINT ist prima zum Aufwachen, aber schlecht zum 
Erkennen des Grundes.
Es muß also dann eine herkömmliche Entprellung noch feststellen, war das 
eine Störung oder ein echter Tastendruck.
Um den PCINT auszulösen, reicht ein elektrostatisch geladener Pullover 
aus.

Hier ein funktionierendes Beispiel:

Beitrag "Re: AVR Sleep Mode / Knight Rider"


Lokus Pokus schrieb:
> Sehe ich das richtig das ich beim ATTiny44 nur den PCINTO (Pin 13) dazu
> verwenden kann um den AVR aus dem Power-down zu wecken?

Nö, alle 12 IOs können das.

von Lokus P. (derschatten)


Lesenswert?

Nachdem ich festgestellt habe das der PowerDown-Mode trotzdem noch 4,5 
mA. zieht, ist das ganze sowieso irrelevant.

Abgesehen davon will ich mit dem gleichen PIN schlafen legen und 
aufwecken. Schafft das mal.

von Johannes O. (jojo_2)


Lesenswert?

Lokus Pokus schrieb:
> Nachdem ich festgestellt habe das der PowerDown-Mode trotzdem noch 4,5
> mA. zieht, ist das ganze sowieso irrelevant.
Evtl. weil du NICHT im PowerDown-Mode bist? Bei mir brauchen die NIE so 
viel!


> Abgesehen davon will ich mit dem gleichen PIN schlafen legen und
> aufwecken. Schafft das mal.

Das schaffen Leute problemlos, die auch das Datenblatt lesen können.


Aber deinen ganzen Code gibts du ja generell nicht preis.

von Hannes L. (hannes)


Lesenswert?

Peter Dannegger schrieb:
> Dann liegt ein Fehler im Programm vor.

Oder im Denken, denn damals wusste ich noch nicht, dass BOD noch etwas 
Strom frisst.

Peter Dannegger schrieb:
> Wie gesagt, der PCINT ist prima zum Aufwachen, aber schlecht zum
> Erkennen des Grundes.
> Es muß also dann eine herkömmliche Entprellung noch feststellen, war das
> eine Störung oder ein echter Tastendruck.
> Um den PCINT auszulösen, reicht ein elektrostatisch geladener Pullover
> aus.

Damit rennst Du (bei mir) offene Türen ein. ;-)

...

von Lokus P. (derschatten)


Lesenswert?

Ich habe jetzt mal versucht dieses "Knight Rider"-Beispiel in mein 
Programm zu implementieren:

1
// Ein-/Ausänge zuweisen
2
// -----------------------------------------------------------------------
3
void ioinit()
4
{
5
  AUSGANG_DDR = SCHALT;                      // SCHALT = Ausgang
6
                                  // RESET = Eingang (Tri-State)
7
                                  // AKTIV = Eingang
8
  AUSGANG_PORT = AKTIV;                      // AKTIV = PullUp
9
10
  ENCODER_DDR = LO;                        // ENCODER = Eingang
11
  ENCODER_PORT = HI;                        // ENCODER = PullUp
12
  PCMSK0 = (1 << PCINT7);
13
  sleep_enable();  
14
}
15
16
// Power-down aktivieren
17
// -----------------------------------------------------------------------
18
void schlafen()
19
{
20
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
21
  GIMSK = 1<<PCIE0;
22
  sleep_cpu();
23
  GIMSK = 0;
24
}
25
26
// Hauptprogramm
27
// -----------------------------------------------------------------------
28
int main(void)
29
{
30
  uint8_t stop = 0;
31
32
  ioinit();                            // PORT setzen
33
  eeprom_var();                          // EEPROM-Werte auslesen
34
  einschalt();                          // LED Einschaltsequenz starten
35
  encode_init();                          // ENCODER initialisieren
36
  sei();                              // alle Interrupt aktivieren
37
38
  for(;;)
39
  {
40
    ADCSRA &= !(1<<ADEN);                    // ADC deaktivieren
41
    ACSR = 0x80;                        // Analogcomperator deaktivieren
42
43
    if (!(PINA & (1<<PA7))) stop ^= 0xFF;
44
45
      if (stop)
46
    {
47
      schlafen();
48
    }
49
      else
50
    {
51
      set_sleep_mode(SLEEP_MODE_IDLE);
52
      sleep_cpu();
53
54
      encoder += encode_read_timeout();              // ENCODER-Wert auslesen
55
56
      if (timeCount == 0) encoder = encoderwert;          // Nach Zeit zurück zum Ausgangswert
57
      if (encoder < 1) encoder = 0;                // ENCODER-Wert darf nicht kleiner als 0
58
      if (encoder > 2) encoder = 3;                // und größer als 3 werden
59
60
      switch(encoder)
61
      {
62
        case 0:
63
          led_setzen_loeschen(encoder);
64
          if (get_key_short(TASTER))              // bei kurzem Tastendruck
65
          {
66
            sd_id(ID_8);
67
            encoderwert = encoder;
68
            reset();
69
          }
70
          if(get_key_long(TASTER))              // bei langen Tastendruck
71
          {
72
            sd_id(ID_8);
73
            encoderwert = encoder;
74
            eeprom_write_byte(&eeprom_sdid, ID_8);      // KERNAL-Wert in EEPROM speichern
75
            eeprom_write_byte(&eeprom_encoderid, encoder);  // ENCODER-Wert in EEPROM speichern
76
            reset();
77
          }
78
          break;
79
80
        case 1:
81
          led_setzen_loeschen(encoder);
82
          if (get_key_short(TASTER))
83
          {
84
            sd_id(ID_9);
85
            encoderwert = encoder;
86
            reset();
87
          }
88
          if(get_key_long(TASTER))
89
          {
90
            sd_id(ID_9);
91
            encoderwert = encoder;
92
            eeprom_write_byte(&eeprom_sdid, ID_9);
93
            eeprom_write_byte(&eeprom_encoderid, encoder);
94
            reset();
95
          }
96
          break;
97
98
        case 2:
99
          led_setzen_loeschen(encoder);
100
          if (get_key_short(TASTER))
101
          {
102
            sd_id(ID_10);
103
            encoderwert = encoder;
104
            reset();
105
          }
106
          if(get_key_long(TASTER))
107
          {
108
            sd_id(ID_10);
109
            encoderwert = encoder;
110
            eeprom_write_byte(&eeprom_sdid, ID_10);
111
            eeprom_write_byte(&eeprom_encoderid, encoder);
112
            reset();
113
          }
114
          break;
115
116
        case 3:
117
          led_setzen_loeschen(encoder);
118
          if (get_key_short(TASTER))
119
          {
120
            sd_id(ID_11);
121
            encoderwert = encoder;
122
            reset();
123
          }
124
          if(get_key_long(TASTER))
125
          {
126
            sd_id(ID_11);
127
            encoderwert = encoder;
128
            eeprom_write_byte(&eeprom_sdid, ID_11);
129
            eeprom_write_byte(&eeprom_encoderid, encoder);
130
            reset();
131
          }
132
          break;
133
      }
134
    }
135
  }
136
}

Beim Einschalten liegt auf PA7 ein HI. Der AVR startet und das Program 
läuft korrekt.
Sobald ich PA7 auf LO lege stopt der AVR. Die LEDs bleiben jedoch alle 
an. Und er läßt sich nicht mehr aktivieren.

von Lokus P. (derschatten)


Lesenswert?

Jemand eine Idee?

von Peter D. (peda)


Lesenswert?

Lokus Pokus schrieb:
> Jemand eine Idee?

Nö.
Mit ein paar Schnipseln kann keiner was anfangen.

Ein Testprogramm muß compilierbar und linkbar sein.
Alles andere ist Kaffeesatz lesen.

von Lokus P. (derschatten)


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.