Ir ao conteúdo

Colocar uma rotina dentro de um programa


joseca

Posts recomendados

Postado

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);                                                        }      }   }}}

Postado

@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

Postado

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

Postado

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

Postado

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);

{

Postado

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.
   }

Postado

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

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...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!