{"id":2107,"date":"2018-12-06T23:32:00","date_gmt":"2018-12-06T22:32:00","guid":{"rendered":"http:\/\/www.sciencetronics.com\/greenphotons\/?p=2107"},"modified":"2025-06-16T18:37:46","modified_gmt":"2025-06-16T16:37:46","slug":"a-tiny-watchdog","status":"publish","type":"post","link":"https:\/\/www.sciencetronics.com\/greenphotons\/?p=2107","title":{"rendered":"A tiny watchdog"},"content":{"rendered":"<p>In a recent quick-and-dirty project with a Wemos D1 mini clone I had some problems with the reliability of the code. The ESP8266 contains two watchdogs which have the sole purpose to reset the chip if the firmware ever should get stuck. Previously I experienced these watchdogs to be too aggressive, but this was not the case now.<\/p>\n<p>In this project I send sensor data directly to an MySQL database using <a href=\"https:\/\/github.com\/ChuckBell\/MySQL_Connector_Arduino\" rel=\"noopener\" target=\"_blank\">Chuck Bell&#8217;s library<\/a>, but once in a while the code would get stuck. From a debug LED I know that this happens while executing the MySQL <em>INSERT<\/em> query. How is this possible? Well, the watchdogs must be fed somehow in spite of the code hanging, and there is no built-in timeout either.<\/p>\n<p><a href=\"https:\/\/www.facebook.com\/groups\/2269842186376084\/2492333484126952\/?comment_id=2492406694119631&#038;reply_comment_id=2495730607120573&#038;notif_id=1544132456313426&#038;notif_t=group_comment\" rel=\"noopener\" target=\"_blank\">On Facebook<\/a> it was suggested to build an external watchdog. This evening I now finally considered first to use a 74HC123 monostable as a trigger for the reset of the ESP8266 if the debug LED stops blinking. But then I reconsidered and grabbed an ATtiny13A out of my box and wrote a small program.<\/p>\n<p><a href=\"http:\/\/www.sciencetronics.com\/greenphotons\/?attachment_id=2108\" rel=\"attachment wp-att-2108\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sciencetronics.com\/greenphotons\/wp-content\/uploads\/2018\/12\/20181206_tiny13_watchdog-300x152.png\" alt=\"\" width=\"300\" height=\"152\" class=\"aligncenter size-medium wp-image-2108\" srcset=\"https:\/\/www.sciencetronics.com\/greenphotons\/wp-content\/uploads\/2018\/12\/20181206_tiny13_watchdog-300x152.png 300w, https:\/\/www.sciencetronics.com\/greenphotons\/wp-content\/uploads\/2018\/12\/20181206_tiny13_watchdog-768x388.png 768w, https:\/\/www.sciencetronics.com\/greenphotons\/wp-content\/uploads\/2018\/12\/20181206_tiny13_watchdog-1024x517.png 1024w, https:\/\/www.sciencetronics.com\/greenphotons\/wp-content\/uploads\/2018\/12\/20181206_tiny13_watchdog-150x76.png 150w, https:\/\/www.sciencetronics.com\/greenphotons\/wp-content\/uploads\/2018\/12\/20181206_tiny13_watchdog-400x202.png 400w, https:\/\/www.sciencetronics.com\/greenphotons\/wp-content\/uploads\/2018\/12\/20181206_tiny13_watchdog.png 1667w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>The watchdog timeout time can be set externally by means of the three pins PB[2:0] as a three bit number, where the actual time is (n*2+1) seconds, i.e. between 1 s and 15 s. Triggering the watchdog is done by toggling the pin PB3, each transition 0-1 and 1-0 restarts the internal timeout.<\/p>\n<div class=\"codecolorer-container c default\" style=\"overflow:auto;white-space:nowrap;width:435px;height:300px;\"><div class=\"c codecolorer\"><span class=\"coMULTI\">\/*<br \/>\n&nbsp;* 20181206_tiny13_watchdog.c<br \/>\n&nbsp;*<br \/>\n&nbsp;* Created: 2018-12-06 21:48:06<br \/>\n&nbsp;* Author : uwezi<br \/>\n&nbsp;*\/<\/span> <br \/>\n<br \/>\n<span class=\"co2\">#define F_CPU 1000000UL<\/span><br \/>\n<span class=\"co2\">#include &lt;avr\/io.h&gt;<\/span><br \/>\n<span class=\"co2\">#include &lt;util\/delay.h&gt;<\/span><br \/>\n<span class=\"co2\">#include &lt;avr\/interrupt.h&gt;<\/span><br \/>\n<br \/>\n<span class=\"kw4\">volatile<\/span> <span class=\"kw4\">int8_t<\/span> timeout<span class=\"sy0\">,<\/span> count<span class=\"sy0\">;<\/span><br \/>\n<br \/>\nISR<span class=\"br0\">&#40;<\/span>PCINT0_vect<span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; count <span class=\"sy0\">=<\/span> timeout<span class=\"sy0\">;<\/span> &nbsp;<br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\nISR<span class=\"br0\">&#40;<\/span>TIM0_COMPA_vect<span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; count <span class=\"sy0\">--;<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>count <span class=\"sy0\">&lt;=<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; count <span class=\"sy0\">=<\/span> timeout<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; PORTB <span class=\"sy0\">&amp;=<\/span> ~<span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span> <span class=\"sy0\">&lt;&lt;<\/span> PB4<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; _delay_ms<span class=\"br0\">&#40;<\/span><span class=\"nu0\">200<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; PORTB <span class=\"sy0\">|=<\/span> <span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span> <span class=\"sy0\">&lt;&lt;<\/span> PB4<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"kw4\">int<\/span> main<span class=\"br0\">&#40;<\/span><span class=\"kw4\">void<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; DDRB &nbsp; <span class=\"sy0\">=<\/span> <span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span> <span class=\"sy0\">&lt;&lt;<\/span> PB4<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; PORTB &nbsp;<span class=\"sy0\">=<\/span> <span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span> <span class=\"sy0\">&lt;&lt;<\/span> PB4<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">|<\/span> <span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span> <span class=\"sy0\">&lt;&lt;<\/span> PB3<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">|<\/span> <span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span> <span class=\"sy0\">&lt;&lt;<\/span> PB2<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">|<\/span> <span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span> <span class=\"sy0\">&lt;&lt;<\/span> PB1<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">|<\/span> <span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span> <span class=\"sy0\">&lt;&lt;<\/span> PB0<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; <br \/>\n&nbsp; timeout &nbsp;<span class=\"sy0\">=<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span>PINB <span class=\"sy0\">&amp;<\/span> <span class=\"nu6\">0b111<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">&lt;&lt;<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">+<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">*<\/span> <span class=\"nu0\">4<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; count &nbsp; &nbsp;<span class=\"sy0\">=<\/span> timeout<span class=\"sy0\">;<\/span><br \/>\n&nbsp; <br \/>\n&nbsp; PCMSK &nbsp;<span class=\"sy0\">=<\/span> <span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span> <span class=\"sy0\">&lt;&lt;<\/span> PCINT3<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; GIMSK &nbsp;<span class=\"sy0\">=<\/span> <span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span> <span class=\"sy0\">&lt;&lt;<\/span> PCIE<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; <br \/>\n&nbsp; OCR0A &nbsp;<span class=\"sy0\">=<\/span> <span class=\"nu0\">243<\/span><span class=\"sy0\">;<\/span> &nbsp; <span class=\"co1\">\/\/ 4 Int\/s<\/span><br \/>\n&nbsp; TCCR0A <span class=\"sy0\">=<\/span> <span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span> <span class=\"sy0\">&lt;&lt;<\/span> WGM01<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">|<\/span> <span class=\"br0\">&#40;<\/span><span class=\"nu0\">0<\/span> <span class=\"sy0\">&lt;&lt;<\/span> WGM00<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; TCCR0B <span class=\"sy0\">=<\/span> <span class=\"br0\">&#40;<\/span><span class=\"nu0\">0<\/span> <span class=\"sy0\">&lt;&lt;<\/span> WGM02<span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">|<\/span> <span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span> <span class=\"sy0\">&lt;&lt;<\/span> CS02<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">|<\/span> <span class=\"br0\">&#40;<\/span><span class=\"nu0\">0<\/span> <span class=\"sy0\">&lt;&lt;<\/span> CS01<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">|<\/span> <span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span> <span class=\"sy0\">&lt;&lt;<\/span> CS00<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; TIMSK0 <span class=\"sy0\">=<\/span> <span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span> <span class=\"sy0\">&lt;&lt;<\/span> OCIE0A<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; <br \/>\n&nbsp; sei<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span> &nbsp; &nbsp; &nbsp; <br \/>\n<br \/>\n&nbsp; <span class=\"kw1\">while<\/span> <span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span> <br \/>\n&nbsp; <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; timeout &nbsp;<span class=\"sy0\">=<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span>PINB <span class=\"sy0\">&amp;<\/span> <span class=\"nu6\">0b111<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">&lt;&lt;<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">+<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">*<\/span> <span class=\"nu0\">4<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; _delay_ms<span class=\"br0\">&#40;<\/span><span class=\"nu0\">500<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>In a recent quick-and-dirty project with a Wemos D1 mini clone I had some problems with the reliability of the code. The ESP8266 contains two watchdogs which have the sole purpose to reset the chip if the firmware ever should get stuck. Previously I experienced these watchdogs to be too aggressive, but this was not [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2108,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"enabled":false},"version":2}},"categories":[46,22,11],"tags":[],"class_list":["post-2107","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-avr","category-computers_en","category-electronics_en","entry","has-media"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/www.sciencetronics.com\/greenphotons\/wp-content\/uploads\/2018\/12\/20181206_tiny13_watchdog.png","jetpack_shortlink":"https:\/\/wp.me\/p48grL-xZ","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.sciencetronics.com\/greenphotons\/index.php?rest_route=\/wp\/v2\/posts\/2107","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sciencetronics.com\/greenphotons\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sciencetronics.com\/greenphotons\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sciencetronics.com\/greenphotons\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sciencetronics.com\/greenphotons\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2107"}],"version-history":[{"count":4,"href":"https:\/\/www.sciencetronics.com\/greenphotons\/index.php?rest_route=\/wp\/v2\/posts\/2107\/revisions"}],"predecessor-version":[{"id":2325,"href":"https:\/\/www.sciencetronics.com\/greenphotons\/index.php?rest_route=\/wp\/v2\/posts\/2107\/revisions\/2325"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.sciencetronics.com\/greenphotons\/index.php?rest_route=\/wp\/v2\/media\/2108"}],"wp:attachment":[{"href":"https:\/\/www.sciencetronics.com\/greenphotons\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2107"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sciencetronics.com\/greenphotons\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2107"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sciencetronics.com\/greenphotons\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2107"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}