Attiny-wdt » History » Version 5
laforge, 08/23/2022 02:26 PM
1 | 4 | laforge | {{>toc}} |
---|---|---|---|
2 | |||
3 | h1. attiny-wdt |
||
4 | 1 | laforge | |
5 | @attiny-wdt@ is an OSHW + open source firmware project of turning an Attiny{4,5,9,10} microcontroller into a hardware watchdog that can be used to reset another CPU/SoC when it gets stuck. |
||
6 | |||
7 | The primary use case was to use it with Raspberry Pi devices. Those do have a built-in hardware watchdog themselves, but unfortuantelly it is not documented at the register-level and there is no option to enable it straight from the boot loader, so it is not really providing the kind of guarantees one would expect from a watchdog. |
||
8 | |||
9 | 3 | laforge | h2. Operating Principle |
10 | |||
11 | The general idea is to use the Timer/Counter block of the ATTiny9 in the following way: |
||
12 | * Clear the output @OC0B@ on BOTTOM (counter == 0) |
||
13 | ** this generates a rising edge on the @!RESET@ signal of the CPU we're guarding |
||
14 | * Set the output @OC0B@ when counter reaches @OCR0B@ |
||
15 | ** this generates a falling edge on the @!RESET@ signal of the CPU we're guarding |
||
16 | * Wrap the counter once it reaches @OCR0A@ |
||
17 | ** this determines the amount of time until a reset |
||
18 | * Configure any falling edge on the INT0 pin to re-set the counter to zero |
||
19 | ** this is what the software on the CPU we're guarding nees to do to avoid the watchdog from expiring |
||
20 | |||
21 | h2. Pinout |
||
22 | |||
23 | The board contains two connectors: |
||
24 | |||
25 | 5 | laforge | h3. JP3 |
26 | 3 | laforge | |
27 | This header is used in two cases: |
||
28 | # *programming phase:* the firmware into the ATtiny9 (using the TPI protocol) |
||
29 | # *normal use:* To supply VCC to the watchdog and to connect its output with @!RESET/GLOBAL_EN@ of the target |
||
30 | |||
31 | 1 | laforge | |_.Number|_.Name|_.Description|_.Programming Function| |
32 | 5 | laforge | |1|GLOBAL_EN|open collector watchdog output; xpected to be connected to the !RESET of the CPU we're guarding (or GLOBAL_EN in case of Raspi)|-| |
33 | |2|VCC|3.3V supply voltage powering the watchdog|VCC| |
||
34 | |3|TPICLK|-|TPICLK| |
||
35 | |4|PB0|-|TPIDATA| |
||
36 | |5|!RESET|-|!RESET| |
||
37 | |6|GND|Ground|GND| |
||
38 | 3 | laforge | |
39 | |||
40 | h3. JP2 |
||
41 | |||
42 | |_.Number|_.Name|_.Description| |
||
43 | |1|GND|Ground| |
||
44 | |2|PB2|Input; any falling edge re-sets the counter to zero. Connected to GPIO26 on Raspi| |
||
45 | |3|PB0/GPIO19|No function; RFU| |
||
46 | |||
47 | 1 | laforge | |
48 | h2. Pictures |
||
49 | |||
50 | The pictures below show one of the first hand-soldered prototypes: |
||
51 | |||
52 | {{thumbnail(attiny-wdt1.jpg)}} {{thumbnail(attiny-wdt2.jpg)}} {{thumbnail(attiny-wdt3.jpg)}} |
||
53 | 5 | laforge | |
54 | |||
55 | h2. Flashing |
||
56 | |||
57 | You need |
||
58 | * an attiny-wdt |
||
59 | * a TPI-capable programmer for ATtiny9, such as the "guloprog":https://guloshop.de/shop/Mikrocontroller-Programmierung/guloprog-der-Programmer-von-guloshop-de::70.html |
||
60 | * a 2x3 to 1x5pin adapter cable (custo made) to connect the guloprog TPI Connector to attiny JP3 |
||
61 | * a Linux machine with "avrdude":https://www.nongnu.org/avrdude/ (e.g. installed via @apt install avrdude@ on Debian/Ubuntu). Tested with avrdude 6.3 |
||
62 | |||
63 | h3. Physical connection |
||
64 | |||
65 | h4. full setup with usb cable, guloprog, 2x3-1x5 cable and attiny-wdt: |
||
66 | |||
67 | {{thumbnail(attiny_wdt_with_gulprog_cable.jpg)}} |
||
68 | |||
69 | h4. detailed view of 2x3 cable in guloprog |
||
70 | |||
71 | {{thumbnail(guloprog_with_cable.jpg)}} |
||
72 | |||
73 | h4. detailed view of 1x5 cable in attiny-wdt |
||
74 | |||
75 | {{thumbnail(attiny_with_cable.jpg)}} |
||
76 | |||
77 | h3. avrdude command for flashing |
||
78 | |||
79 | Assuming your firmware file is called @attiny-wdt.hex@, you can use the fa command like: |
||
80 | <pre> |
||
81 | avrdude -p attiny9 -P usb -c usbasp -U flash:w:attiny-wdt.hex |
||
82 | </pre> |
||
83 | |||
84 | The successful output looks like this: |
||
85 | |||
86 | <pre> |
||
87 | avrdude: AVR device initialized and ready to accept instructions |
||
88 | |||
89 | Reading | ################################################## | 100% 0.00s |
||
90 | |||
91 | avrdude: Device signature = 0x1e9008 (probably t9) |
||
92 | avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed |
||
93 | To disable this feature, specify the -D option. |
||
94 | avrdude: erasing chip |
||
95 | avrdude: reading input file "attiny-wdt.hex" |
||
96 | avrdude: input file attiny-wdt.hex auto detected as Intel Hex |
||
97 | avrdude: writing flash (116 bytes): |
||
98 | |||
99 | Writing | ################################################## | 100% 0.41s |
||
100 | |||
101 | avrdude: 116 bytes of flash written |
||
102 | avrdude: verifying flash memory against attiny-wdt.hex: |
||
103 | avrdude: load data flash data from input file attiny-wdt.hex: |
||
104 | avrdude: input file attiny-wdt.hex auto detected as Intel Hex |
||
105 | avrdude: input file attiny-wdt.hex contains 116 bytes |
||
106 | avrdude: reading on-chip flash data: |
||
107 | |||
108 | Reading | ################################################## | 100% 0.04s |
||
109 | |||
110 | avrdude: verifying ... |
||
111 | avrdude: 116 bytes of flash verified |
||
112 | |||
113 | avrdude done. Thank you. |
||
114 | </pre> |