Ir ao conteúdo
  • Cadastre-se
Microdesign

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

Recommended Posts

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/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?

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja o FUSE HS.

você está trabalhando a 4mhz.

Use o XT.

Vamos ver se só isso resolve.

Falou

Compartilhar este post


Link para o post
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?

Compartilhar este post


Link para o post
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

 

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

abç

  • Curtir 1

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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ç

Compartilhar este post


Link para o post
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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sou fã de PIC e todo mundo sabe...

Mas em qualquer projeto, a primeira coisa é definir o tipo de micro usado.

Será que estou falando besteira?

Compartilhar este post


Link para o post
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ç

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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...

Compartilhar este post


Link para o post
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++;
}
}

Compartilhar este post


Link para o post
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...

Compartilhar este post


Link para o post
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++;}}

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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!

Compartilhar este post


Link para o post
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();}}

Compartilhar este post


Link para o post
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.

Compartilhar este post


Link para o post
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

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

×