Hallo miteinander, ich bin auf der Suche nach eine möglichkeit einen PowerDown Tiny 85 wieder aufzuwecken. Mit Taster am INT0 ist alles kein Problem. Was will ich machen? Ich möchte den Tiny85 "schlafen" schicken, damit meine Batterie Anwendung auch lange Laufzeiten hat. Alle 60s soll der AVR aufwachen und Daten übertragen. So weit so gut, aber wie, wenn im PowerDown nur INT0 geht? Danke & Gruß Steffen
Steffen schrieb: > Alle 60s soll der AVR > aufwachen und Daten übertragen. Wer/wie/was soll ihn denn aufwecken? > So weit so gut, aber wie, wenn im > PowerDown nur INT0 geht? PCINT ginge u.a. auch.
Watchdog kann alle 8s aufwecken. Im watchdog Interrupt die wakeups zählen. Wenn 60s noch nicht vorbei wieder schlafen.
Steffen schrieb: > Hallo miteinander, > > ich bin auf der Suche nach eine möglichkeit einen PowerDown Tiny 85 > wieder aufzuwecken. Mit Taster am INT0 ist alles kein Problem. Was will > ich machen? Ich möchte den Tiny85 "schlafen" schicken, damit meine > Batterie Anwendung auch lange Laufzeiten hat. Alle 60s soll der AVR > aufwachen und Daten übertragen. So weit so gut, aber wie, wenn im > PowerDown nur INT0 geht? > > Danke & Gruß Steffen Der Watchdog kann dafür benutzt werden. Grüße Oliver
Da ich schon sehr viel aus dem Forum entnehmen konnte, hier für alle die auch einen AVR per Watchdog aufwecken wollen. Das ist als Beispiel und Test zu sehen. Ich verwende einen ATTiny85. Dieser soll nach gewisser Zeit was tun :-) Dabei kann man die Zeit über den WDT einstellen (bis 8s) oder einfach die ISR zählen und dann bei erreichen einer Vorgabe weiteren Code ausführen. Zum Test habe ich eine LED an PB3 angeschlossen. Zu beachten ist, der WDT darf nicht per Fuse eingeschalten werden!
1 | /*
|
2 | ************************************************************************
|
3 | *
|
4 | * Sleep Mode Demo, PowerDown + WDT weckup
|
5 | *
|
6 | * WDTON Fuse darf nicht gesetzt sein
|
7 | *
|
8 | * ATiny 85 intern 8Mhz Takt
|
9 | *
|
10 | * An PB3 eine LED mit 1 kOhm Vorwiderstand gegen +5V
|
11 | *
|
12 | ************************************************************************
|
13 | */
|
14 | |
15 | |
16 | #include <avr/io.h> |
17 | #include <avr/sleep.h> |
18 | #include <avr/interrupt.h> |
19 | #include <util/delay.h> |
20 | |
21 | volatile uint16_t wdt_count = 0; |
22 | |
23 | //Watchdog ISR
|
24 | ISR(WDT_vect) { |
25 | wdt_count++; |
26 | }
|
27 | |
28 | // aus Sleep Demo
|
29 | void long_delay(uint16_t ms) { |
30 | for (; ms>0; ms--) _delay_ms(1); |
31 | }
|
32 | |
33 | int main (void) { |
34 | |
35 | |
36 | DDRB |= (1 << DDB3); //Ausgang |
37 | PORTB |= (1<<PB3); // LED aus |
38 | |
39 | MCUSR |= (1 << WDRF); // WDT ein |
40 | |
41 | WDTCR |= (1 << WDIE) | (1 << WDP3) | (1 << WDP0); //WDT Interrupt ein, Timer Prescaler 1024 8.0s |
42 | |
43 | sei(); |
44 | |
45 | for(;;) |
46 | {
|
47 | |
48 | set_sleep_mode(SLEEP_MODE_PWR_DOWN); |
49 | sleep_mode(); // in den Schlafmodus wechseln |
50 | |
51 | // hier wachen wir wieder auf
|
52 | // nach mehrmaligen WDT Interrupt LED an
|
53 | if (wdt_count == 2){ |
54 | wdt_count = 0; |
55 | PORTB &= ~(1<<PB3); // LED an |
56 | long_delay(1500); |
57 | PORTB |= (1 << PB3); // LED aus |
58 | long_delay(1500); |
59 | }
|
60 | }
|
61 | }
|
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.