Atmega328P nin portlarını giriş olarak yönlendiremiyorum

Başlatan tekniker_murat, 14 Mayıs 2022, 22:15:00

tekniker_murat

Selamun aleyküm değerli abiler... Atmega ile yeni uğraşmaya başladım daha dün ilk deneme programını yazdım.

Şimdi sorun şu : Portu çıkış olarak yönlendirip led bağlayıp yak söndür dediğim zaman sorun olmuyor. Fakat bir portun bir pinini giriş olarak yönlendirip bir pull-up direnci bağlayıp bu pine de buton bağladığım zaman yazılım kesinlikle o girişi test edip programı çalıştırmıyor...
Bir yerlerde bir şeyleri atlıyorum ama saatlerce uğraştım bir sürü kaynak ve kod inceledim cevabını bulamadım.

Yazdığım program ise aynen şöyle :

Acaba if komutu yüzünden olabilir mi yanlış mı kullanıyorum ?

         if(portc.b5==1){
         portb.b1=1;
         }


void main() {

MCUCR.PUD   =   1 ; /*
PUD (Pull-Up Disable) Bu bit "1" yapıldığında tüm giriş ve çıkış portlarındaki dahili pull-up
dirençleri devre dışı kalır. DDxn ve PORTxn yazmaçlarında pull-up tanımlansa dahi bu
işlem gerçekleşir. Pull-Up dirençlerini devre dışı bırakmayı kaldırmak için bu bit tekrar sıfır
yapılır.*/
//******************************************************************************************************
ADCSRA.ADEN=0; //Bit 7 – ADEN : ADC Faal Bu biti HIGH yapmak ADC'yi faal hale getirir. Sıfır yapınca ADC
//kapatılır. ADC'yi dönüşüm aşamasında kapatmak dönüştürmeyi sonlandırır.
//******************************************************************************************************
ACSR.ACD=1; //ACSR – Analog Karşılaştırıcı Denetim ve Durum Yazmacı
//Bu yazmaç analog karşılaştırıcı hakkında bütün işlemleri yapacağımız yazmaçtır.
//Bit 7 – ACD : Analog Karşılaştırıcı Devre Dışı
//Bu bit bir (1) yapıldığında analog karşılaştırıcıya giden besleme devre dışı bırakılır. Bu bit
//istenilen her zaman devre dışı bırakmak için kullanılabilir. Güç tasarrufu için aklımızda
//bulundurmakta fayda vardır. ACD biti değiştirilirken ACIE biti ile kesmenin de devre dışı
//bırakılması gereklidir.
//********************************************************************************************
didr1.ain0d=0; //Dijital Girişi Devre Dışı Bırakma Yazmacı Bu yazmaçtaki AIN1D ve AIN0D bitleri bir yapılırsa bu ayaklardaki dijital giriş devre dışı
//bırakılır. Böylelikle analog sinyal uygulanan ayaklarda dijital giriş tamponu devre dışı
//bırakılarak güç tasarrufu sağlanır.
didr1.ain1d=0;
/////////////////////////////////////////////////////////////////////////
//***********************************************************************************************************
//Bu yazmaca yazılan HIGH bitleri karşılık gelen ADC kanalındaki dijital girişi devre dışı bırakır.
DIDR0.ADC0D=0;
DIDR0.ADC1D=0;
DIDR0.ADC2D=0;
DIDR0.ADC3D=0;
DIDR0.ADC4D=0;
DIDR0.ADC5D=0;
//**********************************************************************************************
mcucr.pud=1;//PUD (Pull-Up Disable) Bu bit "1" yapıldığında tüm giriş ve çıkış portlarındaki dahili pull-up
//dirençleri devre dışı kalır. DDxn ve PORTxn yazmaçlarında pull-up tanımlansa dahi bu
//işlem gerçekleşir. Pull-Up dirençlerini devre dışı bırakmayı kaldırmak için bu bit tekrar sıfır
//yapılır.
//*************************************************************************************************
//                         DDRx REGİSTERİ BİTLERİ 0 OLURSA GİRİŞ 1 OLURSA ÇIKIŞ OLUR.
ddrb        =   0XFF;
DDRC        =   0X00;
DDRD        =   0XFF;
PORTB       =   0X00;
//*******************************************************
while(1){
portb.b0=1;
delay_ms(50);
portb.b0=0;
delay_ms(50);

         if(portc.b5==1){
         portb.b1=1;
         }

}
}


Zamanlamada sorun yaşamıştım onu da bir dökümanda okudum Burada da kalın yazılar ile yazacağım belki bir bilmeyenin işine yarar...

AVR denetleyicilerde config ayarları pic denetleyicilerde olduğu gibi editör programında kodlar ile yazılmıyormuş saatlerce kod ile yazmak için datasheetinde okumadığım sayfa bırakmadım ama olmuyor yükleme yapıyorken yükleme programı üzerinden config ayarları yapmamız gerekiyormuş. Özellikle osilatör seçim işlemi için datasheet üzerinde epeyce kafa yorduktan sonra görebildim.
[email]murat.yagci.1984@gmail.com[/email]

pwr_24

Ben AVR MCU'ları atmel studio üzerinden gcc-avr compiler ile çalışıyorum. Pin durumu için PINx registeri kullanmanız gerekiyor.Örneğin PORTB5 pull up olsun buton bağlayın

if (!PINB&(1<<PORTB5))  //Eğer butona basılmışşsa anlamına geliyor.

tekniker_murat

Abi denedim ama if (!PINB&(1<<PORTB5))  komutu işe yaramadı.

Sanırım sorun komutta değil bir yerde register eksik yada hata yapıyorum...

Ama onu tespit edemedim.
[email]murat.yagci.1984@gmail.com[/email]

tekniker_murat

Evet abiler işte buna azmin bir tane daha zaferi diyebiliriz :D

Olayı çözdüm olay yazım şekli ile alakalıymış...

             if(pinc.B5==1){
             
             portb.b1=1;
             }

Şeklinde yazdım istediğim işlemi yaptı kendileri...
[email]murat.yagci.1984@gmail.com[/email]

pwr_24

Alıntı yapılan: tekniker_murat - 15 Mayıs 2022, 00:14:16Evet abiler işte buna azmin bir tane daha zaferi diyebiliriz :D

Olayı çözdüm olay yazım şekli ile alakalıymış...

             if(pinc.B5==1){
             
             portb.b1=1;
             }

Şeklinde yazdım istediğim işlemi yaptı kendileri...

Hangi IDE ve derleyici kullanıyorsunuz. Genelde avr-gcc compiler ve atmel studio kullanılıyor. Bencede en başarılısı bunlar..

tekniker_murat

Alıntı yapılan: pwr_24 - 15 Mayıs 2022, 13:56:38Hangi IDE ve derleyici kullanıyorsunuz. Genelde avr-gcc compiler ve atmel studio kullanılıyor. Bencede en başarılısı bunlar..

Abi MikroC derleyicisini kullanıyorum. Neden mikroC ? En baştan biraz zamanında öğrenmiştim öyle çok olmasa da aşina olduğum bir arayüz ve öğrendiğim komutlar ama en güzeli de aynı komut ve aynı işlemleri kullanarak bir çok mikrodenetleyiciye program yazabilme imkanı. pic, atmel, arm vs...
[email]murat.yagci.1984@gmail.com[/email]