Ir ao conteúdo

Controle RC5 com Timer0


pardalgms

Posts recomendados

Postado

Bom dia, tenho um programa que estou desenvolvendo para o controle de cargas a distância com o protocolo RC5, o código fonte base eu peguei no livro sobre DSpic do autor Vitor A. Souza, fiz algumas mudanças básicas e consegui fazer funcionar em um pic 16F877A, mas eu queria colocar longas temporizações nas saídas e pra isto eu preciso habilitar o timer0 do pic. Quando eu habilito a interrupção pra usar o timer0 a recepção do protocolo RC5 trava e o programa não roda de acordo aí lendo alguns artigos na internet eu vi que tenho que colocar colocar a parte do código que lê o protocolo RC5 dentro da interrupção e dar prioridade para INT0 (RB0) que é a porta onde o sensor infra vermelho está, mas eu tentei e não consegui, então gostaria que alguém mais experiente pudesse me dar uma dica de como posso gerar a interrupção do timer0 e de rb0 e dar prioridade pra rb0.

abaixo o código do protocolo, somente do controle remoto, sem o timer0.

/*******************************************************************************

* Controle Remoto com protocolo RC5 *

* Autor: Rildo SD *

* Microcontrolador: PIC16F877A - Cristal: 4Mhz - Compilador: Mikroc *

* Créditos: Este programa foi retirado do livro sobre DSPIC de Vitor Amador *

* Souza: "Comunicação RC5 com o dsPIC". *

*******************************************************************************/

/*******************************************************************************

Definições de entradas e saídas */

#define rc5 PORTB.F0 //Pino de entrada do RC5

#define led1 PORTC.F2

/*******************************************************************************

Definição de variáveis */

char last_rx,power=0;

char comando=1,sistema;

/*******************************************************************************

Rotina de decodificação em RC5 */

void decodifica_bit(void)

{

last_rx=0;

if (rc5)

{

last_rx=1;

}

delay_us(1770);

}

/*******************************************************************************

Conexões LCD */

sbit LCD_RS at RD4_bit;

sbit LCD_EN at RD6_bit;

sbit LCD_D4 at RD0_bit;

sbit LCD_D5 at RD1_bit;

sbit LCD_D6 at RD2_bit;

sbit LCD_D7 at RD3_bit;

sbit LCD_RS_Direction at TRISD4_bit;

sbit LCD_EN_Direction at TRISD6_bit;

sbit LCD_D4_Direction at TRISD0_bit;

sbit LCD_D5_Direction at TRISD1_bit;

sbit LCD_D6_Direction at TRISD2_bit;

sbit LCD_D7_Direction at TRISD3_bit;

/*******************************************************************************

Rotina do Lcd */

void lcd()

{

Lcd_Init();

Lcd_Cmd(_Lcd_Cursor_Off);

Lcd_Cmd(_Lcd_Clear);

Lcd_Out(1,1,"****Rildo_SD****");

Lcd_Out(2,1,"Controle Remoto");

}

/*******************************************************************************

Inicio do programa principal */

void main()

{

TRISA = 0x00;

TRISB = 0x01; // PORTB como entrada de Dados RC5

TRISC = 0x00;

TRISD = 0x00;

TRISE = 0x00;

PORTA = 0x10;

PORTB = 0x00;

PORTC = 0X00;

PORTE = 0x00;

ADCON1 = 0x0F; // Configura os pinos de forma digital

OPTION_REG = 0B10000000;

INTCON = 0b10010000;

lcd();

PORTD = 0; // Inicia o PORTD desligado

/*******************************************************************************

Laço Infinito */

while(1)

{

if (!rc5) // Sinal RC5 disponível?

{

comando = 0;

sistema = 0;

delay_us(4867); // Após receber o Star bit e toogle...

decodifica_bit(); // Recebe os 5 bits de endereço...

if (last_rx) sistema|=16; // Bit 4 de sistema

decodifica_bit();

if (last_rx) sistema|=8; // Bit 3 de sistema

decodifica_bit();

if (last_rx) sistema|=4; // Bit 2 de sistema

decodifica_bit();

if (last_rx) sistema|=2; // Bit 1 de sistema

decodifica_bit();

if (last_rx) sistema|=1; // Bit 0 de sistema

decodifica_bit(); // Recebe os 6 bits de comando...

if (last_rx) comando|=32; // Bit 5 de comando

decodifica_bit();

if (last_rx) comando|=16; // Bit 4 de comando

decodifica_bit();

if (last_rx) comando|=8; // Bit 3 de comando

decodifica_bit();

if (last_rx) comando|=4; // Bit 2 de comando

decodifica_bit();

if (last_rx) comando|=2; // Bit 1 de comando

decodifica_bit();

if (last_rx) comando|=1; // Bit 0 de comando

/*******************************************************************************

Configuração das saídas */

if (comando==1)

{

led1 = 1;

Lcd_Cmd(_Lcd_Clear);

Lcd_Out(1,1,"Comando = 1");

Lcd_Out(2,1,"Led Aceso");

}

if (comando==2)

{

led1 = 0;

Lcd_Cmd(_Lcd_Clear);

Lcd_Out(1,1,"Comando = 2");

Lcd_Out(2,1,"Led Apagado");

}

}

}// while(1)

}// main

Obrigado pela atenção pessoal.

  • 2 semanas depois...
Postado

Pessoal, procurei alguns exemplos que utilize o timer0 na internet e encontrei em um outro fórum um post com um material da microgenios e nele havia algumas video aulas pra pic com programação no mikroc, acompanhando os exemplos consegui fazer as configuração pra poder utilizar o timer0 com o protocolo rc5, e assim consegui sanar as minhas dúvidas.

Gostaria de pedir ao moderador que desse como resolvido este tópico.

Obrigado.

  • Coordenador
Postado

Caso o autor do tópico necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!