Ir ao conteúdo

MatheusLPS

Membro Pleno
  • Posts

    2.891
  • Cadastrado em

  • Última visita

Tudo que MatheusLPS postou

  1. Acabei de postar no outro tópico: Pronto: Circuito: Código: //ser utilizado de 8 bits também. #FUSES NOWDT //Sem Watch dog, evitando reset #FUSES HS //Crystal de oscilação igual a 4mhz #FUSES PUT //Tempo de início do PIC #FUSES NOPROTECT //Codigo sem proteção de leitura, software livre! #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O #FUSES NOCPD //No EE protection #use delay(clock=12000000) //Meu clock #include <LCD_flex.C> //Rotina de LCD modo 4 vias. Obrigatório! int1 nuevopulso=0; int16 TFB=0,TFS=0,TF=0; float32 AP=0.0,freq; int1 cambio=0; #int_ccp1 void ccp1_int() { if(cambio==0) { TFS=CCP_1; setup_ccp1(CCP_CAPTURE_FE); cambio=1; } else { TFB=CCP_1; setup_ccp1(CCP_CAPTURE_RE); cambio=0; if(nuevopulso==0) { nuevopulso=1; } } } void main() { lcd_init(); setup_timer_1(T1_INTERNAL); setup_ccp1(CCP_CAPTURE_RE); cambio = 0; enable_interrupts(int_ccp1); enable_interrupts(global); do { if(nuevopulso==1) { TF=(TFB-TFS); AP = (TF*1.0)/3; freq=(1/(AP*2)*1000000); printf(lcd_putc,"\fFreq = %2.2fHz", freq); delay_ms (200); nuevopulso=0; } } while (TRUE); } #include <16f628a.h> //O PIC utilizado, obigatório! LCD_flex que irá precisar. Só copiar colaremnovo documento do CCS, salvar ( não precisa compilar). Salva na pasta drivers: // These pins are for the Microchip PicDem2-Plus board, // which is what I used to test the driver. Change these // pins to fit your own board. #define LCD_DB4 PIN_B4 #define LCD_DB5 PIN_B5 #define LCD_DB6 PIN_B6 #define LCD_DB7 PIN_B7 #define LCD_E PIN_B0 #define LCD_RS PIN_B1 #define LCD_RW PIN_B2 // If you only want a 6-pin interface to your LCD, then // connect the R/W pin on the LCD to ground, and comment // out the following line. //#define USE_LCD_RW 1 //======================================== #define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines #define lcd_line_two 0x40 // LCD RAM address for the 2nd line int8 const LCD_INIT_STRING[4] = { 0x20 | (lcd_type << 2), // Func set: 4-bit, 2 lines, 5x8 dots 0xc, // Display on 1, // Clear display 6 // Increment cursor }; //------------------------------------- void lcd_send_nibble(int8 nibble) { // Note: !! converts an integer expression // to a boolean (1 or 0). output_bit(LCD_DB4, !!(nibble & 1)); output_bit(LCD_DB5, !!(nibble & 2)); output_bit(LCD_DB6, !!(nibble & 4)); output_bit(LCD_DB7, !!(nibble & 8)); delay_cycles(1); output_high(LCD_E); delay_us(2); output_low(LCD_E); } //----------------------------------- // This sub-routine is only called by lcd_read_byte(). // It's not a stand-alone routine. For example, the // R/W signal is set high by lcd_read_byte() before // this routine is called. #ifdef USE_LCD_RW int8 lcd_read_nibble(void) { int8 retval; // Create bit variables so that we can easily set // individual bits in the retval variable. #bit retval_0 = retval.0 #bit retval_1 = retval.1 #bit retval_2 = retval.2 #bit retval_3 = retval.3 retval = 0; output_high(LCD_E); delay_cycles(1); retval_0 = input(LCD_DB4); retval_1 = input(LCD_DB5); retval_2 = input(LCD_DB6); retval_3 = input(LCD_DB7); output_low(LCD_E); return(retval); } #endif //--------------------------------------- // Read a byte from the LCD and return it. #ifdef USE_LCD_RW int8 lcd_read_byte(void) { int8 low; int8 high; output_high(LCD_RW); delay_cycles(1); high = lcd_read_nibble(); low = lcd_read_nibble(); return( (high<<4) | low); } #endif //---------------------------------------- // Send a byte to the LCD. void lcd_send_byte(int8 address, int8 n) { output_low(LCD_RS); #ifdef USE_LCD_RW while(bit_test(lcd_read_byte(),7)) ; #else delay_us(60); #endif if(address) output_high(LCD_RS); else output_low(LCD_RS); delay_cycles(1); #ifdef USE_LCD_RW output_low(LCD_RW); delay_cycles(1); #endif output_low(LCD_E); lcd_send_nibble(n >> 4); lcd_send_nibble(n & 0xf); } //---------------------------- void lcd_init(void) { int8 i; output_low(LCD_RS); #ifdef USE_LCD_RW output_low(LCD_RW); #endif output_low(LCD_E); delay_ms(15); for(i=0 ;i < 3; i++) { lcd_send_nibble(0x03); delay_ms(5); } lcd_send_nibble(0x02); for(i=0; i < sizeof(LCD_INIT_STRING); i++) { lcd_send_byte(0, LCD_INIT_STRING[i]); // If the R/W signal is not used, then // the busy bit can't be polled. One of // the init commands takes longer than // the hard-coded delay of 60 us, so in // that case, lets just do a 5 ms delay // after all four of them. #ifndef USE_LCD_RW delay_ms(5); #endif } } //---------------------------- void lcd_gotoxy(int8 x, int8 y) { int8 address; if(y != 1) address = lcd_line_two; else address=0; address += x-1; lcd_send_byte(0, 0x80 | address); } //----------------------------- void lcd_putc(char c) { switch(c) { case '\f': lcd_send_byte(0,1); delay_ms(2); break; case '\n': lcd_gotoxy(1,2); break; case '\b': lcd_send_byte(0,0x10); break; default: lcd_send_byte(1,c); break; } } //------------------------------ #ifdef USE_LCD_RW char lcd_getc(int8 x, int8 y) { char value; lcd_gotoxy(x,y); // Wait until busy flag is low. while(bit_test(lcd_read_byte(),7)); output_high(LCD_RS); value = lcd_read_byte(); output_low(lcd_RS); return(value); } #endif // flex_lcd.c Falou
  2. @Lincon: Sim e sim! @Nycolas95 Circuito novo: Código novo: Programa teste para fazer um relógio com o 16F877A Implementada funções que mostram data e dia da semana Teste promo_version v1.1 by MatheusLPS (Koala) =============================================================================*/ #include <18F2455.h> //O PIC utilizado, obrigatório! #device adc=10 #FUSES NOWDT //Sem Watch dog, evitando reset #FUSES XT //Crystal de oscilação igual a 4mhz #FUSES PUT //Tempo de início do PIC #FUSES NOPROTECT //Codigo sem proteção de leitura, software livre! #FUSES NODEBUG //No Debug mode for ICD #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O #FUSES NOCPD //No EE protection #use delay(clock=4000000) // Definição do clock utilizado. Obrigatório! #include <lcd_FLEX.C> //Inclusão da biblioteca de LCD. Obrigatório! // D0 enable //Pinos utilizados pelo LCD. Podem ser alterados. // D1 rs // D2 rw // D4 D4 // D5 D5 // D6 D6 // D7 D7 /*===================== Meu Botões: =======================*/ #define BOTAO1 PIN_B0 //Botão de escolha de ajuste das funçoes. #define BOTAO_INCREMENTO PIN_B1 //Botão incremento de variáveis. #define BOTAO_DECREMENTO PIN_B2 //Botão de decremento das variáveis. //Foram utilizados resistores pull-up e //pull-down em todos os botões para //evitar ruídos. /*===================== Minhas variáveis: =======================*/ int16 q=0; //Variável que incrementa a cada 0.5s dentro da interupção do timer1. int s=0; //Variável dos segundos, incrementa na metade de q. int m=0; //Variável dos minutos. 0 a 59 int h=0; //Variável das horas. 0 a 23. int contador=0; //Variável de controle do botão de ajuste. int ndia_semana=1; //Variável dos dias da semana, é associada a uma string. int dia=1; //Variável dos dias do mês. 0 a 31. int mes=1; //Variável dos meses. 0 a 12. int16 ano=2010; //Variável dos anos. 2000 a 2099. int16 q1,q2; float p; /*===================== Minha Interrupção: =======================*/ #int_TIMER1 //Interrupção do Timer1 void temp1s(void) //Funcão. O que deverá ser feiro a cada interrupão. { q++; //Variável q incrementada a cada estouro do Timer1 set_timer1 (3036); //Preload do Timer1 } /*===================== O programa Principal: =======================*/ void main() { lcd_init(); //Inicializa o LCD (obrigatório)! /*lcd_gotoxy (2,1); //Coluna 6, linha 1. lcd_putc("Projeto Tempo:"); delay_ms(2000); lcd_gotoxy (2,2); lcd_putc("Com PIC16F877A"); delay_ms(2000); lcd_putc ("\f"); lcd_gotoxy (2,1); lcd_putc("Promo Version"); delay_ms(2000); lcd_gotoxy (6,2); lcd_putc ("1.10"); delay_ms(2000); lcd_putc ("\f"); lcd_gotoxy (7,1); lcd_putc("by"); lcd_gotoxy (2,2); lcd_putc ("Matheus Koala"); delay_ms(3000); lcd_putc ("\f"); delay_ms(1000); lcd_gotoxy (1,1); lcd_putc ("Iniciando"); lcd_gotoxy (10,1); lcd_putc ("."); delay_ms(500); lcd_gotoxy (11,1); lcd_putc ("."); delay_ms(500); lcd_gotoxy (12,1); lcd_putc ("."); delay_ms(500); lcd_gotoxy (13,1); lcd_putc ("."); delay_ms(500); lcd_gotoxy (14,1); lcd_putc ("."); delay_ms(500); lcd_gotoxy (15,1); lcd_putc ("."); delay_ms(500); lcd_gotoxy (16,1); lcd_putc ("."); delay_ms(500); lcd_putc ("\f"); delay_ms(1000);*/ setup_adc_ports(AN0); //Canal 0 analógico setup_adc(ADC_CLOCK_DIV_8); //Fuente de reloj RC set_adc_channel(0); //Habilitación canal0 delay_us(20); 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(global); //habilita interrupcão global while(TRUE) //Loop Principal { /*===================================================================== Teste do botão de ajuste. A medida que é precionado, a variável contador incrementa e as diversas funções de ajustes podem ser efetuadas. São 6 funções de ajuste, HORA, MINUTO, DIA DA SEMANA,DIA DO MES, MÊS e ANO. A cada ajuste de uma função, o menu principal com todas as informações é mostrado. =====================================================================*/ if (input(BOTAO1)) //Teste do botão. { delay_ms (100); //Para evitar retorno. if (contador>11) //Se maior q 11, zera o contador. { contador=0; } contador++; //Incremento da variável contador. } switch (contador) //Depois de incrementada, a variável CONTADOR { //assume um dos casos a seguir: case 1: //Menu de ajuste da HORA. { if (input (BOTAO_INCREMENTO)) //Incrementa a variável H(hora). { delay_ms (75); h++; if (h>23) //Se a hora for maior que 23, reset. { h=0; } } if (input (BOTAO_DECREMENTO)) //Decrementa a variável H(hora). { delay_ms (75); h--; if (h==255) //H é uma variável inteira de 8 bits. { //Quando é decrementada para um valor h=23; //menor que zero, se torna 255. Ou seja, } //deve voltar para 23. } q=0; //Quando se está em algum menu, Q é resetada. lcd_gotoxy (1,1); //Vá para a coluna 1 e linha 1 do LCD. printf (lcd_putc, "\fAjuste Hora:%02u", h); //Escreva com 2 digitos a variável H. delay_ms (100); //Mantenha na tela. break; } case 3: //Menu de ajuste do MINUTO. Idem ao anterior. { if (input (BOTAO_INCREMENTO)) { delay_ms (75); m++; if (m>59) //Diferente aqui. { m=0; } } if (input (BOTAO_DECREMENTO)) { delay_ms (75); m--; if (m==255) //Igual aqui. { m=59; } } q=0; lcd_gotoxy (1,1); printf (lcd_putc, "\fAjuste Minuto:%02u", m); delay_ms (100); break; } case 5: //Menu de ajuste do DIA DA SEMANA. { /*===================================================================== Ajuste do DIA DA SEMANA. A função ficou meio bagunçada. Pesquisarei um pouco sobre como trasformar uma string numa variável. Só consegui fazer isso com 1 (um) caracter, mas não é o ideal. Depois disso, provavelmente essa parte ficará mais enxuta. A função ficou assim: Uma variável chamada ndia_semana(número dia da semana) é incrementada de 1 a 7. Cada número é associado a um dia da semana. 1 é Domingo, 2 é Segunda e assim por diante. Se ndia_semana for maior que 7, ela é resetada em 1 de novo. Utilizei a função SWITCH para associar cada número de 1 a 7 a cada dia da semana. =====================================================================*/ if (input (BOTAO_INCREMENTO)) { delay_ms (100); ndia_semana++; if (ndia_semana>7) { ndia_semana=1; } } if (input (BOTAO_DECREMENTO)) { delay_ms (75); ndia_semana--; if (ndia_semana==255) { ndia_semana=7; } } switch (ndia_semana) { case 1: { lcd_gotoxy (1,1); printf (lcd_putc, "\fDia da Semana:\nDomingo "); delay_ms (100); break; } case 2: { lcd_gotoxy (1,1); printf (lcd_putc, "\fDia da Semana:\nSegunda "); delay_ms (100); break; } case 3: { lcd_gotoxy (1,1); printf (lcd_putc, "\fDia da Semana:\nTerca "); delay_ms (100); break; } case 4: { lcd_gotoxy (1,1); printf (lcd_putc, "\fDia da Semana:\nQuarta "); delay_ms (100); break; } case 5: { lcd_gotoxy (1,1); printf (lcd_putc, "\fDia da Semana:\nQuinta "); delay_ms (100); break; } case 6: { lcd_gotoxy (1,1); printf (lcd_putc, "\fDia da Semana:\nSexta "); delay_ms (100); break; } case 7: { lcd_gotoxy (1,1); printf (lcd_putc, "\fDia da Semana:\nSabado "); delay_ms (100); break; } } q=0; //Variável q sempre resetada nos menus. break; } case 7: //Menu de ajuste do DIA DO MES. Idem ao caso 3. { if (input (BOTAO_INCREMENTO)) { delay_ms (100); dia++; if (dia>31) { dia=1; } } if (input (BOTAO_DECREMENTO)) { delay_ms (75); dia--; if (dia==0) { dia=31; } } q=0; lcd_gotoxy (1,1); printf (lcd_putc, "\fAjuste dia Mes: \n%02u", dia); delay_ms (100); break; } case 9: //Menu de ajuste do MES. Idem ao caso 3. { if (input (BOTAO_INCREMENTO)) { delay_ms (100); mes++; if (mes>12) { mes=1; } } if (input (BOTAO_DECREMENTO)) { delay_ms (75); mes--; if (mes==0) { mes=12; } } q=0; lcd_gotoxy (1,1); printf (lcd_putc, "\fAjuste Mes: \n%02u", mes); delay_ms (100); break; } case 11: //Menu de ajuste do ANO. Idem ao caso 3. { if (input (BOTAO_INCREMENTO)) { delay_ms (100); ano++; if (ano>2099) { ano=2000; } } if (input (BOTAO_DECREMENTO)) { delay_ms (75); ano--; if (ano==1999) { ano=2099; } } q=0; lcd_gotoxy (1,1); printf (lcd_putc, "\fAjuste Ano: \n%Lu", ano); delay_ms (100); break; } default: //Menu principal. Mostra todas as informações. { s=q/2; //A variável Q incrementa a 2Hz, então os segundos //devem ser a metade. if (s==60) //Se for igual a 60, reset em Q e S. M incrementa. { q=0; s=0; m++; } if (m>59) { m=0; h++; } if (h>23) //Se H(horas) for maior q 23, reset. DIA DA SEMANA { //e DIA DO MÊS incrementam. dia++; ndia_semana++; h=0; } if (ndia_semana>7) { ndia_semana=1; } switch (ndia_semana) //Os DIAS DA SEMANA só alteram sozinhos no menu { //principal. Idem ao caso 5. case 1: { lcd_gotoxy (1,1); printf (lcd_putc, "DOMINGO "); delay_ms (100); break; } case 2: { lcd_gotoxy (1,1); printf (lcd_putc, "SEGUNDA "); delay_ms (100); break; } case 3: { lcd_gotoxy (1,1); printf (lcd_putc, "TERCA "); delay_ms (100); break; } case 4: { lcd_gotoxy (1,1); printf (lcd_putc, "QUARTA "); delay_ms (100); break; } case 5: { lcd_gotoxy (1,1); printf (lcd_putc, "QUINTA "); delay_ms (100); break; } case 6: { lcd_gotoxy (1,1); printf (lcd_putc, "SEXTA "); delay_ms (100); break; } case 7: { lcd_gotoxy (1,1); printf (lcd_putc, "sábado "); delay_ms (100); break; } } switch (mes) //Para saber se um mês possui 31, 30 ou 28 dias. { //Numa versão mais nova, farei essa rotina mais enxuta. case (1): { if (dia>31) { dia=1; mes++; } break; } case 2: { if (dia>28) { dia=1; mes++; } break; } case (3): { if (dia>31) { dia=1; mes++; } break; } case (4): { if (dia>30) { dia=1; mes++; } break; } case (5): { if (dia>31) { dia=1; mes++; } break; } case (6): { if (dia>30) { dia=1; mes++; } break; } case (7): { if (dia>31) { dia=1; mes++; } break; } case (8): { if (dia>31) { dia=1; mes++; } break; } case (9): { if (dia>30) { dia=1; mes++; } break; } case (10): { if (dia>31) { dia=1; mes++; } break; } case (11): { if (dia>30) { dia=1; mes++; } break; } case (12): { if (dia>31) { dia=1; mes=1; ano++; } break; } } q1 = read_adc(); //Lectura canal0 p = (q1*5.0*100)/1024; lcd_gotoxy (9,1); printf (lcd_putc, "%02u:%02u:%02u\n%02u/%02u/%Lu %2.1f%C", h, m, s, dia, mes, ano,p,0xdf); delay_ms (100); break; } } } } /*============================================================================= Arquivos para download: Relogio_LCD_novo O arquivo que se chama LCD_Flex.C você copia e cola ele dentro da psta Arquivos de programas>PICC>Drivers Falou
  3. Ele vai no + e no -, ele vai em paralelo à alimentação. Um pino no + e o outro nipo no -. Fique atento à polaridade. Falou
  4. Bem proximo da alimentação do PIC. Falou
  5. Isso mesmo, são esses componentes aí. Falou
  6. Ok.... Ela trabalha entre 5 e 15V... mas ela emite um sinal totalmente quadrado? Podemos usar um divisor resistivo para diminuir a amplitude do sinal. Mas você precisa de certificar que o sinal é o mais quadrado possível. E seja assimétrico, ou seja, ele tenha a parte positiva e não tenha a perte negativa. Falou
  7. Hum......... O 18f2455 é bem "mais PIC" que o 16f877A. Posso modificar o código sim. Muda-se pouca coisa. Esse PIC aí não é caro nao? Falou
  8. Estou no aguardo também! Depois que o colega Horge começou a programar, não parou mais.. hahuahauhauahu Falou
  9. Se é só para ler a frequencia e o duty cicle é simples de fazer. Só nao entedni a história dos 0 a 30V. Esse seu sinal quadrado a ser medido tem amplitude de quantos Volts? Falou
  10. Pode sim. Falou
  11. Sim. Correto! Tem lá pronto. Falou
  12. Sim, já está no esquema. você precisa do .hex para poder gravar no PIC? Falou
  13. Sim. Qualquer LCD com duas linhas e 16 colunas funcionam nesse projeto. você pode sim colocar um chave para o back light. E sim, pode utilizar esse capacitor q você encontrou aí sim! Falou
  14. O cristal é esse: http://www.soldafria.com.br/cristal-4-mhz-meia-caneca-hc49s-p-1602.html O capacitor é de 47uF e não de 0.47uF, no caso é esse: http://www.soldafria.com.br/capacitor-eletrolitico-47uf-x-16v-p-3101.html O resto está correto. Os resistores de 10K podem ser de 1/4 ou 1/8 W. Dos pequenos. Falou
  15. Só falta 1 potênciômetro de 10K para ligar no LCD e mais 1 capacitor de 47uF para ligar em paralelo com a alimentação do PIC. Esse capacitor é eletrolítico. você põe a perna que NÃO tem a listra branca no + da fonte de 5V e a perna com a listra branca no - da fonte. Lembrem-se que esse relógio não é profissional, ele não tem um RTC. Se você retirar a energia dele, terá q configurar a hora novamente. O circuito "completo". Só falta a alimentação que no proteus não tem os pinos. Alimentação positiva (5V) nos pinos 11 e 32. Terra (0V) pinos 12 e 31. Falou
  16. De acordo com o datahseet: Alimentação positiva (5V) nos pinos 11 e 32. Terra (0V) pinos 12 e 31. O cristal tem duas pernas, cada perna vai em 1 pino do 16F877A, que são os pinos 13 e 14. Os capacitores de 15pF vão em paralelo com o cristal ou seja, uma das pernas do capacitor vai no mesmo pino que o cristale a outra perna vai no Terra (0V). Falou
  17. Sim, esqueci de comentar que você precisa do cristal de oslilação de 4Mhz e dois capacitores de 15pF(pico farad). Essa atraso aí está estranho pois nunca ocorreu o mesmo aqui. Deve ser bug da simualação. Quando montei esse circuito pela 1ª vez, deixei ligado por 15 dias e não atrasou nem 1 segundo! O colega jorgeeletronico já usou o mesmo código e me disse estar tudo correto. Sim! você pode utilizar um carregar de celular ou modem aí que tenha 5V e pelo menos uns 500mA de sáida. Falou
  18. É só isso mesmo q precisa. o que vai além e não mostra no circuito é a fonte de 5V que você alimenta o PIC. Isso vcc obtém com um 7805. Falou
  19. Acabei fazendo aqui. Fiz de um código que eu já tenho aqui. O circuito não utiliza RTC. É um código de teste e exemplo. Serve para você poder estudar ele. Como o circuito deve ser: O código fonte: Programa teste para fazer um relógio com o 16F877A Implementada funções que mostram data e dia da semana Teste promo_version v1.1 by MatheusLPS (Koala) =============================================================================*/ #include <16F877A.h> //O PIC utilizado, obrigatório! #device adc=10 #FUSES NOWDT //Sem Watch dog, evitando reset #FUSES XT //Crystal de oscilação igual a 4mhz #FUSES PUT //Tempo de início do PIC #FUSES NOPROTECT //Codigo sem proteção de leitura, software livre! #FUSES NODEBUG //No Debug mode for ICD #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O #FUSES NOCPD //No EE protection #use delay(clock=4000000) // Definição do clock utilizado. Obrigatório! #include <lcd.C> //Inclusão da biblioteca de LCD. Obrigatório! // D0 enable //Pinos utilizados pelo LCD. Podem ser alterados. // D1 rs // D2 rw // D4 D4 // D5 D5 // D6 D6 // D7 D7 /*===================== Meu Botões: =======================*/ #define BOTAO1 PIN_B0 //Botão de escolha de ajuste das funçoes. #define BOTAO_INCREMENTO PIN_B1 //Botão incremento de variáveis. #define BOTAO_DECREMENTO PIN_B2 //Botão de decremento das variáveis. //Foram utilizados resistores pull-up e //pull-down em todos os botões para //evitar ruídos. /*===================== Minhas variáveis: =======================*/ int16 q=0; //Variável que incrementa a cada 0.5s dentro da interupção do timer1. int s=0; //Variável dos segundos, incrementa na metade de q. int m=0; //Variável dos minutos. 0 a 59 int h=0; //Variável das horas. 0 a 23. int contador=0; //Variável de controle do botão de ajuste. int ndia_semana=1; //Variável dos dias da semana, é associada a uma string. int dia=1; //Variável dos dias do mês. 0 a 31. int mes=1; //Variável dos meses. 0 a 12. int16 ano=2010; //Variável dos anos. 2000 a 2099. int16 q1,q2; float p; /*===================== Minha Interrupção: =======================*/ #int_TIMER1 //Interrupção do Timer1 void temp1s(void) //Funcão. O que deverá ser feiro a cada interrupão. { q++; //Variável q incrementada a cada estouro do Timer1 set_timer1 (3036); //Preload do Timer1 } /*===================== O programa Principal: =======================*/ void main() { lcd_init(); //Inicializa o LCD (obrigatório)! /*lcd_gotoxy (2,1); //Coluna 6, linha 1. lcd_putc("Projeto Tempo:"); delay_ms(2000); lcd_gotoxy (2,2); lcd_putc("Com PIC16F877A"); delay_ms(2000); lcd_putc ("\f"); lcd_gotoxy (2,1); lcd_putc("Promo Version"); delay_ms(2000); lcd_gotoxy (6,2); lcd_putc ("1.10"); delay_ms(2000); lcd_putc ("\f"); lcd_gotoxy (7,1); lcd_putc("by"); lcd_gotoxy (2,2); lcd_putc ("Matheus Koala"); delay_ms(3000); lcd_putc ("\f"); delay_ms(1000); lcd_gotoxy (1,1); lcd_putc ("Iniciando"); lcd_gotoxy (10,1); lcd_putc ("."); delay_ms(500); lcd_gotoxy (11,1); lcd_putc ("."); delay_ms(500); lcd_gotoxy (12,1); lcd_putc ("."); delay_ms(500); lcd_gotoxy (13,1); lcd_putc ("."); delay_ms(500); lcd_gotoxy (14,1); lcd_putc ("."); delay_ms(500); lcd_gotoxy (15,1); lcd_putc ("."); delay_ms(500); lcd_gotoxy (16,1); lcd_putc ("."); delay_ms(500); lcd_putc ("\f"); delay_ms(1000);*/ setup_adc_ports(AN0); //Canal 0 analógico setup_adc(ADC_CLOCK_DIV_8); //Fuente de reloj RC set_adc_channel(0); //Habilitación canal0 delay_us(20); 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(global); //habilita interrupcão global while(TRUE) //Loop Principal { /*===================================================================== Teste do botão de ajuste. A medida que é precionado, a variável contador incrementa e as diversas funções de ajustes podem ser efetuadas. São 6 funções de ajuste, HORA, MINUTO, DIA DA SEMANA,DIA DO MES, MÊS e ANO. A cada ajuste de uma função, o menu principal com todas as informações é mostrado. =====================================================================*/ if (input(BOTAO1)) //Teste do botão. { delay_ms (100); //Para evitar retorno. if (contador>11) //Se maior q 11, zera o contador. { contador=0; } contador++; //Incremento da variável contador. } switch (contador) //Depois de incrementada, a variável CONTADOR { //assume um dos casos a seguir: case 1: //Menu de ajuste da HORA. { if (input (BOTAO_INCREMENTO)) //Incrementa a variável H(hora). { delay_ms (75); h++; if (h>23) //Se a hora for maior que 23, reset. { h=0; } } if (input (BOTAO_DECREMENTO)) //Decrementa a variável H(hora). { delay_ms (75); h--; if (h==255) //H é uma variável inteira de 8 bits. { //Quando é decrementada para um valor h=23; //menor que zero, se torna 255. Ou seja, } //deve voltar para 23. } q=0; //Quando se está em algum menu, Q é resetada. lcd_gotoxy (1,1); //Vá para a coluna 1 e linha 1 do LCD. printf (lcd_putc, "\fAjuste Hora:%02u", h); //Escreva com 2 digitos a variável H. delay_ms (100); //Mantenha na tela. break; } case 3: //Menu de ajuste do MINUTO. Idem ao anterior. { if (input (BOTAO_INCREMENTO)) { delay_ms (75); m++; if (m>59) //Diferente aqui. { m=0; } } if (input (BOTAO_DECREMENTO)) { delay_ms (75); m--; if (m==255) //Igual aqui. { m=59; } } q=0; lcd_gotoxy (1,1); printf (lcd_putc, "\fAjuste Minuto:%02u", m); delay_ms (100); break; } case 5: //Menu de ajuste do DIA DA SEMANA. { /*===================================================================== Ajuste do DIA DA SEMANA. A função ficou meio bagunçada. Pesquisarei um pouco sobre como trasformar uma string numa variável. Só consegui fazer isso com 1 (um) caracter, mas não é o ideal. Depois disso, provavelmente essa parte ficará mais enxuta. A função ficou assim: Uma variável chamada ndia_semana(número dia da semana) é incrementada de 1 a 7. Cada número é associado a um dia da semana. 1 é Domingo, 2 é Segunda e assim por diante. Se ndia_semana for maior que 7, ela é resetada em 1 de novo. Utilizei a função SWITCH para associar cada número de 1 a 7 a cada dia da semana. =====================================================================*/ if (input (BOTAO_INCREMENTO)) { delay_ms (100); ndia_semana++; if (ndia_semana>7) { ndia_semana=1; } } if (input (BOTAO_DECREMENTO)) { delay_ms (75); ndia_semana--; if (ndia_semana==255) { ndia_semana=7; } } switch (ndia_semana) { case 1: { lcd_gotoxy (1,1); printf (lcd_putc, "\fDia da Semana:\nDomingo "); delay_ms (100); break; } case 2: { lcd_gotoxy (1,1); printf (lcd_putc, "\fDia da Semana:\nSegunda "); delay_ms (100); break; } case 3: { lcd_gotoxy (1,1); printf (lcd_putc, "\fDia da Semana:\nTerca "); delay_ms (100); break; } case 4: { lcd_gotoxy (1,1); printf (lcd_putc, "\fDia da Semana:\nQuarta "); delay_ms (100); break; } case 5: { lcd_gotoxy (1,1); printf (lcd_putc, "\fDia da Semana:\nQuinta "); delay_ms (100); break; } case 6: { lcd_gotoxy (1,1); printf (lcd_putc, "\fDia da Semana:\nSexta "); delay_ms (100); break; } case 7: { lcd_gotoxy (1,1); printf (lcd_putc, "\fDia da Semana:\nSabado "); delay_ms (100); break; } } q=0; //Variável q sempre resetada nos menus. break; } case 7: //Menu de ajuste do DIA DO MES. Idem ao caso 3. { if (input (BOTAO_INCREMENTO)) { delay_ms (100); dia++; if (dia>31) { dia=1; } } if (input (BOTAO_DECREMENTO)) { delay_ms (75); dia--; if (dia==0) { dia=31; } } q=0; lcd_gotoxy (1,1); printf (lcd_putc, "\fAjuste dia Mes: \n%02u", dia); delay_ms (100); break; } case 9: //Menu de ajuste do MES. Idem ao caso 3. { if (input (BOTAO_INCREMENTO)) { delay_ms (100); mes++; if (mes>12) { mes=1; } } if (input (BOTAO_DECREMENTO)) { delay_ms (75); mes--; if (mes==0) { mes=12; } } q=0; lcd_gotoxy (1,1); printf (lcd_putc, "\fAjuste Mes: \n%02u", mes); delay_ms (100); break; } case 11: //Menu de ajuste do ANO. Idem ao caso 3. { if (input (BOTAO_INCREMENTO)) { delay_ms (100); ano++; if (ano>2099) { ano=2000; } } if (input (BOTAO_DECREMENTO)) { delay_ms (75); ano--; if (ano==1999) { ano=2099; } } q=0; lcd_gotoxy (1,1); printf (lcd_putc, "\fAjuste Ano: \n%Lu", ano); delay_ms (100); break; } default: //Menu principal. Mostra todas as informações. { s=q/2; //A variável Q incrementa a 2Hz, então os segundos //devem ser a metade. if (s==60) //Se for igual a 60, reset em Q e S. M incrementa. { q=0; s=0; m++; } if (m>59) { m=0; h++; } if (h>23) //Se H(horas) for maior q 23, reset. DIA DA SEMANA { //e DIA DO MÊS incrementam. dia++; ndia_semana++; h=0; } if (ndia_semana>7) { ndia_semana=1; } switch (ndia_semana) //Os DIAS DA SEMANA só alteram sozinhos no menu { //principal. Idem ao caso 5. case 1: { lcd_gotoxy (1,1); printf (lcd_putc, "DOMINGO "); delay_ms (100); break; } case 2: { lcd_gotoxy (1,1); printf (lcd_putc, "SEGUNDA "); delay_ms (100); break; } case 3: { lcd_gotoxy (1,1); printf (lcd_putc, "TERCA "); delay_ms (100); break; } case 4: { lcd_gotoxy (1,1); printf (lcd_putc, "QUARTA "); delay_ms (100); break; } case 5: { lcd_gotoxy (1,1); printf (lcd_putc, "QUINTA "); delay_ms (100); break; } case 6: { lcd_gotoxy (1,1); printf (lcd_putc, "SEXTA "); delay_ms (100); break; } case 7: { lcd_gotoxy (1,1); printf (lcd_putc, "sábado "); delay_ms (100); break; } } switch (mes) //Para saber se um mês possui 31, 30 ou 28 dias. { //Numa versão mais nova, farei essa rotina mais enxuta. case (1): { if (dia>31) { dia=1; mes++; } break; } case 2: { if (dia>28) { dia=1; mes++; } break; } case (3): { if (dia>31) { dia=1; mes++; } break; } case (4): { if (dia>30) { dia=1; mes++; } break; } case (5): { if (dia>31) { dia=1; mes++; } break; } case (6): { if (dia>30) { dia=1; mes++; } break; } case (7): { if (dia>31) { dia=1; mes++; } break; } case (8): { if (dia>31) { dia=1; mes++; } break; } case (9): { if (dia>30) { dia=1; mes++; } break; } case (10): { if (dia>31) { dia=1; mes++; } break; } case (11): { if (dia>30) { dia=1; mes++; } break; } case (12): { if (dia>31) { dia=1; mes=1; ano++; } break; } } q1 = read_adc(); //Lectura canal0 p = (q1*5.0*100)/1024; lcd_gotoxy (9,1); printf (lcd_putc, "%02u:%02u:%02u\n%02u/%02u/%Lu %2.1f%C", h, m, s, dia, mes, ano,p,0xdf); delay_ms (100); break; } } } } /*============================================================================= Arquivos para download: Relogio_LCD_2 Essa versão aqui não tem a temperatura mas tem fotos e vídeos da 1ª versão: Relogio_LCD Falou
  20. Pelo histórico do membro solicitante, percebo que é um usuário novo ao mundo da eletrônica. Já no 3º post já dá sinal de desistência por causa do preço. Isso leva a crer q seja um projeto pessoal e nao profissonal. Sendo que a parte em vermelho nem faz parte do circuito do relógio e a adição de um LM35 ao circuito ocupa apenas 3 pinos na protoboard. O LM35 é do tamanho e um tranistor pequeno. Tendo um resultado como "trambolho" feito por mim uma vez, sem a parte da temperatura. Veja como é enorme (ironia): Nesse caso, um 16f628 não serve por não possuir um conversor analógico-digital sendo necessário um sensor de temperatura digital, que é mais caro, ou m AD externo. Aí nesse caso, perde-se a vantagem de uso do PIC mais barato. No mais é isso. Falou
  21. Baixei e analisei o circuito. Só o DS1621 que você recomenda custa 17 reais na farnell: http://www.farnellnewark.com.br/cidigtermometroetermostato8pdip,product,1188024,4375591.aspx Sem falar no 16f84 que custa 8 reais na solda fria: http://www.soldafria.com.br/microcontrolador-pic16f84a-04p-p-579.html E o Lt1173 que custa absurdos 26 reais na farnell: http://www.farnellnewark.com.br/searchresults.aspx?dskeyword=lt1173&idproducttype=0&idproductcolor=0&iddept=0&nupricerangestart=1&nupricerangeend=9999999&type=2 Nesse caso, acredito q um 16F877A + LM35+LCD fique mais em conta e mais simples de fazer mesmo a ideia do colega acima sendo válida. Falou
  22. você precisa de um PIC que tenha conversor analógico-digital e pinos suficientes para o LCD. Nesse caso, o 16f877A é a melhor escolha. Falou
  23. Use esse LCD: http://www.soldafria.com.br/display-lcd-16x2-com-back-fundo-azul-letra-branca-80x36x13-p-1947.html Use um 16F877A para controlar tudo: http://www.soldafria.com.br/microcontrolador-pic16f877a-ip-p-580.html O sensor pode ser o LM35. você já tem gravador de PIC aí? você precisa fazer um código e depois gravar o PIC com o gravador. No www.roboticasimples.com você acha desse gravador simples serial. Custa 25 reais. Lembre-se q seu computador precisa da porta serial. Posso até fazer o código pra você pois não é muito difícil. Mas responda o acima. Melhor! Como estou sem meu PC pessoal esses dias, deixarei os colegas aprendizes e os já experts fazerem esse projeto. Mãos à obra pessoal. Falou
  24. Precisa ser alimentado sim. É que o Meu simulador, o Proteus não pede alimentação p ele. Mas veja a pinagem de acordo com o datasheet: Pino positivo é o 16 e o terra é o 8. Oops, agora vi porq o circuito não funciona de forma adequda. Esses seus leds são de 3.6V e 750mA. Se você colocar os 3 leds em série, você tem 10.8V e os mesmos 750mA. Até quando você ligar 2 leds vai funcionar, mas quando você ligar o 3º led não vai mais pois já que você tem uma limentação de 12V e considerando uma queda no transistor de 1.5 a 2V, você não tem tensão suficiente para os 3 leds em série. Estou com o mesmo problema para faezr um projeto meu aqui. Considere pode usar uma alimentação maior que 12V. Falou
  25. Eu já tinha pensado algo similar mas nao tinha dado certo. Fiz aqui do jeito que você quer com base noq você postou. Apenas substitui as chaves por transistores ativados com o 4017. Só tenho uma observação. Li em algum lugar que não é bom ligar os leds como eu fiz no emissor pois o transistor vai se comportar de maneira diferente. Nesse caso, espere também outras opiniões. Falou

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!