Ir ao conteúdo
  • Cadastre-se
Tiago Shimizu

Interrupção porta serial USART 18F2550

Recommended Posts

Olá a todos. Tenho um programa bem "simples" em meu microcontrolador que apenas deve ler o que recebeu na porta serial. No momento não vou tratar o retorno ainda mas quero deixar tudo pronto. Segue o código:

#define _XTAL_FREQ 20000000         // Definição do clock do sistema
#pragma config FOSC = HS            // Oscilador externo, HS 
#pragma config MCLRE = ON           // Precisa resistor no pino MCLR de pull-up 
#pragma config WDT   = OFF          // Desabilita o Watchdog Timer (WDT).
#pragma config PWRT = ON	    // Habilita o Power-up Timer (PWRT).
#pragma config BOR = OFF
#pragma config PBADEN = OFF	    // RB0,1,2,3 e 4 configurado como I/O digital.
#pragma config LVP = OFF   	    // Desabilita o Low Voltage Program.

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

#define BUFFER_SIZE 256

typedef struct {
    unsigned char Index;
    unsigned char Data[BUFFER_SIZE];
} BUFFER;
BUFFER Buffer;

void interrupt interrupcao(void)
{
    if (PIR1bits.RCIF) {
        Buffer.Index = 0;
        while (PIR1bits.RCIF) {
          Buffer.Data[Buffer.Index++] = RCREG;
        }
        PIR1bits.RCIF = 0; // Limpa a flag
    }
}

void main(void) {
    CMCON = 0x07;      // Desliga os comparadores internos
    ADCON1 = 0x0F;     // Define que todos os pinos são entradas/saídas digitais 

    TRISC6 = 0; // Pino TX como saída
    TRISC7 = 1; // Pino RX como entrada
    SPBRG = 10.35;
    BRGH = 1;
    SYNC = 0; // Modo de trabalh assincrono
    SPEN = 1; // Habilita os pinos da porta serial
    TXEN = 1; // Habilita a transmissão de dados
    CREN = 1; // Habilita a recepção de dados
    TX9 = 0; // Modo 8-bit de envio de dados
    RX9 = 0; // Modo 8-bit de recepção de dados

    IPR1bits.RCIP = 1; // Define a interrupção de recepção como alta prioridade
    PIE1bits.RCIE = 1; // Habilita interrupção de recepção da USART
    PIR1bits.RCIF = 0; // Limpa flag de RX
    RCONbits.IPEN = 1; // Habilita interrupções com nível de prioridade
    INTCONbits.GIEH = 1; // Habilita interrupções de alta prioridade  
    INTCONbits.PEIE = 1; // Habilita interrupções por periférico (USART)

    while (1) {
    }
}

O problema se encontra na linha Buffer.Index = 0; na interrupção. Se habilito essa linha, simplesmente não consigo ler o que está na porta, recebe um monte de caractere esquisito. Se comento ela, recebe ok, porém sempre vai empilhando o que recebe na porta, não começa na posição zero.

Já tentei também criar esse buffer na própria interrupção e também não deu certo:

void interrupt interrupcao(void)
{
  unsigned char Index = 0;
  unsigned char Buffer[256];
    if (PIR1bits.RCIF) {
        Buffer[Index++] = RCREG;
    }
}

Alguém já teve esse tipo de problema? Poderiam me ajudar?

 

Obrigado desde já.

 

Obs: Estou realizando os testes em componentes reais na protoboard.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×