CCS C alıştırma Turlarım

Başlatan Mucit23, 10 Şubat 2012, 15:29:51

Mucit23

Hocam kullandığım işlemci pic18f4620. CCS versiyonuda galiba 4.140 dı. Aksam tekrar bi bakayım.
Benim yapmaya çalıştığım romdaki değeri yani const olarak tanımadığım diziyi ramde bulunan bur pointer'a kopyalamak. Şuanda geldiğim nokta itibari ile hem dizi hemde pointer ramde tanımlı ise sıkıntı olmuyor.  Gerçi ram de tanımadığım dizi 3 elemanlıydı. Derleyici hic uyarı vermiyor.  Birde asm çıktısına bakayım.  Başka birşeyler olmasi lazim.

Mucit23

Birşey sormak istiyorum.

CCS nin mcu'ların header dosyaları içerisinde aşağıdaki gibi port bit tanımlamaları var
#define PIN_A0  40
#define PIN_A1  41
#define PIN_A2  42
#define PIN_A3  43
#define PIN_A4  44
#define PIN_A5  45
#define PIN_A6  46
#define PIN_A7  47

#define PIN_B0  48
#define PIN_B1  49
#define PIN_B2  50
#define PIN_B3  51
#define PIN_B4  52
#define PIN_B5  53
#define PIN_B6  54
#define PIN_B7  55


Buradaki yanda verilen sayısal değerlerin veriliş mantığını bilen varmı. Yapmak istediğim şöyle birşey var. Örneğin SPI ile haberleşen bir çipim var. CS, SCK, DIN,DOUT olmak üzere haberleşmek için 4 pin kullansın.

haberleşme için gerekli olan pinleri aşağıdaki gibi tanımlıyorum.

   #define CS   PIN_C2
   #define DIN   PIN_C4
   #define DOUT   PIN_C5
   #define SCK  PIN_C3

Benim amacım çipin init edildiği sırada bu tanımlamalara bakılarak kullanılan portun gerekli olan giriş çıkış yönlendirmesini yapayım. Tabi portun diğer bitlerine karışmadan. Yani set_tris_x fonksiyonuna yukarıdaki tanımlamalara bakarak bir değer yazmalıyım. Bu değeri program kendi bulsun. DIN giriş olacak diğerleri çıkış olacak vs..

Bu yüzden port bit tanımlamalarının yanındaki değerleri sordum. Bunu nasıl yaparım?

Gökhan BEKEN

O değerler datasheette yazan register adresleri olsa gerek. (ccs c bilmiyorum)
Maskeleme yaparak diğer pinlerin etkilenmemesini sağlayabilirsiniz, zaten bu işlerin mantığı maskelemedir. Çünkü 1 bit olarak işlem yapılmaz, minimum 8 bit işlem yapılır.
örneğin:
trisa nın değeri 0b10110000;
siz 1. biti(en sağdakinin bir öncesi olan bit) 1 yapmak istiyosanız
trisa|=0b00000010; yazarsınız
ama 1. biti 0 yapmak istiyorsunuz diyelim
trisa&=~0b00000010; yazarsınız
Özel mesaj okumuyorum, lütfen göndermeyin.

omereliusuk

output_high(48);
output_high(pin_b0);
aynıdır.
set_tris_a (get_tris_A()|0b00000001));//1. bit giriş olarak değiştirildi. diğerlerine dokulunulmadı
set_tris_a (get_tris_A()&0b11111110));//1. bit çıkış olarak değiştirildi. diğerlerine dokulunulmadı

Mucit23

Ömer hocam işte tanımlanan değerlerin mantığını çözemedim.

tamam 48=pin_b0 olsun. output_high() sonuç olarak bir fonksiyon. Bu fonksiyon içerisine 48'gönderirsek b0 lojik1 olacak.

bu değerlerin adres olduğunu sanmam çünkü her bit için ayrı bir tanımlama yapılmış. Portların adresi varda bitlerin adresi yok diye biliyorum.

Aslında şu output_high() fonksiyonunun içini görebilseydim anlardım meseleyi


Mucit23

Jkramer Yönlendirme için teşekkürler, @Gerbay'e'de açıklama için teşekkürler

Formülü anladım.

ccs forumda bir kod parçası buldum

void My_Output_High(char bitaddress)
{
char byteaddr,bitaddr;

byteaddr = bitaddress >> 3;
bitaddr = bitaddress & 0x07;
bit_set(*byteaddr,bitaddr);
}

Burada yapılan işlemlerde @gerbay'ın anlattıklarını destekliyor.


Mucit23

Teşekkürler. Aynı veriler kullandığım mcu'nun Datasheetindede var.  ;)

Mucit23

#219
Arkadaşlar merhaba,

Pic16F886'da ADC için Referans girişini aktif etmek istiyorum. Daha önce hiç referans ile uğraşmamıştım. CCS de bunun için aşağıdaki ayarlamaları yaptım.

   
   setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
   setup_ccp1(CCP_OFF);
   setup_ccp2(CCP_OFF);   
   setup_spi(SPI_DISABLED);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_adc_ports(sAN0 | VSS_VREF);


Analog giriş ile Referans girişini giriş olarak tanımladım. Amacım ADC nin referans voltajını 2.8V olarak belirlemek. Bunu gelirim bölücü dirençler ile ayarlayacağım.

Daha önce CCS ile Referans girişi kullanan oldumu sıkıntı nedir?

mesaj birleştirme:: 13 Kasım 2014, 00:46:52

Edit;Çözdüm ama gariplik var

benim istediğim 0-VREF arası ölçüm yapmak. Bunun için VREF_VDD şeklinde tanımlama vermek gerekiyor. Bu durumda mantıken düşünürsek -vref ile VDD arasını dönüştürmesi gerekir.

Gerçekten ADCON1 de 5. biti aktif etmek gerekiyor.
5. Bit açıklaması
VCFG1: Voltage Reference bit
1 = VREF- pin
0 = VSS
Buda 4. bit açıklaması
VCFG0: Voltage Reference bit
1 = VREF+ pin
0 = VDD

Ben ilk başta 4. biti 1 yapmıştım.

justice_for_all

5.bit 0 olursa zaten vss ye bağlı olur ve normal ölçümü yapması gerek.Olmazsa 5.biti 1 yapıp vref- pinini şaseye bağla o şekilde dene.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Mucit23

Hocam ne ilginçtirki gerçekte olması gerektiği gibi çalışıyor

Mucit23

birde şöyle bir sıkıntı var. Referans voltaj girişine ve ADC girişine pot bağladım. Referans voltajıyla oynayarak değişimleri gözlemliyorum.

Referanstaki voltajı 3.130V yapıyorum. Sonra analog girişteki pot ile oynuyorum. Analog girişteki voltajı yaklaşık 3.002 volta getirdiğimde adc max değerini alıyor. Arada yaklaşık 130mv bir fark var.

Bu konuda yorumu olan varmı?

F493

Selam,

    Sizinde bildiğiniz gibi adc çevrim sonucunu şu şekilde hesaplıyor.

   
       AdcDigitalVal = read_adc();

       AdcAnalogVal = ( (float)(VREF+  -  VREF-)  / (float)1023) * AdcDigitalVal;

      //Burada (VREF+  -  VREF-) bu sonuç işleme ne kadar dogru degerlerle sokulursa sonuçta okadar dogru çıkar. Siz VREF'leri çalışma         zamanında dinamik olarak degiştiriyorsunuz anladığım kadarıyla.   (VREF+  -  VREF-) bu kısmı nasıl degiştiriyorsunuz?.
     



Esen kalın.

Mucit23

Hocam ben böyle birşey kullanmıyordum aslında.

Doğrudan read_adc() fonksiyonundan gelen değerlere bakıyorum.