pcbway

ADRESH ve ADRESL Nasıl okunur.

Başlatan blacklogic, 24 Şubat 2013, 22:22:45

blacklogic

Merhaba arkadaşlar foruma yeni kayıt oldum ve bir konu hakkında bilgiye ihtiyacım var. Ben adc ile ADRESH ve ADRESL bilgiyi alıyorum fakat bu bilgiyi lcd ekranında 16 hane şeklinde yazdıramıyorum misal: 0000001101010101 şeklinde bu ADRESH ve ADRESL  nasıl okuyacağım ? Kullandığım chip 16f877a
Şimdiden teşekkürler herkese kolay gelsin.

yazici67

Anladığım kadarıyla sorunuz ADC ile ilgili değil. Siz bu sonuçtaki tüm bitleri teker teker basmak istiyorsunuz.
Eğer böyleyse hangi dil ile program yazdığınızı söylemeniz gerekir. Denetleyici görünüşe göre PIC serisi.
Hangi derleyiciyi kullanıyorsunuz? Assembly, PicBasic, CCS C vs...

blacklogic

Hi tech kullanıyorum mplabda yazıyorum. Evet hocam istediğim aynen sizin dediğiniz gibi.

yazici67

Peki bu bit çıktısını nereye yazacaksınız? Lcd anlamında sormuyorum. Hazır bir string/char array adı var mı? Yoksa mantığı anlatsam yeter mi?

blacklogic

Mantığını anlatmanız daha yararlı olur. Ben bunu 2x16 lcdye yazacağım bu işlem için bunu çevirmeme mi gerek?

yazici67

Mantığı basit. ADRESL değişkenini ve ADRESH << 8 değerini ekleyerek 16-bit bir değişkene atacaksınız.
Eğer 16-bit bir MCU kullanıyorsanız 16-bit değişkenle yapın. Eğer 8-bit benzeri bir MCU ile uğraşıyorsanız vereceğim yöntemi iki 8-bitlik değişken ile uygulayıp uç uca ekleyin.
2\'lik tabana dönüştürme işlemi basittir. Her biti tek tek alıp, 1 ise metne \'1\', 0 ise \'0\' ekleyeceksiniz. Her eklemede bellek işaretçisini bir arttıracaksınız. Bitleri teker teker alma işlemi genellikle kaydır & and uygula şeklinde yapılır. Şöyle bir örnek verebiliriz:
void short2binary(char *buffer, unsigned short num)
{
char *p = buffer;
unsigned short n = num; /*  Uzerinde islem yapacagimiz degisken  */
unsigned char index, current_bit;

for  (index = 0; index < 16; index++)
{
current_bit = num & 0x1;
num = num >> 1;
/*  Satir ici if denetimi (bkz. Ternary Operator)  */
/*  HiTech C Little Endian kullandığından ilk gelen bit sona yazilacak  */
p[15 - index] = (current_bit) ? \'1\' : \'0\';
}

p[16] = \'\\0\'; // string sonlandirma karakteri
}
Bu fonksiyona buffer olarak en az 17 karakterlik ayırılmış bir dizi/işaretçi verilmeli. 16 tane 0 veya 1 artı bir tane sonlandırma karakteri \'\\0\' olacak. num ise 16-bit işaretsiz tamsayı olarak alınıyor. İşaretli olsa da önemli değil. Aynı sonucu alırsınız. Denemek isterseniz bilgisayar üzerinde çalışan basit bir uygulama:
#include <stdio.h>

void short2binary(char *buffer, unsigned short num);

int main(int argc, char **argv)
{
signed short number;
char buff[17]; // 16 0|1 ve sonlandirma karakteri

printf(\"16-bit degeri girin:\");
scanf(\"%d\", &number);
short2binary(buff, number);
printf(\"Ikilik karsiligi: %s\", buff);
return 0;
}

void short2binary(char *buffer, unsigned short num)
{
char *p = buffer;
unsigned short n = num; /*  Uzerinde islem yapacagimiz degisken  */
unsigned char index, current_bit;

for  (index = 0; index < 16; index++)
{
current_bit = num & 0x1;
num = num >> 1;
/*  Satir ici if denetimi (bkz. Ternary Operator)  */
/*  HiTech C Little Endian kullandığından ilk gelen bit sona yazilacak  */
p[15 - index] = (current_bit) ? \'1\' : \'0\';
}

p[16] = \'\\0\'; // string sonlandirma karakteri
}
Programı gcc veya başka bir C derleyici ile derleyip çalıştırın. Değer olarak bir sayı girin ve <ENTER> tıkladığınızda girdiğiniz sayının binary karşılığını göreceksiniz.
İki adet 8-bitlik sayıdan nasıl 16-bitlik bir sayı yapılacağını bilmiyorsanız o da kolay.
Little Endian için;
unsigned short num = (ADRESH << 8) | ADRESL;
Big Endigan için;
unsigned short num = (ADRESL << 8) | ADRESH;
HiTech C sanırım Big-Endian bayt dizilimi kullanıyordu. O halde ikinci verdiğimi kullanacaksınız. Eğer değerler anlamsız veya yanlış görünürse little-endian ile deneyin.

blacklogic

Çok iyi bir anlatım oldu zahmetiniz için teşekkür ederim.

suhaarikan

Merhabalar bu konu üzerinden baya zaman geçmiş ama yine de sormak istedim.

ADC kullanmının hakkında fikir sahibiyim. Fakat araştırmalarıma rağmen ADRESH ile ADRESL register içerisindeki bit değerlerinin nasıl elde edildiğini bulamadım? ADCON1 registerindaki  ADFM bitini 1 yaparak sağa yaslı şekilde yaptığımız zaman; örneğin; volt diye int değişkenimiz olsun, 
volt=(int)((ADRESH*256+ADRESL) şeklinde bir komut karşıma çıkıyo bu volt değeri nedir ifade olarak ? nasıl bir değerdir? ve ADRESH 'ın iki bitini kulanıyoruz 00 01 10 11 ihtimalleri var bunu 256 ile nasıl çarpıyo ne elde ediliyo anlayamadım.
Mesala ADC cevrim sonunda 00000010 00110011 şeklinde ADRESH ve ADRESL yazıldı bunu değişkene nasıl algılatıyor.
HI-TECH C derleyicisi kullanıyorum.
yardımcı olabilirseniz çok sevinirim Kolay  gelsin..

toyer

14 Ağustos 2016, 23:35:23 #8 Son düzenlenme: 14 Ağustos 2016, 23:43:57 toyer
o bitleri micro işlemci dolduruyor. nasıl elde edildiğinden kastınız bumudur bilemiyorum tabi.
veya kast ettiğiniz diyelim 3.6 volt u micro işlemcinin nasıl bitlere çevirdiğimi ? 0 volt 00000000 00000000 oluyor 5 voltta 10 bitlik bir adc ise adc niz  00000011 11111111  oluyor.  ( adc ref eksi ve ref artı da 0 ve 5 volt varsa anlayacagınız 5 volt farki 1024 e bölüyor.)
3.6 voltta   (3.6 x 1024)5 = 737 oluyor.  bunuda da bit olarak  00000010 11100001 olarak yazıyor.

sizde adresh ve adresl registerlarını okuyorsunuz.

yukarıda anlatılmış, o registerlardaki bitleri istediğiniz değişkene nasıl aktardıgınız.