fpganedir.com'da ara

fpganedir mail

           
 YAZAR HAKKINDA

 
  Ersen  Çelik

  Üniversite 2. Sınıf
  Öğrencisi

    ersen.celik94@gmail.com

 
Yazarın Yayınlanmış Makaleleri

 

     

PIC ÜZERİNDE WATCHDOG TIMER UYGULAMASI

Bu projemde sizlerle PIC18fF452 mikrodenetleyici üzerinde gerçekleştirdiğim bir watchdog timer uygulamasını sizlerle paylaşacağım. Projemize başlamadan önce watchdog timer'a kısaca bir göz atalım.

Wachdog timer yazılımsal resetleme için kullanılan bir uygulamadır. İçerisinde yazılım koşan her bir cihazın donanım ve diğer yapısına göre hata verme riski vardır. Bu hata genelde yazılımın  her hangi bir noktasında durması veya sonsuz döngüye girmesi (kitlenmesi) şeklinde olur. Bu riske karşı her cihaza bir resetleme (sıfırlama) mekanizması eklenir. Bu genelde karşımıza anahtar olarak çıkar. Sistemin kilitlenmesi durumda bu anahtar sayesinde program baştan başlatılır.

Fakat bu çözüm manuel olduğu için içerisinde kritik yazılım koşan bir cihaz için uygulanabilir değildir. Bu yüzden kritik yazılımlar için watchdog timer kullanılır. Programın içerisinde belirli ifadelerin arasına kontrolcüler konulur. Programın yapısına göre bu kontrolcüler arasındaki yazılım koşma zamanı belirlenir. Eğer program bu belirlenen süre içerisinde bu kontrol noktalarına gelmez ise program kendisini resetler ve  program baştan koşmaya başlar. Watchdog timer'ı programın her noktasında aktif etmeye gerek olmayabilir. Bu durumda sadece kritik görülen kod parçaları arasına da yerleştirilebilir. Bu ise programın gereksiz yere kendini resetlemesini önler.

Artık projemize geri dönebiliriz. PIC C programında PIC Wizard aracını kullanarak yeni bir proje oluşturalım. PIC Wizard aracında Timers kısmında WDT kısmında Enable kutucuğunu işaretleyelim. Daha sonra zamanlayıcının resetleme zamanını belirleyelim. Ben bu örnekte bu zamanı 1152 ms olarak belirledim. Program içerisinde watchdog timer bu zaman aralığında resetlenmediği zaman, zamanlayıcı programı resetleyecek ve programı baştan başlatacak.

Watchdog timer'ı baştan başlatmak için C kodu içerisinde restart_wdt() ifadesini kullanacağız.

Projenin C kodu aşağıdaki gibi olacak.

#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PORT1)

void main() {

     printf("Program Baslangici\n\r");
     while(1)
     {
          delay_ms(1000);
          printf("Program devam ediyor\n\r");
           restart_wdt(); //watchdog timer'ı baştan başlat
      }

}

Yukarıda kodda watchdog timer yaklaşık 1000 ms bir zaman aralığında kendini baştan başlatacak. Bu zaman watchdog timer'ın zaman aşımı olan 1152 ms küçük olduğu için , zamanlayıcı zaman aşımı olmadan tekrar başa döndürülecek. Bu ise programı resetlemeyecek. Bu kodun Proteus'ta simülasyonunu yaptığımızda Virtual Terminal'de aşağıdaki ifadeleri görürüz.

Yukarıdaki kodu aşağıdaki gibi değiştirelim.

void main() {

printf("Program Baslangici\n\r");
while(1)
{
    delay_ms(1500);
     printf("Program devam ediyor\n\r");
     restart_wdt();
}

}

Bu kodda sadece delay zamanını 1500 ms olarak değiştirdik. Bu ise watchdog timer'ın zaman aşımından fazla olduğu için program printf("Program devam ediyor\n\r"); ifadesine gelmeden resetlenecek. Bu kodun Proteus'ta simülasyonunu yaptığımızda Virtual Terminal'de aşağıdaki ifadeleri görürüz.

İyi eğlenceler.

Anasayfa | Fpga | VHDL | VHDL Sözlüğü | Embedded Sistem | Android | Sayısal Tasarım | Simulasyon | PCB | Örnekler | Forum | İletişim
Copyright © 2010-2013 FPGAnedir. All Rights Reserved.