PIC18F2525 port ve trıs adresleri hakkına yardım

Başlatan ghistmanzero, 14 Haziran 2018, 16:27:01

ghistmanzero

merhabalar,
DTH11 ile bir çalışma yapıyorum. CCS C de baya bir örnek var. Kodda malum tek pinden veri okuma ve kontrol işlemleri yapılıyor. Burada tris ayarlamaları ve input/output işlemleri için  şöyle bir tanımlama yapılmış
#BIT Data_Pin = 0x07.4                      // Pin mapped to PORTD.0
#BIT Data_Pin_Direction = 0x87.4            // Pin direction mapped to TRISD.0
buradaki değerler de projede kullanılmış olan 16f877a nın datasheetindeki şu tabloda belirtilmiş zaten


Ben 16f877a kullandığım sürece sorun yok. istediğim pine yönlendirebiliyorum çünkü bu tablo gereken herşeyi vermiş oluyor. Ama ben bu projeyi pic18f2525 veya pic18f2520 gibi bir pic ile yapmaya çalışıyorum.Burada belirttiğim  port ve tris adreslerini pic182525 ve pic18f2520 için de bulamaya çalıştım datasheetlerden.
şöyle bir tabloda görebildim ancak.



buradaki değerleri yazınca maalesef sonuc alamadım.Kod derlemede hata vermese de sistem çalışmadı.
Yanlış adresleri mi girdim acaba ? c portunun 4. pine bağladım sensrörü. 877a de çalışırken bunda çalışmadı.
Sizce sorun nerede ? bu adres atamaları 18 serisinde farklı mı ?
Bununla beraber bir de lat olayı giriyor işin içine. CCS C bu kısımda yetersiz mi ?
ne yapmamı tavsiye edersiniz acaba ?

Teşekkürler


ghistmanzero

#2
Alıntı yapılan: pkelle - 14 Haziran 2018, 23:19:20https://www.picproje.org/index.php/topic,66618.msg520207.html#msg520207

çok teşekkürler :) yalnız şu resimde diye bahsedilen resim görünmüyor. Ben yine ordan kendim konrtol ettim. TRISC için F94 ve PORTC İÇİN F82 demiş ama burada ifade byte uzunluğunda değil.daha fazla. bunu 0xf94.4( 4. pin için tris registerı) ve 0xf82 (4. bit için portc registerı ) şeklinde yazınca hata vermeden derliyor. ama çalışmada hata veriyor. koddaki hata  bloklarından birine giriyor ve sensorden veri alınamıyor diyor. koda baktığımda
if(CheckSum == ((RH_Byte1 + RH_Byte2 + T_Byte1 + T_Byte2) & 0xFF))
  bu sorgunun false döndüğünü gördüm.yani gelen veriyi toplam kontrolünden geçirdiğinde datanın gelirken bpzulduğunu söylüyor.onun da üstüne çıkanca bu değiştirdiğim  f94 ve f82 adreslerindeki durumları sorgulayan iflerin false döndüğünü gördüm. kısacası bu şekilde yazınca doğru şekilde çalışmadı :/

doğru registerları mı yazmadım yoksa 0xf94 ve 0xf82 ifadesi yanlış mı ?

Z80



Sözkonusu işlemleri yaptığında register adresleriyle uğraşmıyorsun. Doğrudan register adlarıyla işlem yapıyorsun. TRISA, PORTC, LATD, ANSEL v.s. gibi.


TRISA    = 0b11100111;                   

#define BUTON PIN_A6                      // Giriş tanımlamak için

#bit LED = PORTA.4                  // Çıkış tanımlamak için
#bit MOTOR = LATD.5                    // Çıkış tanımlamak için

18F serisinde çıkış için "PORT" değil "LAT" kullanmalısın.

ghistmanzero

#4
Alıntı yapılan: pkelle - 15 Haziran 2018, 13:37:24

Sözkonusu işlemleri yaptığında register adresleriyle uğraşmıyorsun. Doğrudan register adlarıyla işlem yapıyorsun. TRISA, PORTC, LATD, ANSEL v.s. gibi.


TRISA    = 0b11100111;                   

#define BUTON PIN_A6                      // Giriş tanımlamak için

#bit LED = PORTA.4                  // Çıkış tanımlamak için
#bit MOTOR = LATD.5                    // Çıkış tanımlamak için

18F serisinde çıkış için "PORT" değil "LAT" kullanmalısın.

Teşekkürler. Bahsettiğiniz gibi bir header dosyası oluşturup ekledim. Artık
#bit  Data_Pin_input = PORTC.4  //   pinin low veya high olduğunu okumak için              
#bit Data_Pin_output = LATC.4 //  pini low veya high yapmak için
#bit  Data_Pin_Direction = TRISC.4 // pinin input veya output modunu belirlemek için
şeklinde tanımlıyorum. Adreslere baktım .Doğru adresleri girmişim ama maalesef kod checkresponse false dönüyor. kodu da ekliyorum aşağıya
short check_response(){
  delay_us(40);
  if(!Data_Pin_input){                    // Read and test if connection pin is low
    delay_us(80);
    if(Data_Pin_input){                    // Read and test if connection pin is high
      delay_us(50);
      return 1;}
    }
}
unsigned int8 Read_Data(){
  unsigned int8 i, k, _data = 0;    // k is used to count 1 bit reading duration
  if(Time_out)
    break;
  for(i = 0; i < 8; i++){
    k = 0;
    while(!Data_Pin_input){                          // Wait until pin goes high
      k++;
      if (k > 100) {Time_out = 1; break;}
      delay_us(1);}
    delay_us(30);
    if(!Data_Pin_input)
      bit_clear(_data, (7 - i));              // Clear bit (7 - i)
    else{
      bit_set(_data, (7 - i));                // Set bit (7 - i)
      while(Data_Pin_input){                        // Wait until pin goes low
      k++;
      if (k > 100) {Time_out = 1; break;}
      delay_us(1);}
    }
  }
  return _data;
}

kod içinde portc, trisc ve latc nin kullanıldığı tüm yerler bunlar.
Data_Pin_input değerinin sorgusu sıkıntı çıkarıyor. burada input için portc.4 kullanırken o pini low veya high yapmak için ise latc.4 kullandım. kullanımı bu şekilde ,değil mi ?

18f reference manuele  de baktım ama biraz fazla uğraşınca karıştı herşey.

ghistmanzero

18F4550 ile deneyince lat kullanmadan direk port ile bile çalıştı ama 18f2525 ile çalışmıyor.

Z80

#6
Giriş tanımlamalarını yanlış yapmışsın.

Böyle yaparsan hata vermeden derlenir ama düzgün çalışmaz.
YANLIŞ : #bit  Data_Pin_input = PORTC.4  //  pinin low veya high olduğunu okumak için 

Doğrusu bu şekilde olacak:
#define  Data_Pin_input  PIN_C4

Çıkışlarda "PORT" kullanırsan da çalışır ama doğrusu "LAT" kullanmaktır.

ghistmanzero

Alıntı yapılan: pkelle - 15 Haziran 2018, 21:00:54Giriş tanımlamalarını yanlış yapmışsın.

Böyle yaparsan hata vermeden derlenir ama düzgün çalışmaz.
YANLIŞ : #bit  Data_Pin_input = PORTC.4  //  pinin low veya high olduğunu okumak için 

Doğrusu bu şekilde olacak:
#define  Data_Pin_input  PINC_4

Çıkışlarda "PORT" kullanırsan da çalışır ama doğrusu "LAT" kullanmaktır.

Teşekkürler, hemen deniycem ama daha öncesinde direk isim yazmadan adresi yazarak da yapmaya çalıştım ama olmadı.

ghistmanzero

Alıntı yapılan: pkelle - 15 Haziran 2018, 21:00:54Giriş tanımlamalarını yanlış yapmışsın.

Böyle yaparsan hata vermeden derlenir ama düzgün çalışmaz.
YANLIŞ : #bit  Data_Pin_input = PORTC.4  //  pinin low veya high olduğunu okumak için 

Doğrusu bu şekilde olacak:
#define  Data_Pin_input  PINC_4

Çıkışlarda "PORT" kullanırsan da çalışır ama doğrusu "LAT" kullanmaktır.
yalnız şuan jeton düştü. PINC_4 hiç çalışmaz. bi kere böyle bir tanımlama yok. PIN_C4 tanımlaması var. o da direk adres belirtmiyor. hani ben bunu if(PIN_C4) şeklinde sorgulatamam.

Z80

#9
İlk mesajımdaki doğru, ikincideki altçizgiyi yanlış yere koyuşum.
"#define BUTON PIN_A6"

Kodu yanlış yazmışsın. Girişleri doğrudan okuyamazsın. input kullanmalısın.
Doğrusu bu :  if (input(BUTON)) LED = !LED;

ghistmanzero

Alıntı yapılan: pkelle - 15 Haziran 2018, 21:31:49İlk mesajımdaki doğru, ikincideki altçizgiyi yanlış yere koyuşum.
"#define BUTON PIN_A6"

Kodu yanlış yazmışsın. Girişleri doğrudan okuyamazsın. input kullanmalısın.
Doğrusu bu :  if (input(BUTON)) LED = !LED;
hocam direk okuyamadığımı söylemek istedim ben de.Adres değerini işaret etmiyor o hani. Arkada bir sayısal değere işaret ediyor. Bu ccs c ye ait bir tanımlama. gösterdiğiniz şekilde de yaptım şimdi olmadı.yine hata vermemesine rağmen  çalışmadı.
input(PIN_C4) şeklide okutup atamada da yerine göre output_low(PIN_C4) veya output_high(PIN_C4) şeklindde yazdım. hani tamm bunlar normal okuma ve çıkış sağlama işlemleri ama benim bu uygulamda direk adresler üzerinden gitmem lazım ki tek pini gerektiğinde çıkış gerektiğinde giriş yapıp aynı zaman da durumunu kontrol edeyim.

ghistmanzero

@pkelle  sizin de baya zamanınızı aldım. kusura bakmayın. Dediğim gibi 18f4550 ile çalıştı ama bunda çalışmadı.bu pice özel bir sıkıntı mı var anlamadım. şimdilik daha fazla zorlamayıp başka bir pic ile deneyeyim diyorum. Cevaplarınız ve yardımınız için çok teşekkürler :)

Z80

Ek bilgi olarak yazayım o zaman,
output_low(PIN_C4) olarak yazdığında derleyici önce ilgili pinin TRIS ayarlarını değiştirip output yapıyor, sonra o biti reset ediyor. Bu da hem zaman hem de byte kaybına sebep oluyor.

#use fast_io(ALL) (bütün registerler için) bunu programın başına ekliyorsun ve TRIS ayarlarını  TRISB = 0b00000010; şeklinde kendin yapıyorsun.

Çıkışları da #bit tanımlamasıyla yapıyorsun ve LED = 1; gibi kullanıyorsun.

Bir pinin durumunu ikidebir giriş-çıkış olarak değiştiriyorsan o pinin girişindeki flip-flop bir öncekinden kalan datayı saklıyor. TRIS'le durum değiştirdikten sonra 2 kere okumalısın ki girişteki data içeri girsin. Çıkışta da aynı şekilde.

Umarım işine yarar.
 

ghistmanzero

Alıntı yapılan: pkelle - 15 Haziran 2018, 22:13:14Ek bilgi olarak yazayım o zaman,
output_low(PIN_C4) olarak yazdığında derleyici önce ilgili pinin TRIS ayarlarını değiştirip output yapıyor, sonra o biti reset ediyor. Bu da hem zaman hem de byte kaybına sebep oluyor.

#use fast_io(ALL) (bütün registerler için) bunu programın başına ekliyorsun ve TRIS ayarlarını  TRISB = 0b00000010; şeklinde kendin yapıyorsun.

Çıkışları da #bit tanımlamasıyla yapıyorsun ve LED = 1; gibi kullanıyorsun.

Bir pinin durumunu ikidebir giriş-çıkış olarak değiştiriyorsan o pinin girişindeki flip-flop bir öncekinden kalan datayı saklıyor. TRIS'le durum değiştirdikten sonra 2 kere okumalısın ki girişteki data içeri girsin. Çıkışta da aynı şekilde.

Umarım işine yarar.
 

Tüm bilgiler için cok teşekkürler hocam.