Página 1 de 2
Fraco,fraco em C !!!!

Enviado:
27 Jul 2009 15:35
por ribeiro220
Boa tarde,companheiros de eletrônica!!
Bom,estou aprendendo a programar em C e de cara já estou com dúvidas,alguem poderia me ajudar?
Fiz um programa abaixo só para exemplo não sendo portanto algo real
void teste()
{delay_ms(500);
output_low(pin_B3);
delay_ms(500);
}
void main()
{ if (input(pin_B0)) //se for 1 b0
output_low(pin_B4);//seta baixo b4
teste();//chama rotina teste
}
Minhas dúvidas?
1)Quando eu ligar o microcontrolador pic,a primeira função que ele vai e na MAIN,correto?
Dentro da função main,chamo uma rotina(função) TESTE.
2)Após a execução desta função(rotina sei la),o programa volta para função MAIN NOVAMENTE?Seria como um:
call teste em ASM?
3)O que tenho que fazer para,ao ligar o pic o programa faça o que tem que fazer em MAIN e quando for verdadeiro o if(teste do pino B0),saia da função MAIN e não volte mais até que seja desligado o pic.
Desculpe-me pela pergunta que acho que deve ser bem básica,porem estou lendo o livro do Fabio pereira,pois só programo algumas coisas em ASM.
grato
ribeiro

Enviado:
27 Jul 2009 15:48
por Francesco
Ribeiro,
Respondendo suas perguntas:
1) Sim, inicia pela função main(). Ele executa uma condição (if) antes, e pode ou não executar a função output_low(). Só depois ele executa teste().
2) Isso é uma questão de conceito, normalmente quando main() termina, o programa termina. Você poderia imaginar que o microcontrolador travaria. Isso é verdade em alguns casos, no Z80 por exemplo ele pode entrar em HALT e parar. Mas normalmente ele reinicia.
Se você realmente quer que ele reinicie após o fim de teste(), o mais correto é colocar um loop infinito. Não que da outra forma não funcione, mas fica mais bonito assim:
- Código: Selecionar todos
void main()
{
while( 1 )
{
if (input(pin_B0)) //se for 1 b0
output_low(pin_B4);//seta baixo b4
teste();//chama rotina teste
}
}
3) Para desligar um microcontrolador que não tem HALT, basta fazer um loop infinito sem nada dentrol
- Código: Selecionar todos
while( 1 )
;
Se você quer que o PIC trave e não saia quando a condição (if) for verdadeira, o código ficaria assim.
- Código: Selecionar todos
void main()
{
while( 1 )
{
if (input(pin_B0)) //se for 1 b0
{
output_low(pin_B4);//seta baixo b4
while( 1 ) // Daqui não sai mais!
;
}
teste();//chama rotina teste
}
}

Enviado:
27 Jul 2009 16:26
por ribeiro220
Boa tarde,Francesco MUITO OBRIGADO pelas respostas,
Na realidade eu não quero reiniciar o pic,eu quero que após a função teste,ele possa ficar travado na rotina do teste,aguardando outro botão ser apertado,só não quero que o mesmo(programa)volte para função main.
O programa que estou querendo fazer é pra controlar um chuveiro(triac)
primeiro quando eu ligar o chuveiro,o programa vai pra MAIN e faz o triac(através de um opto acoplador)conduzir a metade da potencia,ou seja nesse primeiro momento o programa vai analisar somento o ponto zero da senoide.
Depois se for apertado algum botão pra subir ou descer a temperatura,tenho que sair da função MAIN e tratar os botoes e não pode mais retornar na função Main,pois senão o chuveiro vai voltar pra meia potencia(DESCULPE-ME POR TANTOS MAINS!!!!)
grato
ribeiro

Enviado:
27 Jul 2009 16:31
por Sergio38br
Ribeiro um pequeno adendo, a função main() em C sempre vai existir , vc pode depois de certos procedimentos, não retornar ao inicio do main , mas sempre estará dentro dos limites { } dela.
[ ]'s
Sergio

Enviado:
28 Jul 2009 13:39
por _blackmore_
ribeiro220
me desculpe a ignorância ... mas com um triac, o micro controlador, opto-acoplador e o programa fazendo a lógica da coisa ... com certeza irá funcionar.
Mas o que me faz colocar uma pergunta é sobre a senóide ... o ponto de ativar ela ... pois se tu vai trabalhar com uma resistência para quê precisa de ativar no ponto certo da senóide?Fiz um aquecedor e não utilizer o cruzamento em zero da senóide ... não houve necessidade, será que tu realmente precisa disso?
abrax!

Enviado:
28 Jul 2009 14:13
por ze
rib220
vai perder tempo e recurso do uC pra avaliar a passagem pelo zero. Use moc zero crossing se precisar MESMO ver o 0.
abç

Enviado:
28 Jul 2009 14:31
por fabim
lellis escreveu:rib220
vai perder tempo e recurso do uC pra avaliar a passagem pelo zero. Use moc zero crossing se precisar MESMO ver o 0.
abç
hehe, leliz. ta desaprendendo ?
Como controlar o angulo de fase, se o moc com zero crossing só dispara quando passa por zero e com no máximo 8....17V ?
Miguim, passou por zero tu espera (1/60)/4.
Que é 1/2 semi ciclo.
Se disparar o triac aí, então VP = 127V.
E quanto maior o tempo menor será a tensão, e menor a potencia da resistencia. O controle de corrente com triac se dá em 1/2 semi ciclo para descida.. DE 1/2 semi ciclo para a proxima passagem por zero, você tem o range de 4.16mS para trabalhar..
Abraços
Fabim

Enviado:
28 Jul 2009 16:08
por ribeiro220
_blackmore_
Acredito que vai funcionar sem sincronismo com o ponto zero(0)mas não terei um controle preciso,pois vou disparar o triac aleatoriamente,seria como o fabim falou(digitou!!)
lellis o moc zer crossing não daria certo,tenho que fazer um detector a parte,pois é como o fabim disse(digitou!!)
Como controlar o angulo de fase, se o moc com zero crossing só dispara quando passa por zero e com no máximo 8....17V


Enviado:
28 Jul 2009 16:13
por _blackmore_
ribeiro220
Como controlar o angulo de fase, se o moc com zero crossing só dispara quando passa por zero e com no máximo 8....17V?
por isso que perguntei se realmente é necessário o controle de passagem por zero...
mas dê uma procurada no fórum .. já foi discutido acho que exatamente em um controle de temperatura ...
abrax!

Enviado:
28 Jul 2009 16:41
por Djalma Toledo Rodrigues
Se é para contrôle de chuveiro o Dimmer não é uma boa e sequer é necessário. Como a inércia, devido a capacidade termica da água, é grande a melhor opção é ligar alguns ciclos e desligar outros tantos.
E ligar na passagem por Zero com uC ou MOC não gera transiênte ou interferência.
Abraço e boa passagem por Zero. rs
.

Enviado:
29 Jul 2009 07:49
por ze
fabin & ribeiro, o dj tirou as palavras da minha boca (teclado)
na verdade, passou no boteco, tomou umas, veio aqui e digitou aquilo pra mim. rs
vivendo & aprendendo...
abçs

Enviado:
29 Jul 2009 13:02
por ribeiro220
Achei interessante esta ideia do djalma,liga e desliga a resistencia do chuveiro por ciclos,tem que ser bem rápido porque senão o chuveiro vai ficar com um barulhão chuaaaaaaaa ............(silencio)..........chuaaaaaaaaaaa.................loop
interessante ......

Enviado:
29 Jul 2009 13:11
por fabim
ribeiro220 escreveu:Achei interessante esta ideia do djalma,liga e desliga a resistencia do chuveiro por ciclos,tem que ser bem rápido porque senão o chuveiro vai ficar com um barulhão chuaaaaaaaa ............(silencio)..........chuaaaaaaaaaaa.................loop
interessante ......
eu imagino as lampadas e equipos eletronicos da rede dessa infeliz casa..
E O CRIADOR DISSE.
Tudo é licito, mas nem tudo aplicavel..

Enviado:
29 Jul 2009 16:33
por Djalma Toledo Rodrigues
fabim escreveu:... eu imagino as lampadas e equipos eletronicos da rede dessa infeliz casa...
Aqui em casa a queda de Tensão ao ligar o cuveiro é quase imperceptível.

Enviado:
29 Jul 2009 16:34
por ribeiro220
Tem razão fabim!,ruidos pra tudo quanto é lado,pois o propria comutação do triac tem que ter um filtro em paralelo para não influenciar na rede principalmente em equipamentos eletronicos.
Bom,na realidade em ASM eu quase terminei o programa,mas abandonei e estou querendo fazer em C.
talvez se usar
void partida()
{while(true)
if(detector de zero for 1)
output_high(moc)
delay_ms(4,1)
output_low(moc)
delay_ms(4,1)}
ribeiro
void main()
{
While(detector de zero é 1)
{partida();
}
}