Ir ao conteúdo
  • Cadastre-se

Sequencial de LED 16 canais


Posts recomendados

boa tarde meus caros!! estou montando um sequencial de leds com 16 canais usando o PIC16F877A e preciso de ajuda para resolver o problema no código!! o objetivo do programa é seguir uma sequencia de efeitos e que também seja possível mudar essa sequencia d para uma diferente pressionando um botão que denominarei de "mode".


 


o codigo que eu fiz esta assim: 


 


#include <16F877A.h>

#device adc=16

 

#FUSES NOWDT                    //No Watch Dog Timer

#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)

#FUSES PUT                      //Power Up Timer

#FUSES NOBROWNOUT               //No brownout reset

 

#use delay(clock=16000000)

 

// entrada

#define mode    pin_a0 // declaradas entrada

 

//Subrotinas

 

void efeito1(void)

   {

   output_b(0b00000000);

   output_d(0b11111111);

   delay_ms(500);  

   output_b(0b11111111);

   output_d(0b00000000);

   delay_ms(500);

  

}

 

void efeito2(void)

   {

   output_b(0b10101010);

   output_d(0b01010101);

   delay_ms(500);

   output_b(0b10101010);

   output_d(0b01010101);

   delay_ms(500);

 

}

 

// programa principal

void main()

   {

   

      do{

      efeito1();

      }

      while (input(mode));

      

      do{

      efeito2();

      }

      while (input(mode));

 

   }

 

 

 

segue em anexo também o esquema do circuito

alguem poderia me ajudar??

grato!!!

post-697591-0-63433000-1429732452_thumb.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Que tal uma tabela de efeitos? e com vários não só 2...

unsigned char const tabelaB[]={0b01010101,0b10101010,0b11001100,...//até quase o limite da flash, deixe um pouco pro programa} unsigned char const tabelaD[]={0b01010101,0b10101010,0b11001100,...//até quase o limite da flash, deixe um pouco pro programa}#define LIMITE 2048 //p.ex.#define mode RA0main(){unsigned char i;unsigned int a;...//inicializa hwfor(;{for (i=0;i<8;i++){if (!mode) a+=8;//8 efeitos em cada "mode"if (a>LIMITE) a=0; //numero de efeitosPORTB=tabelaB[a+i];PORTD=tabelaD[a+i];delay(xxx);}}}

voce pode também criar efeitos aleatórios. Me lembro de ter visto uma rotina em c para tal. (preguiça de procurar). Penso também que pode usar um timer pra isso, ou uma carga de um capacitor + ad. Mas aí o trem começa a ficar complexo. Muita calma nesta hora

abç

Link para o comentário
Compartilhar em outros sites

Na vdd eunquero colocar mais efeitos mas preciso entender a logica!!! Fiz um algoritmo e esse programa que eu fiz foicompilado e rodou no pic!! So nao fez o que eu queria q fizesse mas com a ajuda de vocês com certeza vou conseguir!!! Vou ver os codigos q vocês mandaram!!! Muito grato!!!

 

Tente assim:

// programa principalvoid main(){   do   {      if (input(mode))         efeito1();      else         efeito2();   }   while (true);}

fala meu caro!!! tudo bom?? o codigo que você me passou rodou lindamente!!! é o mais proximo do objetivo!!! so que tem um porém!!! quando você pressiona a tecla ela muda o efeito mas nao trava!! quando solta o botao mode ela volta pro efeito anterior!!! como resolvo isso??

Link para o comentário
Compartilhar em outros sites

@AllanRoncali

 

Crie uma variável para servir de flag, e quando você aperta o botão, inverta o valor da variável.

 

Teste essa variável e escolha o efeito conforme o conteúdo dela.

 

Detalhe, botões tem ruídos.... você logo vai perceber kkkkk !

 

Mas vou deixar para você "sentir" esse problema !

 

atualização : enquanto eu escrevia o Nayuugga respondeu ... mas lá vem os ruídos kkkk !

 

Paulo

Link para o comentário
Compartilhar em outros sites

kkkkkkkkkkkkkkkkk e eu tava escrevendo isso!! pelo menos to tentando pensar!!! kkkkkkkkkkkkkkkkkkkkkkk

 

// programa principal

void main()
   
{
  do
      {
      if(input(mode))               
           { a++;                     
 
         if ( a == 1 )              
         efeito1();                
 
         else if ( a == 2 )      
         efeito2();                
                                   
         if (a > B)      
         a = 0;         
          }
        while (true);
      }
}
Link para o comentário
Compartilhar em outros sites

 

Tente assim então:

unsigned char flag = 0;unsigned char ap = 0;void main(){   do   {      if (input(mode) && !ap)      {         flag = !flag;         ap = 1;      }      if (!input(mode) && ap)         ap = 0;      if (flag)         efeito1();      else         efeito2();   }   while (true);}

legal!! funcionou!!! :) pra dois efeitos!! to tentando entender a logica dele pra ver se consigo inserir mais efeitos, mas não ta compilando!!!

olha so:

 

unsigned char flag = 0;
unsigned char ap = 0;
 
//programa principal
 
void main()
{
   do
   {
      if (input(mode) && !ap)
      {
         flag = !flag;
         ap = 1;
      }
 
      if (!input(mode) && ap)
         ap = 0;
 
      if (flag)
         efeito1();
      else
         efeito2(); 
      else
         efeito3();
       }
   while (true);
}
 
ai eu criei mais uma sub-rotina pra efeito3!! 
sera que nao precisaria então de um contador que tivesse um limite de falou igual a quantidade de efeitos?? dessa forma poderia enumerar os efeitos e o valor do contador seleciona o efeito de numero equivalente ao valor do contador! mais ou menos assim:
 
#define RA0 mode
char a = 1
char contador = 0
 
inicio
{
      se (!input (mode));
  a + contador = contador;
 
 
}
Link para o comentário
Compartilhar em outros sites

Pra 3 tem que ser assim:

unsigned char flag = 0;unsigned char ap = 0;void main(){   unsigned char quantidadeEfeitos = 3;//Mude a quantidade de efeitos aqui..   do   {      if (input(mode) && !ap)      {         flag++;         ap = 1;         if (flag >= quantidadeEfeitos)           flag = 0;      }      if (!input(mode) && ap)         ap = 0;            switch (flag)      {          case 0: efeito1(); break;          case 1: efeito2(); break;          case 2: efeito3(); break;          //Insira mais efeitos aqui..      }   }   while (true);}
Link para o comentário
Compartilhar em outros sites

 

Tente assim então:

unsigned char flag = 0;unsigned char ap = 0;void main(){   do   {      if (input(mode) && !ap)      {         flag = !flag;         ap = 1;      }      if (!input(mode) && ap)         ap = 0;      if (flag)         efeito1();      else         efeito2();   }   while (true);}

legal!! funcionou!!! :) pra dois efeitos!! to tentando entender a logica dele pra ver se consigo inserir mais efeitos, mas não ta compilando!!!

olha so:

 

unsigned char flag = 0;
unsigned char ap = 0;
 
//programa principal
 
void main()
{
   do
   {
      if (input(mode) && !ap)
      {
         flag = !flag;
         ap = 1;
      }
 
      if (!input(mode) && ap)
         ap = 0;
 
      if (flag)
         efeito1();
      else
         efeito2(); 
      else
         efeito3();
       }
   while (true);
}
 
ai eu criei mais uma sub-rotina pra efeito3!! 
 
sera que nao precisaria então de um contador que tivesse um limite de falou igual a quantidade de efeitos?? dessa forma poderia enumerar os efeitos e o valor do contador seleciona o efeito de numero equivalente ao valor do contador! mais ou menos assim:
 
#define RA0 mode
char a = 1
char contador = 0
char limite = 3
 
inicio
{
      se (!input (mode));
            a + contador = contador;
     {
       se (contador == 1)
            efeito1();                  
 
       senao (contador == 2)
             efeito2();
 
       senao (contador == 3)
             efeito3();
 
       se (limite>3; contador = 0)
 
  }
}
        valeu!!!

 

Pra 3 tem que ser assim:

unsigned char flag = 0;unsigned char ap = 0;void main(){   unsigned char quantidadeEfeitos = 3;//Mude a quantidade de efeitos aqui..   do   {      if (input(mode) && !ap)      {         flag++;         ap = 1;         if (flag >= quantidadeEfeitos)           flag = 0;      }      if (!input(mode) && ap)         ap = 0;            switch (flag)      {          case 0: efeito1(); break;          case 1: efeito2(); break;          case 2: efeito3(); break;          //Insira mais efeitos aqui..      }   }   while (true);}

me mandou antes de eu terminar de por outra duvida!!! kkkkkkkkkkkkkkk 

@AllanRoncali,

 

O que eu falei sobre ruídos, pode ser que você não perceba na simulação, mas na montagem real vai perceber sim ....

 

Paulo

realmente o ruido apareceu!!! o simulador leva tempo pra perceber o pulso no mode!!

legal!! funcionou!!! :) pra dois efeitos!! to tentando entender a logica dele pra ver se consigo inserir mais efeitos, mas não ta compilando!!!

olha so:

 

unsigned char flag = 0;
unsigned char ap = 0;
 
//programa principal
 
void main()
{
   do
   {
      if (input(mode) && !ap)
      {
         flag = !flag;
         ap = 1;
      }
 
      if (!input(mode) && ap)
         ap = 0;
 
      if (flag)
         efeito1();
      else
         efeito2(); 
      else
         efeito3();
       }
   while (true);
}
 
ai eu criei mais uma sub-rotina pra efeito3!! 
 
sera que nao precisaria então de um contador que tivesse um limite de falou igual a quantidade de efeitos?? dessa forma poderia enumerar os efeitos e o valor do contador seleciona o efeito de numero equivalente ao valor do contador! mais ou menos assim:
 
#define RA0 mode
char a = 1
char contador = 0
char limite = 3
 
inicio
{
      se (!input (mode));
            a + contador = contador;
     {
       se (contador == 1)
            efeito1();                  
 
       senao (contador == 2)
             efeito2();
 
       senao (contador == 3)
             efeito3();
 
       se (limite>3; contador = 0)
 
  }
}
        valeu!!!

me mandou antes de eu terminar de por outra duvida!!! kkkkkkkkkkkkkkk 

realmente o ruido apareceu!!! o simulador leva tempo pra perceber o pulso no mode!!

o codigo rodou!!! so leva tempo pro programa reconhecer o botao mode

Link para o comentário
Compartilhar em outros sites

É por causa dos delays chamados dentro dos métodos de efeitos. O botão demora cerca de 1 segundo para mudar..

acabei de achar na minha apostila o condicional switch!! foi exatamente o que eu nao tinha entendido quando estudei a apostila!!! kkkkkkkk

com relaçao ao tempo eu vou modificar todos os efeitos e colocar tempo menor!!!

acabei de achar na minha apostila o condicional switch!! foi exatamente o que eu nao tinha entendido quando estudei a apostila!!! kkkkkkkk

com relaçao ao tempo eu vou modificar todos os efeitos e colocar tempo menor!!!

a questao de reduzir o tempo deu certo!! 

pessoal!! fiquei muito grato pela força!!! Deus abençoes vocês!!! 

Link para o comentário
Compartilhar em outros sites

@AllanRoncali,

 

Esse problema de ruído no botão chama-se Bouncing. E as técnicas de eliminar chamam-se Debouncing. Pesquise aqui no Fórum , tem muita coisa sobre isso.

 

Paulo

ja ouvi falar disso mas quando eu estudava assembly!!! vou pesquisar agora!!! :)  grato!!!!

ja ouvi falar disso mas quando eu estudava assembly!!! vou pesquisar agora!!! :)  grato!!!!

entendi o que é!!! eu coloco um delay antes do teste do botao!!!

tipo assim: 

 

if(botao = 1)

{

delay_ms(100);

if(botão = 1)

{

// Botão acionado.

}

else if(botão = 1)

{

// nao esperou tempo suficiente

}

{

ja ouvi falar disso mas quando eu estudava assembly!!! vou pesquisar agora!!! :)  grato!!!!

entendi o que é!!! eu coloco um delay antes do teste do botao!!!

tipo assim: 

 

if(botao = 1)

{

delay_ms(100);

if(botão = 1)

{

// Botão acionado.

}

else if(botão = 1)

{

// nao esperou tempo suficiente

}

{

mas ai eu também posso mudar o tempo dos meus efeitos!! 

Link para o comentário
Compartilhar em outros sites

@AllanRoncali,

 

Hehehe olha, uma maneira é essa de usar um delay, para garantir que você solte o botão e não haja mais nenhum ruído quando for feita uma nova leitura. Mas use um delay mais "amigável", eu diria que uns 200 mseg  já serve .

 

A melhor maneira dem se fazer isso é por software mesmo, usando interrupção,  existem alguns algoritmos para isso. Mas mude o delay para uns 200 mseg e já vai servir bem para você.

 

Desde que você de apenas uma apertada no botão e solte kkkkk !

 

Paulo

Link para o comentário
Compartilhar em outros sites

@AllanRoncali

Para evitar que o botão demore a responder e incrementar o Mode, use uma interrupção por borda. No CCS é facin de configurar.

O ideal também é evitar os delays nos efeitos, usando outra interrupção de tempo.

Dá uma olhada nesse codigo:
 

#include <16F877A.h>#FUSES NOWDT                    //No Watch Dog Timer#FUSES XT                       //Crystal osc <= 4mhz#FUSES PUT                      //Power Up Timer#FUSES NOPROTECT                //Code not protected from reading#FUSES BROWNOUT                 //Reset when brownout detected#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O#FUSES NOCPD                    //No EE protection#use delay(clock=4000000)int controle;#int_CCP1void trata_ccp1(void){   controle++;}void main() {      output_low (PIN_B1);   SETUP_CCP1(CCP_CAPTURE_RE);         enable_interrupts(INt_CCP1);      enable_interrupts(global);                   //habilita interrupcão global      while (true)   {      if (controle == 3)      {         output_toggle (PIN_B1);         controle = 0;      }   }}

Falou

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

@MatheusLPS,

 

Por acaso você está questionando a opção sexual da Isadora ??????? 

Cuidado que ele pode te processar por discriminação !!!!     :lol:

Mas algo me diz que existe um dedo de algum administrador do Fórum nessa suposta "troca de identidade" , quem sabe o @Bcpetronzio tenha "colocado a mão"  nisso kkk !

 

 

Paulo

Link para o comentário
Compartilhar em outros sites

@MatheusLPS,

 

Por acaso você está questionando a opção sexual da Isadora ??????? 

Cuidado que ele pode te processar por discriminação !!!!     :lol:

Mas algo me diz que existe um dedo de algum administrador do Fórum nessa suposta "troca de identidade" , quem sabe o @Bcpetronzio tenha "colocado a mão"  nisso kkk !

 

 

Paulo

kkkk alem da galera ajudar a resolver problema de programação eles divertem a gente!! site nota 10!! kkkkkkkkkkkkkkkkkkkkkkk

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