xsLIB: USART Kütüphanesi

Başlatan sigmoid, 15 Mayıs 2014, 22:33:08

sigmoid

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.
    }
}


korcenk

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.

sseedat

okuduğun her karakteri  16 elemanlı bir karakter dizisine sırayla yerleştirip depolayabilirsin.
Görünmez bir mezarlıktır Zaman...

korcenk

arkadaşım yapamadım ufak bir kod örnegi verebilirmisin.

Gökhan BEKEN

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++;
}
Özel mesaj okumuyorum, lütfen göndermeyin.

Extreme

#5
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.


sigmoid

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)

Extreme

İ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.


sigmoid

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ı?

Extreme

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 )

Extreme

#10
16f887 içinde kütüphaneniz uygundur.