Duvida ao estudar a estrutura for

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Duvida ao estudar a estrutura for

Mensagempor bruno_eletronica » 14 Fev 2015 19:45

Prezados, boa noite.

A muito não entro no fórum devido a um problema de saúde, bom mas após 3 meses já estou melhor e voltei a estudar C.

Nos meus estudos me deparei com o seguinte comando:

Código: Selecionar todos
void delay (unsigned char tempo)
   {
   for(;tempo!=0;tempo--); 
   }
for(a=0;a!=30;a++) delay(250);
}

Pelo que entendi da estrutura for ela é formada assim: for (1º inicialização; 2º condição; 3º função para mudar a condição ate ela se tornar falsa).

Bom neste caso sitado acima a estrutura for foi usada para gerar um delay, diante disso minhas duvidas são:

1º - Pelo que aprendi o sinal != significa "diferente de", pois bem como interpretar o comando for(;tempo!=0;tempo--); pergunto isso pois a palavra "tempo" não teve nenhum valor a ela atribuído anteriormente, a não ser que o delay(250) seja o equivalente de "tempo", já definido anteriormente como "void delay (unsigned char tempo)".

2º - Agora quanto ao comando " for(a=0;a!=30;a++) delay(250); ", por que as expressões "(a=0;a!=30;a++)", estão sendo usadas em conjunto do delay(250)? Já que tempo eu posso simplesmente informa-lo com o comando Delay_ms(xxxx), não entendi o motivo pelo qual se usar uma estrutura for.


Bom minhas duvidas são essas, acredito que para muitos isso deva ser besteira, mas como eu estudo sozinho tenho muita dificuldade em entender quando e por que usar determinados comandos.

Agradeço desde já a quem puder me explicar, ou ate mesmo me informar algum material na net sobre esses tipos de estruturas.

Att,

Bruno
bruno_eletronica
Bit
 
Mensagens: 10
Registrado em: 17 Out 2014 21:40

Re: Duvida ao estudar a estrutura for

Mensagempor andre_luis » 14 Fev 2015 20:10

Olá Bruno,


Bem vindo de volta.
bruno_eletronica escreveu:1º - Pelo que aprendi o sinal != significa "diferente de", pois bem como interpretar o comando for(;tempo!=0;tempo--); pergunto isso pois a palavra "tempo" não teve nenhum valor a ela atribuído anteriormente, a não ser que o delay(250) seja o equivalente de "tempo", já definido anteriormente como "void delay (unsigned char tempo)".


Tanto o primeiro campo como o último campo do for pode ser deixado em branco, pois tanto o parametro já pode ter sido declarado e inicializado anteriormente, como foi o caso exato do codigo acima, onde o parametro tempo é entrada da função; Também o passo do incremento pode acontecer dentro da própria estrutura controlada pelo
cpp code
for( ;tempo!=0; ) 
{
tempo-- ; //aqui poderia ser decrementado o parametro tempo
}


bruno_eletronica escreveu:2º - Agora quanto ao comando " for(a=0;a!=30;a++) delay(250); ", por que as expressões "(a=0;a!=30;a++)", estão sendo usadas em conjunto do delay(250)? Já que tempo eu posso simplesmente informa-lo com o comando Delay_ms(xxxx), não entendi o motivo pelo qual se usar uma estrutura for.


Meu palpite é que isso pode ter sido uma limitação do compilador pro qual esse código foi criado. Acredito que não aceitasse um argumento maior que 8 bit´s ( 255 ), de modo que o programador teve de usar esse artificio.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Duvida ao estudar a estrutura for

Mensagempor bruno_eletronica » 14 Fev 2015 22:51

André, boa noite.

Obrigado pela dica, de fato pelo que pude ver o compilador é de 8 bits, mesmo assim tenho duvidas tais como:

1 º Como decrementar em "tempo" sendo que "tempo" não tem nenhum valor numeral a ele vinculado tipo para mim seria assim:

Código: Selecionar todos
unsigned char tempo;

void main
{
tempo = 100;
for(;tempo!=0;tempo--); 
delay_ms = 100;

...... tempo = 100;
}


Ou a partir do momento em que eu declaro "unsigned char tempo;", o compilador sub entende que tempo é 255, uma vez que esse é o intervalo do modificador "unsigned char"?



2 º Agora quanto ao comando for(a=0;a!=30;a++) delay(250); como devo interpretar, digo isso pois, eu entendo da seguinte forma:

- "a" esta sendo inicializado com o valor de 0, nisso o compilador se questiona "a!=30" ("a" é diferente de 30?) sim, então delay de 250, e isso vai ate "a" ter o valor de 30, certo?

Vi que você respondeu bem rápido, mais um pouco eu estaria online, o problema é que devido ao meu joelho eu não posso ficar muito tempo na frente do PC.

Mais uma vez muito obrigado pela atenção.

Att,

Bruno
bruno_eletronica
Bit
 
Mensagens: 10
Registrado em: 17 Out 2014 21:40

Re: Duvida ao estudar a estrutura for

Mensagempor andre_luis » 15 Fev 2015 07:10

bruno_eletronica escreveu:1 º Como decrementar em "tempo" sendo que "tempo" não tem nenhum valor numeral a ele vinculado


O que voce apresentou acima no primeiro código mais acima, foi apenas um trecho de um programa.
Essa estrutura é um pedaço do corpo de uma função, e no caso, o parametro tempo é a entrada dessa função.
Isso significa que quando essa função for chamada em algum trecho do programa principal main(), é lá que voce vai atribuir algum valor para o parametro tempo na forma de um valor numerico, como o exemplo abaixo. Isso significa que "a grosso modo", o delay seria escalonado pelos parametros: tempo*30*250

cpp code
void delay (unsigned char tempo) // corrigi a falta da chave no programa acima
{
for(;tempo!=0;tempo--)
for(a=0;a!=30;a++) delay(250);
}

void main
{
...
delay (6) ;
...
}
A propósito, o programa original que voce postou ( ou o pedaço dele ), do modo como estava não fazia sentido. Parecia que o delay se instanciava recursivamente, e acho que não era isso que deveria estar no programa de onde voce extraiu isso.

bruno_eletronica escreveu:2 º Agora quanto ao comando for(a=0;a!=30;a++) delay(250); como devo interpretar, digo isso pois, eu entendo da seguinte forma:
- "a" esta sendo inicializado com o valor de 0, nisso o compilador se questiona "a!=30" ("a" é diferente de 30?) sim, então delay de 250, e isso vai ate "a" ter o valor de 30, certo?

Na verdade, a30 é uma condição geral, mas eu teria preferido a>0, que é mais fácil de interpretar; e sim é exatamente como voce interpretou acima; o a dentro desse for funciona como um contador crescente, e a cada novo incremento, chama o delay(250).
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Duvida ao estudar a estrutura for

Mensagempor RobL » 15 Fev 2015 07:58

a < 30 .
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Re: Duvida ao estudar a estrutura for

Mensagempor andre_luis » 15 Fev 2015 08:18

RobL escreveu:a < 30 .


Tá certo, falha minha...

for(INITIALIZATION; CONDITION; INCREMENT/DECREMENT){
// Code for the for loop's body
// goes here.
}
The initialization declares (and perhaps assigns to) any variables required. The type of a variable should be same if you are using multiple variables in initialization part. The condition checks a condition, and quits the loop if false. The afterthought is performed exactly once every time the loop ends and then repeats.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

RESOLVIDO: Duvida ao estudar a estrutura for

Mensagempor bruno_eletronica » 15 Fev 2015 13:02

Boa tarde, a todos.

Quero agradecer tanto a você André quanto a você RobL, pelas informações orientações e observações, agora posso continuar meus estudos, digo isso pois detesto ler um código e ter que pular uma linha por não ter entendido.

Bom como não tenho tanto conhecimento para poder compartilhar no ramo da microcontrolação, :) deixo uma dica:

Mesmo quando não estiverem conseguindo dormi não tomem Clonazepam, kkkkkkkkkkkk :mrgreen: tomei metade de um comprimido de 2 mg, ontem as 23hs e estou ate agora parecendo um zumbi, :shock: :shock: kkkkkkkkkkkk - Fui ai supermecado hoje pela manhã e me senti naquele filme jogos mortais :shock: :cry: :shock: , com todo me olhando e as prateleiras girando. kkkkkk.

Mais uma vez obrigado a todos minhas duvidas foram esclarecidas. :D :wink:
bruno_eletronica
Bit
 
Mensagens: 10
Registrado em: 17 Out 2014 21:40

Re: Duvida ao estudar a estrutura for

Mensagempor bruno_eletronica » 16 Fev 2015 21:04

André, boa noite.

Abaixo um exemplo de como a estrutura for foi usada, a minha ultima duvida é que quando escrevi este código "para aprender", fui "debugar", eu vi que quando o programa chega na linha for(a=0;a!=30;a++) atraso(250); ele executa a comparação de "a!"e volta para linha " void atraso (unsigned char delay) " ai executa a linha for(;delay!=0;delay--); , depois volta para linha for(a=0;a!=30;a++) atraso(250); isso por 30 vezes, ate aqui beleza aprendi.

O que não entendi e como o compilador usa o "atraso(250)", ao debugar não vejo o que ocorre, ai pensei que este 250 poderia ser qualquer numero diferente de 0 só para o comando for for(;delay!=0;delay--); sempre ser executado, com isso eu substitui o valor por 1 mas ao testar na "Jiga" a velocidade de acender e apagar os LEDs mudaram de tal forma que ele ficam só ligados.

cpp code
void atraso (unsigned char delay)
{
for(;delay!=0;delay--);
}

void main()
{
unsigned char leds, dire, a;
trisd = 0;
leds=0b00000001;
dire=0;

while(1)
{
Portd=leds;
if(dire==0)
{
leds<<=1;
if(leds==0b10000000) dire=1;
}
else
{
leds>>=1;
if (leds==0b00000001)
dire=0;
}

for(a=0;a!=30;a++) atraso(250);
}
}


Não sei se estou me expressando bem, e nem sei se aqui é o lugar para este tipo de duvida, caso eu esteja agindo de forma errada pode me falar que para numa boa, o problema é que algumas coisas não encontro em livros, não nos que tenho.
Editado pela última vez por andre_luis em 16 Fev 2015 22:36, em um total de 1 vez.
Razão: formatação do código para sintaxe C
bruno_eletronica
Bit
 
Mensagens: 10
Registrado em: 17 Out 2014 21:40

Re: Duvida ao estudar a estrutura for

Mensagempor andre_luis » 17 Fev 2015 07:27

bruno_eletronica escreveu:com isso eu substitui o valor por 1 mas ao testar na "Jiga" a velocidade de acender e apagar os LEDs mudaram de tal forma que ele ficam só ligados


Bruno,


Será que os LEDs estão realmente acêsos direto, ou estão piscando numa taxa muito maior que seu olho possa detectar ?
Repare que voce meio que multiplicou a velocidade das piscadas do LED por um fator de cerca de 250 vezes.

Pra confirmar o fato, se não tiver um osciloscópio disponivel, vai diminuindo gradualmente o valor de 250 e vendo o resultado aos poucos, ao invéz de testar direto com o valor de 1.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Duvida ao estudar a estrutura for

Mensagempor ze » 17 Fev 2015 11:59

uma maneira bacana pra vc ver o tempo da iteração é usar o analisador lógico do mplab (caso o esteja a usar)
tipo:
Código: Selecionar todos
#define led RB0
void delay(unsigned char dl)
{
led=1;led=0;
while(dl--);
led=1;led=0;
}

no mplab, view, logic analiser ou algo assim e 'add' RB0
aproveite também e use o também bacana recurso de break point
Código: Selecionar todos
void main(void)
{
//inicializa hw..
for(;;)
{
a++; //qualquer coisa
delay(100);
a++;//aplique break point aqui: basta duplo clique na esquerda da linha
}
}

por fim vc vai ter 2 pulsinhos na tela e poderá medir o tempo (na verdade ciclos de máquina) entre os eventos
Estou sem o mplab aqui. digitei por instinto. Se necessário outro dia confirmo...
abç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Duvida ao estudar a estrutura for

Mensagempor bruno_eletronica » 17 Fev 2015 14:24

Boa tarde a todos.

André, acredito que foi isso mesmo devido a frequência não consigo ver.

Também instalei o Mplab e fiz um programa nele e como o Ze me orientou através do Break point conseguir ver o decremento de 250 vezes ate sair da estrutura "for".

Também encontrei muito material na internet sobre formas de delay usando a estrutura for. (Conforme o André já havia me informado).

Bom tirando os diversos materiais em inglês que falam desta duvida que tive, segue abaixo uma explicação do uso do delay.


http://www.decom.ufop.br/alex/arquivos/ ... Delays.pdf
http://picminas.forumeiros.com/t14-a-funcao-delay

Obs.: No meu caso o Tcy é 100 nano conforme fabricante.

Mais uma vez obrigado a todos. :D
bruno_eletronica
Bit
 
Mensagens: 10
Registrado em: 17 Out 2014 21:40


Voltar para PIC

Quem está online

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

x