Tiny85 Aufwecken

Gast #3425429
Lesenswert?

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
#3425472
Lesenswert?

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
Gast #3426025
Lesenswert?

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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren