16F628A WDT YARDIM

Başlatan ouzslt35, 08 Kasım 2016, 01:22:00

ouzslt35

WDT Yİ SADECE PIC DONDUĞUNDA RESETLEYECEK ŞEKİLDE NASIL AYARLARIM.

PRODA RÖLE ÇEKTİRİYORUM SIKINTI OLMAMASINA RAĞMEN PIC RESETLİYOR KENDİNİ

#include <16f628A.h>
#fuses XT,WDT, NOPUT, PROTECT,NOBROWNOUT, NOLVP, NOCPD
#use delay (clock = 4000000 )
#use fast_io(A)
#use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_B2,RCV=PIN_B1)

char oguz;

void main()
{
delay_ms(200);
set_tris_a(0b00000000); 


Output_a(0x00);
setup_WDT(WDT_2304MS);

PRO BAŞLANGICI...
.
.
.
.
PRONUN BİTİŞİ..
restart_wdt();

İlyas KAYA

WDT sigortasını aktif ettiğinizde zaten bu işe yarar.
Her komuttan sonra arkada çalışan sayaç sıfırlanır. Eğer sayaç sıfırlanmaz ise yani komut işlenmemiş ise reset atılır.
Hali ile; Role çektiğinde resetleme nin WDT ile alakası yok. Devre şemanızı koyun kontrol edelim.
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

est32

pic neden donsun ki? Ben hiç karşılaşmadım.
Ya programda bir sorun vardır sonsuz döngüye giriyordur, ya return komutlarında hata vardır, ya bir dijital sensör okunamıyordur orada oyalanılıyordur ya da buna benzer durumlar ve aşırı uzun bir pause komutu vardır. Bunun dışında program düzgün yazıldıktan sonra donma olayıyla hiç karşılaşmadım(tabii donanımsal hata yoksa, kristalde bir sorun mesela).
Eğer program kilitleniyorsa programa timer kesme eklenir, belli aralarda kesmeye gidilir ve WDT kesme içinde sıfırlanır. Eğer pic gerçekten donuyor, hata yapıyorsa bu durumda işe yarar diye düşünüyoruym. Ama öncelikle işlemcinin neden donduğu bulunmalı, çünkü bu bir sorun olduğunu gösteriyor.

ete

Pic çok kolay donabilir aslında bunun başlıca sebebi de stack taşmasıdır. Bu şu anlama geliyor. İçeride bir program çalışıyor ve pic call-return aralığında gidip geliyor. Ama bir tane fazla return görürse donar kalır çünki Return komutunu görünce stack dan dönüş adresini alır ve oraya gider. Ama stack pointer bir şey göstermiyor ise (Goto ile gidilen yerden Return ile dönerek yada Gosub ile gidilen yerden Goto ile dönülürse) pic nereye gideceğini bilemediği için donar kalır.
Tabiiki iyi programcılar buna hiç rastgelmez. Ama ben çok ca gördüm bu olayı.

Bu donma programcının isteği dışında ama onun hatasından kaynaklanan bir donmadır. Birde programda sonsuz döngüler vardır ve programı oraya hapsedersin. Bu kolay kolay isteyerek yaratılacak bir olay değil. Ama bellimi olur iyice incelemek lazım programları.

Ete

ouzslt35

ETE HOCAM YAPTIĞIM DEVRE BLUTOOT İLE 4 RÖLELİ KONTROL DEVRESİ
RÖLE HEM NORMAL ÇALIŞIYOR AÇ KAPA OLARAK  HEMDE  ÇEK BIRAK OLARAK ÇALIŞIYOR
BEN TELEFONUMDAN ARKA ARKAYA BAS CEK BUTONUNA BASIYORUM RÖLEM 1SN CEKİP BIRAKIYOR ARKA ARKAYA BASINCA İŞLEMCİDE DONMA LLUYOR ENERJİYİ KESİM VERMEM GEREKİYOR

ete

Donma sebebini anlamak mümkün değil. WDT ın çekili röleleri bıraktırmada kullanmak teorik olarak iyi ancak pratik olarak pek iyi bir fikir değil.
Üst üste bastığın her tuş WDT süresini restleyerek çalışmayı engelliyor ama yinede donmanın olmaması gerekiyor. Tabiiki adına donma diyoruz ama epeyce bekleyip sonuca baktınmı hiç?
Bir müddet sonra sistem normale kendiliğinden dönmüyormu?. Dönmüyorsa her reset oluşumunda bildiğim kadarı ile Stack pointer resetlenmiyor ve program sonunda şaşırıyor. Çünki her USART kesmesi stack kullanımını gerektiriyor. Ama oda dolduğu için program sonunda sonsuz döngüye giriyor olsa gerek. Bu şaşırma süresi 5-6 ard arda tuşa basmadan sonra oluyordur mutlaka. İlk çalışmada stack 'ında resetlenmesi için bir ASM kodu aramak lazım bence. Bununla ilgili bir yazı okumuştum bir yerlerde ama çözüm ne idi hatırlamıyorum doğrusu. Araştırayım bulursam buraya eklerim.

Ben olsam röle bıraktırma işini TMR1'e yaptırırdım. TMR1 sayacını 500 ms lik süreç için kurar ve onu kesmeye bağlamadan kesme bayrağını kontrol ederek iki 500ms lik sürede 1 sn artış sağlardım. Sonrada her bir çekili röle için zaman sayardım. 2 sn için 4 defa PIR1.0 bayrağının set edilmiş olması gerekir.
Böylece WDT kullanmadan sistem çalışırdı.
Daha açık söylemek gerekir ise program TMR1 sayacının 500 ms lik döngüsü içinde sürekli çalışır.
Aktif olan röleler için bir byte registeri kullanırdım. Mesela adına aktif der isek, 1 nolu röle çekince AKTIF.1=1 yapılır.
Her birinin bir sayacı olur ve bunlara röle çekildiği anda bırakackları sn miktarı yüklenir. Her sn değişiminde aktif olanların sayacaları 1 azalır ve sıfıra ulaşan sayacların ait oldukları röleler bıraktırılır. Bu şekilde çalışma toplu olrak tek sayaçtan faydalanma imkanı yaratır. Bence değerlendir. Toparlayamazsan yardım ederim.
Ete

Powered by EzPortal