Ir ao conteúdo
  • Cadastre-se

PIC Não consigo ler uma string pela UART do PIC16F887


Posts recomendados

Estou tentando fazer um código para ler um string e retorná-la pela UART do PIC16F887. Entretanto, o microcontrolador não retorna a string de forma correta. Estou utilizando o Arduino como intermediário para poder exibir o resultado no monitor serial da IDE Arduino.

 

Codigo do PIC16F887:

/*
 * File:   ESP-01.c
 * Author: Gregorio Leão
 *
 * Created on 23 de Dezembro de 2021, 15:54
 */

// PIC16F887 Configuration Bit Settings

// 'C' source line config statements

// CONFIG1
#pragma config FOSC = HS        // Oscillator Selection bits (LP oscillator: Low-power crystal on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // RE3/MCLR pin function select bit (RE3/MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF      // Brown Out Reset Selection bits (BOR disabled)
#pragma config IESO = OFF       // Internal External Switchover bit (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
#pragma config LVP = OFF        // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)

// CONFIG2
#pragma config BOR4V = BOR40V   // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT = OFF        // Flash Program Memory Self Write Enable bits (Write protection off)

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

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

#define _XTAL_FREQ 20000000

void Inicia_RS232(){
    SPBRG = 129;
    TXSTAbits.BRGH= 1;
    BAUDCTLbits.BRG16 = 0;
    TXSTAbits.SYNC = 0;
    RCSTAbits.SPEN = 1;
    INTCONbits.GIE = 1;
    INTCONbits.PEIE = 1;
    PIE1bits.TXIE = 1;
    PIE1bits.RCIE = 1;
    TXSTAbits.TXEN = 1;
    RCSTAbits.CREN = 1;
}

void Escreve_RS232(char dado){
    while(!PIR1bits.TXIF);
    TXREG = dado;
}

char Le_RS232(){
    while(!PIR1bits.RCIF);
    if(RCSTAbits.OERR){
        RCSTAbits.CREN = 0;
        RCSTAbits.CREN = 1;
    }
    return RCREG;
}

void EscrevePalavra_RS232(char dados[]){
    for(int i = 0; i < strlen(dados); i++){
        Escreve_RS232(dados[i]);
    }
}

void Verifica_Funcionamento(){
    char AT[] = "AT";
    int guia = 0;
    char *verificacao = NULL;
    char *aux;
    char recebido[10];
    do{
        if(guia == 9){
            for(int i = 0; i < 10; i++){
                recebido[i] = 0;
            }
        }
        __delay_ms(1000);
        EscrevePalavra_RS232(AT);
        if(guia == 9){
            guia = 0;
        }
        if(!BAUDCTLbits.RCIDL){
            recebido[guia] = Le_RS232();
            guia++;
        }
        Escreve_RS232('\n');
        EscrevePalavra_RS232(recebido);
        Escreve_RS232('\n');
        aux = recebido;
        verificacao = strstr(aux, "OK");
    }while(verificacao == NULL);
}

void Zera_Palavra(char dado[], int TAM){
    for(int i = 0; i < TAM; i++){
        dado[i] = 0;
    }
}

void LePalavra_RS232(char dado[], int tamanho){
    int i;
    for(i = 0; i < tamanho; i++){
        dado[i] = Le_RS232();
    }
}

void main(){
    Inicia_RS232();
    TRISDbits.TRISD2 = 0;
    PORTDbits.RD2 = 0;
    char letra;
    char recebido[8];
    
    while(1){
        Zera_Palavra(&recebido, 8);
        LePalavra_RS232(&recebido, 8);
        __delay_ms(1000);
        EscrevePalavra_RS232(recebido);
        Escreve_RS232('\n');
    }
}

 

Codigo carregado no Arduino que estou utilizando de intermediário para usufruir de recursos de sua IDE:

#include "SoftwareSerial.h"

SoftwareSerial ESP_Serial(5, 11); // RX, TX

void setup(){
  Serial.begin(9600);
  ESP_Serial.begin(9600);
}

void loop(){
  if (ESP_Serial.available()){
    Serial.write(ESP_Serial.read());
  }
  if (Serial.available()){
    ESP_Serial.write(Serial.read());
  }
}

Resultado obtido após enviar a palavra "gregorio" para o PIC:

 

Captura de Tela (6).png

Link para o comentário
Compartilhar em outros sites

@.if Aquele quadradinho parece o caractere de final de string, '\0'. Creio que eu esteja certo porque já tentei aumentar um laço de repetição de maior no laço for onde ocorre a leitura da string. Mas eu gostaria de saber porque sempre há um caractere perdido no meio da transmissão? 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...