MCLR sorunu

Başlatan onurinci, 19 Ekim 2019, 03:04:23

onurinci

evdeki Davlunbaz bozuldu ,yenisinin fiyatıda epey uçuk ,timer falan yok lamba ve iki devir seç, birde herşeyi kapa butonu vardı, yanan işlemci çin malı bir şey plaketten kablolar çıkararak kendi tasarladığım devreyi bağladım ,işim görüldü,gayet sağlıklı çalışıyor...programı yazarken CLEAR komutunu işlevsiz hale getirmişim dikkatsizlik ederek..programı simule ettim,ilginç bir hata ile karşılaştım,MCLR pinini aktif ederek burayı reset pini yapmıştım ,aspiratörü çalıştırıp ve lambayı açarsam reset yaptığımda,sadece PortA siliniyor PortB aynen devam ediyor,proteus'un klasik saçmalıklarından biridir deyip gerçek devreye uyarladım,hayret durum aynıydı,benim bildiğim MCLR program akışını kayıtçıları sıfırlar ve herşey yeniden başlar,yazdığım kodu incelediüimde CLEAR komutunu kapattığımı farkettim,derhal düzelltim,ve herşey normale döndü,bir açıklaması olmalı...


@ Device PIC16F628A,WDT_OFF,PWRT_ON,PROTECT_OFF, CPD_OFF,MCLR_ON,BOD_OFF,INTRC_OSC_NOCLKOUT,LVP_OFF
DEFINE OSC 4

TRISA= %00000111 : PORTA= 0
TRISB= %00000000 : PORTB= 1

CMCON= 7 ': OPTION_REG.7= 0 



Value  VAR BYTE
Change VAR BIT
Sw  VAR PORTA.2 
Led VAR PORTA.3
' clear      '' sıkıntı çıkaran satır
'-------------------------------------------------------------------------------

 IF Value= 255 THEN Value= 0

Start:
'-------------------------------------------------------------------------------
 IF Sw= 0 THEN 
      TOGGLE Led : PAUSE 500 
 ENDIF 
'-------------------------------------------------------------------------------
 IF  PORTA.0= 0 THEN  
Change= 1
Value= Value + 1
 IF Value > 2 THEN Value= 2
   WHILE PORTA.0= 0 : WEND 
      PAUSE 30
 ENDIF    
'-------------------------------------------------------------------------------
 IF PORTA.1= 0 THEN
Change= 1 
Value= Value - 1
 IF Value= 255 THEN Value= 0
   WHILE PORTA.1= 0 : WEND
      PAUSE 30
 ENDIF
'------------------------------------------------------------------------------- 
 SELECT CASE Value
    CASE 0  :  PORTB= %00111111
    CASE 1  :  PORTB= %01111001
    CASE 2  :  PORTB= %11000100
   

 END SELECT

'-------------------------------------------------------------------------------      
      GOTO Start
END

ete

#1
Açıklaması şöyle,
İşlemci sıfırdan ilk açıldığında genellikle port pinleri rastgele değerler alır.
Değişken adreslerinde ne varsa aynen okunur. Aksine bir komut yoksa tabiki.
Ama MCLR bacağından reset yaptığında bir nevi programı baştan başlatır. Register değerleri otomatik sıfırlanmaz. Bu nedenle program başında gereken tedbir alınmalıdır.

Her program ilk açılışta registerlerin yerleşmesi (yada onlara değer yerleştirilmesi ) için bir açılış gecikmesi gerektirir. Sen bunu vermemişsin. Bu durumda ne çıkarsa bahtına prensibi işler ve gördüğün durum bahtına çıkandır.
Açılş gecikmesi 150-500 ms arasında bir değer olmalı 150 ms den az olmamalıdır 300ms ideal olur.
Heleki LCD kullanan projelerde açılış gecikmesi mutlaka gereklidir. Koymazsanız bazen LCD açılmaz bile.

Ete

elektro77

belki konu dışı olacak ama oradaki "change" tanımlaması ne işe yarıyor.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

"Change" bir bit değişkeni olarak tanımlanmış ve bir bilginin değişip değişmediğinin göstergesi olarak kullanılmış sanırım. Programın tamamı verilmediği için Change in asıl kullanıldığı yer gözükmüyor ama kullanım amacı işaret değişkeni diyebiliriz.

Ete

Powered by EzPortal