2016-06-25 2 views
0

수정 된 Arduino 보드 : Atmega 1281 MCU 칩이 탑재 된 Gizduino X를 사용하고 있습니다. 응용 프로그램은 Arduino IDE 프로그래머를 사용하여 MCU에 업로드됩니다. 나는 Atmega 1281의 워치 독 타이머 리셋 기능을 사용하려고 시도하고 라이브러리 "wdt.h"를 사용했다. 문제는 워치 독 리셋 후에 마이크로가 계속해서 리셋 할 때 반복되는 것처럼 보입니다.Watchdog이 AVR Atmega 1281을 한 번 트리거하면 계속 재설정합니다.

#include <stdint.h> 
#include <avr/wdt.h> //Watchdog Timer library 
#define RST_PIN 38  //pin for MCU reset indicator 

uint8_t mcusr_mirror __attribute__ ((section (".noinit"))); 
void get_mcusr(void) __attribute__((naked)) __attribute__((section(".init3"))); 
void get_mcusr(void) 
{ 
    mcusr_mirror = MCUSR; 
    MCUSR = 0; 
    wdt_disable(); 
} 

char ch; 
char pn = 0; 
bool ledState = false; 

#define wdtReset() wdt_reset(); \ 
       digitalWrite(RST_PIN, LOW) 

#define wdtBegin() wdt_reset(); \ 
       wdt_enable(WDTO_500MS); \ 
       bitSet(WDTCSR, WDIE) 
/******************************************/ 
void setup() { 
    wdtBegin(); 
    Serial.begin(115200); 

    // initialize digital pin 13 as an output. 

    wdtReset(); 
    pinMode(13, OUTPUT); 
    pinMdoe(RST_PIN, OUTPUT); 
} 
/******************************************/ 
// the loop function runs over and over again forever 
void loop() { 
    if(Serial.available()) { 
    ch = Serial.read(); 
    if(ch == 'R' || ch == 'r') { 
     ledState = !ledState; 
     digitalWrite(13, ledState); 
     while(true); 
    } 
    } 
    if(pn >= 255) pn = 0; 
    Serial.println(pn++); 
    wdtReset(); 
} 
/******************************************/ 
ISR(WDT_vect) { 
    digitalWrite(RST_PIN, HIGH); 
} 

코드의 목적은 다음과 같습니다 : 다음과 같이 내 코드에 포함 있도록 자동으로 재설정 후 활성화되기 때문에, 워치 독 설정()하기 전에 비활성화해야합니다 데이터 시트 사양을 알고 있었다이다 내가 원하는대로 워치 독 문제를 격리하고 워치 독 리셋을 호출하십시오. MCU에 전원이 공급되면 코드가 잘 실행되지만 워치 독 재설정 ('r'또는 'R') 호출 문자를 보내면 RST_PIN이 HIGH (인터럽트 발생을 나타냄)로 설정되고 재설정하지만 보드의 LED 표시등이 켜져 있습니다. 이 상태가되면 리셋 버튼을 눌러 보드에서 전원을 제거 할 때까지 MCU를 더 이상 재설정하지 않습니다. 또한 리셋 버튼을 계속 누르면 리셋 버튼 옆의 ICSP 핀 중 하나를 실수로 터치 할 때 보드의 LED 표시등이 조금 어두워지고 깜박이기 시작합니다.

은 또한이 링크에서 감시를 설정하는 방법 다음 :

http://donalmorrissey.blogspot.com/2011/09/using-watch-dog-on-atmega1281-as-lock.html은 내가 Atmega328 MCU에서 동일한 코드를 업로드를하지만 그것을 잘 작동합니다. 워치 독이 시스템 재설정 후 기본값으로 계속 활성화되어 있기 때문에 새로운 칩에 문제가 있다고 생각합니다.

이 나는 ​​뭔가를 놓치고 있습니까? 문제가있는 하드웨어가 특정한가요?

답변

0

Arduino 부트 로더가 기본 앱보다 먼저 실행되기 때문입니다. 부트 로더 시작 WDT가 여전히 활성화되어 있고 최소 기간 16ms로 설정합니다. 데이터 시트는 말한다 :

참고 : 워치 독 실수로 사용하는 경우, 가출 포인터 나 브라운 - 아웃 조건에 의해 예를 들어, 장치가 초기화되고 워치 독 타이머가 활성화 상태로 유지됩니다. 워치 독을 처리하도록 코드가 설정되지 않은 경우 으로 설정하면 시간 초과 재설정의 영원한 루프가 발생할 수 있습니다. 이러한 상황을 피하기 위해 응용 프로그램 소프트웨어는 Watchdog이 사용되지 않아도 은 WDRF (Watchdog System Reset Flag)와 초기화 루틴의 WDE 제어 비트를 항상 지워야합니다 ( ).

재설정시 Watchdog을 사용하지 않도록 설정하거나 기본 앱에서 Watchdog을 잊어 버리려면 부트 로더를 수정해야합니다.

UPDATE는 부트 로더에서 WDT를 사용하지 않도록 최대한 빨리이 코드를 실행하려면 :

MCUSR &= ~(1 << WDRF); 
wdt_disable(); 
관련 문제