16F1826 MCLR ile ilgili değişik bir problemim var.

Başlatan Eren Eraslan, 01 Aralık 2016, 11:47:53

Eren Eraslan

Kendisi basit bir devre. Ama canımı sıkmaya başladı.
Yeni bir işlemci. 16F1826

MCLR 6.8K ile pull-up da. 20mhz ext. osc kullanıyorum.

Fakat ;
Sadece 2 durumda program çalışmaya başlıyor.

1. PicKit takılı iken enerji verdiğimde
2. PicKit takılı değil , sistem enerjilendirilmiş sadece MCLR pinindeki reset tuşuna basarsam çalışmaya başlıyor

Çözüm olarak Power up timer ve Brownout 2.5V configurasyonlarını yaptım. Değişmedi.

Datasheetteki startup sequence den birşey anlamadım açıkcası. Altta paylaştım.
En son olarak MCLR pinine 100uf bağladım. 0 dan 5V a çıkması 2sn sürdü. Ve çalıştı.

Buradaki temel hata kondansatörden midir? Zira önceki devrelerde MCLR ye böyle yüksek değerli kondansatör girmedim hiç. Sadece filtre amaçlı 100nf


insanın içine işleyen şarkılar ;  https://soundcloud.com/reeraslan

Melih1802

Çok emin olmamakla birlikte buna benzer bir konu konuşulmuştu yakın zamanda. @mehmet in bir çözüm önerisi vardı. Konfigirasyon ayarıydı diye hatırlıyorum.

Eren Eraslan

Aradım bulamadım hocam.
Konfigurasyonlardan dediğim gibi hem power up timer hemde brownout kullandım ama çalıştıramadım.

ek olarak
0.47uf ve 10uf taktım bu değerlerde pici çalıştırmadı. Şuan sadece 100uf ile başardım.
Fakat değer yüksek olduğundan bu sefer de pickit ile kod atmaya çalıştığımda GND ye çekilmiyor.
iki ucu boklu değnek.

insanın içine işleyen şarkılar ;  https://soundcloud.com/reeraslan

bulutay

program çalışmaya başlamadan önce ufak bir gecikme  koyarmısınız.

yas


Eren Eraslan

Valla değişik şeyler oluyor. TFT den dataları okumak için uart interruptı açıktı(Normalde çalışıyor). Şimdi kapattım kod hertürlü çalıştı
Demekki interrupta tıkanmış. Altta parçacığı ekledim. Timeout ile okuyordum aslında çıkması gerekiyordu.


#INT_RDA
void Read_Data_ADC_Int(void)
{  
   received_uart_data = 1;
   rxTimeOut = 0;
   for(rxCnt = 0; rxCnt < 4; rxCnt++){   
      while(!kbhit() && rxTimeOut < 5000) rxTimeOut++;     
      if(kbhit())  rxData[rxCnt] = getc();      
      else break;
   }
}
insanın içine işleyen şarkılar ;  https://soundcloud.com/reeraslan

mehmet

Alıntı yapılan: Melih1802 - 01 Aralık 2016, 12:04:40
Çok emin olmamakla birlikte buna benzer bir konu konuşulmuştu yakın zamanda. @mehmet in bir çözüm önerisi vardı. Konfigirasyon ayarıydı diye hatırlıyorum.
Benim bahsettiğim olay; 8MHz iç osilatör
kullanıp PLL ile 32MHz çıkarmak ile ilgiliydi.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

JOKERAS

Alıntı yapılan: Eren Eraslan - 01 Aralık 2016, 13:45:09
Valla değişik şeyler oluyor. TFT den dataları okumak için uart interruptı açıktı(Normalde çalışıyor). Şimdi kapattım kod hertürlü çalıştı
Demekki interrupta tıkanmış. Altta parçacığı ekledim. Timeout ile okuyordum aslında çıkması gerekiyordu.


#INT_RDA
void Read_Data_ADC_Int(void)
{  
   received_uart_data = 1;
   rxTimeOut = 0;
   for(rxCnt = 0; rxCnt < 4; rxCnt++){   
      while(!kbhit() && rxTimeOut < 5000) rxTimeOut++;     
      if(kbhit())  rxData[rxCnt] = getc();      
      else break;
   }
}

Bu durum bana Flase interrupt durumunu hatırlattı.
İnterrupt registerini kurmadan önce ilgili interrupt bayrağını temizleyip deneyin.

PIRBits.CCPIF = 0;     //False İnterrupt önlemi.
INTCONBits.CCPIE = 1;
INTCONbits.GIE = 1;

Gibi.