Pic Çıkışlarını Okutup Bilgisayara Yollamak

Başlatan ertan2002, 22 Kasım 2011, 03:57:12

ertan2002

Merhaba arkadaşlar, D portunu tamamen çıkış olarak ayarladım ve bilgisayar (usb) üzerinden bu porta bağladığım ledleri yakıp söndürüyorum. Ancak ayrı bir fonksiyon daha yazdım bu fonksiyon ile de D portunun tüm pinlerinin değerlerini çekmek istiyorum. input_d(); yi kullandım olmadı. tek değer alayım dedim başaramadım

int8 send_buffer[32]; 
send_info = input_d();
send_buffer[4] = send_info;
usb_put_packet(1,send_buffer ,64,USB_DTS_TOGGLE);


usb konf. dosytasında da report count un değeri 64 olarak ayarlı..
yapmak istediğim şu.. send_buffer isimli diziye o anki pin değerlerini (logic-1 yada logic-0) olarak atmak.. ancak input_d() sanırım port input olarak ayarlanmışsa giriş değeri okuyor? ancak çıkış olarak ayarlanmış pinlerin değerini nasıl okuyacağım.
elime 128 yada 64 ... gibi bir sayı geçmesini istiyorum yada 1011011 gibi ..

bu tarz bir şeyi hangi kod ile yapabilrim?

Not: kullandığım dil CCS C

teşekkürler

fatihinanc

CCS C hakkında pek bilgim yok ama portun o anki değerini okumanız gerekiyor. input_d(); fonksiyonu dışarıdan girilen durumu okumak için tasarlanmış . Yani pinleri mutlaka giriş olarak ayarlamanız gerekiyor bu fonksiyonu kullanmak için.

İhtiyacınız olan şey şu tarz bir kodlama galiba;

send_info = output_d();
veya
send_info = PORTD; //Hi-Tech

yani mantık olarak şunu demek istiyorum;
PORTD'nin o anki değerini bir değişkene yükle.
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

JKramer

Mutlaka giriş olarak olarak ayarlanması gerekmiyor; sadece #use fast_io direktifi ile giriş-çıkışların otomatik değil, kullanıcı tarafından belirleneceğinin belirtilmesi gerekiyor. fatihinanc'ın dediği şekilde kullanmak istiyorsanız, #byte PORTD=0x08 tanımlaması (D portunun adresi, kullandığınız çipe göre değişebilir) yapmanız gerekiyor. Sonuçta iki şekilde de üretilen kod aynı:
....................    	send_info=input_d(); 
007E:  MOVF   PORTD,W
007F:  MOVWF  send_info
....................    	send_info=PORTD; 
0080:  MOVF   PORTD,W
0081:  MOVWF  send_info

ertan2002

cevaplar için teşekkürler, soruda zaten input olarak kullanmadığımı o yüzden input_d(); nin işe yaramayacağını söyledim..

@fatih, mantığını anladım ancak ccs c yi ben de çok iyi bilmiyorum. output_d(pin); şeklinde fonksiyonu var bu da o pini ayarlıyor, her hangi bir değer döndermiyor.

@jkramer, pic 18f4550 kullanıyorum ve #use fast_io(d) kullandım. Söylediklerinizi tam anlayamadım. input_d olmuyorsa onun yerine ne kullanmam gerekiyor? ayrıca fast_io da kullanmaz isem

teşekkürler

JKramer

#use fast_io(d) yazdıysanız input_d() ile olması gerekiyor. Kullanmazsanız #byte PORTD=0x83 yazıp ikinci şekilde kullanabilirsiniz.

ertan2002

input d ile herhangi bir veri alamıyorum, boş dönüyor. Acaba input_d ile dönen değerleri nasıl okuyabilrim, bir nevi debug işlemi? yada alternatif olarak ne yapmalıyım?

teşekkürler

JKramer

input_d() ile dönen değerin boş(?) olduğunu nasıl anlıyorsunuz? Bence siz usb,vs. kısımları çıkarıp sadece bununla ilgili kısa bir kod yazın, bilgisayarda (isis,vs programla) simule ediyorsanız orada, gerçek devre üzerinde deniyorsanız seri portla, lcd'yle ya da sekiz tane led'le kontrol edebilirsiniz. Dediği gibi, sorununuz çok büyük ihtimalle kodun başka kısmından kaynaklanıyor.

ertan2002

teşekkürler hocam ilgin için olayı çözdüm.. sanrım bir yerde küçük hata yapmışım.. iki türlü olarak çözdüm

yani tek tek pinleri okudum yada input ile tüm pinleri okudum. bana byte türünden veri yolladı.

         send_buffer[0]= input(PIN_D0);
         send_buffer[1]= input(PIN_D1);
         send_buffer[2]= input(PIN_D3);;
         send_buffer[3]= input(PIN_D4); //input_d()
         send_buffer[4]= input(PIN_D5);
         send_buffer[5]= input(PIN_D6);
         send_buffer[6]= input_d();
         
        usb_put_packet(1,send_buffer ,64,USB_DTS_TOGGLE);


send buffer in ilk 6 verisi pinlerin çıkışını 1 yada 0 olarak veriyor. 6. indexli olan ise bir byte yolluyor. mesela 15 gibi..

teşekkürler tekrar ilgin için

Karahan

İlginç bir kullanım şekli...fakat send_buffer[0] dan sonraki her değer sizi yanıltacaktır, yani siz sadece 1 yada 0 olarak olaya  bakıyorsunuz ;1Byte lık alana 1 bit yazıyorsunuz; işinizi görüyorsa sorun yok

ertan2002

teşekkürler cevap için evet bit-byte ayrmının farkındayım.. zaten  input(PIN_D0); şöyle bir kullanım yapmayacağım...  input_d(); kafii diğerlerini, bu tarz sorunla karşılan kişiler için örnek olarak alternatif bir yol diye yazdım