Picproje Elektronik Sitesi

DERLEYİCİLER => Microchip XC Serisi => Microchip XC8 => Konuyu başlatan: sigmoid - 15 Mayıs 2014, 22:33:08

Başlık: xsLIB: USART Kütüphanesi
Gönderen: sigmoid - 15 Mayıs 2014, 22:33:08
PIC16F877A ve PIC16F628A için denediğim usart kütüphasidir. 4MHZ kristal için 9600 ve 19200 hızlarda sorunsuz çalışıyor. 57600 için 20Mhz kristal kullanmak gerekiyor.

xsUsart.h

/*******************************************************************************
* Kütüphane     : xsUSART                                                     *
* Yazar         : sigmoid                                                     *
* Web           : http://www.hayaldefteri.net                                 *
* Başlangıç     : 10 Mayıs 2014                                               *
* Son Düzenleme : 10 Mayıs 2014                                               *
* Versiyon      : 0.1                                                         *
*                                                                             *
* PIC16F877A ve PIC16F628A için usart fonksiyonları                           *
******************************************************************************/

//PIC'in çalışma frekansı
#ifndef _XTAL_FREQ
    #define _XTAL_FREQ 4000000
#endif


#define USARTHIZ 9600
#define usartspbrg ((unsigned char)((_XTAL_FREQ/(16UL * USARTHIZ)) -1)) //bağlantı hızını hesapla


#if defined(_AS16F628A_H_) || defined(_AS16F628_H_)
#define rxpin TRISBbits.TRISB1
#define txpin TRISBbits.TRISB2
#else //_AS16F877A_H_
#define rxpin TRISCbits.TRISC7
#define txpin TRISCbits.TRISC6
#endif

void usart_baslat(void);
void usart_yaz(char veri);
char usart_oku(void);
void putch(unsigned char byte);



xsUsart.c

/*******************************************************************************
* Kütüphane     : xsUSART                                                     *
* Yazar         : sigmoid                                                     *
* Web           : http://www.hayaldefteri.net                                 *
* Başlangıç     : 10 Mayıs 2014                                               *
* Son Düzenleme : 10 Mayıs 2014                                               *
* Versiyon      : 0.1                                                         *
*                                                                             *
* PIC16F877A ve PIC16F628A için usart fonksiyonları                           *
******************************************************************************/

#include <xc.h>
#include "xsusart.h"

void usart_baslat(void)
{
  rxpin=1; //RX pinini giriş yap
  txpin=1; //TX pinini giriş yap
  SPBRG=usartspbrg; //bağlantı hızını yükle
  TXSTA=0x24;
  RCSTA=0x90;


}

void usart_yaz(char veri)
{
while(!TRMT); //gönderilen veri olduğu müddetce dur.
TXREG=veri; //veriyi gönder.
}

char usart_oku(void)
{
while(!RCIF); //veri gelene kadar bekle
if(OERR) //hata varmı
{
CREN=0;
CREN=1;
}
if(FERR)
asm("MOVF _RCREG,W");

return RCREG;
}

void putch(unsigned char byte)
{
usart_yaz(byte);
}



Header dosyasında kullandığımız kristal frekansı _XTAL_FREQ sabitine  Hz cinsinden tanımlanmalıdır. İstediğimiz haberleşme hızıda USARTHIZ sabitine girilmelidir.

USART Fonksiyonları:
usart_baslat(); usart fonksiyonları için ilk önce çalıştırılmalıdır.
void usart_yaz(char veri); 1 karakterlik veri gönderir.
char usart_oku(void); 1 karakterlik veri okur.
void putch(unsigned char byte); printf komutu için gereklidir.


Örnek:

/*******************************************************************************
* File:   main.c                                                              *
* Author: sigmoid                                                             *
*                                                                             *
* xsLCD kütüphanesi test programı                                             *
******************************************************************************/

#include <stdio.h>
#include <stdlib.h>

#include <xc.h>
#define _XTAL_FREQ 4000000

#include "config.h"     //konfigurasyon dosyasını ekle.
#include "xsusart.h"    //usart kütüphanesini ekle

void main(int argc, char** argv) {
    char harf;

    usart_baslat();
    printf("Merhaba Picproje..\r\n");
    while(1)
    {
    harf=usart_oku(); //gelen byte oku
usart_yaz(harf); //ve gönder.
    }
}

Başlık: Ynt: xsLIB: USART Kütüphanesi
Gönderen: korcenk - 03 Haziran 2014, 17:04:32
arkadaşlar merhaba;
aşağıdaki kodla 16 karakter veriyi gönderdikten sonra okumayı nasıl yapacaz.
printf("Merhaba Picproje..\r\n");
bu kod bir karekter okuyor
char usart_oku(void); 1 karakterlik veri okur.

16 karakter veriyi nasıl okuruz.

herkeze iyi çalışmalar.
Başlık: Ynt: xsLIB: USART Kütüphanesi
Gönderen: sseedat - 03 Haziran 2014, 17:07:42
okuduğun her karakteri  16 elemanlı bir karakter dizisine sırayla yerleştirip depolayabilirsin.
Başlık: Ynt: xsLIB: USART Kütüphanesi
Gönderen: korcenk - 03 Haziran 2014, 20:51:44
arkadaşım yapamadım ufak bir kod örnegi verebilirmisin.
Başlık: Ynt: xsLIB: USART Kütüphanesi
Gönderen: Gökhan BEKEN - 03 Haziran 2014, 21:38:00
Alıntı yapılan: korcenk - 03 Haziran 2014, 17:04:32
16 karakter veriyi nasıl okuruz.
Merhaba,
basitçe şöyle yapabilirsiniz:

int i=0;
char karakterler[16];
for(i=0;i<16,i++){
   karakterler[i]=usart_oku();
}


Daha çok enter gelene kadar okuma yapılır, onun da örneğini yapalım:

int i=0;
char karakterler[200]; //maximum karakter sayısı olarak 200 verdik
while(1){
   karakterler[i]=usart_oku();
   if(karakterler[i]==10) //enter karakterinin ascii karşılığı 10'dur
   break; //eğer enter geldiyse çık
   i++;
}
Başlık: Ynt: xsLIB: USART Kütüphanesi
Gönderen: Extreme - 15 Kasım 2014, 12:03:45
Hocam paylaşım için teşekkürler,
1_
#include "config.h"
dosyasını kodlarınıda paylaşmanız mümkün mü

2_xsusart.c dosyasındaki
void putch(unsigned char byte)
{
    usart_yaz(byte);
}

hata veriyor.

Başlık: Ynt: xsLIB: USART Kütüphanesi
Gönderen: sigmoid - 16 Kasım 2014, 06:15:35
config.h dosyasında kullandığım pic için gerekli sigorta değerleri var.

// CONFIG
#pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = OFF      // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)
Başlık: Ynt: xsLIB: USART Kütüphanesi
Gönderen: Extreme - 16 Kasım 2014, 21:41:39
İki adet 16f887a yı haberleştirmeye çalışıyorum kütüphanelerinizle.
kısmen ben bir yerde hata yapıyorum. Bu konuda yardımcı olabilirmisiniz ?

Masterdan 'H' verisi gönderiyorum. Bu veriyi slave picine bağlı lcdde yazdırıyorum.
proteus ve breadboard üzerinde aynı sonuçları aldım.
yaklaşık her 4 bilgide bir H u tutuyor. ve lcd de gösteriyor
özetlersek
sayi = x
sayi = (boşluk)
sayi=H
sayi = (boşluk)
sayi = |
sayi=H

master.c
#include <stdio.h>
#include <stdlib.h>

#include <xc.h>
#define _XTAL_FREQ 4000000

// CONFIG
#pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = OFF      // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)


#include "xsusart.h"    //usart kütüphanesini ekle

void main(int argc, char** argv) {
    char harf;
    TRISD=0;
    usart_baslat();
    while(1)
    {
        harf='H';
    usart_yaz(harf); //ve gönder.
    }
}


slave.c
#include <stdio.h>
#include <stdlib.h>

#include <xc.h>
#define _XTAL_FREQ 4000000

// CONFIG
#pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = OFF      // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

#include "xsusart.h"    //usart kütüphanesini ekle
#include "xsLCD.h"

void main(int argc, char** argv) {
    unsigned char harf;
    ADCON1=0x07;
    lcd_baslat();
    lcd_sil();
    usart_baslat();
    printf("Ser test basliyor...\r\n");
    __delay_ms(1000);
    while(1)
    {
    harf=usart_oku(); //gelen byte oku

        lcd_sil();
        printf("sayi=%c",harf);
        __delay_ms(1000);       
    }
}


Not: usart kütüphanizde aşağıdaki kod blokunu çıkardım çünkü hata alıyor. bu işlemi lcd kütüphanenizden kullandım.

Başlık: Ynt: xsLIB: USART Kütüphanesi
Gönderen: sigmoid - 16 Kasım 2014, 22:05:35
yazdığınız kodlar normal gözüküyor. Hiç mi veri gitmiyor yoksa veri yanlış mı gidiyor?
masterda
char harf;
şeklinde tanımlarken
slave içinde unsigned char harf; şeklinde tanımlamışsınız. Birde iki PIC de de hızlar aynı mı?
Başlık: Ynt: xsLIB: USART Kütüphanesi
Gönderen: Extreme - 16 Kasım 2014, 22:42:23
hızları sizin kütüphanede ayarladığınız gibi değiştirmedim.

Sanırım sorunu çözdüm gibi ama pek anlayamadım
(master.c de biraz gecikme koymak gerekiyor. müsait bir zamanda detaylı yazacağım )
Başlık: Ynt: xsLIB: USART Kütüphanesi
Gönderen: Extreme - 22 Kasım 2014, 23:40:22
16f887 içinde kütüphaneniz uygundur.