ATMEGA16A AU UART PROBLEMI

Başlatan alikilavuz, 25 Mart 2012, 13:47:06

alikilavuz

Merhaba,

Ben şu linki buldum ama daha basit gibi görünüyor. Hem de atmega16 için. Bir deneyeceğim. Bir de zaten avr gcc kütühanesinde avr/wdt.h diye hazır fonksiyonlar varmış.

http://www.engineersgarage.com/embedded/avr-microcontroller-projects/avr-watchdog-timers-circuit

Saygılarla,

alikilavuz

Merhaba, 

main.c kodumu şu şekilde değiştirdim. Doğru mudur acaba? Bu şekilde arızalı olan yere götürüp takacağım. Umarım donma,takılma problemi kaybolur.

Saygılarla,


#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/stdlib.h>
#include <avr/wdt.h>
#include "uart.h"
#include "display.h"
#include "init.h"
#include "timer.h"
#include "convert.h"
#include "hc165.h"
#include "version.h"
#include "rprintf.h"
#include "serial.h"
#include "delay.h"
static signed char floor;
static unsigned char state;

int main(void)
{
   
   uint8_t old_timer_value = 0;
   delay_us(7);
   wdt_enable(WDTO_2S);
   wdt_reset();
   OSCCAL =0x9C;
   

   init();
   wdt_reset();

   while(1)
   {
      wdt_reset();
      if(uartGetRxBufferLength() > 3)
         serial_main_func();
      wdt_reset();
      if( (counter_tmr2 ^ old_timer_value) & _BV(0))
      {
         wdt_reset();
         old_timer_value = counter_tmr2;
         
         state = convert_databus(hc165_scan(),&floor);
         delay_us(7);
         
         if(state == LIFT_TEST)
            display_test(hc165_scan());
         else
            display(state,floor);
         wdt_reset();
      }
      else
      {
         old_timer_value = counter_tmr2;
         wdt_reset();
      }
   
   }
}

arm-beginner

#17
wdt_reset() bu kadar sık kullanmanın bir anlamı yok.

Ben şahsen çok kritik olmayan uygulamalarda Watchdog-Timer'ı 1 - 2 saniye ayarlıyorum. Ve programın sadece main-loop'un  tek bir yerinde wdt_reset() komutunu kullanıyorum.

Sadece kritik olan uygulamalarda Watchdog-Timer süresini düşürmek zorunda kaldığım için, yoğun hesaplamaların veya uzun süren haberleşmelerin başına bir wdt_reset() koymak zorunda kalıyorum. Ama bunlar istisnalar.

Eklenti: Programı geliştirirken Watchdog'u hiç bir zaman devreye sokman. Herşey bitikden sonra ve herşey normal çalışdığından emin oldukdan sonra Watchdog can-simiti olarak aktif hale getirilir.