Ir ao conteúdo
  • Cadastre-se

Dúvida pic 16f648a


pirulito.junior

Posts recomendados

ola amigos do clube, sou novo aqui e estou com uma duvida a respeito do pic 16f 648a, sou leigo a respito de programaçao de microcontroladores o pouco que sei aprendi "fuçando", gostaria de saber se é possivel com o pic16f648a eu programalo para que toda ves que receber um pulso negativo ele enviar 2?

precizo para o seguinte, tenho uma moto e o contagiro marca exatamente a metade pois o painel foi adaptado então precizo dobrar os pulsos.

o circuito eu montei porém nao consigo programa-lo nao consigo escrever o programa correto. estou usando o mikrobasic.

aguardo resposta.

Link para o comentário
Compartilhar em outros sites

voce pode postar aquilo que já tem feito? como o circuito e o programa.

Eu não domino o basic, mas creio ser algo simples em qualquer linguagem.

Por exemplo em C

if(entrada==0){
saida=1;
delay
saida=0;
saida=1;
delay
saida=0;
}

e em ASM

[codeE]btfsc entrada

goto $-1

bsf saida

call delay1

bcf saida

call delay2

bsf saida

call delay1

bcf saida[/codeE]

Qual é o tempo entre os pulsos, e o tempo de duração do pulso?

Link para o comentário
Compartilhar em outros sites

voce pode postar aquilo que já tem feito? como o circuito e o programa.

Eu não domino o basic, mas creio ser algo simples em qualquer linguagem.

Por exemplo em C

if(entrada==0){
saida=1;
delay
saida=0;
saida=1;
delay
saida=0;
}

e em ASM

[codeE]btfsc entrada

goto $-1

bsf saida

call delay1

bcf saida

call delay2

bsf saida

call delay1

bcf saida[/codeE]

Qual é o tempo entre os pulsos, e o tempo de duração do pulso?

o tempo nao é exato pois conforme eu acelero a moto diminui o intervalo entende? teria que ser um esquema que toda ves ki a moto mandar um pulso o pic mande 2 e conforme vou acelerando o pic também tera ki tera ki diminuir o intervalo de tempo entende? grato pela atençao..

Link para o comentário
Compartilhar em outros sites

voce pode postar aquilo que já tem feito? como o circuito e o programa.

Eu não domino o basic, mas creio ser algo simples em qualquer linguagem.

Por exemplo em C

if(entrada==0){
saida=1;
delay
saida=0;
saida=1;
delay
saida=0;
}

e em ASM

[codeE]btfsc entrada

goto $-1

bsf saida

call delay1

bcf saida

call delay2

bsf saida

call delay1

bcf saida[/codeE]

Qual é o tempo entre os pulsos, e o tempo de duração do pulso?

assim acho que da certo só quero acrescentar que acho necessario um delay na segunda passagem de 0 para 1

ficando assim

if(entrada==0){

saida=1;

delay

saida=0;

delay

saida=1;

delay

saida=0;

}

pois a passagem pode ser tão rapida que o giro... pode não identificar como um pulso

quanto a imprcisão use um cristal pos a imprecisão no delay se da pela imprecisão do oscilador interno

Link para o comentário
Compartilhar em outros sites

assim acho que da certo só quero acrescentar que acho necessario um delay na segunda passagem de 0 para 1

ficando assim

if(entrada==0){

saida=1;

delay

saida=0;

delay

saida=1;

delay

saida=0;

}

pois a passagem pode ser tão rapida que o giro... pode não identificar como um pulso

É exactamente isso.

Link para o comentário
Compartilhar em outros sites

esta dizendo q o tempo do pulso da entrada tem q ser igual o da saida ,porém o dobro de pulso? Sendo assim precisaria ao receber o pulso contar o tempo em q ele mantem em x nivel e ao mudar você acionaria a saida pulsando 2 vezes com o tempo salvo no contador.

seria algo como:


se entrada=0
cont++
se entrada=1
contador=cont
cont=0
saida=1
delay(contador)
saida=0
delay(contador)
saida=1
delay(contador)
saida=0
delay(contador).....

Link para o comentário
Compartilhar em outros sites

esta dizendo q o tempo do pulso da entrada tem q ser igual o da saida ,porém o dobro de pulso? Sendo assim precisaria ao receber o pulso contar o tempo em q ele mantem em x nivel e ao mudar você acionaria a saida pulsando 2 vezes com o tempo salvo no contador.

seria algo como:


se entrada=0
cont++
se entrada=1
contador=cont
cont=0
saida=1
delay(contador)
saida=0
delay(contador)
saida=1
delay(contador)
saida=0
delay(contador).....

desculpe minha ignorância.. mas nao consigo no mikro basic.

Link para o comentário
Compartilhar em outros sites

Colega, sei que isto pode soar um tanto quanto desanimador, mas a resposta para a sua dúvida só vai vir com estudo. Sugiro começar a dar uma lida em apostilas (há várias na internet), baixar o datasheet do PIC que você está utilizando, o manual do compilador que você está utilizando, e estudar.

Este programa que você quer fazer é um tanto quanto complexo à primeira vista, mas depois de entender o uso do periférico CCP do PIC vai ficar mais fácil. Sugiro a utilização de assembly. A ideia já foi exposta acima, deves capturar o intervalo de tempo deste pulso e duplica-lo na saída. Tudo isto pode ser feito utilizando o modo de captura do CCP e um timer como o Timer0, e o código, embora seja relativamente complexo, não é extenso.

Aqui vai uma sugestão descritiva de algoritmo:

1)Habilitar de forma individual as interrupções CCP e TIMERx (onde x é o timer que você deseja utilizar, talvez o ideal seja o TIMER1 que é um timer de 16 bits e o CCP também possui um registrador de 16 bits), utilizando o CCP em modo de captura. Habilitar as interrupções de maneira global.

2)Mover o valor do registrador do CCP para um registrador qualquer e dividir por 4 (isso mesmo, por 4), rotacionando duas vezes para a direita o valor do registrador. Este valor rotacionado vai para o registrador do Timer1, utilizando as conversões necessárias tendo em vista prescaler, postscaler, etc, de forma que o período de estouro do Timer1 seja igual ao período do registrador do CCP dividido por 4.

3)O Timer1 contém um flag, que é invertido cada vez que há estouro de contagem. Este flag é utilizado para ligar ou desligar a saída. Sendo assim, haverão duas inversões de nível lógico 0 para 1, em tempo igual.

|-----|_____ => O período do sinal original é guardado no registrador do CCP, através do modo de captura.

|--|__|--|__ => O Timer1 utiliza o valor do período, dividindo por 4 e invertendo a saída cada vez que há estouro.

Esta é uma sugestão, que pode parecer chata e complexa, mas de nada adianta darmos o código pronto. Como diz meu pai, não se dá o peixe, se ensina a pescar.

Se quiseres continuar utilizando Basic, deves ler o manual do compilador para entender as funções do mesmo. Procure pelo modo CCP e pelo Timer1.

Link para o comentário
Compartilhar em outros sites

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