Ir ao conteúdo
  • Cadastre-se

Ajuda com função FOR


avinicius

Posts recomendados

#include<16f877.h>

#FUSES XT

#FUSES NOWDT

#FUSES NOPROTECT

#FUSES NOBROWNOUT

#FUSES PUT

#FUSES NOLVP

#use DELAY(CLOCK=4000000)

int valor;

long int soma=0;

int i=100;

//função//////////////////////////////////////

void main()

{

for(i=0;i<250;i++){

valor=i;

soma=soma+i;

}

}

Tipo assim,eu queria implementar esta contagem em um led, em um port do PIC,mas nem tenho ideia de como fazer isso.

Consegui fazer a jogada para contar até 250.

Obg,coninuo tentando aqui valeu!

Feliz NATAL pra todos ai!

Link para o comentário
Compartilhar em outros sites

DICA: Sempre quando for postar seus códigos, utilize as tags: {code} SEU CODIGO aqui, SÓ COLAR{/code}. No lugar das chaves, utilize colchetes: [].

Voltando a sua pergunta, não entendi o que você quer fazer com a soma. você quer colocar ela em algum port?

Do jeito q você fez, está correto. Mas o que seria implementar em um led? você quer mostrar em um display de leds? tipo um 7 segmentos, num LCD ou numa matriz de led?

Falou

Link para o comentário
Compartilhar em outros sites

Exato Matheus,

Na verdade , que a contagem fosse implementada em um led, e para melhor visualização mostrasse a contagem em um LCD 16X2,a jogada da função FOR eu sei,do LCD também,mais a jogada lógica, de criar variáveis,ainda apanho muito...

Creio que é por isso ,que em algumas das vezes acabava achando muito complexo...

Mas agora que ando apanhando,vejo mais claro a programação em C,é questão de analisar outros programas,correr atrás de tutoriais,....

Bom,vou continuar tentando,se não der certo posto aqui minha dificuldade ao fazer esse programinha e simulá-lo no ISIS.

Obrigado pela atenção ;)

Link para o comentário
Compartilhar em outros sites

Experimenta esse código que fiz agora:

Circuito (não precisa dos componentes da esquerda, apenas o PIC e o LCD):

circuiton.jpg

Codigo:

#include <16F877A.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

#use delay(clock=4000000)

#include <LCD.C>

int16 soma;
int16 i;

void main()
{
lcd_init();

while (TRUE)
{
for (i=0;i<=250;i++)
{
soma = soma + i;
printf (lcd_putc,"\fi=%lu\nsoma=%lu",i,soma);
delay_ms (100);
}

soma=0;
delay_ms (5000);
}
}

Fiz do jeito que você pediu. No entanto, podemos fazer essa soma considerando que seja uma PA, Progressão Aritmetica, com razão 1 fazer a soma com:

6cf5006eb363bcc99c6ca47.png

O resultado será o mesmo.

Falou

Link para o comentário
Compartilhar em outros sites

valeu matheus,ai pela ajudinha....

Compilei,e não deu nenhum erro,embora quando vou simular no ISIS dá erro.

Obrigado pela atenção.

Creio que deve ser problema do ISIS mesmo, o programa está 100%,também olhei se era na configuração do cristal,não era,bom ,mais de qualquer maneira ja clareou minha mente,valeu mano td de bom pra você e sua família!

Link para o comentário
Compartilhar em outros sites

Achei o erro --',

estava utilizando o PIC errado --'

estava utilizando o 18f422 em vez do 16f877,só vou mudar o PIC aqui no SELECT DEVICE, e adicionar sua biblioteca aqui no MPLAB.

Em seguida retorno a mensagem...

Achei o erro --',

estava utilizando o PIC errado --'

estava utilizando o 18f422 em vez do 16f877,só vou mudar o PIC aqui no SELECT DEVICE, e adicionar sua biblioteca aqui no MPLAB.

Em seguida retorno a mensagem...

Pegou,deu certo:

http://img20.imageshack.us/i/lcdfor.png/

Mais uma coisa,andei estudando um pouco,sobre printf();

Nesse trecho:


printf (lcd_putc,"\fi=%lu\nsoma=%lu",i,soma);

/n serve para deslocar uma linha,para não ficarem juntos neste caso;

f=para exibir decimal;

=%lu seria para exibir a operação feita pela função for?

Link para o comentário
Compartilhar em outros sites

Boa pergunta.

Não, veja:

printf (lcd_putc,"\f i = %lu \n soma = %lu ",i,soma);

Dei espaços para facilitar a visualização!

onde:

\f --> Limpa o display;
i --> Escrever a string/char "i" na tela;
= --> Escrever a string/char "=" (o sinal de igualdade) na tela;
% --> Caractere que diz para o LCD que virá uma variável.
lu(Lu)--> No inicio do programa declarou-se "i" como int16, então usamos Lu pois
é uma variável long unsigned (longa sem sinal).
\n --> Diz para o LCD ir para a linha de baixo.
soma --> Escreve a string "soma" na tela.
= --> Escrever a string/char "=" (o sinal de igualdade) na tela;
% --> Caractere que diz para o LCD que virá uma variável.
lu(Lu)--> No inicio do programa declarou-se "soma" como int16, então usamos Lu
pois é uma variável long unsigned (longa sem sinal).
i --> Diz qual veriável será escrita;
soma --> Idem ao de cima;

Temos os seguintes tipos de dados:

dadosl.png

Temos as seguintes opções para escrever em um LCD:

lcd1.png

e

lcd2.png

Qualquer dúvida pergunte.

Falou

Link para o comentário
Compartilhar em outros sites

Nossa valeu mesmo,ótimo tutorial,agora

vou implementando mais coisas,como :

além da contagem ser mostrada em um display, de 0 até 10 "alterei algumas coisas"


#include <18f442.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //Reset when brownout detected
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

#use delay(clock=4000000)

#include <LCD.C>

int16 soma;
int16 i;

void main()
{
lcd_init();

while (1)
{
for (i=0;i<11;i++){
soma = soma + i;
printf (lcd_putc,"\fi=%lu",i);//imprimindo o valor de uma variável
delay_ms(300);
}

soma=0;
delay_ms (2000);
}
}




/*
\f --> Limpa o display;
i --> Escrever a string/char "i" na tela;
= --> Escrever a string/char "=" (o sinal de igualdade) na tela;
% --> Caractere que diz para o LCD que virá uma variável.
lu(Lu)--> No inicio do programa declarou-se "i" como int16, então usamos Lu pois
é uma variável long unsigned (longa sem sinal).
\n --> Diz para o LCD ir para a linha de baixo.
soma --> Escreve a string "soma" na tela.
= --> Escrever a string/char "=" (o sinal de igualdade) na tela;
% --> Caractere que diz para o LCD que virá uma variável.
lu(Lu)--> No inicio do programa declarou-se "soma" como int16, então usamos Lu
pois é uma variável long unsigned (longa sem sinal).
i --> Diz qual veriável será escrita;
soma --> Idem ao de cima;
*/

Mantive apenas a variável

 i 

no lcd.Onde mostrará uma contagem de 0 á 10.

O interessante também,é que , neste trecho:

 ....for (i=0;i<11;i++){
soma = soma + i;
printf (lcd_putc,"\fi=%lu",i);//imprimindo o valor de uma variável
delay_ms(300);
}

O delay_ms(300); mantém a velocidade da contagem, percebi também que o display buga,parece ser uma varredura de init_lcd() bém rápido depois dos 300ms.

Bom, só retomando Matheus,vou tentar implementar essa contagem em um led,onde ele piscará de acordo com a contagem.

Obrigado até agora pela ajuda Matheus, se eu tiver alguma pergunta, sobre a programação retorno aqui...

valeu!

Link para o comentário
Compartilhar em outros sites

Se for só para piscar um led, você pode fazer assim:

....for (i=0;i<11;i++){
output_toggle (PIN_B0);
delay_ms (tempo_da_piscada);
soma = soma + i;
printf (lcd_putc,"\fi=%lu",i);//imprimindo o valor de uma variável
output_toggle (PIN_B0);
delay_ms (tempo_da_piscada);
}

Essa é 1 maneira de fazer. O problema é que sua contagem vai depender do tempo das piscadas do led.

Sendo que o output_toggle pode ser substituido por output_high e output_low, repectivamente.

Falou

Link para o comentário
Compartilhar em outros sites

Aproveitando o embalo, estou com uma duvida e não sei se isso é possivel de fazer, mas vamos lá.Tenho o seguinte codigo e gostaria de testar as saidas com um laço for ,mas ta dando erro você sabe como fazer isso

Segue parte do codigo

#define led0 pin_a4 //led0

#define led1 pin_a5 //led1

for(saida=0; saida<3; saida++)

{

lcd_gotoxy(2,1); printf(lcd_putc," TESTANDO ..."); //Escreve mensagem no display

lcd_gotoxy(1,2); printf(lcd_putc,"SAIDA LIGADA"); //Escreve mensagem no display

lcd_gotoxy(7,2); printf(lcd_putc,"%01d",saida); //Mensagem no display

output_high(led(saida));

delay_ms(5000);

lcd_putc("\f"); //Apaga mensagens do LCD

lcd_gotoxy(1,1); printf(lcd_putc,"SAIDA DESLIGADA"); //Escreve mensagem no display

output_low(led(saida));

delay_ms(1000);

lcd_putc("\f"); //Apaga mensagens do LCD

}

Conforme o valor da variavel saida, eu ligaria uma saida e depois de um tempo desligaria a mesma, ai incrementa a variavel saida e repete o processo até a condição do laço for.

Link para o comentário
Compartilhar em outros sites

Seu código parace estar correto. Apenas não utilize o pino A4 como saída.

Com esse codigo funcionou:

#include <16F877A.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

#use delay(clock=4000000)

#include <LCD.C>

int i;

void main()
{
lcd_init();

while (TRUE)
{
for (i=0;i<=10;i++)
{
output_high (PIN_B0);

printf(lcd_putc," TESTANDO ...");
printf(lcd_putc,"\nSAIDA LIGADA %01d",i);
delay_ms (3000);
lcd_putc("\f");

output_low(PIN_B0);
printf(lcd_putc,"SAIDA DESLIGADA"); //Escreve mensagem no display
delay_ms(3000);
lcd_putc("\f");
}

}
}

Falou

Link para o comentário
Compartilhar em outros sites

Seu código parace estar correto. Apenas não utilize o pino A4 como saída.

Com esse codigo funcionou:

#include <16F877A.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

#use delay(clock=4000000)

#include <LCD.C>

int i;

void main()
{
lcd_init();

while (TRUE)
{
for (i=0;i<=10;i++)
{
output_high (PIN_B0);

printf(lcd_putc," TESTANDO ...");
printf(lcd_putc,"\nSAIDA LIGADA %01d",i);
delay_ms (3000);
lcd_putc("\f");

output_low(PIN_B0);
printf(lcd_putc,"SAIDA DESLIGADA"); //Escreve mensagem no display
delay_ms(3000);
lcd_putc("\f");
}

}
}

Falou

EU ACHO QUE NÃO FUI CLARO NA PERGUNTA.

ESSE CODIGO QUE você POSTOU EU ENTENDI É QUE A CADA INCREMENTO DA VARIAVEL I EU GOSTARIA QUE ACIONASSE A SAIDA CORRESPONDENTE,TIPO ASSIM

QUANDO I==0, OUTPUT-HIGH(LED0)

QUANDO I==1 OUTPUT-HIGH(LED1)

QUANDO I==2, OUTPUT-HIGH(LED2)

e ASSIM POR DIANTE.

EU FIZ DE OUTRA MANEIRA UTILIZANDO A FUNÇÃO SWITCH CASE porém FICA MUITO EXTENSA E SE DESSE PRA FAZER COM O FOR DESSE JEITO FICARIA MELHOR, FUI CLARO AGORA

Link para o comentário
Compartilhar em outros sites

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!