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?
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.
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.
> 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?
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?
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.
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.
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.
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.
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.
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?
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.
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...
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. ...
Wenn der MCU eh (fast)aus sein kann, warum nicht komplett stromlos machen,falls raminhalt unwichtig ist.
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.
Lokus Pokus schrieb: > Möglichkeit zurückgreifen und den AVR mittels Relais > abschalten. Super Idee....grins
@ 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.
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.
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
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. ...
@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... )
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.
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 ...
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.
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.
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.
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. ;-) ...
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.