Ir ao conteúdo

Comunicação serial substituir Pic18f4520 para 16f877a


felipeetec

Posts recomendados

Postado

Eae galera encontrei um programinha no site da microgenios para tratar texto recebido pela serial, através de interrupção, só que o programa é para o pic18f4520 e gostaria de modificar para o Pic16f877a, o que eu deveria mudar na programação???

/*
Microgenios Soluções Eletrônicas Ltda.

********************************************************************************
PROGRAMA EXEMPLO: Recebimento e envio de STRING e tratamento de comando pela RS232 (por INTERRUPÇÃO).
OBJETIVO: Aprender a utilizar o Recebimento e envio de STRING e tratamento de comando pela RS232 (por INTERRUPÇÃO).
AUTOR: Fabio Mulero.[[email protected]]
********************************************************************************
MICROCONTROLADOR: PIC18F4520.
http://ww1.microchip.com/downloads/en/DeviceDoc/39631E.pdf

PLACA DE DESENVOLVIMENTO: KIT PICgenios - PIC18F
http://www.microgenios.com.br/news/index.php?option=com_content&task=view&id=88&Itemid=134

SOFTWARE: MikroC PRO for PIC
http://www.mikroe.com/en/compilers/mikroc/pro/pic/

************************ Configurações do KIT Picgenios ************************
CRISTAL: 8Mhz.

CHAVES DE FUNÇÃO:
--------------------- ----------------------
|GLCD\LCD ( 1) = OFF |DIS1 ( 1) = OFF |
|RX ( 2) = ON |DIS2 ( 2) = OFF |
|TX ( 3) = ON |DIS3 ( 3) = OFF |
|REL1 ( 4) = OFF |DIS4 ( 4) = OFF |
|REL2 ( 5) = OFF |INFR ( 5) = OFF |
|SCK ( 6) = OFF |RESIS ( 6) = OFF |
|SDA ( 7) = OFF |TEMP ( 7) = OFF |
|RTC ( 8) = OFF |VENT ( 8) = OFF |
|LED1 ( 9) = ON |AN0 ( 9) = OFF |
|LED2 (10) = ON |AN1 (10) = OFF |
--------------------- ----------------------
********************************************************************************
OBS:
- HABILITAR BIBLIOTECA UART.
********************************************************************************
*/

// VARIAVEIS GLOBAIS
unsigned char Texto[50];
unsigned char *Ponteiro_Texto;
// Prototipos de função.
void Executa_Comando();

// Rotina de Tratamento de Interrupção
void interrupt(){
if(PIR1.RCIF==1){
*Ponteiro_Texto = UART1_Read(); // Lê dado
if (*Ponteiro_Texto == 13){ // Enquanto for diferente de '\n' (troca de linha)
*Ponteiro_Texto = 0; // Coloca o finalizador de string '\0'
Executa_Comando();
Ponteiro_Texto = &Texto; // Reinicializa ponteiro
}
else
{
Ponteiro_Texto++; // Incrementa ponteiro
}
PIR1.RCIF = 0; // Zera Flag da interrupção do recebimento serial
}
}

void main() {
TRISD = 0; // Inicializa o PORTD como Saida
PORTD = 0; // Zera PORTD

TRISB = 0; // Inicializa o PORTB como Saida
PORTB = 0; // Zera PORTB
ADCON1 = 0X0F; // TODOS OS ANALOGICOS COMO DIGITAL
UART1_Init(9600); // Inicializa UART a 9600bps.

PIR1.RCIF = 0; // Limpa Flag da interrupção de recebimento serial
PIE1.RCIE = 1; // Habilita interrupção de recebimento serial
PIR1.RCIP = 1; // Seta interrupção de alta prioridade do recebimento serial

RCON.IPEN = 1; // Seleciona o modo de 2 niveis de interrupção
INTCON.GIE = 1; // Habilita as interrupções de alta prioridade
INTCON.GIEL = 1; // Habilita as interrupções de baixa prioridade
Ponteiro_Texto = &Texto; // Reinicializa ponteiro
while(1);
}

void Executa_Comando(){
if ((Texto[0] == 'L') && (Texto[1] == 'E')&& (Texto[2] == 'D')){
if (Texto[3] == 'D'){
switch (Texto[4]){
case '1':
PORTD.RD0 = 1;
break;
case '2':
PORTD.RD1 = 1;
break;
case '3':
PORTD.RD2 = 1;
break;
case '4':
PORTD.RD3 = 1;
break;
case '5':
PORTD.RD4 = 1;
break;
case '6':
PORTD.RD5 = 1;
break;
case '7':
PORTD.RD6 = 1;
break;
case '8':
PORTD.RD7 = 1;
break;
default :
PORTD = 0;
break;
}
}
if (Texto[3] == 'B'){
switch (Texto[4]){
case '1':
PORTB.RB0 = 1;
break;
case '2':
PORTB.RB1 = 1;
break;
case '3':
PORTB.RB2 = 1;
break;
case '4':
PORTB.RB3 = 1;
break;
case '5':
PORTB.RB4 = 1;
break;
case '6':
PORTB.RB5 = 1;
break;
case '7':
PORTB.RB6 = 1;
break;
case '8':
PORTB.RB7 = 1;
break;
default :
PORTB = 0;
break;
}
}
}
}

Postado

Alguem tem ideia de como posso adequar a seguinte parte do programa para o Pic16f877a:

PIR1.RCIF = 0; // Limpa Flag da interrupção de recebimento serial

PIE1.RCIE = 1; // Habilita interrupção de recebimento serial

PIR1.RCIP = 1; // Seta interrupção de alta prioridade do recebimento serial

RCON.IPEN = 1; // Seleciona o modo de 2 niveis de interrupção

INTCON.GIE = 1; // Habilita as interrupções de alta prioridade

INTCON.GIEL = 1; // Habilita as interrupções de baixa prioridade

Pois acho que é a única parte que precisa de manutenção para substituir o pic, me corrijam se eu estiver errado.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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...