XC8 Değişken Tanımlamaları

Başlatan SB7, 11 Şubat 2019, 22:14:31

SB7

Merhabalar
Uzun zamandır CCS C ile ilgileniyordum. Şimdi XC8 üzerinde çalışmaya başladım. CCS C de yaptığım projeleri XC8 e port etmeye çalışıyorum. Ancak değişken tannımlamaları çok sıkıntılı geldi. Örnek verecek olursam 0-9999 sayıcı devresinde "signed long int sayi=0;" diye tanımladığım değişkeni xc8 de deneyince sayi değişkeninin hiç sıfırın altına inmediğini gördüm . short, signed int16_t,signed int32_t, int gibi tanımlamaları da denememe rağmen hiçbir sonuç alamadım sayi değişkeni minimum 0 oluyor.
XC8 user manueli inceledim bu tür tanımlamalar için  "#include<stdint.h>" kütüphanesinin eklenmesi gerektiği yazıyor. Onu da ekledim ancak değişen birşey olmadı.
Değişken tanımlamalarını nasıl yapmalıyım?
XC8 için user manuel dışında önerebileceğiniz kaynaklar var mı?
-SB7

baran123

Bence senin sorunun farklı bir noktada.
Stdint kütüphaneside olur ama ben genelde ekstra bir dosya ile kendim yapıyorum oldukça basit.
#ifndef TYPEDEF_H
#define	TYPEDEF_H

#include <xc.h>

typedef unsigned char uint8_t;
typedef unsigned int uint16_t;

typedef signed char int8_t;
typedef signed int int16_t;

#endif	/* TYPEDEF_H */

Tagli

stdint.h'ı ekleyerek int32_t şeklinde kullanmak en doğru yaklaşım. Bu arada int32_t zaten işaretlidir, başına signed yazılmaz.

Ben XC8'i epey kullandım ve böyle bir sorun yaşadığımı hatırlamıyorum. Sanki bir ara XC16'da int64_t ile ilgili bir sorun yaşamıştım ama emin değilim, ve zaten konumuz dışında sanırım.

Sorun yaşadığın basit bir main.c dosyasını eklersen incelenmesi kolaylaşır. Belki senin kodunda gözünden kaçan bir hata vardır.
Gökçe Tağlıoğlu

apsis

Arkadaşın dediği sorunu xc8'de ben de yaşıyordum. Tagli'nin yaptığı gibi yaptım sorun çözüldü. Ama problemin nedenini bulamamıştım. Belki de kürekli kullandığım için problem çıkıyordu.
"Makineye Beyin" MEKATRONİK

SB7

Yorumlarınız için teşekkür ederim. @Tagli hocam dediğinizi yaptım ancak sorun @apsis hocamın dediği gibi program kaynaklı galiba.Kürekli versiyon da değil ama çok stabil çalışmıyor sanki. Eski proje dosyasının yerine yeni bir proje oluşturdum aynı kodları bu projeye kopyaladım derledim ve sorun düzeldi. @baran123 hocam sizin yaptığınız şekli anlayamadım bu kodları yeni bir .h uzantılı dosya olarak kaydedip mi denemem gerekiyor?
-SB7

baran123

Evet bu typedef.h diye bir dosya tanımlayıp ekleyebilirsin fakat standarları kullanmak daha iyidir.
#include <stdint.h> daha iyi olur.

SB7

Tamamdır hocam tekrar teşekkür ederim.
-SB7

SB7

Selamlar
Değişken tanımlamalarından yana yine sıkıntı çekiyorum. Bu yüzden yeni konu açmadım.
Bu kez de interrupt tanımlamalarında hata alıyorum.Referans aldığım kaynak Fırat devecinin Hı-Tech C kitabı
#include <xc.h>
#include <stdint.h>

#pragma config FOSC = XT,  WDTE = OFF, PWRTE = OFF ,  BOREN = OFF, LVP = OFF, CPD = OFF ,WRT = OFF, CP = OFF


#define _XTAL_FREQ 4000000
#include "delay.h"




void main() {
    TRISB=0x01;  //RB0 pini giri? di?erleri ç?k??
    PORTB=0x00;  //PORTB yi s?f?rla
    
    INTF=0;    //RB0 int bayra?? temizleniyor
    INTEDG=1;  //Yükselen kenarda kesme olu?acak
    INTE=1;    //Rb0 Kesmesine izin ver
    GIE=1;      //Genel kesmelere izin ver
    
    for(;;);
}

void interrupt kesme (void)
{

    uint8_t i;
    if(INTF)  //kesme olu?mu?mu diye bayrakk kontrol ediliyor
    {
        GIE=0;  // Kesme varsa, ba?ka kesme gelmemesi için genel kesme s?f?rlan?yor
        i++;
        if(i == 1){ RB1=1;}
        if(i == 2){
        RB1=0;
        i=0;
        }
        INTF=0;  //Kesme bayra??n? temizle
        GIE=1;    //Genel kesmeleri aktifle?tir
    }
    

}

RB0/INT ext kesmesini denedim ve şu 2 hatayı aldım

main.c:85:13: error: variable has incomplete type 'void'
static void interrupt
            ^
main.c:85:22: error: expected ';' after top level declarator
static void interrupt
                    ^
                    ;
2 errors generated.

Noktalı virgüle kütüphanelere dikkat etmeme rağmen sorun düzelmedi. Ayrıca interrupt için __interrupt diye bir kullanım gördüm onu da denedim ancak değişen birşey olmadı.

Program kaynaklı olduğunu düşünüp başka kesmeler yapmayı denedim. ADC kesmesi de aynı şekilde 2 hata ve hatalar da birebir aynı. Sorun sizce nerde?
-SB7

Tagli

XC8 v2.00'dan itibaren,
void __interrupt() isr(void);
şeklinde tanımlanıyor. "isr" yerine herhangi bir isim yazabilirsin.
Gökçe Tağlıoğlu

apsis

Kesme içerisinde değişken arttırma işlemi yapacaksan değişkeni "static" olarak tanımlaman gerek. Aksi taktirde programın düzgün çalışmaz
"Makineye Beyin" MEKATRONİK

SB7

Gökçe hocam çok sağolun sorun düzeldi.
@apsis hocam teşekkürler düzelttim. Dediğiniz gibi program düzgün çalışmadı "static" ile tanımlamayınca.
Ancak ben böyle problemlerle çok vakit harcayacağım gibi görünüyor. Önerebileceğiniz kaynaklar var mıdır?
-SB7

apsis

Bunlar problem değil eksik bilgi. Ama zamanla aşarsın.
"Makineye Beyin" MEKATRONİK