XC8 Yeni başlayanlar için basit sorular

Başlatan Extreme, 02 Mart 2015, 15:50:54

OxfordBlue

arkadaşlar bit değişkenini .header için tanımlanmıyor. sadece .c dosyalarında tanımlanabiliyor .. Denermisiniz ?

ahmetzafer

Merhaba
Bana da 24 ya da 32 bitlik değişkenler lazım. mplab dökümanlarındaki tüm değişken tiplerini inceledim. Amacım pozitif olarak 24 ya da 32 bitlik değer girebilmek.
Karşılaştığım sıkıntı, tüm değişken tanımlarımın sadece 16. bitini 1 yaptığımda -32768 değerini alıyorum, unsigned komutu yazdığım halde.
Benim bu değerin üstüne pozitif olarak çıkmam gerek.
24 bit lik float ve double değişkenleri var ama onların da ilk 8 bit i ondalık değeri belirttiği için integer olarak 32767 değerinin üzerine çıkmıyor.

Dokumanda unsigned short, unsigned int 16 bit, unsigned long 24 bit, unsigned short long 32 bit olarak yazıyor ancak ben bu değerleri pic üzerinde okuyamıyorum.

uint16_t,  uint24_t, uint31_t gibi diğer değişken tiplerinide denedim sonuç aynı. Pozitif olarak görebildiğim max değer  32767. ben 1000000 değerini değişkene atamak istiyorum.

Kullandığım pic 16f877a. Emin değilim ya da bilmiyorum ama varabildiğim tek sonuç kullandığım pic böyle birdeğeri, float ya da double değişkenleri dışında, 24 bitlik değeri depolayamıyor. Ama buda saçma geldi biraz bana.

bu arada tüm çalışmalarım simulasyon üzerinde. 2-3 güne gerçeğe dönüşecek ama bir şey değişeceğini sanmıyorum.

Tagli

OxfordBlue, denemedim ama bu normal bir durum olabilir. bit türü standart bir tür olmadığından bazı kısıtlamalar var. Örneğin fonksiyon içinde de normal şekilde tanımlanamıyor, sadece static olarak tanımlanabiliyor. bit değişkeninin pointer'ı da olmuyor. Öyle sanıyorum ki başka bir şekilde çözüm bulman gerekecek.

ahmetzafer, bir ara galiba 32 bit değişkenlerle uğraşırken buna benzer bir sorun yaşamıştım gibi hatırlıyorum. Normalde gerekli olmayan birkaç casting ile çözmüştüm. Sanırım derleyiciden kaynaklı bir hata idi. Ama 16 bit değişkenler ile hiç böyle bir sorun yaşamadım.

MPLAB X proje klasörünü paylaşırsan bir de ben deneyeyim. Düşük bir ihtimalle proje ayarları ile ilgili bir durum olabilir.
Gökçe Tağlıoğlu

mehmet

Bir de bu şekilde deneyiniz...
/*
 * File:   main.c
 * Author: mbmb
 *
 * Created on 03 Şubat 2016 Çarşamba, 21:35
 */

#include <stdint.h>

// PIC12F675 Configuration Bit Settings
// 'C' source line config statements
#include <xc.h>

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

// CONFIG
#pragma config FOSC = INTRCIO   // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-Up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF      // GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = ON       // Brown-out Detect Enable bit (BOD enabled)
#pragma config CP = ON          // Code Protection bit (Program Memory code protection is enabled)
#pragma config CPD = ON         // Data Code Protection bit (Data memory code protection is enabled)

void main(void)
{
    uint24_t degisken = 1000000;
    
    while(1)
    {
        if(degisken >= 1000000) 
        {
            degisken++;
        }
    }
}
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

OxfordBlue

#64
Merhabalar ,

2 sorum var error değil ama warning alıyorum.

1.sorum
const unsigned char *Array[18] =
{
"......",
"ABC   ","ABC   ","ABC   ",
"ABC   ","ABC   ","ABC   ",
"ABC   ","ABC   ","ABC   ",
"ABC   ","ABC   ","ABC   ",
"......","......","......",
"......","......"
};

main.h:133: warning: (1478) initial value for "_ErrorCodes" differs to that in main.h:133

2.sorum
volatile unsigned int adcUp;
volatile unsigned int adc;

adcUp=(int)(adc)*(1.30);
system.c:13: warning: (356) implicit conversion of float to integer

yardım edermisiniz?



Tagli

İlkini anlamadım ama ikincide durum belli: int = int * float şeklinde bir işlem var. Sağ taraf işlem sırasında kendi içinde float'a dönecek. Bunun int'e atılması küsuratın kaybolması anlamına geliyor ve derleyici seni uyarıyor. Derleyiciye "Ben ne yaptığımın farkındayım, sen sus." demek için sağdaki işlemin bir bütün olarak int'e cast edilmesi lazım. Yani şöyle yazabilirsin: adcUp = (int)(adc * 1.30);
Gökçe Tağlıoğlu

vitruvius

İlkini net söylemek için kodun tamamını görmek lazım. _ErrorCodes'u en az iki kere tanımlayıp değer atamışsınız ve bu değerler birbirlerinden farklı. Muhtemelen başka bir header dosyası yada C dosyası içinde de değer ataması var. Onları bir kontrol edin.

OxfordBlue

İkinci sorumun cevabı için tşkler çalıştı.

İlki için tekrar yineliyim anlaşılması için.

main.h
const unsigned char *Array[18] =
{
"......",
"ABC   ","ABC   ","ABC   ",
"ABC   ","ABC   ","ABC   ",
"ABC   ","ABC   ","ABC   ",
"ABC   ","ABC   ","ABC   ",
"......","......","......",
"......","......"
};

bu kodu derleyince kodun bu kısmında warning hatası geliyor.

main.h:133: warning: (1478) initial value for "_ErrorCodes" differs to that in main.h:133

OxfordBlue

#68
Merhabalar,

typedef struct __i2c_comm {
    unsigned char buffer[MAXI2CBUF];
    unsigned char buflen;
    unsigned char event_count;
    unsigned char status;
    unsigned char error_code;
    unsigned char error_count;
    unsigned char outbuffer[MAXI2CBUF];
    unsigned char outbuflen;
    unsigned char outbufind;
    unsigned char slave_addr;
} i2c_comm;

static i2c_comm *ic_ptr;

SSPBUF = ic_ptr->outbuffer[0];
ic_ptr->error_count++;

Yukarıdaki şekildeki kodlar nasıl okunur açıklamalı anlatabilirmisiniz ?

Gökhan BEKEN

Özel mesaj okumuyorum, lütfen göndermeyin.

OxfordBlue

#70
Merhabalar

xc8'de int bir sayiyi noktalı olarak bölmeden print etmenin bir yolu var mı ?
unsigned int sayi=9876;

printf("%4u",sayi); // bu islem noktasız olarak yapıyor.


bu int sayisini

mod işlemine tabi tutup karakterlerine ayırmadan
yada float tipde değişkene işlemeden


kısa yolla noktalı yapılabilir mi ?

Gökhan BEKEN

Bu soru doğrudan C dili ile ilgili,

Nokta koymak istiyorsanız, önce sayıyı sprint ile stringe çevirip sonra sağdan başlayarak her üç karakterde bir nokta koyup (nokta koyduğunuz yerleri kaydırmanız gerekiyor bu arada), en son printf işlemine sokabilirsiniz.
Özel mesaj okumuyorum, lütfen göndermeyin.