-
Posts
2.891 -
Cadastrado em
-
Última visita
Tipo de conteúdo
Artigos
Selos
Livros
Cursos
Análises
Fórum
Tudo que MatheusLPS postou
-
Medidor de duty cycle e frequência com pic 16f877a
MatheusLPS respondeu ao tópico de pit.du em Microcontroladores
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 -
@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
-
Ele vai no + e no -, ele vai em paralelo à alimentação. Um pino no + e o outro nipo no -. Fique atento à polaridade. Falou
-
Bem proximo da alimentação do PIC. Falou
-
Isso mesmo, são esses componentes aí. Falou
-
Medidor de duty cycle e frequência com pic 16f877a
MatheusLPS respondeu ao tópico de pit.du em Microcontroladores
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 -
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
-
Estou no aguardo também! Depois que o colega Horge começou a programar, não parou mais.. hahuahauhauahu Falou
-
Medidor de duty cycle e frequência com pic 16f877a
MatheusLPS respondeu ao tópico de pit.du em Microcontroladores
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 -
Pode sim. Falou
-
Sim. Correto! Tem lá pronto. Falou
-
Sim, já está no esquema. você precisa do .hex para poder gravar no PIC? Falou
-
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
-
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
-
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
-
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
-
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
-
É 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
-
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
-
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
-
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
-
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
-
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
-
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
-
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