Changes between Initial Version and Version 1 of Watch_dog_for_RPi_ATTiny


Ignore:
Timestamp:
Jun 12, 2015 5:08:21 PM (9 years ago)
Author:
aoki
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Watch_dog_for_RPi_ATTiny

    v1 v1  
     1= ウォッチドック基板のファームウェア =
     2
     3ウォッチドッグ基板上のATTiny85のソースファイルです。
     4
     5 - WDtimer.c
     6{{{
     7/*************************************
     8**  main.c                          **
     9**                                  **
     10**  Created : 2014/12/18 14:43:39   **
     11**  Author  : O.aoki                **
     12*************************************/
     13
     14#include <avr/io.h>
     15#include <avr/interrupt.h>
     16#include <stdlib.h>
     17
     18#include "WDtimer.h"
     19
     20//#define       F_CPU   8000000UL                                                       // 8 MHz
     21//#include <util/delay.h>
     22
     23/*---------------------------------------------------
     24        Global variable
     25*/
     26        volatile unsigned char  IntFlag;
     27        volatile unsigned char  LowCounter;
     28        volatile unsigned char  HighCounter;
     29        volatile unsigned long  GlobalCounter;
     30        volatile unsigned long  WDCounter;
     31
     32/*---------------------------------------------------
     33        Timer
     34*/
     35void Timer_Init() {                     // base CK = 8MHz
     36        OCR1C = 10;                             // 0.0102 sec
     37        BitSet(TIFR, TOV1);             // clear overflow flag
     38        BitSet(TIMSK, TOIE1);   // Parmit overflow interrupt
     39        TCCR1 = 0b11001110;             // Clear timer, PWM Mode, No Output, timer-prescaler 1/8192
     40}
     41
     42/*---------------------------------------------------
     43        In-port driver
     44*/
     45/* ---- Watch dog pulse ---- */
     46void WD_Port_Read() {
     47        if ((~PINB) & (1<<WDpulse)) {
     48                HighCounter = 0;
     49                if (LowCounter < 250) LowCounter++;
     50        } else {
     51                if (HighCounter < 250) HighCounter++;
     52                LowCounter = 0;
     53        }
     54}
     55
     56unsigned char WD_Port_Rise_Edge() {
     57        if (HighCounter == 9) return (0xFF);
     58        return (0);
     59}
     60
     61unsigned char WD_Port_Fall_Edge() {
     62        if (LowCounter == 9) return (0xFF);
     63        return (0);
     64}
     65
     66unsigned char WD_Port_Double_Edge() {
     67        if (HighCounter == 9) return (0xFF);
     68        if (LowCounter  == 9) return (0xFF);
     69        return (0);
     70}
     71
     72/* ---- Jumper switch port for LED ---- */
     73unsigned char JSW_Port() {
     74        if ((~PINB) & (1<<LEDsw)) return (0xFF);
     75        return (0);
     76}
     77
     78/*---------------------------------------------------
     79        Main Routine
     80*/
     81int     main( void ) {
     82        unsigned char   WDstat;
     83        unsigned char   preCounter;
     84        unsigned char   LEDflag;
     85
     86        /* ******* 初期化開始 ******* */
     87        cli();                                          // 初期処理中は割り込み禁止
     88
     89        // ---- 変数初期化
     90        GlobalCounter = 0;
     91        WDstat = WD_default;
     92        WDCounter = 0;
     93        preCounter = 0;
     94        // ---- ポートB初期化
     95        BitSet(MCUCR, PUD);
     96        DDRB  = OutPortMask;            // Set to `PB4` `PB1` ouput
     97        PORTB = OutPortMask;            // Output default pattern
     98        RstLED;
     99        // ---- タイマー初期設定
     100        Timer_Init();
     101
     102        sei();                                          // 割込み許可
     103
     104        /* ******* 初期化終了 ******* */
     105
     106        while (1) {     // main loop
     107                LEDflag = 0;
     108                switch (WDstat) {
     109                        case WD_ReBoot :
     110                                        if ((GlobalCounter & 0x00000003) == 0) LEDflag = 0xFF;
     111                                        OffFET;
     112                                        if (WDCounter >= WD_RecoveryTime) {
     113                                                WDstat = WD_default;
     114                                                WDCounter = 0;
     115                                        }
     116                                        preCounter = 0;
     117                                        break;
     118                        case WD_default :
     119                                        if ((GlobalCounter & 0x0000007F) == 0) LEDflag = 0xFF;
     120                                        OnFET;
     121                                        WDCounter = 0;
     122                                        if (WD_Port_Fall_Edge()) {
     123                                                preCounter++;
     124                                                if (preCounter > WD_StartPulseNumber) WDstat = WD_active;
     125                                        }
     126                                        break;
     127                        case WD_active :
     128                                        if ((GlobalCounter & 0x0000000F) == 0) LEDflag = 0xFF;
     129                                        OnFET;
     130                                        if (WD_Port_Fall_Edge()) WDCounter = 0;
     131                                        if (WDCounter >= WD_TimeOut) {
     132                                                WDstat = WD_ReBoot;
     133                                                WDCounter = 0;
     134                                        }
     135                                        break;
     136                        default:
     137                                        WDstat = WD_ReBoot;
     138                                        WDCounter = 0;
     139                                        break;
     140                }
     141                if (!JSW_Port())
     142                        RstLED;
     143                else
     144                        if (LEDflag) TglLED;
     145                IntFlag = 1;
     146                while (IntFlag == 1);
     147        }
     148}
     149
     150/*------------------------------------------------------
     151        Timer Interrupt Sub Routines
     152 */
     153/* -=-=-=-= Timer Overflow ISR =-=-=-=- */
     154ISR(SIG_OVERFLOW1) {
     155        WD_Port_Read();
     156        GlobalCounter++;
     157        WDCounter++;
     158        IntFlag = 0;
     159}
     160}}}
     161
     162 - WDtimer.h
     163{{{
     164/*************************************
     165**  main.c                          **
     166**                                  **
     167**  Created  : 2014/12/18 14:43:39  **
     168**  Author   : O.aoki               **
     169**************************************/
     170
     171#define __ATtiny85__            1                               // チップ環境を"ATtiny85"としてコンパイルする
     172
     173/* ---- 定数 ---- */
     174#define OutPortMask             (1 << FET) + (1 << LED)         // ポート出力レジスタのマスクパターン
     175#define WD_TimeOut              5*100                           // ウォッチドッグのタイムアウト[*10mS]
     176#define WD_RecoveryTime         10*100                          // Raspberry Piのリブート(電源off)時間[*10mS]
     177#define WD_StartPulseNumber     5                               // ウォッチドッグ開始シグナルのエッジ検出数
     178
     179/* ---- ウォッチドッグステータス ---- */
     180#define WD_ReBoot               0
     181#define WD_default              1
     182#define WD_active               2
     183
     184/* -=-=-= Inport =-=-=- */
     185/* ---- Watch dog pulse ---- */
     186#define WDpulse                 PINB0                           // Global : Watch dog pulse port
     187/* ---- Jumper switch port for LED ---- */
     188#define LEDsw                   PINB3                           // Global : jumper sw port
     189
     190/* -=-=-= Outport =-=-=- */
     191/* ---- ビット操作 ---- */
     192#define BitRst(addr, bit)       addr &= ~(1<<bit)               // Global : addrのbit番目をLowに
     193#define BitSet(addr, bit)       addr |=  (1<<bit)               // Global : addrのbit番目をHighに
     194#define BitTgl(addr, bit)       addr ^=  (1<<bit)               // Global : addrのbit番目を反転
     195
     196/* ---- FET操作 ---- */
     197#define FET                     PB4
     198#define OnFET                   BitRst(PORTB, FET)              // Global : FETを繋げる
     199#define OffFET                  BitSet(PORTB, FET)              // Global : FETを切る
     200
     201/* ---- LED操作 ---- */
     202#define LED                     PB1
     203#define SetLED                  BitRst(PORTB, LED)              // Global : LEDを点ける
     204#define RstLED                  BitSet(PORTB, LED)              // Global : LEDを消す
     205#define TglLED                  BitTgl(PORTB, LED)              // Global : LEDを反転
     206
     207/* -=-=-= Debug用 =-=-=- */
     208/* ---- Debug用LED ---- */
     209#define LED1                    1
     210#define SetLED1                 BitRst(PORTB, LED1)             // Global : LED1を点ける
     211#define RstLED1                 BitSet(PORTB, LED1)             // Global : LED1を消す
     212#define TglLED1                 BitTgl(PORTB, LED1)             // Global : LED1を反転
     213
     214}}}