Ir ao conteúdo
  • Cadastre-se

Leitura de Botões Controle ECP (PIC 16F628A)


Posts recomendados

Olá Pessoal,

 

Estou tentando utilizar um código para ler os botões de um controle remoto ECP no PIC 16F628A e não funciona

 

O mais estranho é que com o 16F877A funcionou perfeitamente, mas com o 16F628A não

 

O código eu peguei nesse tópico aqui :

 

http://forum.clubedohardware.com.br/forums/topic/853197-resolvido-m%C3%B3dulos-rr3-e-rt4-da-telecontrolli/page-2

 

 

Fiz as adaptações para o 16F628A e ficou assim:

#include <16F628A.h>#FUSES HS, NOWDT, NOPROTECT,NOLVP,BROWNOUT, PUT#use delay(clock = 4000000)#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8)   //#define lcd_enable     pin_B0      // pino enable do LCD   //#define lcd_rs         pin_B1      // pino rs do LCD   //#define lcd_wr         pin_B2      // pino rs do LCD   //#define lcd_d4         pin_B4      // pino de dados d4 do LCD   //#define lcd_d5         pin_B5      // pino de dados d5 do LCD   //#define lcd_d6         pin_B6      // pino de dados d6 do LCD   //#define lcd_d7         pin_B7      // pino de dados d7 do LCD#include "lcd.c"#use fast_io(A)#use fast_io(#define RFIn PIN_B0 //entrada do sinal de RF#define NBIT 28 // numero de bitsINT32 DATA=0;int1 decoder(void){byte x=0;int16 time_aux=0;DATA=0;while(!input_state(RFIn)){time_aux++;delay_us(10);}if((time_aux>1149) || (time_aux<=1151)){for(x=0;x<NBIT;x++){while(input_state(RFin));delay_us(250);if(input_state(RFIn)){return FALSE;}delay_us(500);if(!input_state(RFIn)){data|=0x8000000;data>>=1;}else data>>=1;delay_us(500);if(!input_state(RFin)){return FALSE;}}return TRUE;}else return FALSE;}void main(){set_tris_A(0b00000000);lcd_init();while (TRUE) {decoder();printf(lcd_putc,"\fC: %Lu\nRECV",DATA);delay_ms(5);if(DATA==112971776){ output_toggle(PIN_A0);delay_ms(500);}else if(DATA==110874624){ output_toggle(PIN_A1);delay_ms(500);}else if(DATA==111923200){ output_toggle(PIN_A2);delay_ms(500);}}}

Na verdade o que estou tentando fazer aqora é acionar os LEDS das portas A0,A1 e A2 com os códigos os botões que eu já li usando o 16F877A.

 

Eu montei o mesmo código como 16F877A e ele aciona os LEDS perfeitamente

 

Não consegui descobrir o porque de não estar funcionando 

Alguém pode me ajudar a resolver esse mistério?

 

 

Link para o comentário
Compartilhar em outros sites

Veja o FUSE HS.

você está trabalhando a 4mhz.

Use o XT.

Vamos ver se só isso resolve.

Falou

 

Olá Matheus,

 

Fiz o que você sugeriu mas também não funcionou

Com o 877A ,Mesmo usando HS com xtal de 4MHz funciona perfeitamente agora com o 628A...nada

 

Não sei que mistério é esse

Já testei com dois PIC's 16F628A para descartar problema no CI

 

Mais alguma coisa que eu possa fazer?

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

dei uma analisada rápida e percebi:

pra compor a variável data 32 bits você faz

data|=0x8000000;
data>>=1;

cujo 1 está no 31º bit, é isto mesmo? são 31 bits?

também define DATA e manipula data. o compilador não xiou?

Define melhor "não funciona"

O display mostra qual valor de data? (ou DATA)

Talvez o 628 você tenha que configurar os pinos de comparador (CMCON não lembro) como digital e etc Também pode estar usando pino compartilhado com outra função e esta está errada e tal

Também seu controle pode estar enviando dados diferentes ou seu receptor pode estar com defeito e etc

 

Enfim, são muitas emoções...

abç

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

 

dei uma analisada rápida e percebi:

pra compor a variável data 32 bits você faz

data|=0x8000000;

data>>=1;

cujo 1 está no 31º bit, é isto mesmo? são 31 bits?

também define DATA e manipula data. o compilador não xiou?

Define melhor "não funciona"

O display mostra qual valor de data? (ou DATA)

Talvez o 628 você tenha que configurar os pinos de comparador (CMCON não lembro) como digital e etc Também pode estar usando pino compartilhado com outra função e esta está errada e tal

Também seu controle pode estar enviando dados diferentes ou seu receptor pode estar com defeito e etc

 

Isadora,

 

Quanto a função 'decoder'  ainda não estudei a sua funcionalidade, peguei esse código em outro tópico e ele está funcionando perfeitamente no 16F877A.

É estranho mas o compilador CCS parece não diferenciar maiúsculas de minúsculas..."data" e "DATA" tratam-se da mesma variável e tá funcionando assim.

 

O controle esta enviando os códigos corretamente...eu leio com um 16F877A e um LCD. Os códigos dos botões aparecem certinho 

peguei o código dos botões e criei as rotinas if{DATA=XXXXXXX } e gravei nesse mesmo PIC 16F877A e funcionou perfeitamente.

Cada botão pressionado acende o LED ligado a sua respectiva porta.

 

Pode ser alguma configuração especifica mesmo para o 16F628A

Já tentei com o PIC12F675 e nada também

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

você não definiu direito "não funciona". Haja bola de cristal pow!! 877 ok. mas com o 628 o que aparece no display? nada? ous numeros diferentes? está recebendo algo no pino? tem oscilo? (preguiça de escrever osciloscópio) veja com ele. Aproveita e meça e anote os tempos pra acertar a questão da sincronização. Mas não sem estudar o protocolo. Se não tem, faça um programinha simples pra "ver" o sinal do pino num led (em outro pino). tipo:

#define RF RB0#define led RA2main(){unsiged char a;//iniclaliza hwfor(;{while(!RF);while(RF);led=a>>4;a++;}}

 

abç

Link para o comentário
Compartilhar em outros sites

O "não funciona" ´significa não aciona os LEDs nas Portas A0, A1 e A2. Esse é objetivo do projeto

 

O Módulo Receptor 433 está OK ....está funcionando com o 877A, portanto certamente está enviando os bits para o Pino B0 do 628A

A questão é por que não lê e interpreta os dados enviados se o 877A faz isso perfeitamente acionando os respectivos LEDs.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

ainda continua vago. você sequer respondeu as perguntas. Acho que não vale muito a pena eu investir tempo nisso...

Boa sorte

 

chico você fala o que está em seu coração. Pra função simples, tanto faz o mc. mas claro existem melhores, mais baratos que o tal pic

abç

Link para o comentário
Compartilhar em outros sites

ainda continua vago. você sequer respondeu as perguntas. Acho que não vale muito a pena eu investir tempo nisso...

Boa sorte

 

chico você fala o que está em seu coração. Pra função simples, tanto faz o mc. mas claro existem melhores, mais baratos que o tal pic

abç

 

Isadora,

 

Respondi às suas perguntas procurando ser o mais objetivo e lógico possível

 

Como disse eu quero apenas acender dos LEDs nso pinos que eu indiquei...somente isso. Nada de display LCD.

O display LCD eu usei com o 877A pra capturar os códigos do controle ECP.

 

Sabendo os códigos gerados pelos botões do controle ECP gravei no PIC16F628A para acionar os LEDs.

 

Já tentei trocar a ligação do Pino B0 (onde está ligado o módulo receptor 433) para outros pinos do port B e nada

Sinceramente não faça a mínima ideia do que pode ser

Continua sendo um mistério o fato de estar acionando os LEDS quando uso o 877A e não estar acendendo os LEDs com o 628A

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

errado. você não respondeu p.ex. o que aparece no display ou como se comporta e tal. Também não falou sobre o oscilo, não comentou o teste simples que propus e etc. Para um diagnóstico remoto mais preciso, aquelas questões são fundamentais.

Aliás, nem sei porque retornei

Aguarde uma boa alma...

Link para o comentário
Compartilhar em outros sites

errado. você não respondeu p.ex. o que aparece no display ou como se comporta e tal. Também não falou sobre o oscilo, não comentou o teste simples que propus e etc. Para um diagnóstico remoto mais preciso, aquelas questões são fundamentais.

Aliás, nem sei porque retornei

Aguarde uma boa alma...

 

isadora

 

Não tem osciloscópio

O que aparece no LCD quando leio com o PIC 16F877A é o seguinte:

 

Código do Controle Remoto ECP (ele fica enviando esse código constantemente):

------------------------------

C: 67109780

RECV

------------------------------

 

 

Código do Botão 1:

------------------------------

C: 112971776

RECV

------------------------------

 

 

Código do Botão 2:

------------------------------

C: 110874624

RECV

------------------------------

 

 

Código do Botão 3:

------------------------------

C: 111923200

RECV

------------------------------

 

Por fim não consegui compilar o código que você pediu pra testar...mesmo fazendo as adaptações para o compilador CCS o compilar apresenta os seguintes erros:

 

 
#define RF PIN_B0
#define led PIN_A2
char a=0;
 
main()
{
 
//iniclaliza hw
for(;;)
{
while(!RF);    //condition always false
while(RF);     //condition always true
led==a>>4;    //code has no effect
a++;
}
}
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

continuo sem saber porque retorno...

 

Viu? Não doeu nada. Aparentemente você (ou o compilador) não está configurando o hw direito. Tente TRISA=0; (traduza pro seu compilador) e verifique se estes pinos não são compartilhados com outras funções. Desabilite-as.

Altere para "data"

 

Quando ao codigo simples que propus, acho que o lance está no subentendido "inicializa hw". Sorry. No ccs.

 

agora vai...

Link para o comentário
Compartilhar em outros sites

continuo sem saber porque retorno...

 

Viu? Não doeu nada. Aparentemente você (ou o compilador) não está configurando o hw direito. Tente TRISA=0; (traduza pro seu compilador) e verifique se estes pinos não são compartilhados com outras funções. Desabilite-as.

Altere para "data"

 

Quando ao codigo simples que propus, acho que o lance está no subentendido "inicializa hw". Sorry. No ccs.

 

agora vai...

 

 

Não... não foi

Já tinha feito isso tudo isso que você falou,,,só repeti o seu código e comentei as partes que estão apresentando o erro. 

 

Vou colocar o código completo então:

#include <16F628A.h>#FUSES NOWDT                    #FUSES XT                       #FUSES NOPUT                    #FUSES NOPROTECT                #FUSES NOBROWNOUT               #FUSES MCLR                     #FUSES NOLVP                    #FUSES NOCPD                    #use delay(clock=4000000)#define RF PIN_B0#define led PIN_A2char a=0;void main(){   set_tris_A(0b00000000);   set_tris_B(0b11111111);   setup_ccp1(CCP_OFF);   setup_comparator(NC_NC_NC_NC);   setup_vref(FALSE);   disable_interrupts(INT_EXT);   disable_interrupts(GLOBAL); for(;{while(!RF);while(RF);led==a>>4;a++;}}
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

são questões distintas. No hitech, mikroc, sdcc, o exemplo que dei (teoricamente) funciona. No seu acho que tem que fazer os irritantes inputpin e outputpin e irritante cia.

Enão era led==a>>4; É led=a>>4; //prestenção menino!

 

Voltando ao seu caso, pelo que reporta está lendo o dado corretamente. Portanto aquele teste talvez não seja necessário. Talvez seu compilador esteja perdido com números grandes. Tenta um tipo de variável "de verdade" do c

unsigned long int data;

pra ver se esta porcaria aceita

Troque de compilador que tenho aversão ou troque a versão.

Mas ainda acho que é questão de incialização correta do hw

Link para o comentário
Compartilhar em outros sites

são questões distintas. No hitech, mikroc, sdcc, o exemplo que dei (teoricamente) funciona. No seu acho que tem que fazer os irritantes inputpin e outputpin e irritante cia.

Enão era led==a>>4; É led=a>>4; //prestenção menino!

 

Voltando ao seu caso, pelo que reporta está lendo o dado corretamente. Portanto aquele teste talvez não seja necessário. Talvez seu compilador esteja perdido com números grandes. Tenta um tipo de variável "de verdade" do c

unsigned long int data;

pra ver se esta porcaria aceita

Troque de compilador que tenho aversão ou troque a versão.

Mas ainda acho que é questão de incialização correta do hw

 

 

 

 

(led=a>>4) ====> Essa sintaxe o CCS não aceitou por isso fiz a alteração

 

Também acho que não é necessário rodar esse código uma vez que está funcionando bem com 877A

 

Vou fazer a mudança que você sugeriu e realizar os testes.

Ontem eu fiz testes com outros valores de cristais 8MHz, 10MHz e 12MHz e nada...o PIC 628A não acende os LEDs

 

Também acho que é alguma configuração de hw do micro

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

saidera...

tente faze-lo piscar leds nos mesmos pinos independente da entrada. Ou seja faça um pisca led literalmente falando. Acho que você queimou esta etapa

for(;{RA0^=1;//output_toggle(PIN_A0); iécaRA1^=1;//output_toggle(PIN_A1); iécaRA2^=1;//output_toggle(PIN_A2); iéca//ou PORTA^=0xff; use a sintaxe do seu compiladordelay(500);//meio segundo}

Assim você isola o problema

Se ainda assim não piscar, tente outro port B ou C. Não se esqueça de zerar o TRIS. Trocadilhaidiotamente.. pode estar por um tris. E não use led verde!

Link para o comentário
Compartilhar em outros sites

É isadora....fiz os testes e o mistério continua...não aciona nenhum LED

 

Mudei pra DATA

Desabilitei o PWM

Desabilitei os comparadores

 

O código ficou assim:

#include <16F628A.h>#FUSES XT, NOWDT, NOPROTECT,NOLVP,BROWNOUT, PUT#use delay(clock = 4000000)#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8)#define RFIn PIN_B0 //entrada do sinal de RF#define NBIT 28 // numero de bits//INT32 DATA=0;unsigned long int DATA;int1 decoder(void){byte x=0;int16 time_aux=0;DATA=0;while(!input_state(RFIn)){time_aux++;delay_us(10);}if((time_aux>1149) || (time_aux<=1151)){for(x=0;x<NBIT;x++){while(input_state(RFin));delay_us(250);if(input_state(RFIn)){return FALSE;}delay_us(500);if(!input_state(RFIn)){DATA|=0x8000000;DATA>>=1;}else data>>=1;delay_us(500);if(!input_state(RFin)){return FALSE;}}return TRUE;}else return FALSE;}void main(){set_tris_A(0b00000000);set_tris_B(0b11111111);setup_ccp1 (ccp_off);setup_comparator (NC_NC_NC_NC);while (TRUE) {decoder();if(DATA==112971776){ output_toggle(PIN_A0);delay_ms(300);}else if(DATA==110874624){ output_toggle(PIN_A1);delay_ms(300);}else if(DATA==111923200){ output_toggle(PIN_A2);delay_ms(300);}}}

E agora???

 

Oh céus...Não sei mais o que fazer

Me ajuda Isadoraaaa !!!


Isadora,

 

Também fiz o seguinte teste:

 

Enquanto mantenho o pino B0 (push bottom) em nivel baixo

os LEDs nos Pinos A0 e A1 ficam piscando

 

Funcionou normalmente

O código de teste ficou assim:

#include <16F628A.h>#FUSES XT, NOWDT, NOPROTECT,NOLVP,BROWNOUT, PUT#use delay(clock = 4000000)#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8)  #define RFIn PIN_B0 //entrada do sinal de RF#define NBIT 28 // numero de bits//INT32 DATA=0;//unsigned long int DATA;int1 decoder(void){while(!input_state(RFIn)){output_toggle(PIN_A0);delay_ms(500);output_toggle(PIN_A1);}}void main(){set_tris_A(0b00000000);set_tris_B(0b11111111);setup_ccp1 (ccp_off);setup_comparator (NC_NC_NC_NC);while (TRUE) {decoder();}}
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

você vai ter que bolar um jeito de ver se a variável DATA está com o dado correto. Nem me lembro se disse que está. Por acaso colocou display no 628? Se não, tente enviá-la via terminal com um printf p.ex. Ou se não, tente vê-la no debug do mplab

 

Tente usar o mikroc. É facim de portar.

Link para o comentário
Compartilhar em outros sites

você vai ter que bolar um jeito de ver se a variável DATA está com o dado correto. Nem me lembro se disse que está. Por acaso colocou display no 628? Se não, tente enviá-la via terminal com um printf p.ex. Ou se não, tente vê-la no debug do mplab

 

Tente usar o mikroc. É facim de portar.

   

Pela lógica acredito que sim...a variável DATA está com o dado correto, uma vez que código + Modulo RF433 funcionam no PIC 877A

 

Mas vou colocar um LCD no PIC 628A e ver o que ta chegando na variável DATA

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber 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!