Picproje Elektronik Sitesi

DERLEYİCİLER => Microchip XC Serisi => Microchip XC8 => Konuyu başlatan: Mucit23 - 04 Mayıs 2014, 01:08:52

Başlık: XC8 Başlangıç
Gönderen: Mucit23 - 04 Mayıs 2014, 01:08:52
Şimdiye kadar pic ile CCS kullanıyordum. XC8 Hiç kullanmadım. Başlangıç için ne yapmam gerekiyor? Bu konuda bir yazı olmasını isterdim açıkçası.
Başlık: Ynt: XC8 Başlangıç
Gönderen: t2 - 04 Mayıs 2014, 01:13:49
mplabx son versiyon kuruyoruz
xc8 son versiyon kuruyoruz.
sonsivriden ilaç kuruyoruz.

böylece başlamış oluyoruz.
Başlık: Ynt: XC8 Başlangıç
Gönderen: subram - 04 Mayıs 2014, 01:29:10
Hocam temel konular için blogdaki yazıları inceleyebilirsiniz. Zaman ayırıp devam edemiyorum. Fırsat bulursam bir ara devam ederim konulara.

http://ramazansubasi.net/ (http://ramazansubasi.net/)
Başlık: Ynt: XC8 Başlangıç
Gönderen: Mucit23 - 04 Mayıs 2014, 01:34:41
Hocam Basit işleri halletsem devam ederim zaten. Mesela Proje dosyası oluşturma, Projeye kütüphane ekleme vs.

Donanım kütüphanelerim yok. Örneğin 2x16 lcd vs.
Altyapım hiç yok.
Başlık: Ynt: XC8 Başlangıç
Gönderen: subram - 04 Mayıs 2014, 01:45:49
o zaman blog tam size göre, ilk yazılar başlamanız için gerekli konuları içeriyor.
Başlık: Ynt: XC8 Başlangıç
Gönderen: galenga - 04 Mayıs 2014, 03:23:19
            @subram hocam ccs c ye başlamak nasip olmadı daha , okul tatile girince başlamayı düşünüyorum ama biraz ufak tefek detaylarla çok uğraşan birisiyim kalktım araştırma yaptım forumda da

okumuştum xc8 iyi gibi bana kısa öneride bulurmusunuz acaba , amacım mikrodenetliyicide donanıma iyice hakim olup sonrasında arm a geçmek ve büyük projelerle uğraşmak ,  sonradan bir daha ondan

buna bundan şuna geçeyim gibi bir durum olsun istemiyorum , bu 1 numara büyüğünü al seneyede giyersin mantığından mı geliyor bilmiyorum ama bir yön gösterirseniz sevinirim .
Başlık: Ynt: XC8 Başlangıç
Gönderen: subram - 04 Mayıs 2014, 03:31:41
xc8 için öneride bulunacağım tekşey; Kullanın. Gerisi size kalmış birşey. Yukarıda da yazdım Xc8'e başlamak için temel bilgiler blogumda mevcut, oradan başlayabilirsiniz kullanmak için. Takıldığınız bir yer olursa yardımcı olmaya çalışırım.
Başlık: Ynt: XC8 Başlangıç
Gönderen: Gökhan BEKEN - 04 Mayıs 2014, 04:34:22
Öncelikle IDE'yi tanıyın, bu adımda netbeans tutorial'leri veya mplabx TV işinizi görecektir: http://www.microchip.com/pagehandler/en-us/family/mplabx/#VideoContent (http://www.microchip.com/pagehandler/en-us/family/mplabx/#VideoContent)



MPLABX'te yeni bir proje oluşturup, derleyici olarak xc8′i seçip, dilediğiniz bir mcu seçip(bu derste 18F4685 kullandık) kaydediniz.
Projelerimizde kodların karman çorman olmaması için header dosyaları kullanacağız, ve tekrarlanan işlemleri tekrar tekrar yazmamak için fonksiyonel yapılar kullanacağımızı şimdiden belirtelim.

Projemizi açtıktan sonra, Header files kısmından "main.h" adında yeni bir dosya ekleyelim:
(http://gokhanbeken.com/resimler/xc8_dersleri/header_dosyasi_ekleme.png)

(http://gokhanbeken.com/resimler/xc8_dersleri/header_dosyasi_ekleme-2.png)

Sıradaki yapacağımız işlem ise, configuration bits işlemidir. Daha önceden ezbere bilmiyorsak veya programlayacağımız pic ile ilk defa çalışıyorsak mplabx imdadımıza yetişiyor ve istediğimiz özelliklere göre kod üretiyor. Aşağıdaki adımları takip ederek, configuration bits'leri ayarlayabiliriz.

1- Window menüsünden, PIC Memory Views / Configurations Bits yolunu takip ediyoruz

(http://gokhanbeken.com/resimler/xc8_dersleri/configuration_bits-1.png)

2-Settings kısmından internal(dahili) osilatörü seçip, WDT'yi disable seçiyoruz. Varsa, başka ayarlarıda seçerek, "Generate Source Code to Output" butonuna tıklıyoruz:
(http://gokhanbeken.com/resimler/xc8_dersleri/configuration_bits-2.png)

3-Output kısmından üretilen kodları kopyalayıp, main.h dosyamıza yapıştırıyoruz.
(http://gokhanbeken.com/resimler/xc8_dersleri/configuration_bits-3.png)

4-Aşağıda göreceğiniz üzere 4. satırın altı çizili, bunun sebebi main.c dosyamızda henüz hiç bir kod olmadığı için, dolayısıyla main.h dosyamızı çağırmadığımız için hata vermesidir.
(http://gokhanbeken.com/resimler/xc8_dersleri/configuration_bits-4.png)

Configuratin bitlerini 2 farklı şekilde yazabiliriz. İster alt alta yazarız, ister yan yana virgül ile ayırarak... Alt alta yazmanın avantajı tek tek açıklama yapabilmemizdir. Yan yana yazmanın avantajı tek satırda bütün konfigürasyonu yapabilmemizdir. Eğer eklediğiniz konfigurasyonun ne işe yaradığını tek tek biliyorsanız ve unutmayacağınıza inanıyorsanız, en iyisi yan yana yazmaktır.

Aşağıdaki tek satırlık kod ile, 3 satırlık kodlar birbirine eştir:
(http://gokhanbeken.com/resimler/xc8_dersleri/configuration_bits-5.png)

Configuration bits kodlarını da ekledikten sonra kullandığımız pic'in header dosyasınıda çağırmamız gerekiyor. Bunun için

#include <pic18f4685.h>

satırını eklememiz yeterlidir.
Bekleme fonksiyonlarının kaç herz'e göre yapılacağını bildirmemiz gerekmektedir. Çünkü derleyici bizim kullandığımız osilatörün frekansını bilemez. Aşağıdaki tanımlama ile 4000000 hz'lik osilatör kullandığımızı belirtiyoruz.

   
#define _XTAL_FREQ 4000000

Sonuç olarak main.h dosyamızın son hali aşağıdaki gibi olacaktır.


/*
* File:   main.h
* Author: M. Gokhan BEKEN
* [url=http://www.GokhanBeken.com]www.GokhanBeken.com[/url]
*
* Created on 14 Aralik 2013 Cumartesi, 21:55
*/
// PIC18F4685 Configuration Bit Settings
#include <pic18f4685.h> //pic 18f4620 seçiliyor
#include <xc.h>
#define _XTAL_FREQ 4000000 //Bekleme fonksiyonlarini 4mhz kristal için ayarlar
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

// CONFIG1H
#pragma config OSC = IRCIO67    // Oscillator Selection bits (Internal oscillator block, port function on RA6 and RA7)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF       // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)

// CONFIG2L
#pragma config PWRT = OFF       // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = BOHW     // Brown-out Reset Enable bits (Brown-out Reset enabled in hardware only (SBOREN is disabled))
#pragma config BORV = 3         // Brown-out Reset Voltage bits (VBOR set to 2.1V)

// CONFIG2H
#pragma config WDT = OFF        // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
#pragma config WDTPS = 32768    // Watchdog Timer Postscale Select bits (1:32768)

// CONFIG3H
#pragma config PBADEN = ON      // PORTB A/D Enable bit (PORTB<4:0> pins are configured as analog input channels on Reset)
#pragma config LPT1OSC = OFF    // Low-Power Timer 1 Oscillator Enable bit (Timer1 configured for higher power operation)
#pragma config MCLRE = ON       // MCLR Pin Enable bit (MCLR pin enabled; RE3 input pin disabled)

// CONFIG4L
#pragma config STVREN = ON      // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
#pragma config LVP = ON         // Single-Supply ICSP Enable bit (Single-Supply ICSP enabled)
#pragma config BBSIZ = 1024     // Boot Block Size Select bits (1K words (2K bytes) Boot Block)
#pragma config XINST = OFF      // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))

// CONFIG5L
#pragma config CP0 = OFF        // Code Protection bit (Block 0 (000800-003FFFh) not code-protected)
#pragma config CP1 = OFF        // Code Protection bit (Block 1 (004000-007FFFh) not code-protected)
#pragma config CP2 = OFF        // Code Protection bit (Block 2 (008000-00BFFFh) not code-protected)
#pragma config CP3 = OFF        // Code Protection bit (Block 3 (00C000-00FFFFh) not code-protected)
#pragma config CP4 = OFF        // Code Protection bit (Block 4 (010000-013FFFh) not code-protected)
#pragma config CP5 = OFF        // Code Protection bit (Block 5 (014000-017FFFh) not code-protected)

// CONFIG5H
#pragma config CPB = OFF        // Boot Block Code Protection bit (Boot block (000000-0007FFh) not code-protected)
#pragma config CPD = OFF        // Data EEPROM Code Protection bit (Data EEPROM not code-protected)

// CONFIG6L
#pragma config WRT0 = OFF       // Write Protection bit (Block 0 (000800-003FFFh) not write-protected)
#pragma config WRT1 = OFF       // Write Protection bit (Block 1 (004000-007FFFh) not write-protected)
#pragma config WRT2 = OFF       // Write Protection bit (Block 2 (008000-00BFFFh) not write-protected)
#pragma config WRT3 = OFF       // Write Protection bit (Block 3 (00C000-00FFFFh) not write-protected)
#pragma config WRT4 = OFF       // Write Protection bit (Block 4 (010000-013FFFh) not write-protected)
#pragma config WRT5 = OFF       // Write Protection bit (Block 5 (014000-017FFFh) not write-protected)

// CONFIG6H
#pragma config WRTC = OFF       // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write-protected)
#pragma config WRTB = OFF       // Boot Block Write Protection bit (Boot block (000000-0007FFh) not write-protected)
#pragma config WRTD = OFF       // Data EEPROM Write Protection bit (Data EEPROM not write-protected)

// CONFIG7L
#pragma config EBTR0 = OFF      // Table Read Protection bit (Block 0 (000800-003FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR1 = OFF      // Table Read Protection bit (Block 1 (004000-007FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR2 = OFF      // Table Read Protection bit (Block 2 (008000-00BFFFh) not protected from table reads executed in other blocks)
#pragma config EBTR3 = OFF      // Table Read Protection bit (Block 3 (00C000-00FFFFh) not protected from table reads executed in other blocks)
#pragma config EBTR4 = OFF      // Table Read Protection bit (Block 4 (010000-013FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR5 = OFF      // Table Read Protection bit (Block 5 (014000-017FFFh) not protected from table reads executed in other blocks)

// CONFIG7H
#pragma config EBTRB = OFF      // Boot Block Table Read Protection bit (Boot block (000000-0007FFh) not protected from table reads executed in other blocks)


Yaptığı tek iş bütün ledleri yakmak olan main.c dosyası aşağıdaki gibidir:

#include "main.h"

void main(void)
{
    TRISA=0x00; //A PORT'unun bütün pinleri çıkış olsun
    TRISB=0x00; //B PORT'unun bütün pinleri çıkış olsun
    TRISC=0x00; //C PORT'unun bütün pinleri çıkış olsun
    TRISD=0x00; //D PORT'unun bütün pinleri çıkış olsun
    TRISE=0x00; //E PORT'unun bütün pinleri çıkış olsun

    LATA=0xFF; //A PORT'unun bütün pinleri HIGH olsun
    LATB=0xFF; //B PORT'unun bütün pinleri HIGH olsun
    LATC=0xFF; //C PORT'unun bütün pinleri HIGH olsun
    LATD=0xFF; //D PORT'unun bütün pinleri HIGH olsun
    LATE=0xFF; //E PORT'unun bütün pinleri HIGH olsun

    for(;;); //sonsuz döngü
}


İlk programımızın görüntüsü aşağıdaki gibi olacaktır:
(http://gokhanbeken.com/resimler/xc8_dersleri/isis_ledler.png)

Şimdi TRIS, LAT ve PORT tanımlamalarını inceleyelim.
TRIS: Portların yani pic'in giriş çıkış olarak kullanabildiğimiz pinlerinin, giriş mi yoksa çıkış mı olarak kullanacağımızı belirttiğimiz yazmaçlardır. Giriş olarak kullanacağımız pinlerin tris değeri 1, çıkışların ise 0 dır. TRISA demek A portu ile ilgili tris ayarları demektir. TRISA=0b00001111 der isek; a0,a1,a2 ve a3 pinlerine 1 verdiğimiz için giriş olacak, a4,a5,a6 ve a7 pinleri çıkış olacaktır. Giriş olan pinler buton bağlantıları veya herhangi bir dış tetikleme için kullanılabilir. Çıkış olanları ise led yakma gibi işler için kullanabiliriz.

Diğer pinleri karıştırmadan sadece tek bir pinin tris'ini ayarlamak için aşağıdaki gibi bir kullanım şekli vardır:

TRISAbits.RA0=0; //a0 pini çıkış olsun
TRISAbits.RA1=1; //a1 pini giriş olsun
TRISBbits.RB0=1; //b0 pini giriş olsun
TRISCbits.RC3=0; //c3 pini çıkış olsun


LAT: Çıkış olarak ayarladığımız pinlerin yönetimi çin kullanılır. LATA=0xFF demek a portunun bütün bitlerini HIGH yap demektir.

Tris'te olduğu gibi bit bit ayarlama şansımız da vardır:

LATAbits.LATA1=1; //a1=high
LATBbits.LATB3=0; //b3=low
LATCbits.LATC5=0; //c5=low
LATDbits.LATD2=1; //d2=high


PORT:  Giriş olarak ayarladığımız pinlerin durumunu öğrenmek için kullanılır genelde ancak tek kullanımı bu değildir. Eski piclerde lat olayı olmadığı için port kullanımı hem çıkış vermek hem de pin okumak içindi. Portlar sanal olarak değil gerçekten okuma yapıyordu. LAT'ın çıkış amacıda bu idi.

programda PORTA=PORTA; derseniz mantıken porta nın değişmemesini beklersiniz ancak portayı önce okuyor sonra direkt porta ya yazdığı için sorun oluyordu. Çünkü bir portu okuduktan hemen sonra yazamazsınız arada çok ufak ta olsa bir zaman gerekir. Bu gibi sorunları aşmak için yazma yapmak için LAT , okuma yazmak için PORT kullanmalıyız. örneğin: LATA=PORTA şeklinde kullanmamız daha verimli olacaktır. Tabiki PORTA=0xFF; gibi bir kullanım hala mevcuttur ancak önerilmez. PORTA nın 3. bitindeki butonun basılı olup olmadığını anlamak için aşağıdaki gibi bir kullanım vardır:

if(PORTAbits.RA0==1)//a0'ın değeri high ise
{
    //yapılacak işlemler
}




EK projeler:
http://gokhanbeken.com/ds1302-projesi-xc8-ve-c18-derleyicileri-icin-tek-program (http://gokhanbeken.com/ds1302-projesi-xc8-ve-c18-derleyicileri-icin-tek-program)
http://gokhanbeken.com/lcd-kutuphanesic18-ve-xc8-icin (http://gokhanbeken.com/lcd-kutuphanesic18-ve-xc8-icin)
Başlık: Ynt: XC8 Başlangıç
Gönderen: Tagli - 04 Mayıs 2014, 08:16:34
#include <pic18f4685.h> Bunu yazmaya gerek yok. xc.h'ı dahil etmek yeterli.

Ayrıca, ben main.h kullanmıyorum. Header dosyaları daha çok bir arayüzü tanımlamak için kullanılır. main dışarıdan erişilip çağrılan bir öğe barındırmadığı için bir header dosyasının olması pek mantıklı gelmiyor. config tanımlamalarını config.c gibi bir dosyada yapıyorum. Aslında iki yaklaşım arasında teknik olarak bir fark yok galiba.
Başlık: Ynt: XC8 Başlangıç
Gönderen: kantirici - 04 Mayıs 2014, 08:59:14
Başlangıç için yararlı bir kaynak.

http://www.gooligum.com.au/tut_baseline_C.html (http://www.gooligum.com.au/tut_baseline_C.html)
Başlık: Ynt: XC8 Başlangıç
Gönderen: sigmoid - 04 Mayıs 2014, 10:53:08
Alıntı yapılan: Mucit23 - 04 Mayıs 2014, 01:34:41
Hocam Basit işleri halletsem devam ederim zaten. Mesela Proje dosyası oluşturma, Projeye kütüphane ekleme vs.

Donanım kütüphanelerim yok. Örneğin 2x16 lcd vs.
Altyapım hiç yok.
PIC16 için donanım kütüphanelerini yazıyorum. 8bit modda lcdye erişim tamam. 4 bit mod için düzenlemelere devam ediyorum.
Başlık: Ynt: XC8 Başlangıç
Gönderen: Mucit23 - 04 Mayıs 2014, 10:57:29
@meftun Teşekkür ederim. Açıkçası böyle bir yazı yazmanı bekliyordum :)

@sigmoid hocam 8 bit ile lcd yi çalıştırdıysanız 4bit ile çalışacak şekilde ben düzenleyebilirim
Başlık: Ynt: XC8 Başlangıç
Gönderen: sigmoid - 04 Mayıs 2014, 11:50:20
bitmek üzere, 4 bitte LCDden veri okuma ve geriyede biraz test yapmak kalıyor.
Başlık: Ynt: XC8 Başlangıç
Gönderen: Tagli - 04 Mayıs 2014, 17:18:31
Ben zamanında bir kod paylaşmıştım:
https://www.picproje.org/index.php/topic,40341.msg296824.html#msg296824 (https://www.picproje.org/index.php/topic,40341.msg296824.html#msg296824)
Başlık: Ynt: XC8 Başlangıç
Gönderen: Mucit23 - 04 Mayıs 2014, 22:30:04
ilk proje için çalışmalara başladım. main.h dosyası oluşturdum. main.c de oluşturdum. Şimdi main.c  içerisine main fonksiyonunu ekleyip main.h'ı dahil etmeden derleyebiliyorum ama main.h dosyasını ekleyince aşağıdaki hatayı alıyorum.

main.c:7: error: (141) can't open include file "main.h": No such file or directory

Sanırım main.h dosyasını bulamıyor ama proje ağacında header files altında main.h görünüyor.

main.h'ı başka bir yerdemi tanıtmam gerekiyor. Problem nedir

XC8'in arayüzü açıkçası çok hoşuma gitti. Alışırsam CCS ye bakmam bile. Fakat kullanmayı öğrenmem gerek.
Mesela şunu sorayım.

Bir library ekleyeceğim. Örneğin DS1302 Library'si

DS1302.c ve DS1302.h diye iki adet dosyam var.

Ben Proje ağacında DS1302 diye bir klasör açıp DS1302 ile ilgili dosyaları orada tutmak istiyorum. Yani Bütün library dosyalarını Header files ve Source Files altında toplamak istemiyorum. (Karmaşa olmaması için)

Nasıl yaparım?
Başlık: Ynt: XC8 Başlangıç
Gönderen: Tagli - 04 Mayıs 2014, 22:43:54
Proje ayarlarında header dosyaları için bir include adresi (veya birden fazla) tanımlama gerekiyordu ama tam yerini tarif edemeyeceğim, şimdi önümde bulunan bilgisayarda yüklü değil. Aynı şeyi .c dosyaları için de yapmak gerekiyor olabilir. Yarın bir bakarım.

Aslında galiba include yollarını (header seach path) tanımlamak yerine #include "adres/dosya_adi" şeklinde doğrudan yol da yazılabilir ama XC8 rehberinde CCI (Common C Interface) standardı uyarınca bu tavsiye edilmiyor. Adres include yoluna eklenip #include "dosya_adi" şeklinde yazılması öneriliyor.
Bkz. XC8 C Compiler User's Guide 2.4.3 Header File Specification

Ancak, bir süre ben de o şekilde kullandıktan sonra eski usule geri döndüm. Klasör içinde saklamak biraz daha zahmetli olabiliyor. Genelde proje klasörü içine src diye bir klasör açıp tüm .c ve .h dosyalarını oraya koyuyorum. Zaten genelde proje çok büyük olmuyor. Belki harici kütüphaneleri lib adında bir klasörde toplamak iyi bir organizasyon şekli olabilir. Tartışmaya açık bir konu bu.
Başlık: Ynt: XC8 Başlangıç
Gönderen: Mucit23 - 04 Mayıs 2014, 23:01:02
Hocam başka bir proje dosyası oluşturup çözdüm problemi.

Proje ağaıcı konusuna gelirsel, Bende STM32 den alıştım bu olaya. Bir proje ile uğraşırken proje ağacının düzenli olmasını istiyorum. Gerçi STM32 ilede karıştırmamak lazım. STM32'de kendi iç donanımlarını kullanabilmek için bile kütüphanesini eklemek gerekiyor. Bu yüzden çok karmaşa oluyor.

Dediğiniz gibi tartışmaya açık bir konu.

mesaj birleştirme:: 04 Mayıs 2014, 23:25:22

iyi gitmiyoruz.

kütüphane eklemede ciddi sıkıntılar çekiyorum. Mesela LCD kütüphanesi ekleyeceğim. LCD.h ve LCD.c Dosyalarım proje klasöründe.

Header Files ve Source Files Dosyalarının içine LCD.h ve LCD.c yi ekliyorum ama dosya bulunamıyor hatası alıyorum..

make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory `C:/Users/My_PC/Desktop/Son Projeler/Pid_Motor_Kontrol/XC_Software/Pid_Test.X'
make  -f nbproject/Makefile-default.mk dist/default/production/Pid_Test.X.production.hex
make[2]: Entering directory `C:/Users/My_PC/Desktop/Son Projeler/Pid_Motor_Kontrol/XC_Software/Pid_Test.X'
"C:\Program Files (x86)\Microchip\xc8\v1.31\bin\xc8.exe" --pass1  --chip=16F877A -Q -G  --double=24 --float=24 --opt=default,+asm,+asmfile,-speed,+space,-debug --addrqual=ignore --mode=free -P -N255 --warn=0 --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,+osccal,-resetbits,-download,-stackcall,+clib --output=-mcof,+elf:multilocs --stack=compiled:auto:auto "--errformat=%%f:%%l: error: (%%n) %%s" "--warnformat=%%f:%%l: warning: (%%n) %%s" "--msgformat=%%f:%%l: advisory: (%%n) %%s"    -obuild/default/production/main.p1  main.c
main.c:3: error: (141) can't open include file "LCD.h": No such file or directory
make[2]: Leaving directory `C:/Users/My_PC/Desktop/Son Projeler/Pid_Motor_Kontrol/XC_Software/Pid_Test.X'
make[1]: Leaving directory `C:/Users/My_PC/Desktop/Son Projeler/Pid_Motor_Kontrol/XC_Software/Pid_Test.X'
(908) exit status = 1
make[2]: *** [build/default/production/main.p1] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

BUİLD FAILED (exit value 2, total time: 307ms)


mesaj birleştirme:: 05 Mayıs 2014, 00:56:20

projeye bir dosya include ederken <> işareti ile çift tırnak "" arasında ne fark var.

Yukarıdaki hatayı çözdüm projeye dosya include ederken çift tırnak kullanmak gerekiyor.
Ayrıca aynı isimli library dosyalarını (Örneğin lcd.h ve lcd.c) projeye eklerken header files altına lcd.h'ı eklemek yeterli. LCD.c'yi eklemeye gerek yok.

Sonradan main.c içerisinde #include "lcd.h" komutu ile gerekli dosyayı projeye dahil ettim. Şimdide aşağıdaki hatayı alıyorum.

Örneğin LCD_init() fonksiyonunu çağırıyorum. Gelen hata aşağıdaki gibi.
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory `C:/Users/My_PC/Desktop/Son Projeler/Pid_Motor_Kontrol/XC_Software/Pid_Test.X'
make  -f nbproject/Makefile-default.mk dist/default/production/Pid_Test.X.production.hex
make[2]: Entering directory `C:/Users/My_PC/Desktop/Son Projeler/Pid_Motor_Kontrol/XC_Software/Pid_Test.X'
"C:\Program Files (x86)\Microchip\xc8\v1.31\bin\xc8.exe" --pass1  --chip=16F877A -Q -G  --double=24 --float=24 --opt=default,+asm,+asmfile,-speed,+space,-debug --addrqual=ignore --mode=free -P -N255 --warn=0 --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,+osccal,-resetbits,-download,-stackcall,+clib --output=-mcof,+elf:multilocs --stack=compiled:auto:auto "--errformat=%%f:%%l: error: (%%n) %%s" "--warnformat=%%f:%%l: warning: (%%n) %%s" "--msgformat=%%f:%%l: advisory: (%%n) %%s"    -obuild/default/production/main.p1  main.c
"C:\Program Files (x86)\Microchip\xc8\v1.31\bin\xc8.exe"  --chip=16F877A -G -mdist/default/production/Pid_Test.X.production.map  --double=24 --float=24 --opt=default,+asm,+asmfile,-speed,+space,-debug --addrqual=ignore --mode=free -P -N255 --warn=0 --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,+osccal,-resetbits,-download,-stackcall,+clib --output=-mcof,+elf:multilocs --stack=compiled:auto:auto "--errformat=%%f:%%l: error: %%s" "--warnformat=%%f:%%l: warning: (%%n) %%s" "--msgformat=%%f:%%l: advisory: (%%n) %%s"     -odist/default/production/Pid_Test.X.production.elf  build/default/production/main.p1     
Microchip MPLAB XC8 C Compiler (Free Mode) V1.31
Copyright (C) 2014 Microchip Technology Inc.
:0: error: undefined symbol:
        _lcd_init(dist/default/production\Pid_Test.X.production.obj)
(908) exit status = 1
make[2]: *** [dist/default/production/Pid_Test.X.production.hex] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
make[2]: Leaving directory `C:/Users/My_PC/Desktop/Son Projeler/Pid_Motor_Kontrol/XC_Software/Pid_Test.X'
make[1]: Leaving directory `C:/Users/My_PC/Desktop/Son Projeler/Pid_Motor_Kontrol/XC_Software/Pid_Test.X'

BUİLD FAILED (exit value 2, total time: 1s)


2 saattir uğraşıyorum. Library eklemeyi adam akıllı çözemedim  :-\
@meftun nerelerdesin :o
Başlık: Ynt: XC8 Başlangıç
Gönderen: Mucit23 - 05 Mayıs 2014, 10:00:51
Güncel

Çözemedim arkadaşlar.
Başlık: Ynt: XC8 Başlangıç
Gönderen: JKramer - 05 Mayıs 2014, 10:18:34
Projeye lcd.c dosyasını eklemelisiniz. Projeye eklemek derken main.c içinde #include "lcd.c" yazmayı kastetmiyorum. Sonuçta tüm .c dosyaları tek tek (ayrı ayrı) derlenebilmesi lazım (object file oluşması için), siz lcd.c dosyasını eklemezseniz, program olmayan bir şeyi derleyemez.

Ek: http://www.cprogramming.com/compilingandlinking.html (http://www.cprogramming.com/compilingandlinking.html)
http://stackoverflow.com/questions/6264249/how-does-the-compilation-linking-process-work (http://stackoverflow.com/questions/6264249/how-does-the-compilation-linking-process-work)
Başlık: Ynt: XC8 Başlangıç
Gönderen: Tagli - 05 Mayıs 2014, 10:19:11
Proje klasörünü sıkıştırıp verebilirsen bir bakayım.
Başlık: Ynt: XC8 Başlangıç
Gönderen: Mucit23 - 05 Mayıs 2014, 10:47:28
Hocam proje dosyası burada
http://yadi.sk/d/tk32OGm3P5jmJ (http://yadi.sk/d/tk32OGm3P5jmJ)

LCD kütüphanesi benim stm32 ile kullandığım kütüphane. pic ile çalışacak şekilde düzenledim. Derleyebilsem kodlarda hata varmı yokmu göreceğim.

Başka bir kütüphaneyi yani aynı isimli c ve h dosyalarını nasıl projeye ekleyeceğimi anlatırsanız sevinirim.
Başlık: Ynt: XC8 Başlangıç
Gönderen: Tagli - 05 Mayıs 2014, 14:23:21
.c dosyası projeye eklenmemiş. Ekleyince derleme yapıyor. Eklemeyi resim ile gösterdim. Gerçi birkaç ufak sorun daha vardı onları da düzelttim. Örneğin LCD.h içinde xc.h include edilmemişti. LCD_E'nin kullanımıyla ilgili de birkaç yazım hatası vardı. Düzeltmediğim sadece bir warning kaldı, işaretli sayının işaretsiz değişkene atanması ile ilgili. Çalışma şeklini incelemediğim için o konuda yorum yapmaktan kaçındım.

(http://s29.postimg.cc/yviyrx6k7/ekleme.png)

Proje Linki: http://s3.dosya.tc/server22/FVkMp4/Pid_Test.X_duzeltilmis_.zip.html (http://s3.dosya.tc/server22/FVkMp4/Pid_Test.X_duzeltilmis_.zip.html)
Başlık: Ynt: XC8 Başlangıç
Gönderen: Mucit23 - 05 Mayıs 2014, 20:49:39
Hocam oraya c dosyası eklediğime eminim. Sonradan kaldırdım. Başka hatalar alıyordum. Bakayım tekrardan..
Başlık: Ynt: XC8 Başlangıç
Gönderen: M_B - 05 Mayıs 2014, 20:54:40
@Mucit23 Hocam;
XC8 icin Mplabx ile ugrasmaya gerek var mı ki?
Mplab icinde de xc8 'i kullanabiliyoruz.
Başlık: Ynt: XC8 Başlangıç
Gönderen: t2 - 05 Mayıs 2014, 21:04:23
Uğraşmak ne kelime? 

Mplabx varken Mplab kullanılmaz.  Mplabx > Mplab
Başlık: Ynt: XC8 Başlangıç
Gönderen: seyityildirim - 03 Ağustos 2015, 10:06:55
@Gökhan BEKEN hocam yeni konu açmayayım dedim. LAT komutunu xc8 tanımadı.

LATB=0xFF;

yazdım. hata mesajı şu
unable to resolve identifier LATB
Başlık: Ynt: XC8 Başlangıç
Gönderen: t2 - 03 Ağustos 2015, 10:15:21
Kullandığınız picde LATB register yoktur. bu yüzden tanımamış olabilir.
Başlık: Ynt: XC8 Başlangıç
Gönderen: Gökhan BEKEN - 03 Ağustos 2015, 10:17:34
t2'nin dediği gibi bütün PIC'ler desteklemiyor. Bildiğim kadarıyla eski 16f serilerinde yok bu komut.
Başlık: Ynt: XC8 Başlangıç
Gönderen: RaMu - 03 Ağustos 2015, 10:23:54
16Fxx instruction set diye aratabilirsin, veya;
16F84 ün datasheet inde
9.0 INSTRUCTION SET SUMMARY
kısmında, Table 9.2 de hangi komutların olduğunu görebilirsin.
Başlık: Ynt: XC8 Başlangıç
Gönderen: seyityildirim - 03 Ağustos 2015, 10:40:14
Çok teşekkürler... kullandığım pic 16f84a idi. datasheetine baktım böyle bir register yok. tekrar teşekkürler
Başlık: Ynt: XC8 Başlangıç
Gönderen: OxfordBlue - 04 Ağustos 2015, 11:20:50
merhabalar

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

Bu kodların yaptıkları işi bana açıklayabilirmisiniz?
Başlık: Ynt: XC8 Başlangıç
Gönderen: Gökhan BEKEN - 04 Ağustos 2015, 11:31:52
ö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.
Başlık: Ynt: XC8 Başlangıç
Gönderen: OxfordBlue - 04 Ağustos 2015, 11:47:55
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.
Başlık: Ynt: XC8 Başlangıç
Gönderen: Gökhan BEKEN - 04 Ağustos 2015, 12:59:55
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.
Başlık: Ynt: XC8 Başlangıç
Gönderen: OxfordBlue - 04 Ağustos 2015, 15:02:19
AN0_Value 16bitlik evet. ADRESH DA 16bit şimdi sorun ortadan kalktı
teşekkürler
Başlık: Ynt: XC8 Başlangıç
Gönderen: 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 ?
Başlık: Ynt: XC8 Başlangıç
Gönderen: mehmet - 28 Ağustos 2015, 12:17:31
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;
}
Başlık: Ynt: XC8 Başlangıç
Gönderen: Gökhan BEKEN - 28 Ağustos 2015, 12:38:05
unsigned char Data[400]=0;
şeklinde tanımlama yapamazsınız.
ama şöyle olur: unsigned char Data[400]={1,2,3,4};
Başlık: Ynt: XC8 Başlangıç
Gönderen: mehmet - 28 Ağustos 2015, 13:04:09
İlk değer atama istenirse söyle yapılabilir...

unsigned char Data[400];
...
for(a = 0; a < 400; a++)
{
     Data[a] = 0;
}
...
Başlık: Ynt: XC8 Başlangıç
Gönderen: OxfordBlue - 28 Ağustos 2015, 14:55:46
Teşekkürler
Başlık: Ynt: XC8 Başlangıç
Gönderen: OxfordBlue - 10 Eylül 2015, 13:19:43
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.
Başlık: Ynt: XC8 Başlangıç
Gönderen: Timucin - 27 Eylül 2016, 10:07:13
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
Başlık: Ynt: XC8 Başlangıç
Gönderen: quarko - 27 Eylül 2016, 15:11:28
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.
Başlık: Ynt: XC8 Başlangıç
Gönderen: Timucin - 28 Eylül 2016, 00:07:21
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 


Başlık: Ynt: XC8 Başlangıç
Gönderen: Mucit23 - 09 Aralık 2016, 17:20:23
xc8 de delay fonksiyonları nasıl sistemeeklenir? __delay_ms fonksiyonları tanımlı değil diye bir hata alıyorum. 
Başlık: Ynt: XC8 Başlangıç
Gönderen: a.zorba - 09 Aralık 2016, 17:27:58
muhtemel iki neden
1 kristal frekansı  tanımlı degil
2 microchip peripheral library kurulu degil.
Başlık: Ynt: XC8 Başlangıç
Gönderen: Mucit23 - 09 Aralık 2016, 17:43:17
Xtal tanımlı hocam. Peripheral library kurmamışım. Nereden indirmem geerekiyo?
Başlık: Ynt: XC8 Başlangıç
Gönderen: JOKERAS - 09 Aralık 2016, 18:25:18
Liblerle falan uğraşmaya gerek yok.
New Proje tıklayıp Categories penceresindeki Samples -> Microchip Embedded tıklayın.
Aynı lokalde,Sağ tarafta Projects penceresindenkullanacağınız işlemci ailesini seçip Alttaki "Next" Tıklayın.
Proje adını ve yolunu belirleyip "Finish" tıklayın.
İdenin sol tarafında proje penceresinde Projeniz Kılçıklarından ayrılmış,Klasik dosyaları
hazır olarak çıkar.

Sonra Projenin Header Files yazan yere tıklayın,System.h içine girip


#define SYS_FREQ        500000L
#define FCY             SYS_FREQ/4


Yazana yeri Allttaki gibi değiştirin.Osc frekansınız ne ise ona göre set edin.

#define _XTAL_FREQ  16000000L
#define FCY              _XTAL_FREQ/4




Başlık: Ynt: XC8 Başlangıç
Gönderen: a.zorba - 09 Aralık 2016, 19:37:30
Alıntı yapılan: Mucit23 - 09 Aralık 2016, 17:43:17
Xtal tanımlı hocam. Peripheral library kurmamışım. Nereden indirmem geerekiyo?
http://www.microchip.com/mplab/compilers

http://www.microchip.com/mymicrochip/filehandler.aspx?ddocname=en574973

xc8 klasorune kurman gerekiyor .
JOKERAS in anlatdıgı yöntemi denemedim .
yapman gereken ayar
(http://i.hizliresim.com/An647Q.png) (http://hizliresim.com/An647Q)
Başlık: Ynt: XC8 Başlangıç
Gönderen: Mucit23 - 09 Aralık 2016, 22:55:24
Hocam yaptım. Şimdi Delay fonksiyonunda hata vermiyor.Fakat delay fonksiyonlarına yüksek değer veremiyorum.

Örneğin __delay_ms(100); fonksiyon hatasız derlenirken __delay_ms(1000); fonksiyonu için aşağıdaki hatayı veriyor.

main.c:30: error: (1355) in-line delay argument too large

Bu neden olur?

@JOKERAS hocam sizin dediğinize de baktım. Ama proje ağacında Header Files altında system.h yok. İlk kez proje oluştururken oraya hiçbir dosya eklemiyor.

Bir sorum daha olacak . Kullandığımız mcu'nun config ayarlarını nasıl göreceğim? #pragma yapısı ile configürasyon yapıldığını biliyorum fakat configlerin tanımlı olduğu bir yer mutlaka olmalı.
Başlık: Ynt: XC8 Başlangıç
Gönderen: Cemre. - 09 Aralık 2016, 23:01:03
Alıntı yapılan: Mucit23 - 09 Aralık 2016, 22:55:24
Hocam yaptım. Şimdi Delay fonksiyonunda hata vermiyor.Fakat delay fonksiyonlarına yüksek değer veremiyorum.

Örneğin __delay_ms(100); fonksiyon hatasız derlenirken __delay_ms(1000); fonksiyonu için aşağıdaki hatayı veriyor.

main.c:30: error: (1355) in-line delay argument too large

Bu neden olur?

@JOKERAS hocam sizin dediğinize de baktım. Ama proje ağacında Header Files altında system.h yok. İlk kez proje oluştururken oraya hiçbir dosya eklemiyor.

Bir sorum daha olacak . Kullandığımız mcu'nun config ayarlarını nasıl göreceğim? #pragma yapısı ile configürasyon yapıldığını biliyorum fakat configlerin tanımlı olduğu bir yer mutlaka olmalı.

Hocam XC8 uzun delay'lara izin vermiyordu.
http://gokhanbeken.com/ds1302-projesi-xc8-ve-c18-derleyicileri-icin-tek-program

Gökhan hocanın kullandığı yöntemle uzun delay'lar üretebilirsiniz.
Başlık: Ynt: XC8 Başlangıç
Gönderen: striger - 09 Aralık 2016, 23:04:19
fonksiyon uint8 tanımlanmıstır 256 max degeridir, ya tanımlama degistirilir uint16 olarak yada dongulerle bikac kez tekrarlanır
Başlık: Ynt: XC8 Başlangıç
Gönderen: Mucit23 - 09 Aralık 2016, 23:10:23
Alıntı yapılan: striger - 09 Aralık 2016, 23:04:19
fonksiyon uint8 tanımlanmıstır 256 max degeridir, ya tanımlama degistirilir uint16 olarak yada dongulerle bikac kez tekrarlanır

Aklıma geldi denedim :) Başka birşey var. __delay_ms() fonksiyonunun kabul ettiği en yüksek değer 197, eğer 198 verirsem hata veriyor. uint8 ile alakası olmaması lazım.
Başlık: Ynt: XC8 Başlangıç
Gönderen: a.zorba - 09 Aralık 2016, 23:13:56
main menu select Window ▶ PIC Memory Views ▶ Configuration Bits

Ayrıntılı bilgi


http://microchip.wikidot.com/mplabx:view
Başlık: Ynt: XC8 Başlangıç
Gönderen: Mucit23 - 09 Aralık 2016, 23:21:17
Teşekürler. konfig işi tamam. Delay işide çok sorun değil. Büyük gecikmelerle pek işim olmuyor olursade dögülerle yaparım artık.

Diğer bir sorum ise özel kütüphaneler, mesela system.h gibi bazı kütüphanelerin tanımlı olduğunu görüyorum internette incelediğim uygulamalarda. Bu dosyalar nerelerde tutuluyor?  Buna benzer kodlamayı kolaylaştıracak ne tür kütüphaneler var?
Başlık: Ynt: XC8 Başlangıç
Gönderen: mehmet - 09 Aralık 2016, 23:54:50
Yanlış hatırlamıyorsam 197.120 cyl en fazla
gecikme yapılabiliyor.
Başlık: Ynt: XC8 Başlangıç
Gönderen: RaMu - 10 Aralık 2016, 00:23:39
Alıntı yapılan: Mucit23 - 09 Aralık 2016, 23:10:23
Aklıma geldi denedim :) Başka birşey var. __delay_ms() fonksiyonunun kabul ettiği en yüksek değer 197, eğer 198 verirsem hata veriyor. uint8 ile alakası olmaması lazım.

256*256*3 ~= 197 000
https://www.picproje.org/index.php/topic,66436.msg518774.html#msg518774
Başlık: Ynt: XC8 Başlangıç
Gönderen: HeCToR - 10 Aralık 2016, 00:29:53
@Mucit23 Alt alta ekleyerek delay verebilirsin.

__delay_ms(100);
__delay_ms(100);
Başlık: 2 adet led i yakıp söndürmek xc8 de
Gönderen: tomi - 17 Mart 2021, 02:56:00
/*
* File:  led_yak_sondur.c
* Author: oguz
*
* Created on 14 Mart 2021 Pazar, 22:59
*/

#include <xc.h>

// PIC18F4520 Configuration Bit Settings
// 'C' source line config statements
// CONFIG1H
#pragma config OSC = XT        // Oscillator Selection bits (XT oscillator)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF      // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)

// CONFIG2L
#pragma config PWRT = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = SBORDIS  // Brown-out Reset Enable bits (Brown-out Reset enabled in hardware only (SBOREN is disabled))
#pragma config BORV = 3        // Brown Out Reset Voltage bits (Minimum setting)

// CONFIG2H
#pragma config WDT = ON        // Watchdog Timer Enable bit (WDT enabled)
#pragma config WDTPS = 32768    // Watchdog Timer Postscale Select bits (1:32768)

// CONFIG3H
#pragma config CCP2MX = PORTC  // CCP2 MUX bit (CCP2 input/output is multiplexed with RC1)
#pragma config PBADEN = ON      // PORTB A/D Enable bit (PORTB<4:0> pins are configured as analog input channels on Reset)
#pragma config LPT1OSC = OFF    // Low-Power Timer1 Oscillator Enable bit (Timer1 configured for higher power operation)
#pragma config MCLRE = ON      // MCLR Pin Enable bit (MCLR pin enabled; RE3 input pin disabled)

// CONFIG4L
#pragma config STVREN = ON      // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
#pragma config LVP = ON        // Single-Supply ICSP Enable bit (Single-Supply ICSP enabled)
#pragma config XINST = OFF      // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))

// CONFIG5L
#pragma config CP0 = OFF        // Code Protection bit (Block 0 (000800-001FFFh) not code-protected)
#pragma config CP1 = OFF        // Code Protection bit (Block 1 (002000-003FFFh) not code-protected)
#pragma config CP2 = OFF        // Code Protection bit (Block 2 (004000-005FFFh) not code-protected)
#pragma config CP3 = OFF        // Code Protection bit (Block 3 (006000-007FFFh) not code-protected)

// CONFIG5H
#pragma config CPB = OFF        // Boot Block Code Protection bit (Boot block (000000-0007FFh) not code-protected)
#pragma config CPD = OFF        // Data EEPROM Code Protection bit (Data EEPROM not code-protected)

// CONFIG6L
#pragma config WRT0 = OFF      // Write Protection bit (Block 0 (000800-001FFFh) not write-protected)
#pragma config WRT1 = OFF      // Write Protection bit (Block 1 (002000-003FFFh) not write-protected)
#pragma config WRT2 = OFF      // Write Protection bit (Block 2 (004000-005FFFh) not write-protected)
#pragma config WRT3 = OFF      // Write Protection bit (Block 3 (006000-007FFFh) not write-protected)

// CONFIG6H
#pragma config WRTC = OFF      // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write-protected)
#pragma config WRTB = OFF      // Boot Block Write Protection bit (Boot block (000000-0007FFh) not write-protected)
#pragma config WRTD = OFF      // Data EEPROM Write Protection bit (Data EEPROM not write-protected)

// CONFIG7L
#pragma config EBTR0 = OFF      // Table Read Protection bit (Block 0 (000800-001FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR1 = OFF      // Table Read Protection bit (Block 1 (002000-003FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR2 = OFF      // Table Read Protection bit (Block 2 (004000-005FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR3 = OFF      // Table Read Protection bit (Block 3 (006000-007FFFh) not protected from table reads executed in other blocks)

// CONFIG7H
#pragma config EBTRB = OFF      // Boot Block Table Read Protection bit (Boot block (000000-0007FFh) not protected from table reads executed in other blocks)

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



#define _XTAL_FREQ 4000000

#define led1 PORTEbits.RE0
#define led2 PORTEbits.RE1

#define but1 PORTBbits.RB6
#define but2 PORTBbits.RB7

// const unsigned char dizi[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
int x=0, dizi[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x6f};
     

void main() {
    TRISA=0x00;
    TRISB=0b11000000;
    TRISC=0b00000000;
    TRISD=0x00;
    TRISEbits.RE0=0;
   
    PORTA=0x00;
    PORTB=0x00;
    PORTC=0x00;
    PORTD=0x00;
    PORTE=0x00;
   
    x=0;
    while(1){
        if (but1==0){
          led1=1 ;
        }
          else {
              led1=0;
          }
                   
        if (but2==0){
                          led2=1;
        }
                          else {
                              led2=0;
                          }
                          }
                      }
Arkadaşlar merhaba,
işlemciye baglı 2 adet butonum ve 2 adette baglı led im var
1. butona bastıgımda 1. led yansın basmadıgımda sönsün ve 2. butona basarsam 2. led yansın basmadıgımda ise sönsün istiyorum ama çok garip çalışıyor, nerede hata yapıyorum?
Başlık: Ynt: XC8 Başlangıç
Gönderen: tomi - 17 Mart 2021, 02:59:46
gönderdikten sonra gördüm ,TRISEbits.RE1=0; yapmamısım
ama gene çalışmadı
Başlık: Ynt: XC8 Başlangıç
Gönderen: ahuramazda - 17 Mart 2021, 09:35:25
Alıntı Yap#define led1 PORTEbits.RE0
#define led2 PORTEbits.RE1

#define led1 LATEbits.LATE0
#define led2 LATEbits.LATE1
Başlık: Ynt: XC8 Başlangıç
Gönderen: tomi - 17 Mart 2021, 11:57:18
çok teşekkür ederim çalıştı ama çok şaşırdım, daha önce ne yazarken nede derlerken ne hata verdi ne de başka bir şey bu kadar vasat olmamalı diye düşünüyorum mplab x ?
Başlık: Ynt: XC8 Başlangıç
Gönderen: tomi - 17 Mart 2021, 12:05:50
bir şey daha soracagım ,
#define but1 PORTBbits.RB6
#define but2 PORTBbits.RB7 bu tanımlamaları kabul edip,

#define led1 PORTEbits.RE0 neden kabul etmiyor yanlış çalışıyor anlamadım?
Başlık: Ynt: XC8 Başlangıç
Gönderen: tomi - 17 Mart 2021, 12:12:29
yazınızı şimdi okudum ahuramazda arkadaşım lat tanımlaması çıkış pinleri içinmiş ,:-) bu arada xc8 için önerebilecegin bir döküman varmı aynı ete kardeşimizin basıc hakkındaki o muhteşem dökümanı gibi?
Başlık: Ynt: XC8 Başlangıç
Gönderen: ahuramazda - 17 Mart 2021, 16:04:05
Microchip'in sitesinde başlangıç için güzel dökümanlar mevcut. Bir de Youtube'da forum üyelerinden bir arkadaşın çalışmaları var. Kanalının ismi genç mucitler gibi bir şeydi hatırladığım kadarıyla
Başlık: Ynt: XC8 Başlangıç
Gönderen: tomi - 17 Mart 2021, 20:02:45
tamam teşekkür ederim :)
Başlık: Ynt: XC8 Başlangıç
Gönderen: tomi - 25 Mart 2021, 01:37:42
Arkadaşlar merhaba,
char c; tipinde bir değişkenim var ve bu değişkenin 8 bitine ayrı ayrı isim vermek istiyorum.Hep hata alıyorum yardım ederseniz çok sevinirim.
Mesela c değişkeninin 0. bitini nasıl ifade edebilirim?
Başlık: Ynt: XC8 Başlangıç
Gönderen: mehmet - 25 Mart 2021, 14:04:59
https://forum.allaboutcircuits.com/threads/packing-bits-in-xc8.144163/
Başlık: Ynt: XC8 Başlangıç
Gönderen: tomi - 25 Mart 2021, 17:17:09
maalesef linkte aradığım bilgi yok, yine de teşekkür ederim.
Başlık: Ynt: XC8 Başlangıç
Gönderen: power20 - 26 Mart 2021, 01:34:16
char c;

BYTE b;
...

b = (BYTE) c;

 olsun.
b nin her bitine isim vermek zor bir iş değil. Son satırdaki gibi c yi bayt olarak yorumlayıp sonra b nin bit isimleri kullanılabilir
Başlık: Ynt: XC8 Başlangıç
Gönderen: tomi - 26 Mart 2021, 02:26:50
valla anladım desem yalan olacak :-)
şimdi,

yukarıdaki c degişkeninin, 0. bitini led0 olarak nasıl tanımlarız?

#define led0 cbits.c0;     degil sanırım ?İşte sormak istediğim bu.Birde 3 adet 1 bit degişken tanımlamak istiyorum oda;

bit x,y,z ; şeklinde olmuyor? Anlayacağınız 2 adet problemim var. :-)
Başlık: Ynt: XC8 Başlangıç
Gönderen: power20 - 26 Mart 2021, 06:25:31
https://www.electro-tech-online.com/threads/accessing-bits-of-variable-xc8.151239/
Başlık: Ynt: XC8 Başlangıç
Gönderen: MCansız - 26 Mart 2021, 08:29:17
merhaba,

mplab x üzerinde plugin olarak MCCyi kurun ve işlemcinin tüm ayarlarını programdan yapabilirsiniz. sizce kullanacağınuız işlemler için kod üretecektir. üretilen kütüphaneleri incelediğinizde konuyu çok daha rahat anlayacaksınız ve bir daha ccs c ye bakmayacaksınız.
Başlık: Ynt: XC8 Başlangıç
Gönderen: RaMu - 26 Mart 2021, 14:19:28
Verilen cevaplar güzelde sorulan sorunun cevabı değil.

Alıntı yapılan: tomi - 26 Mart 2021, 02:26:50...
yukarıdaki c degişkeninin, 0. bitini led0 olarak nasıl tanımlarız?

#define led0 cbits.c0;     degil sanırım ?
...

Böyle bir tanım yapıp
led0 = 1;
gibi kullanmayı istiyorsun.

Byteadı.bitadı
gibi uzun uzun yazmak yerine
direk noktasız tek isim ile rahat rahat kullanmak istiyorsun.

Bildiğim kadarıyla böyle bir şeyi yapamıyorsun.
C dilinin özelliklerinden kaynaklanıyor diye biliyorum bu durum.

Konuyu:
"C'de byteAdi.bitAdi=1; yerine mybit = 1; nasıl yapılabilir? "

gibi bir başlıkla yeniden aç istersen
bilen varsa yardımcı olur.
Başlık: Ynt: XC8 Başlangıç
Gönderen: tomi - 26 Mart 2021, 14:27:06
 ilgilenen cevap veren tüm arkadaşlarıma teşekkür ederim.Bu güne kadar gerek asm ile gerek basic pro ile yazmadıgım program kalmadı, fakat işe bak sadece 8 bitlik bir değişkenin bitlerine isim veremiyoruz, ne acaip şeymiş bu, xc8 e devam ama bitleri ile artık uğraşmıyacagım ...
Başlık: Ynt: XC8 Başlangıç
Gönderen: RaMu - 26 Mart 2021, 15:02:06
Asm dede DsPic te aynı durum var,
bayağı bir kurcalamıştım ya çözüm bulamamış yada kullanılamayacak kadar garip bir çözüm bulmuştum.

C de kod taşınabilirliğini ön planda tutmak lazım.
Çok garip çözümlere girmeyip
byteadi.bitadi kullanımıyla devam etmeli.
Başlık: Ynt: XC8 Başlangıç
Gönderen: power20 - 26 Mart 2021, 15:28:44
......
#Define bit1 byteadi.bitadi

#on 1
#off 0

...
bit1=on;



Başlık: Ynt: XC8 Başlangıç
Gönderen: tomi - 26 Mart 2021, 16:59:18
kılıç arkadaşım,
char x; değişkeni için 0. bitini tanımlayacak kod senin yazdıgına göre?

#Define bit1 byteadi.bitadi --> ne olacak yazabilirmisin?
  bitadı--> tamam
  byteadı-->? ne?   0. bit için bunu yazabilirsen cok sevinirim...


yukarı da raMU arkadaşımda   byteadı.bitadı demiş ama sadece 1 değişken için 1 adet örnege ihtiyacım var...:-)
Başlık: Ynt: XC8 Başlangıç
Gönderen: RaMu - 26 Mart 2021, 17:35:58
Önceki mesajlarda bahsedildiği gibi struct tanımlayacaksın orası için.

Port un biti için struct tanımlamanada gerek yok çünkü zaten tanımlı.

@Kılıç ın mesajına göre

#define led1 PORTBbits.1 demen yeterli
sonra
led1 = 1;
led1 = 0;
şeklinde ledi aç kapa yapabilirsin anlamı çıkıyor ama
define ile bu işin olacağını sanmam.

Ben sanmamaya devam edeyim.
5. sayfadaki mesajları tekrar okuyunca görüyorumki oluyormuş.

Son sorduğun soruyada zaten cevap verilmiş.
Struct tanımlayacaksın, verilen linklerdede anlatılmış ve
nette birçok anlatım var struct için.
Başlık: Ynt: XC8 Başlangıç
Gönderen: tomi - 26 Mart 2021, 17:42:14
RaMu arkadaşım port tanımlamalarında sıkıntı yok yani,

#define led1 PORTBbits.1  değil de #define led1 PORTBbits.RB1 şeklinde tanımlıyorsun hiç sorun yak ve daha sonra led1=0 veya led1=1 rahatlıkla yapıyorsun ama;
iş değişkenin bitlerine gelince olmuyor,
dediğin gibi struct yapılara bakmam lazım oda attıgım taş ürkütdüğüm kuşa degermi bakalım... ;-)
Başlık: Ynt: XC8 Başlangıç
Gönderen: power20 - 26 Mart 2021, 20:11:20
Kesin çözümü yazıyorum.  Az önce denedim

union {
    volatile char val;
 

    struct {
        unsigned b0 : 1;
        unsigned b1 : 1;
        unsigned b2 : 1;
        unsigned b3 : 1;
        unsigned b4 : 1;
        unsigned b5 : 1;
        unsigned b6 : 1;
        unsigned b7 : 1;
    };
} val;

#define val0 val.b0

void test3(void) {

    while (1) {



        val0 = !val0;

        if (val0 == 1) UART_Print("1\r\n");
        else UART_Print("0\r\n");

        __delay_ms(100);
        ClrWdt();
}


Çıktısı da şöyle:

1
0
1
0
1
...
Başlık: Ynt: XC8 Başlangıç
Gönderen: mehmet - 26 Mart 2021, 20:19:33
https://www.codesdope.com/blog/article/set-toggle-and-clear-a-bit-in-c/

https://aticleworld.com/how-to-set-clear-and-toggle-a-single-bit-in-cc/

https://www.includehelp.com/c-programs/preprocessor-programs.aspx

Bunlar da benim kullandıklarım. Anahtar kelime "bitwise".
#define _BV(bit) (1 << (bit))
#define sbi(port, bit) (port) |= _BV(bit)
#define cbi(port, bit) (port) &= ~_BV(bit)

/* Bit Operation macros */
#define sbi(b,n) ((b) |=   (1<<(n)))        /* Set bit number n in byte b   */
#define cbi(b,n) ((b) &= (~(1<<(n))))       /* Clear bit number n in byte b */
#define rbi(b,n) ((b) &    (1<<(n)))        /* Read bit number n in byte b  */
#define fbi(b,n) ((b) ^=   (1<<(n)))        /* Flip bit number n in byte b  */

#define bit_is_set(b,n)   (b & (1<<n))      /* Test if bit number n in byte b is set   */
#define bit_is_clear(b,n) (!(b & (1<<n)))   /* Test if bit number n in byte b is clear */

#define pinToggle(PORT, n)  (PORT ^= 1 << n)
Başlık: Ynt: XC8 Başlangıç
Gönderen: tomi - 27 Mart 2021, 00:14:18
kılıç ve mehmet arkadaşım çok teşekkür ederim , tansiyon düşmüştür....sagolun  :-)
Başlık: Ynt: XC8 Başlangıç
Gönderen: tomi - 31 Mart 2021, 14:09:42
merhaba arkadaşlar,

xc8 kullanıyorum ve program içinde asm kodlarına ihtiyacım oluyor ama ne yaptıysam dahil edemedim mesela,

__asm
   RRCF veri_saat,F
__endasm
          yaptım hata veriyor sonra
#asm
   RRCF veri_saat,F
#endasm   yaptım yine hata veriyor

_asm
   RRCF veri_saat,F
_endasm         yaptım yine hata veriyor

   sanırım yardıma ihtiyacım var...:-(
Başlık: Ynt: XC8 Başlangıç
Gönderen: Tagli - 31 Mart 2021, 14:33:44
Bu tür soruların için resmi XC8 kullanım kılavuzuna bakmalısın. Son versiyonu burada (https://www.microchip.com/content/dam/mchp/documents/DEV/ProductDocuments/UserGuides/50002737D.pdf).

Kılavuzda bu konuyla ilgili bir örnek verilmiş:
unsigned int var;
int main(void)
{
    var = 1;
    asm("bcf 0,3");
    asm("BANKSEL _var");
    asm("rlf (_var)&07fh");
    asm("rlf (_var+1)&07fh");
}

ASM kodu yazarken derleyicinin ürettiği kodla çakışabilecek şeylerden kaçınman gerekiyor. Derleyicinin kendisinin kullandığı register'lara özellikle dikkat etmen gerekiyor. Eğer bunlar bir şekilde değişecekse, sanırım önce yedekleyip sonra işin bittiğinde eski değerlerini geri yerine yüklemelisin.

Ancak sana tavsiyem, çok özel bir ihtiyaç yoksa C içine ASM kodu gömmekten kaçınman, özellikle de bu konularda yeni isen. Yapmak istediğin her ne ise C ile yaz. Birkaç komut ve cycle tasarruf etmek için ortalığı karıştırmaya gerek yok bence.
Başlık: Ynt: XC8 Başlangıç
Gönderen: tomi - 31 Mart 2021, 14:52:08
teşekkür ederim tagli arkadaşım ...
Başlık: Ynt: XC8 Başlangıç
Gönderen: RaMu - 01 Nisan 2021, 14:24:22
Aynı konu üzerinden farklı konularda mesaj yazmak uygunsuz oluyor.
İlgili bir başlık ile yeni konu açarsanız
hem bilgisi olanlar konu başlığını görüp yardımcı olabilir
hemde ileride benzer sorunu yaşayanlar konuyu rahatlıkla bulup faydalanabilir.

Birde kod paylaşırken kod tag ını kullanırsanız
mesaj düzenli ve okuması kolay olur.
Başlık: Ynt: XC8 Başlangıç
Gönderen: OG - 01 Nisan 2021, 14:34:57
Alıntı yapılan: RaMu - 01 Nisan 2021, 14:24:22Aynı konu üzerinden farklı konularda mesaj yazmak uygunsuz oluyor.
İlgili bir başlık ile yeni konu açarsanız
hem bilgisi olanlar konu başlığını görüp yardımcı olabilir
hemde ileride benzer sorunu yaşayanlar konuyu rahatlıkla bulup faydalanabilir.

Birde kod paylaşırken kod tag ını kullanırsanız
mesaj düzenli ve okuması kolay olur.
silindi,
gerekli uygun bir başlık ile yeni konu olarak açsın
bu başlıkla ilgisi yok
başka temizlenecekler var ise bildirin lütfen