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 | }
|