Merhabalar.
Datasheette yazan :
Each of the PORTD pins has a weak internal pull-up. A single control bit, RDPU (PORTE<7>), can turn on all the pull-ups. This is performed by setting RDPU. The
weak pull-up is automatically turned off when the port pin is configured as a digital output or as one of the
other multiplexed peripherals. The pull-ups are disabled on a Power-on Reset. The PORTE register is shown in Section 10.5 "PORTE, TRISE and LATE Registers"
yazıya binaen, türlü türlü register ayarlarını denediğim halde başaramadığım PortD'nin pull-up'ını kullanabilen olduysa beni aydınlatabilir mi?
Yaptığım register ayarları şö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 = 0xFF;
trisE = 0xFF;
portD = 0x00;
portE = 0x00;
Teşekkürler.
hızlıca port b pull up kullanma şansınız yok mu
B portunda INT0,INT1 VE INT2 kesmelerini kullanmak istediğimden bu yolu zorluyorum. Kesmeler ile pull-up aynı anda yürümüyor, pull-up pinlerini ayırabilseydik..
biraz baktımda sizin pullup ayarlarınızdan önce şuna benzer bir işlem yapmanız gerekebilir. Kendi kodlarınıza göre deneyiniz.
setup_psp(PSP_DISABLED);
setup_ccp1(CCP_OFF);
Merhabalar jrcapa hocam;
Alıntı yapılan: jrcapa - 29 Mayıs 2015, 23:39:21
Yaptığım register ayarları şö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 = 0xFF;
trisE = 0xFF;
portD = 0x00;
portE = 0x00;
RDPU_bit=1; ile Dahili pull-up aktif
trisD=0xFF ile tüm D portunu giriş olarak ayarlıyorsunuz.
fakat portD=0x00 ile D portu çıkışına lojik 0 değeri yazmış olmuyor musunuz ?
D portu için şu şekilde dener misiniz ?
ADCON1 |= 0x0F; // Hepsi digital
CMCON |= 7; // Comparator pasif
CCP1CON=0x00; // ECCP pasif
SPPCON=0x00; //SSP pasif
trisD = 0xFF;
RDPU_bit=1; //porte|=0x80; --->> portD pullup AKTİF
pull up ı kullanamadığına nasıl kanaat getirdin? data sheet te weak pull up diye yazar, bazen yeterli gelmiyor, mecburen 4k7 veya 10k atmak gerekiyor?
Alıntı yapılan: esensoy - 30 Mayıs 2015, 12:30:58
pull up ı kullanamadığına nasıl kanaat getirdin? data sheet te weak pull up diye yazar, bazen yeterli gelmiyor, mecburen 4k7 veya 10k atmak gerekiyor?
Simulasyonda gözlemliyorum, gerçekte bakmadım. Portb için de weak pull up yazılıyor ama simulasyonda görünüyor. Bilemiyorum portb'den farkı var mı.
pull up i görünce portD dediğinizi hiç görmedim,
doğrulamak için datasheet e de baktım, portD de pull up yok, B de var,
Sayfa 18
PORTB is a bidirectional I/O port. PORTB can be software
programmed for internal weak pull-ups on all inputs.
Sayfa 20
PORTD is a bidirectional I/O port or a Streaming
Parallel Port (SPP). These pins have TTL input buffers
when the SPP module is enabl
konuyu açan şu an ki hali hakkında bilgi verse belki halledildi konu kapanacak.
Şöyle bir deneme yaptım;
PORTE Registerinin 7. bitini (RDPU) 1 yaptım. (PORTE.RDPU=1;)
PORTD'nin ilk 2 pinini giriş diğerlerini çıkış olarak yönlendirdim. (TRISD=0x03;)
PORTD'yi 0 yaptım (PORTD=0;)
PORTD'nin pinlerini ölçtüm. RD0 ve RD1'de 4.80 V diğer pinlerde 0V okudum.
Yani sonuç olarak PORTD'de dahili Pull-Up kullanılabiliyormuş. Bunu da öğrenmiş olduk.
Alıntı yapılan: esensoy - 30 Mayıs 2015, 19:06:07
pull up i görünce portD dediğinizi hiç görmedim,
doğrulamak için datasheet e de baktım, portD de pull up yok, B de var
Esensoy Hocam syf. 120 de aşağıdaki ifadeler
[IMG]http://i59.tinypic.com/2gtcfpd.png[/img]
Alıntı yapılan: selimkoc - 30 Mayıs 2015, 20:59:16
PORTD'nin ilk 2 pinini giriş diğerlerini çıkış olarak yönlendirdim. (TRISD=0x03;)
PORTD'yi 0 yaptım (PORTD=0;)
PORTD'nin pinlerini ölçtüm. RD0 ve RD1'de 4.80 V diğer pinlerde 0V okudum.
Selimkoc Hocam PORTD'yi neden 0 yapıyoruz ?
PortD de için bakmak lazım ama geçen gün gözüme şu linkdeki ifade çarptı.
http://www.microchip.com/wwwproducts/Devices.aspx?product=PIC18F4550 (http://www.microchip.com/wwwproducts/Devices.aspx?product=PIC18F4550)
Solda özellikler kısmında İnternal pull up resistor yazıyor ama D+, D- için
Gerçekten de 120. sayfaya bakınca var olduğu görülüyor, ama 18. sayfadaki tabloda bahsetmemişler, unutmuşlar belki,
Neyse simulasyondan ziyade gerçekte bakmak lazım diye düşünüyorum,
Baran D+ ve D- deki pulluplar usb device olarak çalıştırdığında hızı belirleyen 1K5 dirençleri ifade ediyor,
Alıntı YapPORTD'yi neden 0 yapıyoruz
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.
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.
18 serisinde pin i çıkış yaptıysanız pinde portx i değil latxin değerini görürsünüz,
girişler için de , şimdi deneme şansım yok ama, diyelim ki B0 ı giriş yaptık, 4k7 ile de +vcc ye bağladık,
portB = 0x00 desek çıkışı 0 yapar mı ki? bana yapmaz gibi geliyor,
yani portb ye değer atamak pek mantıklı gelmedi bana,
Ö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/ (https://elektrokod.wordpress.com/2014/09/10/usb-hid-bootloader-pic18f4550-deney-karti/)
Yanlış ölçümüşsünüz demedim, latb yi ölçmüşsünüzdür dedim,
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 ?
PORTD'nin ilk 4 biti giriş diğerleri çıkış olarak ayarlanmış ve girişler Pull-Up yapılmış.
Kodlar doğru.
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:
(http://i.hizliresim.com/JYZ5PW.jpg)
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.
}
}
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 ?
Eskiden bu başlıkta (https://www.picproje.org/index.php/topic,10891.msg146758.html#msg146758) konuşulmuştu. Özetle, yazarken LAT'a yazmak, okurken PORT'tan okumak gerekiyor.
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);
}
Merhabalar;
Alıntı yapılan: Tagli - 04 Haziran 2015, 08:47:56
Eskiden bu başlıkta (https://www.picproje.org/index.php/topic,10891.msg146758.html#msg146758) 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 ?
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.