Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
joseca

Colocar uma rotina dentro de um programa

Recommended Posts

joseca    3

Ola a todos!

Venho pedir um ajuda aos nobres colegas,estou querendo colocar uma rotina (while (true)) dentro de um codigo que esta funcionando muito bem,é apenas um teste de aprendizado de onde colocar essa rotina no lugar certo,pois ja tentei em varios pontos do codigo sem sucesso,apenas fazer piscar um led dentro desse codigo que vai abaixo.

 

 

#include <16F877A.h>#device adc=10                   //Habilitar ADC de 10 bits, obrigatório. Pode                                 //ser utilizado de 8 bits também.#FUSES NOWDT                    //No Watch Dog Timer#FUSES XT                          //Clock <=4Mhz#FUSES PUT                      //Power Up Timer#FUSES NOPROTECT                //Code not protected from reading#FUSES NOBROWNOUT               //No brownout reset#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 <ds1307.c>#include <lcd.c> #define botao_incremento PIN_B0#define botao_decremento PIN_B1 BYTE sec;BYTE mim;BYTE hrs;BYTE day;BYTE month;BYTE yr;BYTE dow; int8 modo;int16 adc;float temperatura; int8 tempo; char dia_da_semana[7][8]={   "DOMINGO",   "SEGUNDA",   "TERCA",   "QUARTA",   "QUINTA",   "SEXTA",   "sábado",}; #int_timer1    void trata_tempo(){   tempo++;      if (tempo == 10)// 5 segundos   {      output_toggle (PIN_B5);  //inverte o nivel logico de RB5      tempo=0;      disable_interrupts( INT_TIMER1);               //Habilita interrupção timer1   }   set_timer1 (3036);} #int_ccp1void trata_ccp_1(){   if ((modo == 0) && (tempo ==0))   {      output_toggle (PIN_B5);      enable_interrupts( INT_TIMER1);               //Habilita interrupção timer1      set_timer1 (3036);   }} #int_ccp2void trata_ccp_2(){   modo++;   if (modo == 1)   {      disable_interrupts(INT_TIMER1);               //Habilita interrupção timer1      output_high (PIN_b5);   }         if (modo > 7 )   {            modo = 0;   }      if (modo == 0 )   {      enable_interrupts( INT_TIMER1);               //Habilita interrupção timer1         }} void main()  {    output_high (PIN_B5);   setup_ccp1(CCP_CAPTURE_RE);   setup_ccp2(CCP_CAPTURE_RE);   setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8);   //Configuração do Timer1 para clock interno = 1E6 dividido por 8   set_timer1 (3036);                           //Preload do Timer1      enable_interrupts( INT_TIMER1);               //Habilita interrupção timer1   enable_interrupts (int_ccp1);   enable_interrupts (int_ccp2);   enable_interrupts (global);      setup_adc_ports(AN0);         //Configura canal 0 analógico   setup_adc(ADC_CLOCK_INTERNAL);    //De acordo com relógio interno.      set_adc_channel(0);           //Habilita canal 0   delay_us(20);                 //Espera um pouco, obrigatório!         ds1307_init();   lcd_init();   modo = 0;      while(true)                          {      switch (modo)      {                                                                      case 1:         {                        if (input(BOTAO_INCREMENTO))            {               delay_ms (75);               hrs++;            }                        if (input(BOTAO_DECREMENTO))            {               delay_ms (75);               hrs--;            }                        if (hrs == 24 )            {               hrs = 0;            }                        if (hrs == 255 )            {               hrs = 23;            }                        printf(lcd_putc,"\fAjustar Hora:\n%u",hrs);                        delay_ms (100);            break;         }                  case 2:         {                        if (input(BOTAO_INCREMENTO))            {               delay_ms (75);               mim++;            }                        if (input(BOTAO_DECREMENTO))            {               delay_ms (75);               mim--;            }                        if (mim == 60 )            {               mim = 0;            }                        if (mim == 255 )            {               mim = 59;            }                                                printf(lcd_putc,"\fAjustar Minutos:\n%u",mim);                        delay_ms (100);            break;         }                  case 3:         {                        if (input(BOTAO_INCREMENTO))            {               delay_ms (75);               sec++;            }                        if (input(BOTAO_DECREMENTO))            {               delay_ms (75);               sec--;            }                        if (sec == 60 )            {               sec = 0;            }                        if (sec == 255 )            {               sec = 59;            }                        printf(lcd_putc,"\fAjustar Segundos:\n%u",sec);                        delay_ms (100);            break;         }                  case 4:         {                        if (input(BOTAO_INCREMENTO))            {               delay_ms (75);               day++;            }                        if (input(BOTAO_DECREMENTO))            {               delay_ms (75);               day--;            }                        if (day == 32 )            {               day = 1;            }                        if (day == 0 )            {               day = 31;            }                        printf(lcd_putc,"\fDia do Mes:\n%u",day);                        delay_ms (100);            break;         }                  case 5:         {                        if (input(BOTAO_INCREMENTO))            {               delay_ms (75);               month++;            }                        if (input(BOTAO_DECREMENTO))            {               delay_ms (75);               month--;            }                        if (month == 13 )            {               month = 1;            }                        if (month == 0 )            {               month = 12;            }                        printf(lcd_putc,"\fAjustar Mes:\n%u",month);                        delay_ms (100);            break;         }                  case 6:         {                        if (input(BOTAO_INCREMENTO))            {               delay_ms (75);               yr++;            }                        if (input(BOTAO_DECREMENTO))            {               delay_ms (75);               yr--;            }                        if (yr == 100 )            {               yr = 1;            }                        if (yr == 0 )            {               yr = 99;            }                        printf(lcd_putc,"\fAjustar Ano:\n%u",yr);                        delay_ms (100);            break;         }                  case 7:         {                        if (input(BOTAO_INCREMENTO))            {               delay_ms (75);               dow++;            }                        if (input(BOTAO_DECREMENTO))            {               delay_ms (75);               dow--;            }                        if (dow > 7 )            {               dow = 1;            }                        if (dow == 0)            {               dow = 7;            }                        printf(lcd_putc,"\fDia da Semana:\n%s",dia_da_semana[dow-1]);                        delay_ms (100);                        ds1307_set_date_time(day,month,yr,dow,hrs,mim,sec);                                                                                              break;         }                  default:         {         if ((mim == 59) && (sec ==59)){                     output_high(pin_b4);            delay_ms(100);            output_low(pin_b4);            delay_ms(100);            output_high(pin_b4);            delay_ms(100);            output_low(pin_b4);                                             }                                                            {              adc = read_adc();               //Lê canal 0            temperatura = (5.0 * adc * 100) / 1024.0;         //Conversão para tensão.                   ds1307_get_date(day,month,yr,dow);            ds1307_get_time(hrs,mim,sec);                        printf(lcd_putc,"\f%s %02d:\%02d:\%02d\n%02d/\%02d/\%02d %2.0f%cC",dia_da_semana[dow-1],hrs,mim,sec,day,month,yr,temperatura,0xdf);                          delay_ms(1000);                                                        }      }   }}}

Editado por Bcpetronzio
Inserir spoiler

Compartilhar este post


Link para o post
Compartilhar em outros sites
MatheusLPS    383

@joseca

 

Reconheço esse código. :D Eu que fiz..... :D

 

Bom, o jeito mais fácil é você colocar o comando:

 

output_toggle (PIN_XX);

 

Coloque logo no final do código antes do delay_ms (1000);

 

Onde PIN_XX é algum pino do PIC que tem o LED com seu devido resistor.

 

Falou

Compartilhar este post


Link para o post
Compartilhar em outros sites
joseca    3
  • Autor do tópico
  • Ola Matheus,sim o codigo é seu :)  :)  :)  :D

    Eu estudei o seu projeto,montei na protoboard  e como funcionou muito bem resolvi fazer um layout e fiz a placa definitiva se voce quiser posso te mandar o arquivo do proteus com o projeto da pci.

    Mas então é o seguinte fiz a modificção do codigo como voce me falou:

     

    output_toggle(pin_b2);{

    delay_ms(1000);

    output_toggle(pin_b2);

    delay_ms(1000);

    {

    Os leds piscam agora,mas......

    Coloquei essas linhas no final do codigo(como voce pediu)mas aconteceu do relogio de segundos ficar contando de 2 em 2,caramba sera que esse delay de 1 segundo no final do codigo esta bagunçando tudo????

    Experimentei tambem colocar essas linha no começo,mas sem sucesso

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    MatheusLPS    383

    Explique melhor o que você deseja.

     

    Seria apenas piscar o led a cada segundo? Se for, é fácil. Coque apenas o comando output_toggle(pin_b2); antes do delay. Some te ele e mais nada.

     

    Se você adicionar mais delays, ira atrapalhar a visualização do relógio.

    Falou

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    joseca    3
  • Autor do tópico
  • na verdade queria fazer piscar 2 leds portb,2 e portb,3 como esta nas linhas abaixo so que atrapalha os segundos como te falei

     

    output_toggle(pin_b2);{

    delay_ms(1000);

    output_toggle(pin_b3);

    delay_ms(1000);

    {

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    joseca    3
  • Autor do tópico
  • não posso colocar mais um while (true) no codigo ?

     

      whiletrue ) //Loop infinito.
       {
           output_high(pin_d2);       //Liga LED.
           delay_ms(1000);              //espera 1 segundo.
           output_low(pin_d2);        //Desliga LED.
           delay_ms(1000);              //espera 1 segundo.
       }

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    MatheusLPS    383

    Como eu te falei. No final do código que você postou, está assim:

    printf(lcd_putc,"\f%s %02d:\%02d:\%02d\n%02d/\%02d/\%02d %2.0f%cC",dia_da_semana[dow-1],hrs,mim,sec,day,month,yr,temperatura,0xdf);              delay_ms(1000);

    Por que você não faz assim:

    printf(lcd_putc,"\f%s %02d:\%02d:\%02d\n%02d/\%02d/\%02d %2.0f%cC",dia_da_semana[dow-1],hrs,mim,sec,day,month,yr,temperatura,0xdf);              output_toggle (PIN_B2);            delay_ms(1000);

    Irá piscar a cada segundo. Se você colocar outro while (true), o LCD não irá atualizar.

     

    Falou

    Editado por MatheusLPS

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×