21 Eylül 2021, 01:42:41

Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME


xsLIB: USART Kütüphanesi

Başlatan sigmoid, 16 Mayıs 2014, 01: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 argcchar** 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, 20: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

15 Kasım 2014, 15:03:45 #5 Son düzenlenme: 15 Kasım 2014, 15:11:29 Extreme
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 argcchar** 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 argcchar** 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

23 Kasım 2014, 02:40:22 #10 Son düzenlenme: 24 Kasım 2014, 01:35:31 Extreme
16f887 içinde kütüphaneniz uygundur.

Yasal Uyarı: Picproje.org sitemizde 5651 sayılı kanunun 8. maddesine ve T.C.Knın 125. maddesine göre tüm üyelerimiz yaptıkları paylaşımlardan kendileri sorumludur. Picproje.org hakkında yapılacak tüm hukuksal şikayetleri İletişim sayfamızdan bize bildirdikten en geç 3 (üç) iş günü içerisinde ilgili kanunlar ve yönetmelikler çerçevesinde tarafımızca incelenerek gereken işlemler yapılacak ve site yöneticilerimiz tarafından bilgi verilecektir.