Ir ao conteúdo

Dúvidas sobre linguagem C


AllanRoncali

Posts recomendados

Postado

ola galera do Clube do Hardware!! venho aqui pedindo uma força com a programação de microcontroladores! desde segunda feira dia 23/09 eu venho estudando a linguagem C por conta própria e já compilei dos programas não usuais no CCS apenas por objetivo didático e para me familiarizar com o CCS! já tenho uma parca experiencia com a linguagem assembler, mas quero me atualizar.

eu elaborei um algoritmo pra criar um programa para um LEDchaser com o pic16f628a que me permitiria (na teoria) selecionar efeitos com um botão de seleção.

Aqui vai o programa que eu escrevi que não deu certo:mellow: :

#include <16F628A.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES PUT //Power Up Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOBROWNOUT //No brownout reset

#use delay(clock=16000000)

// entrada
#define B1 pin_a0 // declaradas as diretivas

// variaveis
char a = 0;
char b = 5;

// programa principal
void main()
{

while (TRUE) // enquanto for verdadeiro executara o programa
{
if ( B1 == 0 ) a++; // se o B1 estiver em 0 incremeta 'a'
{
if ( a == 1 ) // testa 'a'. se seu valor for igual a 1
efeito1; // chamara uma rotina que executara o efeito1
else if ( a == 2 ) // em caso de valor de 'a' ser 2
efeito2; // chamara uma rotina que executara o efeito2
else if ( a == 3 ) // e assim por diante nessa mesma lógica
efeito3;
else if ( a == 4) // observação: os efeitos também testarão o botoa
//constantemente
efeito4; // para que possam mudar de efeito mesmo que em //momento de execução
else if ( a == 5 ) // do efeito atual
efeito5;
if ( a > b ) // e no caso de valor de 'a' for superior 'b'
a = 0; // faz 'a' igual a zero
}
}
}

os efeito são sub rotinas que eu criarei depois

aqui segue a imagem do diagrama elétrico:

sequencial.jpg

queria fazer outra observçao! no CCS apos a compilaçao aparece uma mensagem indicando uma linha da progrmaçao com a informaçao: "condition always false" eu entendi o significado mas nao o contexto e indica essa linha do programa que no caso seria a linha ( if ( B1 == 0 ) a++; ). o que preciso fazer??

se alguém puder me ajudar eu ficarei eternamente grato!

Postado

Olá amigo! Fiz algumas modificações no seu código só para corrigir o erro, mas você terá que fazer muitas outras modificações nele para alcançar seu objetivo.

Como também sou iniciante não colocarei minha opinião sobre o que eu acho que deve ser feito. Mesmo porque você também está aprendendo. Conforme suas dúvidas forem surgindo teremos muito prazer em ajudar. Boa sorte!

#include <16F628A.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES PUT //Power Up Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOBROWNOUT //No brownout reset

#use delay(clock=16000000)

// entrada
#define B1 pin_a0 // declaradas as diretivas

// variaveis
char a = 0;
char b = 5;
//Subroinas
void efeito1(void){ }
void efeito2(void){ }
void efeito3(void){ }
void efeito4(void){ }
void efeito5(void){ }

// programa principal
void main()
{

while (TRUE) // enquanto for verdadeiro executara o programa
{
if(input(B1)){ a++; // se o B1 estiver em 0 incremeta 'a'

if ( a == 1 ) // testa 'a'. se seu valor for igual a 1
efeito1(); // chamara uma rotina que executara o efeito1
else if ( a == 2 ) // em caso de valor de 'a' ser 2
efeito2(); // chamara uma rotina que executara o efeito2
else if ( a == 3 ) // e assim por diante nessa mesma lógica
efeito3();
else if ( a == 4) // observação: os efeitos também testarão o botoa
//constantemente
efeito4(); // para que possam mudar de efeito mesmo que em //momento de execução
else if ( a == 5 ) // do efeito atual
efeito5();
if ( a > b ) // e no caso de valor de 'a' for superior 'b'
a = 0; // faz 'a' igual a zero
}
}
}

Postado

não na verdade você me ajudou bastante!!! e claro que ainda tem muita coisa a fazer nesse projeto!!! vou compilar de novo com o seu código e vou adicionar os códigos dos efeitos!! e por favor eu na verdade quero saber sobre a sua opinião pois tenho certeza de que sera reveladora e também eu não conheço muita gente que ta nessa área de programação que possa compartilhar informações comigo! os que eu conheço me viraram as costas mas fico feliz de ter entrado nesse site!! kkkkkkkkkkkk

valeu mesmo!!!

compilei o programa raquel!! você foi fantástica! Deus te abençoe!! rsrs

o programa tem que permanecer dessa forma mesmo!!

só vou ter que adaptar o hardware pra funcionar de acordo com o programa!!!

e que a tecla de B1 por se tratar de uma chave N/A ( normalmente aberta ) de acordo com a configuração no diagrama elétrico ela mantem uma condição de 1 na entrada do pino, ou seja, para o programa trabalhar nas condições do hardware para mudar o efeito ele teria que testar o momento que a chave esta em 0 para trocar o efeito! só que ta acontecendo o contrario!!! ela ta testando a chave e o programa ta mudando de efeito na condição da entrada estar em 1! isso significa que se você pressionar a tecla constantemente ela mantem o efeito como foi sugerido no algoritmo ( não postei o algoritmo por que não vi necessidade ).enfim temos duas soluções pra este problema:

1° eu poderia simplesmente substituir a chave por uma N/F ou:

2° colocar o programa pra mudar o efeito quando a o pino estiver em 0.

saca só o código:

#include <16F628A.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES PUT //Power Up Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOBROWNOUT //No brownout reset

#use delay(clock=16000000)


// entrada
#define B1 pin_a0 // declaradas as diretivas

// variaveis
char a = 0;
char b = 5;
//Subrotinas
//=================================
void efeito1(void)
{
output_b(0b01010101);
delay_ms(500);
}
//=================================
void efeito2(void)
{
output_b(0b00110011);
delay_ms(500); }
//=================================
void efeito3(void)
{
output_b(0b00111100);
delay_ms(500);
}
//=================================
void efeito4(void)
{
output_b(0b11000011);
delay_ms(500);
}
//=================================
void efeito5(void)
{
output_b(0b00000000);
delay_ms(500);
}

// programa principal
void main()
{

while (TRUE) // enquanto for verdadeiro executara o programa
{
if(input(B1))
{ a++; // se o B1 estiver em 0 incremeta 'a'

if ( a == 1 ) // testa 'a'. se seu valor for igual a 1
efeito1(); // chamara uma rotina que executara o efeito1
else if ( a == 2 ) // em caso de valor de 'a' ser 2
efeito2(); // chamara uma rotina que executara o efeito2
else if ( a == 3 ) // e assim por diante nessa mesma lógica
efeito3();
else if ( a == 4) // observação: os efeitos também testarão o botoa constantemente
efeito4(); // para que possam mudar de efeito mesmo que em //momento de execução
else if ( a == 5 ) // do efeito atual
efeito5();
if ( a > b ) // e no caso de valor de 'a' for superior 'b'
a = 0; // faz 'a' igual a zero
}
}
}

observação: depois de ler o código que você escreveu eu percebi que a minha falha foi não respeitar a sintaxe e a ma escolha dos recursos dentro da linguagem se comparar os nossos códigos!!!

só mais uma coisa!!! como eu faço o programa executar o efeito quando a condição do B1 for igual a zero??

Postado

Boa noite amigo! Testei teu circuito aqui e cheguei as seguintes conclusões:

1 - para manter seu circuito como está faça assim: if(!input(B1)) executa em nível baixo.

2_ para executar em nível alto basta inverter as posições de terra e vcc ligados ao botão e manter a condição if(input(B1)).

Espero ter ajudado. Boa noite!

  • Coordenador
Postado

Caso o autor necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!