Picproje Elektronik Sitesi

DERLEYİCİLER => Microchip XC Serisi => Microchip XC8 => Konuyu başlatan: Extreme - 02 Mart 2015, 15:50:54

Başlık: XC8 Yeni başlayanlar için basit sorular
Gönderen: Extreme - 02 Mart 2015, 15:50:54
Merhaba arkadaşlar çok kısıtlı zamanım olduğu için basit bir soru sormak zorundayım.


int adc = 1020; ( bu rakam 0 ile 1023 arası değişecek)
unsigned char send1
unsigned char send2

şimdi benim bu sayıyı 4.25 (0.00 ile 5.00) arasında değişecek şekilde ayırıp
virgülden önceyi send1 , virgülden sonrayı send2 değişkenine aktarmak istiyorum
Ayrıca değişken tanımlaması gerekiyorsa tanımlananabilir

direkt olarak Çözüm odaklı cevap verirseniz çok memnun olurum.

Başlık: Ynt: Basit bir xc8 değişken sorusu
Gönderen: Emin Aydın EROĞLU - 02 Mart 2015, 16:09:51
float deger;
deger=adc*0,00488; // 0-1023 arasında okuduğun adc değerini gerilime çevirir.
deger*=100; // degeri 100 ile çarpıp tam sayı haline gitirir.
send1=(int)(deger/100);  // degerin 1. hanesini sen1' e atar.
send2= deger % 100; degerin 100e bölümünden kalanı send2 ye atar. Yani virgülsen sonrasını send2 ye atar.
Başlık: Ynt: Basit bir xc8 değişken sorusu
Gönderen: Extreme - 02 Mart 2015, 16:18:24
Nokta atışı hocam teşekkürler.
Başlık: Ynt: Basit bir xc8 değişken sorusu
Gönderen: apsis - 02 Mart 2015, 17:06:55
ben burada port yönlendirmeleriyle ilgili birşey göremedim!.
pardon arkadaşlar başka yere bu yorumu yazacaktım yanlışıkla buraya yazdım. bunu silebilirsiniz.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Extreme - 02 Mart 2015, 17:55:52
Mikrodenetleyici: 18F4620
Analog olarak AN0,AN1 VE AN3 tanımlamak istiyorum.
Diğerleri Dijital olmak zorunda.

ADCON1 =  ? ;

(http://s12.postimg.cc/579zk88t5/adcon1.jpg) (http://postimg.cc/image/579zk88t5/)

yardımcı olursanız çok mutlu olurum
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Emin Aydın EROĞLU - 02 Mart 2015, 18:01:37
ADCON1=0x0B olacak
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Extreme - 02 Mart 2015, 18:09:08
Alıntı yapılan: Emin Aydın EROĞLU - 02 Mart 2015, 18:01:37
ADCON1=0x0B olacak


iş yoğunluğundan biraz affaladım galiba.
kağıtda aynısı yazıyor. niyeyse tabloya daldım.

teşekkürler hocam.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Extreme - 03 Mart 2015, 10:05:05
Uzun uzun anlatıp kafa karıştırmak istemiyorum.

Bir sinyalin gerilimini(RA0) başka bir bacağa gelen kare dalga sinyaliyle okumak zorundayım(RA2)

Yardımcı olursanız sevinirim aşağıdaki kodlar çalışmıyor.
(Kodların daha yalın olması acısından sadece lcd panelle seri haberleşme olan kısmı çıkardım)

Not: RA2 ye gelen kare dalga sinyali asla 1 görmüyor. Bu kare sinyali örneğin RC0 a alırsam çalışıor.

#include <pic18f4620.h>
#include <pic18.h>
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include "18F_Config_40_v10.h"

unsigned char sample=16;

int veri=0;
float adc_1kanal_1digit=0;
float adc_1kanal_2digit=0;
float deger=0;
float degerold=0;
bit squarewave=0;
bit squarewave2=0;

void main(void)
{
    TRISA = 0b00001111;
    TRISB = 0b00000000;
    TRISC = 0b10000000;
    TRISD = 0b00000000;
    TRISE = 0b00000000;

    ADCON1 = 0x0B;
    CMCON = 0x07;   //deactivate comparator module
    INTCON2bits.RBPU=1; //portb pull-ups disabled.

    ADCON0bits.CHS3=0;  //AN0 seçildi
    ADCON0bits.CHS2=0;
    ADCON0bits.CHS1=0;
    ADCON0bits.CHS0=0;

    ADCON2bits.ACQT2=1;
    ADCON2bits.ACQT1=1;
    ADCON2bits.ACQT0=1;

    ADCON2bits.ADCS2=0;  //fosc/32 seçildi.
    ADCON2bits.ADCS1=1;
    ADCON2bits.ADCS0=0;

    ADCON2bits.ADFM=1;  //sa?a yaslama

    ADCON0bits.ADON=1;  //adc modülü aktif.

    LATA=0x00;
    LATB=0x00;
    LATC=0x00;
    LATD=0x00;
    LATE=0x00;

    //SERIAL COMMUNICATION SETTINGS
    SPBRG=64;
    TXSTA=0b00100010;
    RCSTA=0b10010000;
    RCIF=0;
    RCIE=0;

    //TIMER1 SETTINGS
    PIE1=0b00000001;    //Only Enables timer1 overflow interrupt
    PIR1bits.TMR1IF=0;  // TMR1 register did not overflow
    INTCON=0b11000000;  // Enables all unmasked interrupts
    T1CON=0b00000000;

    TMR1ON=1;  //TIMER1 ACTIVATE
    TMR1 = 64765;

    squarewave=1;
   
    while(1)
    {
        __delay_us(1);
        __delay_us(1);
        __delay_us(1);
        __delay_us(1);
    }

}

void AdcOperation(void)
{
    if(squarewave==0){goto adcstep2;}
    else if(PORTAbits.RA2==0){squarewave=0;goto adcfinished;}
    else{goto adcfinished;}
    adcstep2:
    if(PORTAbits.RA2==1)
    {
    ADCON0bits.CHS3=0;  //AN0 seçildi
    ADCON0bits.CHS2=0;
    ADCON0bits.CHS1=0;
    ADCON0bits.CHS0=0;

    ADCON0bits.GO=1;
    while(ADCON0bits.nDONE);
    veri=(ADRESH<<8)+ADRESL;

    degerold=veri*0.00488758; // 0-1023 aras?nda okudu?un adc de?erini gerilime çevirir.
    deger=deger+degerold;
    sample--;
    if(sample==0)
    {
        deger=deger/16;
        deger*=100; // degeri 100 ile çarp?p tam say? haline gitirir.
        L1_SendData2=(int)(deger/100);  // degerin 1. hanesini sen1' e atar.
        L1_SendData3=(int) deger % 100; // degerin 100e bölümünden kalan? send2 ye atar. Yani virgülsen sonras?n? send2 ye atar.
        deger=0;
        degerold=0;
        sample=16;
        squarewave=1;
    }
    }
    adcfinished:
    __delay_us(1);
}

void interrupt isr(void)
{
  if (PIR1bits.TMR1IF && PIE1bits.TMR1IE)
   {
    PIR1bits.TMR1IF = 0;
    TMR1 = 64765;
    AdcOperation();
    __delay_us(1);
   }
}
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Emin Aydın EROĞLU - 03 Mart 2015, 11:24:15
Hocam olmaması gayet normal. Çünkü RA1'i siz analog olarak ayarlıyorsunuz. Siz o pini digital olarak karşılaştırma yapamazsınız. Eğer dediğiniz gibi yapmak istiyorsanız RA1 i digital ayarlayıp karşılaştırma sonucu ADC ölçümünü yapmalısınız. Ayrıca o karşılaştırma kısmınıda bulamadım kodlarda acaba kesmenin içerisine mi koydunuz da buraya yazarken sildiniz?
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Extreme - 03 Mart 2015, 11:52:48
   if(squarewave==0){goto adcstep2;}
    else if(PORTAbits.RA2==0){squarewave=0;goto adcfinished;}
    else{goto adcfinished;}
    adcstep2:
    if(PORTAbits.RA2==1)
    {
adc ölçümleri
    }
adcfinished:
..
..
bu bölüm kare dalgayla ilgili

RA1 değil RA2 tekrar kontrol edermisiniz hocam.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Emin Aydın EROĞLU - 03 Mart 2015, 11:57:27
Hocam dediğim gibi bakın siz analog olarak tanımladığınız bir pini 1 mi 0 mı diye kontrol yapamazsınız o pini digital olarak tanımlamanız lazım. Eğer RA2 yi analog olarak kontrol etmiyecekseniz onu digital yapın. Yada C portuna alın kontrol pinini.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Extreme - 03 Mart 2015, 15:33:28
ADCON1 = 0x0B;  için RA2 , Digital olmuyor mu ?

bence digital olarak tanımladım ben RA2 yi
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Emin Aydın EROĞLU - 03 Mart 2015, 19:51:47
Hayir hocam RA0 RA1 RA2 RA3 Analog tanimli suanda
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Extreme - 04 Mart 2015, 09:04:08
eğer ordaki yorum satırına takıldıysanız o eskiden kalmaydı.

Yada doğru kodu nereyi değiştiriceğimi gösterebilirmisiniz?
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Emin Aydın EROĞLU - 04 Mart 2015, 09:15:33
Hocam bakın Eğer RA2 yi digital yapmak istiyorsanız ister istemez RA3'ü de digital yapmak zorundasınız. Yukarıda ki paylaştığınız PCFGx tablosunu incelerseniz anlarsınız. ADCON1=0x0D; yaparsanız eğer RA0 ve RA1 Analog diğerleri digital olacaktır. Şimdi önemli olan şey sizin burada kaçtane analog girişe ihtiyacınız var onu tespit etmek. Eğer karşılaştırma yapacaksanız eğer digital pine ihtiyacınız var. A portunu analog ayarlarken maalesef pin atlayarak analog seçemiyorsunuz. Sırası ile analog seçebilirsiniz. Örneğin RA0 ve RA2 analog RA1 digital olsun diyemezsiniz. Ancak RA0 ve RA1 analog RA2 ve geri kalanları digital olsun diye seçebilirsiniz. Tablo bunu söylüyor.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Extreme - 12 Mart 2015, 14:36:25
tskler Emin hocam o sorunu hallettik.

Yeni bir sorunum var.
#define TRA_0   LATDbits.LATD0
#define TRA_1   LATDbits.LATD1
#define TRA_2   LATDbits.LATD2
#define TRA_3   LATDbits.LATD3
#define TRA_4   LATDbits.LATD4
#define TRA_5   LATDbits.LATD5
#define TRA_6   LATDbits.LATD6
#define TRA_7   LATDbits.LATD7

unsigned char Degerler

bu TRAları direkt olarak Degerler değişkene nasıl aktarırım ?

Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Emin Aydın EROĞLU - 12 Mart 2015, 14:50:41
Hocam öncelikle eğer sen portu olduğu gibi okumak istiyorsan bu kadar farklı tanımlamaya ihtiyacın yok. Tek tanımlama yeterli. Sonra eğer sen portun değerini okuyacaksan o portu giriş olarak tanımlamalısın. Daha sonrada tanımlamanı PORTD şekilde yapmalısın. LATA çıkış için kullanılır.

#define TRA PORTD

unsigned char Degerler;

Degerler=TRA;

Şeklinde okuyabilirsin. Bunun sonucunda 8 bitlik D portunu Degerler değişkeninne atmış olursun.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Extreme - 12 Mart 2015, 15:40:27
Peki emin hocam ben bit bit işlem yapmak istiyorum.

net olarak bitlerden Rd7,Rd6,Rd5,Rd4,Rd3 bitlerine bir değişkene aktarmak istiyorum nasıl yapabilirim. ?Rd2 ve Rd1 ve Rd0 ile ilgilenmeden
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Gökhan BEKEN - 12 Mart 2015, 15:45:23
Forumda sabit konu yapmıştık ama görmediniz sanırım: https://www.picproje.org/index.php/topic,53020.0.html (https://www.picproje.org/index.php/topic,53020.0.html)
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Extreme - 13 Mart 2015, 16:07:20
Emin hocam,
18F4620 için

#define TRA LATD

unsigned char Degerler;

TRA=Degerler;

DEDİĞİMİZDE TRA içeriğini Degerler içeriğiyle dolduracak mı ? binary şeklinde
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Extreme - 30 Mart 2015, 11:23:29
#define TRMA_0   LATCbits.LATC0
#define TRMA_1   LATCbits.LATC1
#define TRMA_2   LATCbits.LATC2
#define TRMA_3   LATCbits.LATC3

ben bunları aynı anda bir değer atamam gerekiyor

TRMA_3=0; TRMA_2=0; TRMA_1=0; TRMA_0=0;  // bu şekilde degil aynı anda vermek istiyorum

TRMA=14; deyince hepsini ataması gibi ..

Böyle bir yöntem var mı arkadaşlar ?
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Gökhan BEKEN - 30 Mart 2015, 12:02:05
LATC=0xFF; diyebilirsiniz mesela...
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Kabil ATICI - 30 Mart 2015, 12:59:03
Birden fazla kullanacaksan, fonksiyon olarak yaz.

void fonksiyon (int degisken)
{
//fonksiyon yapması gereken iş.,
}

kullanımda
fonksiyon (14); //şeklinde kullanabilirsin
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Extreme - 10 Nisan 2015, 14:23:52
Merhaba Benim bir sorum olucak.

watchdog timer hesabını öğrenmek istiyorum. sadece hesabını kullanmasını biliyorum.

#pragma config WDTPS = 32768    // Watchdog Timer Postscale Select bits (1:32768)

10mhz osilatör ile benim ne kadar süre CLRWDT(); komutunu kullanmazsam pic resetlenir.

Hesabını öğretebilecek var mı ?
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: RaMu - 10 Nisan 2015, 14:39:49
Osilator farketmez,
wdt nin kendi rc osilatörü var picin içinde.
Ayarladığın (ayarlayabileceğin belli değerler var) değer kadar milisaniye
sonra resete sebep olur, yani
#pragma config WDTPS = 32768
için 32768 milisaniye içinde wdt yi clear yapmazsan pic resetlenir.

Datasheeti incelemen çok faydalı olur,
wdt timer0 ın prescaler ını kullanabiliyor,
timer0 ve wdt beraber kullanıldığında dikkat etmek gerekir.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Gökhan BEKEN - 10 Nisan 2015, 14:45:05
WDTCON: WATCHDOG TIMER CONTROL REGISTER
diye bir register var, orda hangi ayarları yaptığınıza göre değişir.

bu registerın ilk 4 bitinin(WDTPS) değerleri, Prescale Rate değeridir, bunlar direkt olarak süreyi etkiler
WDTPS<3:0>: Watchdog Timer Period Select bits
Bit Value = Prescale Rate
0000 = 1:32
0001 = 1:64
0010 = 1:128
0011 = 1:256
0100 = 1:512 (Reset value)
0101 = 1:1024
0110 = 1:2048
0111 = 1:4096
1000 = 1:8192
1001 = 1:16384
1010 = 1:32768
1011 = 1:65536
1100 = reserved
1101 = reserved
1110 = reserved
1111 = reserved
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Extreme - 10 Nisan 2015, 14:47:29
ramazan hocam,

pic 18f4620 datashetti inceledim cok anlayamadım.

32768msn = 9 saniye yapar.

ama burda 1 saniye demiş

ben 32768 kullanırken 140saniye olarak uygulamada test ettim.

hangisi doğru hocam ?
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: RaMu - 10 Nisan 2015, 15:03:33
32768 ms =32768/1000 = 32,768 yaklaşık 33 saniye yapar.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Extreme - 10 Nisan 2015, 16:14:28
Ramazan hocam

20mhz osilatörlede 10mhz osilatörlede

33saniye mi ?
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: RaMu - 10 Nisan 2015, 16:37:41
Daha önceki mesajdada söyledim ya
wdt nin kendi osilatörü var, mcuya bağladığın osilatörden bağımsız olarak çalışıyor.

Gökhan ın bahsettiği şeylere dikkat etmen gerekebilir,
kullandığın derleyici wdt ayarını kendi yapıyor mu bilmiyorum,
ccsc de basit bir satırla istediğin değeri veriyor ama
xc8 mplabx için registerları tek tek ayarlamak gerekeiliyor,
şurada Ramazan Subaşı nın bir yazısı var, 18f içinde temel oluşturabilir;
http://ramazansubasi.net/xc8-wdt-ve-sleep-uygulamasi/ (http://ramazansubasi.net/xc8-wdt-ve-sleep-uygulamasi/)

mesaj birleştirme:: 10 Nisan 2015, 16:46:17



Yalnız benim çıkarımım şu;
kullandığın mcu nun 18F4620
en düşük WDT zamanı 4ms
ve xc8 de yazdığın
#pragma config WDTPS = X
X defa 4ms kadar bekleyip WDT resetlemesine sebep oluyor.

Yani
#pragma config WDTPS = 32768
dediğinde
32768 x 4 =  131072 ms yani  yaklaşık 130 saniye sonra WDT reset gerçekleşiyor.

İstersen
#pragma config WDTPS = 256
gibi deneyip 1 saniyede bir wdt reseti gerçekleşiyormu şeklinde test et,
sonra diğer değerleride test et,
tabi neden böyle olduğunuda araştırabilirsin.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Extreme - 17 Nisan 2015, 10:46:04
Ramazan hocam dediğiniz net bir şekilde anlaşıldı teşekkürler.

xc8 'de yazılım bir yere 1000 kere girdiğinde tüm yazılımı resetlemek istiyorum.

Böyle bir komutumuz var mı ?

Yardımcı olurmusunuz ?
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Tagli - 17 Nisan 2015, 11:14:44
PIC18 ve üstü işlemcilerde reset komutu var. XC8'de var mıydı hatırlamıyorum ama zaten tek komut olduğu için asm kodu olarak C kodu içinde rahatlıkla çağrılabilir.

Galiba asm("RESET"); şeklinde kullanılıyor.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: JOKERAS - 17 Nisan 2015, 11:36:29
Selam,
RESET();
Bu şekildede oluyor.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: OxfordBlue - 14 Eylül 2015, 16:19:49
FrequenceHigh=255;

if(!(40<=FrequenceHigh<=70)){FrequenceHigh=75;}
((bu kodun yerine if((FrequenceHigh<=40)||(FrequenceHigh>=70))  bunu yazsam çalışıyor )

cevap : FrequenceHigh=255;
Neden FrequenceHigh=75 olmuyor.

neden olabilir ?
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Tagli - 14 Eylül 2015, 16:34:00
Çünkü C'de karşılaştırma ifadeleri 3'lü yazılmaz. (40<=FrequenceHigh<=70) dediğin zaman muhtemelen önce 40<=FrequenceHigh işlemi yapılıyor ve cevap 1 çıkıyor. Sonra 1<=70 işlemi yapılıyor ve cevap yine 1 çıkıyor. Başına ! gelince 0 oluyor ve haliyle FrequenceHigh=75 komutu işletilmiyor hiçbir zaman.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Gökhan BEKEN - 14 Eylül 2015, 16:40:21
Merhaba @OxfordBlue bu sorular xc8 ile alakalı değil, lütfen C bölümünde sorun.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: OxfordBlue - 16 Eylül 2015, 21:13:28
Gökhan Hocam, Dikkat ederim.

Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: OxfordBlue - 18 Eylül 2015, 15:46:18
mplabx , xc8 'de bir projem var project1.x
ve bir main.c dosyası var buna header ve c dosyalarıyla ayırmak istiyorum.
örnek communication.h,communication.c,misc.c,misc.h
fakat başarılı olamadım.
ilk olarak com.h ve com.c adlı iki dosya açtım

com.c içeriği

#include "com.h"
void SerialGW(void)
{
fonksiyon içeriği
}


com.h içeriği

#include <xc.h>
void SerialGW(void);


main.c içeriği

#include <pic18f4620.h>
#include <pic18.h>
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include "com.h"

değişkenler v.s.


void SerialGW(void);


(http://s17.postimg.cc/40v07432z/111.jpg) (http://postimg.cc/image/40v07432z/)

gelen hata:
com.c:9: error: (192) undefined identifier "ComWait"
com.c:11: error: (192) undefined identifier "ComWaitCounter"
.
.
.
.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Gökhan BEKEN - 18 Eylül 2015, 15:50:58
ComWait ve ComWaitCounter değişkenleri nerde tanımlıysa
aynısını com.c veya com.h içerisinde başına extern koyarak tekrar tanımlayın ama ilk değer vermemeniz lazım.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: OxfordBlue - 18 Eylül 2015, 16:50:25
Peki o zaman örnek vereyim.

main.c

Tanımlamar , değişkenler v.s.
FrequenceRead();



com.c

#include "com.h"

extern unsigned int    FrequenceTotal;
extern unsigned int    Frequence;
extern unsigned int    FrequenceCounter;
extern bit SquareWave;
extern bit FrequenceRec;

void FrequenceRead(void)
{
    if(SquareWave==0)
    {FrequenceRec=1;}
    if((FrequenceRec)&&(SquareWave))
    {
     FrequenceTotal++;FrequenceRec=0;
    }

    FrequenceCounter++;
    if(FrequenceCounter>=49650)
    {
        Frequence=FrequenceTotal;
        FrequenceTotal=0;
        FrequenceCounter=0;
    }
}



com.h

#include <xc.h>
void FrequenceRead(void);



build ve gelen hata:
:0: error: (499) undefined symbol:
        _SquareWave(dist/default/production\Mainboard.X.production.obj)
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Gökhan BEKEN - 18 Eylül 2015, 16:59:04
main.c dosyasına şunu eklemelisiniz:
extern void FrequenceRead(void);
mantığı anladınız mı?
bütün değişken ve fonksiyonlar için bu yöntem geçerlidir. Bir dosyadaki değişkeni başka bir dosyada kullanacaksanız extern ile tekrar tanımlayacaksınız.

bu _SquareWave adlı değişken mi fonksiyon mu artık neyse onu da dediğim gibi extern yapın kullandığınız yere.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: OxfordBlue - 18 Eylül 2015, 17:11:40
Oldu. teşekkürler,

hex dosyasının oluşturulduğu yeri değiştirmek istiyorum.

Mainboard.X/dist/default/production/Mainboard.X.production.hex...
hex dosyası bu konuma oluşturuluyor.

Mainboard.X/hex/Mainboard.X.production.hex...
dosya konumuna oluşturulmasını istiyorum
propertiese bakıyorum ama uygun bir yer bulamadım.

Bu konuda bilginiz var mı ?
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Gökhan BEKEN - 18 Eylül 2015, 17:57:32
Bildiğim kadarıyla değiştirilmiyor.
Bu sayfayı inceleyin: http://microchip.wikidot.com/mplabx:directory-structure (http://microchip.wikidot.com/mplabx:directory-structure)
görüldüğü üzere, "şu şekilde değiştirebilirsiniz" felan da yazmamışlar.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Tagli - 18 Eylül 2015, 20:07:58
MPLAB X proje ayarlarında derlemeden sonra çalıştırılacak programlar tanımlanabiliyor. Basit bir betik yazarak .hex dosyasını oluştuktan sonra otomatik taşımak mümkün olabilir.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: OxfordBlue - 24 Eylül 2015, 18:18:50
Herkese iyi bayramlar,

while ((SSPCON2 & 0x1F) | (SSPSTATbits.R_W))

bu kodun anlamını bana açıklayabilirmisiniz ?
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Tagli - 24 Eylül 2015, 19:51:26
İyi bayramlar.

PIC'in modeli nedir?
Ne iş yapan bir programın içinde geçiyor bu kod?
Bu tek bir satırın altında ne var, üstünde ne var?
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: OxfordBlue - 24 Eylül 2015, 21:19:02
Hocam internetde gezerken karşıma gelmişti. sadece komut setinde eksiklerim olduğunu düşündüm

while ((SSPCON2 & 0x1F) | (SSPSTATbits.R_W))

Burada tahminim SSPCON2= 0x1F ise  veya SSPSTATBİTS.r_w bir olduğu müddetçe burada bekle diye anlıyorum.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: sovalye - 24 Eylül 2015, 21:28:04
çok yanlış gelmişsiniz :)

sspcan2 'nin bitleri ile 0x1f in bitleri üzerinde AND işlemini yap daha sonra bunu sspstatbits.r_w ninkiler ile OR la çıkan sonuç sıfırdan farklı ise döngünün içine gir.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: baran123 - 24 Eylül 2015, 21:28:37
| = or işlemi yap
& = ve işlemi yap
|| = (1. veya 2.)
&& = (1 ve 2)

mesaj birleştirme:: 24 Eylül 2015, 21:29:11

https://gelecegiyazanlar.turkcell.com.tr/konu/ios/egitim/ios-101/mantiksal-operatorler
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: OxfordBlue - 23 Ocak 2016, 20:53:21
define CHECK_BIT(var,pos)  !!((var) & (1 << (pos)))

merhabalar bu satırın anlamı hakkında yardımcı olabilecek var mı?
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: vitruvius - 23 Ocak 2016, 21:08:52
Alıntı yapılan: OxfordBlue - 23 Ocak 2016, 20:53:21
define CHECK_BIT(var,pos)  !!((var) & (1 << (pos)))

merhabalar bu satırın anlamı hakkında yardımcı olabilecek var mı?

Bir değişkenin herhangi bir bitini kontrol etmek için kullanılan makro.

var yerine test etmek istediğiniz değişkeni, pos yerine de hangi bitini test etmek istediğinizi yazarsanız o bitin değerini görürsünüz.

int temp = 0x55 // 01010101
CHECK_BIT(temp, 3)

0 değerini döndürecektir.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: OxfordBlue - 23 Ocak 2016, 22:01:34
Alıntı yapılan: vitruvius - 23 Ocak 2016, 21:08:52
Bir değişkenin herhangi bir bitini kontrol etmek için kullanılan makro.

var yerine test etmek istediğiniz değişkeni, pos yerine de hangi bitini test etmek istediğinizi yazarsanız o bitin değerini görürsünüz.

int temp = 0x55 // 01010101
CHECK_BIT(temp, 3)

0 değerini döndürecektir.

teşekkürler hocam , kodun içeriğindende bahsedermisin?

benim bildiğim pos (1 << (pos)) sola kaydırma işlemi yapıyor.
!! hakkında hiç bilgim yok.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: vitruvius - 23 Ocak 2016, 23:20:36
Mantık şu; bir bitin 1 mi 0 mı olup olmadığını nasıl anlarsın? O biti 1 ile "and" işlemine tabi tutarsan sana bitin değerini verir.

Yani ilk önce, hangi biti test etmek istiyorsan o bitin altına 1 sayısını yerleştirmek lazım. Diyelim ki çalıştığımız sayı 0x55;

01010101   bizim sayımız
00000001   0x01 (1 şu an 0. bitte)

Biz 6 numaralı biti test etmek istiyorsak alt sayıdaki 1'i altıncı bit hanesine kaydırmamız lazım.

01010101   0x55
01000000   1 << 6 işlemi ile 1'i, 6 bit sola kaydırdık. Böylece istediğimiz yere geldi.

Bundan sonra esas sayımızla bizim hazırladığımız "maske"yi "and" işlemine sokarsak;

01000000 sonucunu elde ederiz. Bu sayı hex olarak 0x40, decimal olarak 64'dür. Yani bu işlemin sonucunu int bir değişkene atarsan 64 olarak saklanır.

Ama bu sayıyı boolean bir değişkenmiş gibi kullanmak isteyebilirsin. Yani sayıyı ya 0'a, yada 1'e dönüştürmek isteyebilirsin. Burada "!" (lojik değil) operatörü devreye giriyor.

Lojik anlamda C dilinde bir sayı "0" değilse "1" olarak kabul edilir. Sayı negatif olsa bile. Yani;

01000000  lojik-1'dir. Bunun tersini alırsan;

!(01000000) lojik-0 elde edersin -> 00000000

Bunun bir daha tersini alırsan;

!(00000000) lojik-1 elde edersin -> 00000001

Yani lojik anlamda sayının değeri değişmemiş oluyor. Tersinin tersini almak sayıyı değiştirmez.

Örnek bir kodla bakarsak;

#include <stdio.h>
#define CHECK_BIT1(var,pos)  ((var) & (1 << (pos)))    // Hicbir lojik ters islemi yapmadan
#define CHECK_BIT2(var,pos)  !((var) & (1 << (pos)))   // Sonucun bir kere tersini alarak
#define CHECK_BIT3(var,pos)  !!((var) & (1 << (pos)))  // Sonucun iki kere tersini alarak

int main()
{
int temp = 0x55;
int result1, result2, result3;

result1 = CHECK_BIT1(temp, 6);
result2 = CHECK_BIT2(temp, 6);
result3 = CHECK_BIT3(temp, 6);

printf("Result 1: %#04x -> %d\n", result1, result1);
printf("Result 2: %#04x -> %d\n", result2, result2);
printf("Result 3: %#04x -> %d\n", result3, result3);

return 0;
}


Bu kodun çıkışı:

Result 1: 0x40 -> 64
Result 2: 0000 -> 0
Result 3: 0x01 -> 1


Gördüğün gibi ilk makro'yu int bir değişkene yazınca 0x40, yani 64 olarak saklanır.
İkinci makro'yu int bir değişkene yazınca, bir kere lojik ters işlemini yaptığımız için kontrol ettiğimiz bitin tersini saklamış olduk. 0x00, yani 0.
Üçüncü makro'yu da int bir değişkene yazınca, kontrol ettiğimiz bitin tersinin tersini yazmış oluyoruz. 0x01, yani 1.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: mehmet - 24 Ocak 2016, 02:46:52
https://www.picproje.org/index.php/topic,60384.msg466892.html#msg466892 (https://www.picproje.org/index.php/topic,60384.msg466892.html#msg466892)
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: OxfordBlue - 24 Ocak 2016, 18:15:38
Çok açıklayıcı oldu teşekkürler.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: OxfordBlue - 03 Şubat 2016, 15:18:12
Merhaba bit tanımlaması yapmak istiyorum . main .c de kullandığım bir değişkeni örneğin system.c 'dede kullanmak istiyorum.

.c 'de diyorum . header demiyorum çünkü .header lar bit tanımlanamıyorum xc8'de bug olduğunu düşünüyorum

main.c
bit  a=0;

system.c
extern bit a;

bu şekilde çalışmalarda sorun oluyor . uyarı veriyor.
"initializer in extern declaration"

fikri olan var mı ?
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Gökhan BEKEN - 03 Şubat 2016, 15:26:32
c dilinde bit diye bir değişken türü yok.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: t2 - 03 Şubat 2016, 15:35:26




...
typedef union {
    struct {
        unsigned ADON                   :1;
        unsigned GO_nDONE               :1;
        unsigned CHS                    :5;
    };

...
while (ADCON0bits.GO_nDONE);


şeklinde Microchip biti tanımlamış ve kullanmış.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Gökhan BEKEN - 03 Şubat 2016, 16:02:18
Peki system.c dosyası bunu nerden anlasın? Arkadaşın sorunu bu bence :) bit typedef'inin tanımlı olduğu header'i system.c dosyasına include ederse düzelir sanırım.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Tagli - 03 Şubat 2016, 16:09:17
XC8'de bit türü var ve doğrudan kullanılabiliyor. Ancak sanırım bazı kısıtlamalara tabi. Yanlış hatırlamıyorsam ilk değer verilemiyor ama bu çok sorun değil. xc.h dışında bir şey include etmeye gerek de yok.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: OxfordBlue - 03 Şubat 2016, 16:39:57
arkadaşlar bit değişkenini .header için tanımlanmıyor. sadece .c dosyalarında tanımlanabiliyor .. Denermisiniz ?
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: ahmetzafer - 03 Şubat 2016, 20:02:59
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.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Tagli - 03 Şubat 2016, 22:35:45
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.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: mehmet - 03 Şubat 2016, 22:36:28
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++;
        }
    }
}
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: OxfordBlue - 05 Şubat 2016, 10:16:14
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?


Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Tagli - 05 Şubat 2016, 10:26:22
İ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);
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: vitruvius - 05 Şubat 2016, 10:40:26
İ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.
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: OxfordBlue - 05 Şubat 2016, 11:14:56
İ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
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: OxfordBlue - 06 Şubat 2016, 20:32:35
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 ?
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Gökhan BEKEN - 07 Şubat 2016, 02:56:56
Sorduğunuz soru C dili ile ilgili:  http://www1.gantep.edu.tr/~bingul/c/index.php?ders=15 (http://www1.gantep.edu.tr/~bingul/c/index.php?ders=15)
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: OxfordBlue - 12 Şubat 2016, 11:24:25
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 ?
Başlık: Ynt: XC8 Yeni başlayanlar için basit sorular
Gönderen: Gökhan BEKEN - 12 Şubat 2016, 12:08:26
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.