Fraco,fraco em C !!!!

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Fraco,fraco em C !!!!

Mensagempor ribeiro220 » 27 Jul 2009 15:35

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
ribeiro220
Bit
 
Mensagens: 42
Registrado em: 04 Mai 2007 21:06

Mensagempor Francesco » 27 Jul 2009 15:48

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
     }
}
Avatar do usuário
Francesco
Word
 
Mensagens: 699
Registrado em: 04 Mar 2008 00:22
Localização: São Paulo - SP

Mensagempor ribeiro220 » 27 Jul 2009 16:26

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
ribeiro220
Bit
 
Mensagens: 42
Registrado em: 04 Mai 2007 21:06

Mensagempor Sergio38br » 27 Jul 2009 16:31

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
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor _blackmore_ » 28 Jul 2009 13:39

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!
_blackmore_
Dword
 
Mensagens: 1397
Registrado em: 28 Set 2008 13:26

Mensagempor ze » 28 Jul 2009 14:13

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ç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor fabim » 28 Jul 2009 14:31

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
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor ribeiro220 » 28 Jul 2009 16:08

_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 :?
ribeiro220
Bit
 
Mensagens: 42
Registrado em: 04 Mai 2007 21:06

Mensagempor _blackmore_ » 28 Jul 2009 16:13

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!
_blackmore_
Dword
 
Mensagens: 1397
Registrado em: 28 Set 2008 13:26

Mensagempor Djalma Toledo Rodrigues » 28 Jul 2009 16:41

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
.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor ze » 29 Jul 2009 07:49

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
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor ribeiro220 » 29 Jul 2009 13:02

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 :D
interessante ......
ribeiro220
Bit
 
Mensagens: 42
Registrado em: 04 Mai 2007 21:06

Mensagempor fabim » 29 Jul 2009 13:11

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 :D
interessante ......


eu imagino as lampadas e equipos eletronicos da rede dessa infeliz casa..

E O CRIADOR DISSE.
Tudo é licito, mas nem tudo aplicavel..
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Djalma Toledo Rodrigues » 29 Jul 2009 16:33

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.
Editado pela última vez por Djalma Toledo Rodrigues em 29 Jul 2009 16:54, em um total de 1 vez.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor ribeiro220 » 29 Jul 2009 16:34

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();
}
}
ribeiro220
Bit
 
Mensagens: 42
Registrado em: 04 Mai 2007 21:06

Próximo

Voltar para PIC

Quem está online

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

x