Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
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






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

×