Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
pirulito.junior

Dúvida pic 16f648a

Recommended Posts

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.

Compartilhar este post


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

Editado por LEOPUENA

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • 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..

    Compartilhar este post


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

    Compartilhar este post


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

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • desculpe mas nao entendo muito a respeito, dera que alguem pode me passa um codigo pro mikrobasic? muito grato pela atençao.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • A ideia sugerida é ,ao receber um pulso na entrada ,você pulsa duas vezes a saida.

    isso! porém conforme diminui o intervalo de tempo entre os pulsos de entrada teria que fazer o mesmo na saida mas com o dobro da entrada, entende?

    Compartilhar este post


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

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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.

    Compartilhar este post


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

    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






    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

    ×