Ir ao conteúdo
  • Cadastre-se

PIC Como fazer piscar o led com o 12f629


Posts recomendados

Agora o que mudou foi que até então ao fechar e abrir o botão e mantê-lo aberto, o led piscava sem parar.

Agora, ao fazer o mesmo procedimento, o led pisca só 1 vez. Nunca mas ele pisca. Porém pisca imediatamente quando abre o botão. Ou seja, continua não dando bola para a variável tempo

 

Troço chato

#include <12F675.h>
#device adc=8
#use delay(clock=4000000)
#fuses NOWDT,INTRC_IO, NOCPD, NOPROTECT, NOMCLR, PUT, BROWNOUT
#use fast_io(A)
//#end if
#ZERO_RAM

#byte tris=0x85

#bit  led     = 0x5.4 //pino 3
#bit  botao   = 0x5.0 //pino 7

int tempo;
int1 flag_led_piscou;

void main() {
 
   tris=0b001101; //gp0 como entrada
   tempo=0;

   flag_led_piscou=0;
 
   while(true){
     
   if(botao==1){
      delay_ms(100);    // filtro de ruído
      while(botao==0 && flag_led_piscou==0){
        delay_ms(1);
        tempo++;
        if (tempo==5000){
            led=1;
            delay_ms(500);    //led aceso
            led=0;
            flag_led_piscou=1;  // poderia ser um return ou sei la
                }
            }
    tempo=0;
    led=0;   
        }
 
  }
}

 

Link para o comentário
Compartilhar em outros sites

achei outro erro meu.... dps q sair do while coloca a flag em 0 de novo kkkkk

 

#use fast_io(A)
//#end if
#ZERO_RAM

#byte tris=0x85

#bit  led     = 0x5.4 //pino 3
#bit  botao   = 0x5.0 //pino 7

int tempo;
int1 flag_led_piscou;

void main() {
 
   tris=0b001101; //gp0 como entrada
   tempo=0;

   flag_led_piscou=0;
 
   while(true){
     
   if(botao==1){
      delay_ms(100);    // filtro de ruído
      while(botao==0 && flag_led_piscou==0){
        delay_ms(1);
        tempo++;
        if (tempo==5000){
            led=1;
            delay_ms(500);    //led aceso
            led=0;
            flag_led_piscou=1;  // poderia ser um return ou sei la
                }
            }
    tempo=0;
    led=0;
    flag_led_piscou=0;   //af q put$ria
        }
 
  }
}

Link para o comentário
Compartilhar em outros sites

ainda não entendi porque ele liga imediatamente ao abrir o botão , vou dar mais uma olhada aqui

naooo, é so int mesmo aff ausheuhasea
copiei o seu codigo pra modificar, acho que não existe int1
colocou flag_led_piscou=0; dps q saiu do while(botao==0 && flag_led_piscou==0)?
não precisa ser essa flag, pode ser algum comando q saia do while, eu n conheço muito essa linguagem
 

Link para o comentário
Compartilhar em outros sites

Coloquei. Agora toda vez que fecha e abre o botão, atua só na abertura, o led pisca imediatamente.

Vale dizer que estou usando um pic 12f629 que na maioria dos casos funciona beleza com código para 12f675, acho que a única diferença de um pro outro é que o 675 tem conversor AD. Já mudei o include e setei para 12f629 no compilador, nada mudou.

Ficou assim, só pra confirmar:

 

#include <12F675.h>
#device adc=8
#use delay(clock=4000000)
#fuses NOWDT,INTRC_IO, NOCPD, NOPROTECT, NOMCLR, PUT, BROWNOUT
#ZERO_RAM

#byte tris=0x85

#bit  led     = 0x5.4 //pino 3
#bit  botao   = 0x5.0 //pino 7

int tempo;
int flag_led_piscou;

void main() {
 
   tris=0b001101; //gp0 como entrada
   tempo=0;
   flag_led_piscou=0;
 
   while(true){
     
   if(botao==1){
      delay_ms(100);    // filtro de ruído
      while(botao==0 && flag_led_piscou==0){
        delay_ms(1);
        tempo++;
        if (tempo==5000){
            led=1;
            delay_ms(500);
            led=0;
            flag_led_piscou=1;
                }
            }
    flag_led_piscou=0;
    tempo=0;
    led=0;   
        }
 
  }
}

 

Link para o comentário
Compartilhar em outros sites

Se não der desisto, (por hj kkk)

 

#include <12F675.h>
#device adc=8
#use delay(clock=4000000)
#fuses NOWDT,INTRC_IO, NOCPD, NOPROTECT, NOMCLR, PUT, BROWNOUT
#use fast_io(A)
//#end if
#ZERO_RAM

#byte tris=0x85

#bit  led     = 0x5.4 //pino 3
#bit  botao   = 0x5.0 //pino 7

int tempo;
bool flag_led_piscou;
bool flag_botao_acionou;

void main() {
 
   tris=0b001101; //gp0 como entrada
   tempo=0;
   flag_led_piscou= false;
   flag_botao_acionou= false;

   while(true){
   tempo=0;
   if(botao==1){
    flag_botao_acionou=true;
        tempo=0;
}
   while(flag_botao_acionou==true && flag_led_piscou==false && botao==0){
        delay_ms(1);
        tempo++;
        if (tempo==5000){
            led=1;
            delay_ms(500);    //led aceso
            led=0;
            flag_led_piscou=true;
            flag_botao_acionou=false;
            tempo=0;
                }
            }
     flag_led_piscou=false;
     flag_botao_acionou=false;
  }
}

Link para o comentário
Compartilhar em outros sites

Deixa int entao, e troca os true e false por 0 e 1, da na mesma

#include <12F675.h>
#device adc=8
#use delay(clock=4000000)
#fuses NOWDT,INTRC_IO, NOCPD, NOPROTECT, NOMCLR, PUT, BROWNOUT
#use fast_io(A)
//#end if
#ZERO_RAM

#byte tris=0x85

#bit  led     = 0x5.4 //pino 3
#bit  botao   = 0x5.0 //pino 7

int tempo;
int flag_led_piscou;
int flag_botao_acionou;

void main() {
 
   tris=0b001101; //gp0 como entrada
   tempo=0;
   flag_led_piscou= 0;
   flag_botao_acionou= 0;

   while(true){
   tempo=0;
   if(botao==1){
    flag_botao_acionou=1;
        tempo=0;
}
   while(flag_botao_acionou==1 && flag_led_piscou==0 && botao==0){
        delay_ms(1);
        tempo++;
        if (tempo==5000){
            led=1;
            delay_ms(500);    //led aceso
            led=0;
            flag_led_piscou=1;
            flag_botao_acionou=0;
            tempo=0;
                }
            }
     flag_led_piscou=0;
         flag_botao_acionou=0;
  }
}

Link para o comentário
Compartilhar em outros sites

OK, feito. Voltou àquelas duas mensagens das linhas 18 e 19

Será que não tem que setar nenhum timer interno do PIC...pra contar ? ...sei lá

OK, compilou, vou testar

 

 

Deu no mesmo, quando abre o botão, o led pisca imediatamente. Eu tinha até agora as 21:00. Que troço essa linguagem, tanta coisa pra piscar um led com retardo. Mas enfim, grato demais, se você puder e quiser amanhã poderei fazer mais testes. Valeu.

 

 

 

Link para o comentário
Compartilhar em outros sites

Se puder mostra o esquema elétrico, to vendo q ta em um oscilador rc entao não deve ser arduino, dependendo da ligação pode dar pau também, tipo se não colocar resistor nas entradas ligados no terra (de uns 3 a uns 15 k devem servir, 10k eh o habitual ).
Tem o timer0 q da pra usar a interrupção dele(quando ele estoura) pra contar tempo(colocando valor inicial no timer e definindo quantas linhas de código contam uma unidade do timer nas config da pra contar qualquer valor de tempo) , a interrupção para o programa e leva a execução dos ciclos pra um endereço no começo da memória(linha 4) e de lá você faz o que quiser
o byte tris=0x85 n seria byte tris=0x85h ? ou não precisa do h?
to sem meus componentes aqui, pior q eu tenho esse pic kkkk mas to em outra cidade....

Link para o comentário
Compartilhar em outros sites

 

O melhor código é este, nele o led só pisca quando a chave abre, ou seja, quando Gp0 = 0 (resistor de 10K para o GND). Sem ruído, só pisca 1 vez, etc. Tá beleza. Mas o propósito é: O led só pode piscar se a chave abrir e ficar 5 segundos aberta, aí sim o led pisca só 1 vez. O problema é que não adianta pôr uma variável x e fazer x++ e depois x==5000 pois não funciona de jeito nenhum. Parece estar faltando settar algum recurso interno do PIC para que ele possa contar.

 

#include <12F675.h>
#device adc=8
#use delay(clock=4000000)
#fuses NOWDT,INTRC_IO, NOCPD, NOPROTECT, NOMCLR, PUT, BROWNOUT

#byte tris=0x85

#bit  led     = 0x5.4 //pino 3
#bit  botao   = 0x5.0 //pino 7

void main() {
 
   tris=0b001101; //gp0 como entrada
 
   while(true){

      while(botao==1){
        delay_ms(20);
          if(botao==0){
            delay_ms(20);
            led=1;
            delay_ms(500);
            led=0;
            }
        }
    }
}

 

 

Ali onde o delay_ms(20) eu mudei para delay_ms(6000), quase que resolveu de vez. Pois, ao abrir a chave, o led só pisca após os delay, que aliás na prática dá quase 4 segundos e não os 6s previstos. Mas o detalhe é que se a chave tornar a ser fechada antes do tempo terminar, o led não pode piscar e o tempo tem que reiniciar. Isso com delay não acontece. Depois que a chave abriu, não importa se ela torna a fechar que o led vai piscar de qualquer maneira.

Link para o comentário
Compartilhar em outros sites

 

Desta outra forma é curioso pois o led pisca após eu fechar e abrir o botão 6 vezes. Então tá contando ? mas ainda não é o caso. Teria que contar 5 segundos e não quantidade de vezes. Isso me faz crer que eu preciso remover o while, mas se eu remover o while vai contar direto, e não é para contar direto mas sim somente quando a chave abrir depois de ter estado fechada.

 

while(botao==1){
        delay_ms(20); 
          if(botao==0){
          x++;         
            if(x==6){
             led=1;
             delay_ms(400);
             led=0;
             x=0;

 

 

 

Mas se eu fizer assim, o led pisca direto assim que a chave fechar, ou seja, ignora totalmente a variável x, como se não existisse as linhas x++ e if(x==6000). 

 

 if(botao==1){
     x++;
     delay_ms(1);         
        if(x==6000){
          led=1;
          delay_ms(400);
          led=0;
          x=0;

 

Link para o comentário
Compartilhar em outros sites

nesse ultimo quando você aperta o botao o programa esta lendo
if(botao==1){
x++;
}
entao como você demorou mais de um décimo de segundo pra apertar o botao o programa ja leu essas linhas de codigo pelo menos centenas de vezes por isso o x já vai direto pro 6000 e aciona o led, pra isso q serve o filtro de ruido do botão, é tipo um delay q você bota no programa

no penultimo você fez um filtro de ruido pro botão...
while(botao==1){
    delay_ms(20);

 

esse gp3 tb ta como entrada, liga um resistor de 10k no terra igual fez com o botao

 

sei gp0 tb ta como entrada... coloca como saída ou bota um resistor também, ou não vai funcionar direito

Link para o comentário
Compartilhar em outros sites

 @eletron1791,

 

Cansei de ver você sofre aqui ....

Se você não pode usar a interrupção do timer como base de tempo, ( não sei por qual motivo, mas aposto que na tal outra etapa ele também será usado como alguma base de tempo ... ) , a maneira de fazer é criar um delay pequeno, por exemplo 1 milissegundo, e criar um loop onde você chama essa rotina de delay, e incrementa uma variável, e testa o botão, e testa a variável, e volta ao inicio da rotina. Assim você pode comparar o contador de tempo que é essa variável, e pode agir no Led quando necessário, e sair desse trecho de programa quanto algum tempo limite é atingido.

Esquece isso de usar delays longos.

 

Não posso te ajudar no código em C, não entendo nada, então paro por aqui.

 

Paulo

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

Paulo, essa linguagem c é doida mesmo, estamos apanhando bastante aqui. E acho que já fizemos sua sugestão mas não quis funcionar.

 

PATO, Gp0 é o pino 7, tem que ficar como entrada pois é o botão. E Gp3 é o pino 4, que não está sendo usado (mesmo assim tá com R 10K indo para o +5). O que falta entenderemos é por que parece que não está aceitando este trecho do código ?

 

 delay_ms(1);
        tempo++;
        if (tempo==5000){

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 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...