Der folgende Code läuft auf einem "Digispark" Klon mit ATtiny85 bei 5V
extern (USB ist nicht verbunden).
Wenn ich INPUT mit NC2 low ziehe, schaltet OUTPUT für 204 ms ein - nicht
für 8 Sekunden.
Stimmt etwas mit der Watchdog-Konfiguration nicht, oder woran kann's
noch liegen?
1 | // Microchip / Atmel AVR ATtinyx5
|
2 | //
|
3 |
|
4 | //#define F_CPU 1000000 // 8MHz/8 CLKDIV8 (default, fuse sets prescaler in CLKPR, can be overwritten)
|
5 | #define F_CPU 16500000 // 16.5 MHz: PLL overclocked by micronucleus USB bootloader (USB sync.)
|
6 |
|
7 |
|
8 | // C types
|
9 | #include <stdint.h>
|
10 |
|
11 | // AVR-libc
|
12 | #include <avr/io.h>
|
13 | #include <avr/sleep.h>
|
14 | #include <avr/interrupt.h>
|
15 | #include <avr/wdt.h>
|
16 | #include <util/delay.h>
|
17 |
|
18 |
|
19 | // IO
|
20 | // #RESET PB5 1 8 VCC
|
21 | // PB3 2 7 PB2
|
22 | // PB4 3 6 PB1
|
23 | // GND 4 5 PB0
|
24 | #define NC0 (1<<PB0) // 5 (MOSI/DI/SDA/AIN0/OC0A/#OC1A/AREF/PCINT0)
|
25 | #define LED (1<<PB1) // 6 (MISO/DO/AIN1/OC0B/OC1A/PCINT1)
|
26 | #define NC2 (1<<PB2) // 7 (SCK/USCK/SCL/ADC1/T0/INT0/PCINT2)
|
27 | #define INPUT (1<<PB3) // 2 (PCINT3/XTAL1/CLKI/#OC1B/ADC3)
|
28 | #define OUTPUT (1<<PB4) // 3 (PCINT4/XTAL2/CLKO/OC1B/ADC2)
|
29 | // // 1 (PCINT5/#RESET/ADC0/dW)
|
30 | // 4 GND
|
31 | // 8 VCC
|
32 |
|
33 |
|
34 | ISR(PCINT0_vect) {
|
35 | GIMSK = 0; // stop PCIE
|
36 | PORTB |= (LED | OUTPUT); // debug
|
37 | WDTCR = (1<<WDIE) | WDTO_8S; // enable WDT
|
38 | }
|
39 |
|
40 |
|
41 | ISR(WDT_vect) {
|
42 | wdt_disable(); // stop WDT
|
43 | PORTB &= ~(LED | OUTPUT); // debug
|
44 | GIMSK = (1<<PCIE); // enable interrupt
|
45 | }
|
46 |
|
47 |
|
48 | int main(void) {
|
49 |
|
50 | MCUSR = 0; // reset status
|
51 | GIFR = 0xFF; // clear interrupt flags
|
52 |
|
53 | // low power
|
54 | wdt_disable(); // stop WDT
|
55 | sleep_bod_disable(); // BOD
|
56 | ACSR |= (1<<ACD); // analog comparator
|
57 | PRR |= (1<<PRTIM0) | (1<<PRTIM1) | (1<<PRUSI) | (1<<PRADC);
|
58 |
|
59 | // output(s)
|
60 | DDRB = (LED | OUTPUT | NC0 | NC2); //
|
61 | PORTB = 0;
|
62 |
|
63 | // hello world
|
64 | for (uint8_t n=0; n<6; n++) {
|
65 | PORTB ^= LED;
|
66 | _delay_ms(200);
|
67 | }
|
68 |
|
69 | // enable pin change interrupt
|
70 | GIFR |= (1<<PCIF); // the flag can be cleared by writing a logical one to it
|
71 | GIMSK = (1<<PCIE); //
|
72 | PCMSK = (1<<PCINT3); //
|
73 |
|
74 | // power down
|
75 | set_sleep_mode(SLEEP_MODE_PWR_DOWN);
|
76 | sleep_enable();
|
77 | sei();
|
78 | while (1) {
|
79 | sleep_cpu();
|
80 | //sleep_disable();
|
81 | }
|
82 | }
|