Nun ja ich hab wohl etwas zu voreilig eine Schaltung entworfen, bei der
der Mikrocontroller direkt an eine Batterie gelötet ist und es keinen
Reset button gibt ...
Zum Glück war der Button an einem Interrupt Pin dran, so dass ich ein
relativ robustes Reset-Schnipsel mit dem Watchdog schreiben konnte:
1 | #include <avr/interrupt.h>
|
2 | #include <avr/wdt.h>
|
3 |
|
4 | #define RESET_BUTTON _BV(PD1)
|
5 | #define RESET_BUTTON_PORT PORTD
|
6 | #define RESET_BUTTON_PIN PIND
|
7 | #define RESET_BUTTON_STATE !(RESET_BUTTON_PIN & RESET_BUTTON)
|
8 |
|
9 | #define RESET_BUTTON_INT _BV(INT1)
|
10 | #define RESET_BUTTON_INT_vect INT1_vect
|
11 | #define RESET_BUTTON_ISC _BV(ISC10) /* Any edge of INTn generates an interrupt */
|
12 |
|
13 | void InitReset()
|
14 | {
|
15 | /* set internal pull up */
|
16 | RESET_BUTTON_PORT |= RESET_BUTTON;
|
17 |
|
18 | EIMSK |= TASTER_INT;
|
19 | EICRA |= TASTER_ISC;
|
20 |
|
21 | MCUSR = 0; /* reset MCU status register */
|
22 | wdt_disable();
|
23 |
|
24 | sei(); /* enable interrupt */
|
25 | }
|
26 |
|
27 | ISR(RESET_BUTTON_INT_vect)
|
28 | {
|
29 | if(RESET_BUTTON_STATE)
|
30 | {
|
31 | wdt_enable(WDTO_8S); wdt_reset();
|
32 | }
|
33 | else
|
34 | {
|
35 | wdt_disable();
|
36 | }
|
37 | }
|
38 |
|
39 | void InternalWatchdog_Reset()
|
40 | {
|
41 | if(RESET_BUTTON_STATE)
|
42 | return;
|
43 | wdt_reset();
|
44 | }
|
(soweit die idee, hoffe es compiliert da ich es nochmals aus einer c
datei abgeschrieben habe)
der button funktioniert so lange als reset button, wie die interrupts
aktiviert sind.
falls der watchdog verwendet werden möchte, muss beim zurücksetzen des
watchdoges einfach überprüft werden dass der taster nicht gedrückt.