PIC18F4550 portD dahili Pull-up

Başlatan jrcapa, 29 Mayıs 2015, 23:39:21

selimkoc

Ölçümleri bizzat donanım üzerinde, aşağıda linkini verdiğim kit üzerinde ölçtüm.

Deney kiti https://elektrokod.wordpress.com/2014/09/10/usb-hid-bootloader-pic18f4550-deney-karti/

esensoy

Yanlış ölçümüşsünüz demedim, latb yi ölçmüşsünüzdür dedim,
En tehlikeli an "zafer" anıdır.

OnderGrmz

Alıntı yapılan: selimkoc - 30 Mayıs 2015, 22:16:30
Sadece ölçüm için; girişlerin H, çıkışların L olduğunu görmek için. Varsayılan değer değil, çıkışlar 0 olsun diye.

Hocam yanlış anladıysam düzeltin.
ADCON1 |= 0x0F;   // Hepsi digital
CMCON  |= 7;        // Comparator pasif
CCP1CON=0x00;   // ECCP pasif
SPPCON=0x00;     //SSP pasif
RDPU_bit=1;         //porte|=0x80;  --->> portD pullup AKTİF
trisD = 0x0F;          // D portunun D0, ..,D3 pinleri input
// D4,...,D7 output olarak ayarlandı.
portD = 0x00;   // komutu ile çıkış olan pinler D4,..., D7 sıfırlandı. Diğer pinler ( D0,.. , D3 ) pull-up olarak kaldı.


Selimkoc Hocam doğru anlamış mıyım ?

selimkoc

PORTD'nin ilk 4 biti giriş diğerleri çıkış olarak ayarlanmış ve girişler Pull-Up yapılmış.

Kodlar doğru.

jrcapa

#19
Evet arkadaşlar D portu için pull-up'ı kullanabiliyoruz. Simulasyonda lojik 1'ler görünmeyince bir devre kurup üzerinde test ettim ve çalıştı.  Devre simulasyonda çalışmıyor yani D0-D1 lojik1 olmadığından sıfıra çekemiyorsunuz. Dikkat edilmesi gereken bir husus da  RDPU_bit=1 yaptıktan sonra portE'nin 7. biti tekrar sıfırlanmamalı. İlk mesajımda yaptığım hata bu imiş.

Çalışan basit bir devre ve programı şöyle:



ADCON1 |= 0x0F;   // Hepsi digital
CMCON  |= 7;        // Comparator pasif
CCP1CON=0x00;   // ECCP pasif
SPPCON=0x00;     //SSP pasif
RDPU_bit=1;         //porte|=0x80;  --->> portD pullup AKTİF
trisD = 0x03;  //D0-D1 giriş    
trisE = 0xF0;     
portD = 0x00;
portE = 0xF0;  //7.bit 0 olursa pull-up çalışmıyor.

while(1)     // Sonsuz döngü.
 { 
if(!portd.rd0) {   while(!portd.rd0);

portd.rd7=1;   delay_ms(500);  portd.rd7=0;
   }
if(!portd.rd1) {  while(!portd.rd1);

porte.re0=1;   delay_ms(500);  porte.re0=0;

PWM2_Set_Duty(128);  //herhangi bir işlem yapılabilir.
    }
}

OnderGrmz

Merhabalar;
Konu ile bağlantılı olduğunu düşünerek burada bir soru sormak istiyorum.
LATDbits.LATD0
PORTDbits.RD0

Bu 2 register da D portuna erişilebiliyor diye biliyorum. Peki bunların farkları neler ? Kullanım alanı olarak bir farkı var mı ? İki register ı da hem okuma hem yazma işlemlerinde kullanabilir miyiz ?

Tagli

Eskiden bu başlıkta konuşulmuştu. Özetle, yazarken LAT'a yazmak, okurken PORT'tan okumak gerekiyor.
Gökçe Tağlıoğlu

esensoy

Porttan okuma yapılır, pine yazmak için LAT kullanılır,

D0 pinini okumak yani diital giriş olarak kullanmak istiyorsan;
int main (void){
int i = 0;

TRISDbits.TRISD0 = 1; 
i = PORTDbits.RD0;
while(1);
}


Yok D0 ı çıkış olarak kullanmak istiyor ve durumunu da lojik 1 yapmak istiyorsan;
int main (void){

TRISDbits.TRISD0 = 0; 
LATDbits.LATD0 = 1;
while(1);
}
En tehlikeli an "zafer" anıdır.

OnderGrmz

#23
Merhabalar;
Alıntı yapılan: Tagli - 04 Haziran 2015, 08:47:56
Eskiden bu başlıkta konuşulmuştu. Özetle, yazarken LAT'a yazmak, okurken PORT'tan okumak gerekiyor.
Konuyu okudum hocam.

Alıntı yapılan: esensoy - 04 Haziran 2015, 08:50:26
Porttan okuma yapılır, pine yazmak için LAT kullanılır,

        ADCON1 |= 0x0F;   // Hepsi digital
        CMCON  |= 7;        // Comparator pasif
        CCP1CON=0x00;   // ECCP pasif
        SPPCON=0x00;     //SSP pasif
        
        TRISD = 0x0F;    // D portunun D0, ..,D3 pinleri input
                        // D4,...,D7 output olarak ayarlandı.
        PORTE|=0x80;       // RDPU_bit=1; --->> portD pullup AKTIF
        PORTDbits.RD7=1;
        Delay10KTCYx(500);
        LATD=0x00; // Tüm porta sıfır yazılmaya çalışıldı, fakat D0, ..,D3 pinleri pull-up nedeniyle hala lojik 1 kaldı !!!

LATD=0x00; yazıp tüm portu lojik 0'a çeksek bile input olarak ayarladığımız pinler hala lojik 1 kaldı. Bu nedenle şöyle bir yorum yapabilir miyiz
" input olarak ayarlanan pinlere lojik olarak değer yazamıyoruz " ?

Not: devamında şöyle bir işlem var inputların lojik 1 olarak kaldığını buradan anlıyorum
while(1)
	{
               if(PORTDbits.RD0==0)
                {
		        Delay10KTCYx(500);
                LATDbits.LATD7=1;
                LATDbits.LATD6=1;
                LATDbits.LATD5=1;
                }
                else if(PORTDbits.RD0==1)
                {
                Delay10KTCYx(50);
                LATDbits.LATD7=0;
                LATDbits.LATD6=0;
                LATDbits.LATD5=0;
                }
	}



Giriş pinine yazmaya çalışmak veya çıkış pinin okumaya çalışmak mantıksız oluyor. Ama böyle bir şey yapılabiliyor mu onu merak ettim ?

Tagli

Giriş bacağının latch'ına yazarsan, o bacak ileride çıkışa ayarlanırsa latch'a son yazılan çıkış etkili olur. Çıkış bacağından normal olarak okuma yapabilir ve bacaktaki mantık seviyesini öğrenebilirsin. Bazı durumlarda (örneğin kısa devre benzeri bir durumda) sen çıkışı 1 yapsan bile çıkış gerçekte 0'da kalabilir. İlgili çıkış bacağını okumak buna benzer bir durumda işe yarayabilir.
Gökçe Tağlıoğlu