Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

uart sorunu

Başlatan canbulut, 16 Mayıs 2015, 15:58:22

canbulut

Merhaba arkadaslar,
Bu kodlar ile transmit yapamadım. Problem ne olabilir?

/*
 * File:   Uart_TX.c
 * Author: Bulut
 *
 * Created on 16 May?s 2015 Cumartesi, 10:29
 */


#include <xc.h>
#include "Config.h"
void main(void) {
    
// PIC16F628A 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 = INTOSCCLK // Oscillator Selection bits (INTOSC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON      // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
#pragma config BOREN = ON       // Brown-out Detect Enable bit (BOD enabled)
#pragma config LVP = OFF        // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EE Memory Code Protection bit (Data memory code protection off)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)


#define _XTAL_FREQ 4000000
    TRISA=0;
    PORTA=0;
    TRISB=0;
    PORTB=0;
    CMCON=7;
    TXSTAbits.BRGH=1;       // select low speed Baud Rate (see baud rate calcs below)
    TXSTAbits.TX9=0;        // select 8 data bits
    TXSTAbits.TXEN = 1;     // enable transmit
    TXSTAbits.SYNC=0;
    SPBRG=25;  // here is calculated value of SPBRGH and SPBRGL
void uart(void);
    while (1)
    {
         uart();
    }
}
void uart()
{
   while(!TXSTAbits.TRMT)    // make sure buffer full bit is high before transmitting
    TXREG ='M';
    return;
}

Tagli

#1
İlk bakışta göze iki hata çarpıyor:

1) RCSTA.SPEN biti 1 yapılmamış. Seri port modülünün ana açma kapama anahtarı bu.
2) Seri port ile ilgili bacakların TRIS bitleri 1 olmalı. TX için de böyle, çıkış diye 0 olmayacak yani. Kulağa yanlış gibi geliyor ama datasheet'te böyle yazmış.

Başka hata var mı bilmiyorum, çok ayrıntılı bakmadım.
Gökçe Tağlıoğlu

canbulut

dedikleriniz yaptım gelişme yok hocam.

Tagli

Şimdi bir tane daha gördüm: while(!TXSTAbits.TRMT) satırından sonra noktalı virgül olacak. Yani TXREG = 'm'; ifadesi döngünün bir parçası olmamalı. Döngünün amacı TRMT 0 olduğu sürece (ki bu gönderme işleminin devam ettiğini gösterir) boş boş dönüp beklemek.
Gökçe Tağlıoğlu

canbulut

#4
onuda düzelttim. bişeyler daha var kaçan ama.. ne :)

mesaj birleştirme:: 16 Mayıs 2015, 18:43:15

donanımı basic ile denedim sorun yok..xc8'de çalışmıyor. son hali asağıda
/*
 * File:   Uart_TX.c
 * Author: Bulut
 *
 * Created on 16 May?s 2015 Cumartesi, 10:29
 */


#include <xc.h>
//#include "Config.h"
void main(void) {

// PIC16F628A 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 = INTOSCCLK // Oscillator Selection bits (INTOSC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON      // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
#pragma config BOREN = ON       // Brown-out Detect Enable bit (BOD enabled)
#pragma config LVP = OFF        // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EE Memory Code Protection bit (Data memory code protection off)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)


#define _XTAL_FREQ 4000000
    TRISA=0;
    PORTA=0;
    TRISB=6;
    PORTB=0;
    CMCON=7;
    TXSTAbits.BRGH=1;       // select low speed Baud Rate (see baud rate calcs below)
    TXSTAbits.TX9=0;        // select 8 data bits
    TXSTAbits.TXEN = 1;     // enable transmit
    RCSTAbits.CREN=1;
    //OPTION_REGbits.nRBPU=0;
    TXSTAbits.SYNC=0;
    SPBRG=25;  // here is calculated value of SPBRGH and SPBRGL
void uartt(void);
    while (1)
    {
         uartt();
    }
}
void uartt()
{
   while(!TXSTAbits.TRMT);    // make sure buffer full bit is high before transmitting
    TXREG ='M';
    //return;
}



Tagli

İlk mesajımda bahsetmiş olduğum RCSTAbits.SPEN = 1; ifadesi vermiş olduğun son kodda bulunmuyor. Gözünden kaçmadığından emin misin?
Gökçe Tağlıoğlu

Pyrodigy

Uart tx/rx pinlerini giriş yaptınmı ?
Persistance is the name of the game in this business....

mehmet

Deneyiniz...

/* 
 * File:   main.c
 * Author: mbmb
 *
 * Created on 17 Mayıs 2015 Pazar, 00:38
 */

#include <xc.h>


// CONFIG 16F628A
#pragma config FOSC = INTOSCCLK // Oscillator Selection bits (INTOSC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON      // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
#pragma config BOREN = ON       // Brown-out Detect Enable bit (BOD enabled)
#pragma config LVP = OFF        // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EE Memory Code Protection bit (Data memory code protection off)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)


#define _XTAL_FREQ 4000000

void uartt(void);


void main(void)
{
    TRISA = 0;
    PORTA = 0;
    TRISB = 6;
    PORTB = 0;
    CMCON = 7;
    TXSTAbits.BRGH = 1;       // select low speed Baud Rate (see baud rate calcs below)
    TXSTAbits.TX9 = 0;        // select 8 data bits
    TXSTAbits.TXEN = 1;     // enable transmit
    RCSTAbits.CREN = 1;
    //OPTION_REGbits.nRBPU = 0;
    TXSTAbits.SYNC = 0;
    SPBRG = 25;  // here is calculated value of SPBRGH and SPBRGL


    while (1)
    {
         uartt();
    }
}


void uartt(void)
{
   while(!TXSTAbits.TRMT);    // make sure buffer full bit is high before transmitting
    TXREG = 'M';
}
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

canbulut

gerçektende spen bitini kaçırmışım şu anda çalışıyor. Teşekkürler arkadaşlar. teşekkürler Tagli hocam.

mehmet

Çalışan kodu ekleyebilirsiniz...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

canbulut

peki bu gönderme işinde text halinde nasıl gönderirim. kendi library'mi mi kurmam gerekiyor paylaşılan bir yer var mı_?
yazarken mesajıınızı aldım mehmet hocam.asağıdaki kodu ekledim.
    RCSTAbits.SPEN=1;

Tagli

Text denen  şey arka arkaya sıralanmış ASCII karakterinden ibarettir. Sonlandığının anlaşılabilmesi için diznin sonunca \0 karakteri bulunur (ki bildiğin sıfırdır bu). Yani yapman gereken şey, yukarıda yaptığın işlemi bir döngü içinde dizinin tüm elemanları için tekrarlamak ve en son \0 karakterini gönderdikten sonra durmak.
Gökçe Tağlıoğlu

mehmet

@canbulut; C yapısına biraz dikkat edebilirsiniz.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

canbulut

aşağıdaki kodlar ile text şeklinde gönderebiliyorum ama rakam,sayı gönderemiyorum.

void xmitt(char TxArray[])   // An array that can hold 25 characters
{
  int b=0;
 while (TxArray[b]!='\0')
 {
   while(!TXSTAbits.TRMT);    // make sure buffer full bit is high before transmitting
   TXREG =TxArray[b];
   b++;
 }
}

Gökhan BEKEN

void xmitt(char TxArray[])   // An array that can hold 25 characters
{
  int b=0;
 while (TxArray[b]!='\0') // stringin sonuna gelene kadar döngü çalışır
 {
   while(!TXSTAbits.TRMT);    // meşguliyet bitene kadar bekle
   TXREG =TxArray[b]; // stringin sıradaki karakterini gönder
   b++; //sırayı 1 artır
 }
}


void xmittData(char TxArray[], unsigned int boyut)   // An array that can hold 25 characters
{
  int b=0;
 while (boyut--) // sayac 0 olana kadar döngüyü dönder
 {
   while(!TXSTAbits.TRMT);    // meşguliyet bitene kadar bekle
   TXREG =TxArray[b]; // stringin sıradaki karakterini gönder
   b++; //sırayı 1 artır
 }
}


kullanım:
TxArray[0]=0xFF;
TxArray[1]=0x00;
TxArray[2]=0x15;
TxArray[3]=0x75;
xmittData(&TxArray[0], 4) // dizideki verilerden 4 tanesini gönder


stringler 0 ile bittiğinden sıfıra ulaşana kadar döngüyü döndeririz, fakat göndereceğiniz şey, sayısal data ise, adet belirtmeniz şart.
Özel mesaj okumuyorum, lütfen göndermeyin.