Entrar    Registrar

Não consegui piscar 2 leds independentes, CCS

Software e Hardware para uC PIC

Moderadores: aluis-rcastro, guest2003, 51, Renie

  • Autor
    Mensagem

Não consegui piscar 2 leds independentes, CCS

Mensagempor erpgc82 » 10 Mai 2020 22:14

Olá pessoal, esta é minha primeira postagem!
Trabalho com eletrônica desde 1996 em manutenção, produção e desenho de placas, só não sei programar firmware.

Comecei a estudar um livro em Abril, a IDE é o CCS, aproveitando essa quarentena.
Já passei mais da metade dos capítulos, mais da metade do livro, com bastante atenção e anotações e decidi então repetir desde o ínicio para aprender melhor.
Porem hoje ao praticar uma mudança num código e já não conseguir fiquei frustrado, gostaria da ajuda de vocês por aqui, se puderem!

O exemplo do livro, é o Exemplo 1, é para piscar apenas um led, ao ligar o circuito, esse eu fiz e funcionou perfeitamente.
Porem ao tentar piscar 2 leds, já não consegui, veja abaixo como fiz nos exemplos 2, 3 e 4:




//Exemplo 1: Funciona 1 LED ok
#include <16f628a.h>
#use delay(clock=4000000)
#fuses INTRC_IO //Irá utilizar clock interno, e os 2 pinos do cristal ficarão disponiveis para Entrada e Saída;
#fuses NOWDT //Whatchdog interno, desabilitado;
#fuses PUT //Aguarda 72ms para estabiliar o circuito e então ligar o PIC;
#fuses BROWNOUT //Monitora se o circuito cair pra menos de 4.5v e resetar o PIC;
#fuses NOLVP //Não efetua gravação por baixa voltagem;
#fuses NOMCLR //Não habilita MASTER CLEAR MOCLR desabilitado, pode usar o PINO MCLR como Entrada e Saída;

void main() //Função principal (corpo principal do programa)
//main() //tambem funciona digitar o comando somente: main()
{ //início do bloco de comandos da função principal;
int tempo; //Variável tempo de 8 bitsl;
tempo = 100; //atribui o valor 100 à variável tempo;
// tambem pode ser escrito: "int tempo=100;"


while(true) //se verdadeiro, fica repetindo, loop infinito. Declara que o bloco de comandos a ser iniciado abaixo, fica repetindo
{ //***** início do bloco de comandos para piscar o led. BLOCO DE INSTRUÇÕES A SEREM REPETIDAS;
output_high(pin_b0); //levanta o pino B0, liga o led;
delay_ms(tempo); //aguarda o valor da variável tempo;
output_low(pin_b0); //abaixa o pino B0, desliga o led;
delay_ms(tempo); //aguarda o valor da variável tempo;
} //***** fim do bloco de comando para piscar o led. BLOCO DE INSTRUÇÕES A SEREM REPETIDAS;
} //Fim do bloco de comandos da função principal;




/*Exemplo 2: Funciona 2 LEDs, porem atrasa a piscada do LED, pois tem que percorrer todos os comandos para
voltar no primeiro e não é isso que eu queria testar; */
#include <16f628a.h>
#use delay(clock=4000000)
#fuses INTRC_IO //Irá utilizar clock interno, e os 2 pinos do cristal ficarão disponiveis para Entrada e Saída;
#fuses NOWDT //Whatchdog interno, desabilitado;
#fuses PUT //Aguarda 72ms para estabiliar o circuito e então ligar o PIC;
#fuses BROWNOUT //Monitora se o circuito cair pra menos de 4.5v e resetar o PIC;
#fuses NOLVP //Não efetua gravação por baixa voltagem;
#fuses NOMCLR //Não habilita MASTER CLEAR MOCLR desabilitado, pode usar o PINO MCLR como Entrada e Saída;

void main() //Função principal (corpo principal do programa)
//main() //tambem funciona digitar o comando somente: main()
{ //início do bloco de comandos da função principal;
int tempo; //Variável tempo de 8 bitsl;
tempo = 100; //atribui o valor 100 à variável tempo;
// tambem pode ser escrito: "int tempo=100;"
int tempo2; // MEU TESTE
tempo2=250; // MEU TESTE


while(true) //se verdadeiro, fica repetindo, loop infinito. Declara que o bloco de comandos a ser iniciado abaixo, fica repetindo
{ //***** início do bloco de comandos para piscar o led. BLOCO DE INSTRUÇÕES A SEREM REPETIDAS;
output_high(pin_b0); //levanta o pino B0, liga o led;
delay_ms(tempo); //aguarda o valor da variável tempo;
output_low(pin_b0); //abaixa o pino B0, desliga o led;
delay_ms(tempo); //aguarda o valor da variável tempo;

output_high(pin_b2); //levanta o pino B2, liga o led; MEU TESTE
delay_ms(tempo2); //aguarda o valor da variável tempo2; MEU TESTE
output_low(pin_b2); //abaixa o pino B2, desliga o led; MEU TESTE
delay_ms(tempo2); //aguarda o valor da variável tempo2; MEU TESTE
} //***** fim do bloco de comando para piscar o led. BLOCO DE INSTRUÇÕES A SEREM REPETIDAS;
} //Fim do bloco de comandos da função principal;





//Exemplo 3: Como imaginei que funcionaria, mas apenas o LED do rb0 funciona corretamente;
#include <16f628a.h>
#use delay(clock=4000000)
#fuses INTRC_IO //Irá utilizar clock interno, e os 2 pinos do cristal ficarão disponiveis para Entrada e Saída;
#fuses NOWDT //Whatchdog interno, desabilitado;
#fuses PUT //Aguarda 72ms para estabiliar o circuito e então ligar o PIC;
#fuses BROWNOUT //Monitora se o circuito cair pra menos de 4.5v e resetar o PIC;
#fuses NOLVP //Não efetua gravação por baixa voltagem;
#fuses NOMCLR //Não habilita MASTER CLEAR MOCLR desabilitado, pode usar o PINO MCLR como Entrada e Saída;

void main() //Função principal (corpo principal do programa)
//main() //tambem funciona digitar o comando somente: main()
{ //início do bloco de comandos da função principal;
int tempo; //Variável tempo de 8 bitsl;
tempo = 100; //atribui o valor 100 à variável tempo;
// tambem pode ser escrito: "int tempo=100;"
int tempo2; // MEU TESTE
tempo2=250; // MEU TESTE


while(true) //se verdadeiro, fica repetindo, loop infinito. Declara que o bloco de comandos a ser iniciado abaixo, fica repetindo
{ //***** início do bloco de comandos para piscar o led. BLOCO DE INSTRUÇÕES A SEREM REPETIDAS;
output_high(pin_b0); //levanta o pino B0, liga o led;
delay_ms(tempo); //aguarda o valor da variável tempo;
output_low(pin_b0); //abaixa o pino B0, desliga o led;
delay_ms(tempo); //aguarda o valor da variável tempo;
} //***** fim do bloco de comando para piscar o led. BLOCO DE INSTRUÇÕES A SEREM REPETIDAS;

{ //***** início do SEGUNDO bloco de comandos para piscar o led do RB2. BLOCO DE INSTRUÇÕES A SEREM REPETIDAS; MEU TESTE
output_high(pin_b2); //levanta o pino B2, liga o led; MEU TESTE
delay_ms(tempo2); //aguarda o valor da variável tempo2; MEU TESTE
output_low(pin_b2); //abaixa o pino B2, desliga o led; MEU TESTE
delay_ms(tempo2); //aguarda o valor da variável tempo2; MEU TESTE
} //***** fim do SEGUNDO bloco de comando para piscar o led. BLOCO DE INSTRUÇÕES A SEREM REPETIDAS; MEU TESTE
} //Fim do bloco de comandos da função principal;





//Exemplo 4: outra tentativa de piscar o outro led;
#include <16f628a.h>
#use delay(clock=4000000)
#fuses INTRC_IO //Irá utilizar clock interno, e os 2 pinos do cristal ficarão disponiveis para Entrada e Saída;
#fuses NOWDT //Whatchdog interno, desabilitado;
#fuses PUT //Aguarda 72ms para estabiliar o circuito e então ligar o PIC;
#fuses BROWNOUT //Monitora se o circuito cair pra menos de 4.5v e resetar o PIC;
#fuses NOLVP //Não efetua gravação por baixa voltagem;
#fuses NOMCLR //Não habilita MASTER CLEAR MOCLR desabilitado, pode usar o PINO MCLR como Entrada e Saída;

void main() //Função principal (corpo principal do programa)
//main() //tambem funciona digitar o comando somente: main()
{ //início do bloco de comandos da função principal;
int tempo; //Variável tempo de 8 bitsl;
tempo = 100; //atribui o valor 100 à variável tempo;
// tambem pode ser escrito: "int tempo=100;"
int tempo2; // MEU TESTE
tempo2=250; // MEU TESTE


while(true) //se verdadeiro, fica repetindo, loop infinito. Declara que o bloco de comandos a ser iniciado abaixo, fica repetindo
{ //***** início do bloco de comandos para piscar o led. BLOCO DE INSTRUÇÕES A SEREM REPETIDAS;
output_high(pin_b0); //levanta o pino B0, liga o led;
delay_ms(tempo); //aguarda o valor da variável tempo;
output_low(pin_b0); //abaixa o pino B0, desliga o led;
delay_ms(tempo); //aguarda o valor da variável tempo;
} //***** fim do bloco de comando para piscar o led. BLOCO DE INSTRUÇÕES A SEREM REPETIDAS;

} //Fim do bloco de comandos da função principal;

void piscaled2() //Função piscaled2
//main() //tambem funciona digitar o comando somente: main()
{ //início do bloco de comandos da função principal;
int tempo2; //Variável tempo de 8 bitsl;
tempo = 250; //atribui o valor 100 à variável tempo2;


while(true) //se verdadeiro, fica repetindo, loop infinito. Declara que o bloco de comandos a ser iniciado abaixo, fica repetindo
{ //***** início do bloco de comandos para piscar o led. BLOCO DE INSTRUÇÕES A SEREM REPETIDAS;
output_high(pin_b2); //levanta o pino B2, liga o led;
delay_ms(tempo2); //aguarda o valor da variável tempo2;
output_low(pin_b2); //abaixa o pino B2, desliga o led;
delay_ms(tempo2); //aguarda o valor da variável tempo2;
} //***** fim do bloco de comando para piscar o led do portB, pino 2. BLOCO DE INSTRUÇÕES A SEREM REPETIDAS;
}




Onde está o meu erro, pois consigo compilar corretamente mas não consigo piscar 2 leds de forma independentes?
erpgc82
 
Mensagens: 1
Registrado em: 03 Mai 2020 01:54
Localização: Brazil

Re: Não consegui piscar 2 leds independentes, CCS

Mensagempor Aquino » 11 Mai 2020 07:15

Para referenciarmos a seguir:
cpp code
//Exemplo 4: outra tentativa de piscar o outro led;
#include <16f628a.h>
#use delay(clock=4000000)
#fuses INTRC_IO //Irá utilizar clock interno, e os 2 pinos do cristal ficarão disponiveis para Entrada e Saída;
#fuses NOWDT //Whatchdog interno, desabilitado;
#fuses PUT //Aguarda 72ms para estabiliar o circuito e então ligar o PIC;
#fuses BROWNOUT //Monitora se o circuito cair pra menos de 4.5v e resetar o PIC;
#fuses NOLVP //Não efetua gravação por baixa voltagem;
#fuses NOMCLR //Não habilita MASTER CLEAR MOCLR desabilitado, pode usar o PINO MCLR como Entrada e Saída;

void main() //Função principal (corpo principal do programa)
//main() //tambem funciona digitar o comando somente: main()
{ //início do bloco de comandos da função principal;
int tempo; //Variável tempo de 8 bitsl;
tempo = 100; //atribui o valor 100 à variável tempo;
// tambem pode ser escrito: "int tempo=100;"
int tempo2; // MEU TESTE
tempo2=250; // MEU TESTE


while(true) //se verdadeiro, fica repetindo, loop infinito. Declara que o bloco de comandos a ser iniciado abaixo, fica repetindo
{ //***** início do bloco de comandos para piscar o led. BLOCO DE INSTRUÇÕES A SEREM REPETIDAS;
output_high(pin_b0); //levanta o pino B0, liga o led;
delay_ms(tempo); //aguarda o valor da variável tempo;
output_low(pin_b0); //abaixa o pino B0, desliga o led;
delay_ms(tempo); //aguarda o valor da variável tempo;
} //***** fim do bloco de comando para piscar o led. BLOCO DE INSTRUÇÕES A SEREM REPETIDAS;

} //Fim do bloco de comandos da função principal;

void piscaled2() //Função piscaled2
//main() //tambem funciona digitar o comando somente: main()
{ //início do bloco de comandos da função principal;
int tempo2; //Variável tempo de 8 bitsl;
tempo = 250; //atribui o valor 100 à variável tempo2;


while(true) //se verdadeiro, fica repetindo, loop infinito. Declara que o bloco de comandos a ser iniciado abaixo, fica repetindo
{ //***** início do bloco de comandos para piscar o led. BLOCO DE INSTRUÇÕES A SEREM REPETIDAS;
output_high(pin_b2); //levanta o pino B2, liga o led;
delay_ms(tempo2); //aguarda o valor da variável tempo2;
output_low(pin_b2); //abaixa o pino B2, desliga o led;
delay_ms(tempo2); //aguarda o valor da variável tempo2;
} //***** fim do bloco de comando para piscar o led do portB, pino 2. BLOCO DE INSTRUÇÕES A SEREM REPETIDAS;
}
ASM51 descanse em paz!
Avatar do usuário
Aquino
Dword
 
Mensagens: 1949
Registrado em: 12 Out 2006 22:24

Re: Não consegui piscar 2 leds independentes, CCS

Mensagempor Aquino » 11 Mai 2020 07:20

Welcome on bord erpgc82!!!

Resumidamente:
A função main é a primeira a ser chamada após a inicialização do sistema. No seu programa, dentro dela existe um loop infinito e você nunca faz nenhuma chamada para pisca_led2.
O que você precisa entender é que a execução é sequencial - não vamos entrar em interrupções por agora, então a partir de main é que as coisas serão executadas.
Não ocorrem erros na compilação pois não existe erro de sintaxe, aqui o que ocorre é um erro de lógica. Compiladores mais sérios como o GCC e o IAR informam que essa função nunca é chamada.
ASM51 descanse em paz!
Avatar do usuário
Aquino
Dword
 
Mensagens: 1949
Registrado em: 12 Out 2006 22:24

Re: Não consegui piscar 2 leds independentes, CCS

Mensagempor Aquino » 11 Mai 2020 07:23

cpp code
//Exemplo 3: Como imaginei que funcionaria, mas apenas o LED do rb0 funciona corretamente;
#include <16f628a.h>
#use delay(clock=4000000)
#fuses INTRC_IO //Irá utilizar clock interno, e os 2 pinos do cristal ficarão disponiveis para Entrada e Saída;
#fuses NOWDT //Whatchdog interno, desabilitado;
#fuses PUT //Aguarda 72ms para estabiliar o circuito e então ligar o PIC;
#fuses BROWNOUT //Monitora se o circuito cair pra menos de 4.5v e resetar o PIC;
#fuses NOLVP //Não efetua gravação por baixa voltagem;
#fuses NOMCLR //Não habilita MASTER CLEAR MOCLR desabilitado, pode usar o PINO MCLR como Entrada e Saída;

void main() //Função principal (corpo principal do programa)
//main() //tambem funciona digitar o comando somente: main()
{ //início do bloco de comandos da função principal;
int tempo; //Variável tempo de 8 bitsl;
tempo = 100; //atribui o valor 100 à variável tempo;
// tambem pode ser escrito: "int tempo=100;"
int tempo2; // MEU TESTE
tempo2=250; // MEU TESTE


while(true) //se verdadeiro, fica repetindo, loop infinito. Declara que o bloco de comandos a ser iniciado abaixo, fica repetindo
{ //***** início do bloco de comandos para piscar o led. BLOCO DE INSTRUÇÕES A SEREM REPETIDAS;
output_high(pin_b0); //levanta o pino B0, liga o led;
delay_ms(tempo); //aguarda o valor da variável tempo;
output_low(pin_b0); //abaixa o pino B0, desliga o led;
delay_ms(tempo); //aguarda o valor da variável tempo;
} //***** fim do bloco de comando para piscar o led. BLOCO DE INSTRUÇÕES A SEREM REPETIDAS;

{ //***** início do SEGUNDO bloco de comandos para piscar o led do RB2. BLOCO DE INSTRUÇÕES A SEREM REPETIDAS; MEU TESTE
output_high(pin_b2); //levanta o pino B2, liga o led; MEU TESTE
delay_ms(tempo2); //aguarda o valor da variável tempo2; MEU TESTE
output_low(pin_b2); //abaixa o pino B2, desliga o led; MEU TESTE
delay_ms(tempo2); //aguarda o valor da variável tempo2; MEU TESTE
} //***** fim do SEGUNDO bloco de comando para piscar o led. BLOCO DE INSTRUÇÕES A SEREM REPETIDAS; MEU TESTE
} //Fim do bloco de comandos da função principal;
ASM51 descanse em paz!
Avatar do usuário
Aquino
Dword
 
Mensagens: 1949
Registrado em: 12 Out 2006 22:24

Re: Não consegui piscar 2 leds independentes, CCS

Mensagempor Aquino » 11 Mai 2020 07:25

Você precisa entender a construção do comando while.
while(condições){
// bloco de código
}

No seu caso, você fez:

while(condição)
{
bloco
}

{
bloco
}

O segundo bloco não faz parte do while, você criou um bloco de código avulso.
Como o while é um loop infinito, ele ficará executando e nunca chamará seu bloco avulso.
ASM51 descanse em paz!
Avatar do usuário
Aquino
Dword
 
Mensagens: 1949
Registrado em: 12 Out 2006 22:24

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante