Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

XC8 Başlangıç

Başlatan Mucit23, 04 Mayıs 2014, 01:08:52

OxfordBlue

#30
merhabalar

(data>>8 )
(veri<<4)

Bu kodların yaptıkları işi bana açıklayabilirmisiniz?

Gökhan BEKEN

#31
örnek:
unsigned char data=0xFF;
unsigned char sonuc=data>>8;
//sonuc değişkeninin değeri 0 olur, çünkü bütün bitleri sağa kaymış olduğundan yerlerine 0 gelir.

örnek:
unsigned char veri=0x0F;
unsigned char sonuc=veri<<4;
//sonuc değişkeninin değeri 0xF0 olur, çünkü sağdaki bitler 4 kere sola kaymıştır ve yerlerine 0 gelmiştir.


örnek:
unsigned char sayi=0xAB;
unsigned char sonuc=sayi<<0;
unsigned char sonuc2=sayi>>0;
//sonuc  ve sonuc2 değişkeninin değeri 0xAB olur, çünkü hiç bir kaydırma yapılmamış olur.
Özel mesaj okumuyorum, lütfen göndermeyin.

OxfordBlue

Hocam gayet açıklayıcı olmuş. Peki o zaman
    ADCON2bits.ACQT2=1;//A/D Acquisition Time Select bits
    ADCON2bits.ACQT1=1;
    ADCON2bits.ACQT0=1;
    ADCON2bits.ADCS2=0;  //fosc/4
    ADCON2bits.ADCS1=1;
    ADCON2bits.ADCS0=0;
    ADCON2bits.ADFM=1;  //right justified

ADCON0bits.CHS3=0;  //Choose AN0
    ADCON0bits.CHS2=0;
    ADCON0bits.CHS1=0;
    ADCON0bits.CHS0=0;
    ADCON0bits.GO=1;
    while(ADCON0bits.nDONE);
    AN0_Value=AN0_Value+(ADRESH<<8)+ADRESL;

Burda ADRESH=0 olarak yapılmış gibi duruyor.
(ADRESH<<8) burayı aradan çıkarırsam 128 eksik çıkıyor değer.

Gökhan BEKEN

ADRESH verisi 8 kere sola kaydırılıyor diye 0 oluyor dememek lazım. Diğer örnekte 8 kere sola kaydırılıp aynı değişkene yazılıyordu, değişken 8 bitlik olduğu için sonuç 0 oluyordu.
Burda 8 kere kaydırılıyor ama 16 bitlik bir register'a yazılıyor olabilir ki öyle olması gerekir. AN0_Value değişkeninin(veya register'inin) kaç bitlik olduğunu bilmek lazım.

Not: Kodları code tagı içine alırsanız okunması kolay olur. Lütfen dikkat edin.
Özel mesaj okumuyorum, lütfen göndermeyin.

OxfordBlue

#34
AN0_Value 16bitlik evet. ADRESH DA 16bit şimdi sorun ortadan kalktı
teşekkürler

OxfordBlue

Basit bir tek boyutlu dizi kullanmak istiyorum 401 tane unsigned char olan içinde.

unsigned char Data[400]=0;

Data[0]=10;
Data[1]=20;

Data[2]=Data[1]-Data[0];

Şeklinde kullanabilirmiyim ?

mehmet

Alıntı yapılan: OxfordBlue - 28 Ağustos 2015, 11:50:45
Basit bir tek boyutlu dizi kullanmak istiyorum 401 tane unsigned char olan içinde.

unsigned char Data[400]=0;

Data[0]=10;
Data[1]=20;

Data[2]=Data[1]-Data[0];

Şeklinde kullanabilirmiyim ?
Yapılabilir tabbi ki...

Mesela;
c = analog_oku();
switch (Data[c])
{
     case 0:
         fonksiyon0();
         break;
     .....
     default:
         break;
}

...
...

for(a = 0; a < 100; a++)
{
    Data[a] = a;
}
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

Gökhan BEKEN

unsigned char Data[400]=0;

şeklinde tanımlama yapamazsınız.
ama şöyle olur:
unsigned char Data[400]={1,2,3,4};
Özel mesaj okumuyorum, lütfen göndermeyin.

mehmet

İlk değer atama istenirse söyle yapılabilir...
unsigned char Data[400];
...
for(a = 0; a < 400; a++)
{
     Data[a] = 0;
}
...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

OxfordBlue


OxfordBlue

#40
unsigned char A1=2;
unsigned char Z=0;

switch (Z)
{
CASE 0:
..
BREAK;
CASE 1:
....
BREAK;
CASE A1:
...
BREAK;
}

2 'yi A1 yerine kullanabilirmiyim, başka uygulamalarda buna ihtiyacım olcak.

Timucin

Merhaba;
Dizi ve Pointer'lar konusunda kendimi geliştirmeye çalışıyorum. Şöyle bir noktaya takıldım; (XC8 V1.37  -  PIC16F876A)

const unsigned char MyDizi[6] @0x0123;
const unsigned char * MyPointer;

MyPointer =  (const unsigned char *) &MyDizi;   // Burada MyPointer'in gösterdiği Adres 0x8123 ama program sorunsuz çalışıyor????


Burada MyPointer'in gösterdiği adres 0x8123 oluyor; yani derleyici kendi kendiliğine adrese 0x8000 ekliyor. Program Memory 0x8000'e çıkmadığı için program sorunsuz çalışıyor.
Halbuki aynı şey RAM için söz konusu değil

unsigned char MyDizi[6] @0x01A0;
unsigned char * MyPointer;

MyPointer =  (unsigned char *) &MyDizi;  // Burada MyPointer'in gösterdiği Adres 0x01A0 sorun yok !...


Const'daki bu durum küçük programlarda sorun yaratmıyor gibi ama komplex programlarda sorun yaratır mı? Bunu gidermenin bir yolu var mı?

Saygılarımla
Timuçin

quarko

Const olarak tanımladığınız bir pointer a öyle adres tanımlayamazsınız. Program memory de denediğiniz örnekte const u kaldırıp denerseniz veya const pointer ı tanımladığınız yerde adres ataması yaparsanız çalışacaktır.

Kolay gelsin.
"Vicdanın ziyası ulum-u diniyedir. Aklın nuru fünun-u medeniyedir. İkisinin imtizacıyla hakikat tecelli eder."

Timucin

Merhaba
Cevap için çok teşekkür ediyorum; lakin sizin söylediğiniz derleyici ERROR veriyor ve derlemiyor;
Benim yukarıdaki mesajımda verdiğim kodlar problemsiz derleniyor; hem proteus'da hem de gerçekte hiç bir sorun olmadan çalışıyor;
Sadece derleyicinin otomatik olarak adrese neden 0x8000 eklediğini merak ettim. Beklenmeyen bir şey bu.

Saygılarımla
Timuçin

const unsigned char MyDizi[6] @0x0123;   // Global'de tanimlandi
unsigned char * MyPointer;       // Main içinde tanimlandi

MyPointer =  (const unsigned char *) &MyDizi;   // error: (712) can't generate code for this expression


const unsigned char MyDizi[6] @0x0123;   // Global'de tanimlandi
unsigned char * MyPointer;       // Main içinde tanimlandi

MyPointer =  (unsigned char *) &MyDizi;   // error: (712) can't generate code for this expression


Benim Constant'lı ,lk verdiğim kodlara ait ASM'sinden....

185                           
   186                           ;main.c: 14: MyPointer = (const unsigned char*)&MyDizi;
   187  0131  3081               	movlw	129                      [color=red][b][b]Neden MyPointerin highbyte'ına 0x81 yüklüyor?[/b][/b][/color]
   188  0132  00F1               	movwf	_MyPointer+1
   189  0133  3023               	movlw	35
   190  0134  00F0               	movwf	_MyPointer

    __CFG_PWRTE$OFF    0000               _MyDizi              0123                __end_of__initialization 012A     
    __pcstackCOMMON    0000                _MyDizi_absaddr 0123               __pnvCOMMON 0070                            [b][color=red]Halbuki MyDizi 0123 ??[/color][/b]
             __pmaintext    012E                 __stringtab         0003               end_of_initialization 012A 



Mucit23

xc8 de delay fonksiyonları nasıl sistemeeklenir? __delay_ms fonksiyonları tanımlı değil diye bir hata alıyorum.