LP-Impulse.c


1
/* 
2
Low-Power Impulsgenerator mit ATTiny13, 25, ...
3
An PB0 wird ein kurzer (2 ms) Impuls ausgegeben.
4
Der Impulsabstand wird in 1 s Schritten mit dem WDT per Interrupt
5
erzeugt. Für minimale Stromaufnahme während des aktiven Ausgangsimpulses
6
(ca. 200 µA @ 5 V) ist CPU-Clock ist auf 31,25 kHz eingestellt.
7
Die Stromaufnahme liegt bei ca. 7 µA @ 5 V; 
8
Hauptverbraucher dabei ist der WDT selbst.
9
10
http://www.mino-elektronik.de
11
12
Alle Angaben ohne Gewaehr !
13
2018-03-23
14
*/
15
16
17
#include <avr/io.h>
18
#include <avr/interrupt.h>
19
#include <stdlib.h>
20
#include <avr/sleep.h>
21
22
#define BIT(x)  (1<<x)
23
24
#define PERIODENDAUER_IN_SEKUNDEN  5
25
26
ISR(WDT_vect)                     // Aufruffrequenz 1 Hz           
27
{
28
static int8_t sekunden;
29
volatile uint8_t n;
30
  sekunden++;
31
  if(sekunden >= PERIODENDAUER_IN_SEKUNDEN) {
32
    sekunden = 0;
33
    PORTB |= 1;
34
    n = 5;                        // ca. 2 ms @ 31,25 kHz
35
    while(n--);
36
    PORTB &= 0xfe;
37
  }
38
}
39
40
int main(void)
41
{
42
  CLKPR = 0x80; CLKPR = 0x8;      // Vorteiler / 256 CPU-Takt = 31,25 kHz
43
  DDRB = 0x1f;                    // alle Pins als Ausgang und auf GND
44
  WDTCR = BIT(WDIE) | BIT(WDP2) | BIT(WDP1);  // Watchdog-Intervall auf 1 s
45
  sei();
46
  while(1) {
47
    MCUCR = BIT(SE) + BIT(SM1);    // Power-Down wählen
48
    sleep_cpu();                  // und stoppen
49
  }
50
}