Ir ao conteúdo
  • Cadastre-se

Maurinho0

Membro Júnior
  • Posts

    7
  • Cadastrado em

  • Última visita

Reputação

9
  1. @.if Felizmente, já está tudo certo!! Ontem consegui terminar o trabalho, e agora o relógio funciona a 100% dando a opção ao utilizador de alterar os mins e as horas. Obrigado por toda a ajuda!
  2. @aphawk@Bisã[email protected] Olá amigos, tenho boas notícias!! O relógio já funciona!!!! Consegui configurar o timer com a ajuda de um amigo, e por isso a interrupção funciona com 1s. Juntando isso ao meu programa, o relógio funciona normalmente! Agora, tenho outro problema. Eu quero fazer o selecionador. Ou seja, quero os botões para que o utilizador possa escolher a hora e os minutos que deseja!! Eu já consegui fazer isso noutro programa, e funcionava bem. Tenho um botão que se estiver ativado, mudará apenaas as horas e se estiver desativado, mudará apenas os minutos. Depois tenho 2 botões, para aumentar e para diminuir. O problema é juntar esse programa do selecionador ao programa das horas. Eu juntei eles normalmente, e adicionei outro botão, fazendo com que cada vez que esse botão fosse pressionado, o relógio entrasse num "modo de mudança de hora" e o utilizador pudesse então mudar as horas. O problema, é que quando clico nesse botão, o relógio não para o tempo que tem, ele volta ao 0. E depois é que o selecionador pode mudar as horas. E também, quando o selecionador acaba de mudar as horas, e desliga o botão do modo de mudança de horas, o relógio volta ao tempo que estava a contar antes, ignorando as horas que o selecionador colocou. Acham que conseguem ajudar-me nesse sentido? O meu código atualmente: //TODO O TIPO DE VARIÁVEIS!!!!! //Variável que apresenta os números no display //"0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "0" unsigned char hexcod[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x3F}; //Variáveis SELECIONADOR unsigned char bot_aumenta; //Variável para aumentar as horas unsigned char bot_diminui; //Variável para diminuir as horas unsigned char bot_selec; //Variável do selecionador unsigned char cntdru, cntdrd, cntdrc, cntdrm; //Variável de armazenamento do contador //Variáveis RELÓGIO int uni, dez, cen, mil, valoru = 0, valord = 0, valorc = 0, valorm = 0; //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //DECLARAÇÃO PARA O INTERRUPT!!! void InitHardware(void){ //TRISD=0x00; //IRQ INTCON.GIE=1; // Enable interrupts INTCON.PEIE=0; // Enable internal peripherical interrupts INTCON.TMR0IE=1; // Enable IRQ timer0 INTCON.TMR0IF=0; // Disable Timer0 flag //Timer0 TMR0H=0x0B; TMR0L=0xDC; T0CON.T08BIT=0; // set as 16 bit timer T0CON.T0CS=0; // set as internal clock T0CON.PSA=0; // prescaler is enable T0CON.T0PS2=1; T0CON.T0PS1=0; T0CON.T0PS0=0; T0CON.TMR0ON=1; // start timer /*INTCON3.INT1IE=1; // =1 Enables the INT1 external interrupt. INTCON2.INTEDG1=1; // External interrupt 1- IRQ on rising edge 0 - falling edge INTCON3.INT1IF=0; INTCON.GIE=1; // activar as IRQ's*/ } //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void Interrupt(void){ if(INTCON.TMR0IF==1){ T0CON.TMR0ON=0; TMR0H=0x0B; TMR0L=0xDC; T0CON.TMR0ON=1; INTCON.TMR0IF=0; uni++; if(uni == 10){ // Utilizado para reiniciar as unidades uni = 0; dez++; valord = dez; } if(dez == 6){ // Utilizado para reiniciar as dezenas cen++; valorc = cen; dez = 0; valord = dez; } if(cen == 10){ // Utilizado para reiniciar as centenas cen = 0; mil++; valorm = mil; } if (cen == 4 && mil == 2){ // Utilizado para reiniciar os milhares cen = 0; mil = 0; valorc = cen; valorm = mil; } } } void main(void) { //Inicializar as variáveis com 0 bot_aumenta=0; bot_diminui=0; bot_selec=0; cntdru=0; cntdrd=0; cntdrc=0; cntdrm=0; InitHardware(); //Portas TRISC = 0b00000000; //Saída dos displays TRISD = 0b00000000; // Saída dos números nos displays TRISB.F0 = 1; // Botão para ativar o modo mudança de hora TRISB.F1 = 1; // Botão do Selecionador TRISB.F2 = 1; // Botão para diminuir as horas TRISB.F3 = 1; // Botão para aumentar as horas ANSELC = 0; ANSELD = 0; ANSELB = 0; while(1){ while(PORTB.F0 == 1){ //SELECIONADOR DOS MINUTOS //Se o selecionador não estiver ligado, muda os minutos if((PORTB.F3==0)&& (PORTB.F1==0) &&(bot_aumenta==0)){ //Se clicar no botão, aumenta uma vez bot_aumenta=1; cntdru++; } if((PORTB.F3==1)&& (PORTB.F1==0) &&(bot_aumenta==1)){ //Para continuar a aumentar bot_aumenta=0; } if((PORTB.F2==0)&& (PORTB.F1==0) && (bot_diminui==0)){ //Se clicar no botão, aumenta uma vez bot_diminui=1; cntdru--; } if((PORTB.F2==1) && (PORTB.F1==0) &&(bot_diminui==1)){ //Para continuar a aumentar bot_diminui=0; } if(cntdru == 60){ // Para reiniciar os minutos ao chegar ao 60 cntdru = 0; } valoru = cntdru; //Valor fica com o conteúdo do contador //Mostrar a unidade PORTD = hexcod[valoru%10]; //Faz a conta do resto da divisão por 10, para associar ao código Hexa respetivo PORTC = 0b00000111; // Liga o Display Delay_ms(2); // Delay para mostras o número PORTC = 0b00001111; //Desliga o Display valoru/=10; // Divide a variável por 10 valord = valoru; if(valord ==6) { valord = 0; } //Mostrar a dezena PORTD = hexcod[valord%10]; //Faz a conta do resto da divisão por 10, para associar ao código Hexa respetivo PORTC = 0b00001011; // Liga o Display Delay_ms(2); // Delay para mostras o número PORTC = 0b00001111; //Desliga o Display valord/=10; // Divide a variável por 10 //SELECIONADOR DAS HORAS //Se o selecionador estiver ligado muda as horas if((PORTB.F3==0)&& (PORTB.F1==1) &&(bot_aumenta==0)){ //Se clicar no botão, aumenta uma vez bot_aumenta=1; cntdrc++; } if((PORTB.F3==1)&& (PORTB.F1==1) &&(bot_aumenta==1)){ //Para continuar a aumentar bot_aumenta=0; } if((PORTB.F2==0)&& (PORTB.F1==1) && (bot_diminui==0)){ //Se clicar no botão, aumenta uma vez bot_diminui=1; cntdrc--; } if((PORTB.F2==1) && (PORTB.F1==1) &&(bot_diminui==1)){ //Para continuar a aumentar bot_diminui=0; } if(cntdrc == 24){ // Para reiniciar os minutos ao chegar ao 60 cntdrc = 0; } valorc = cntdrc; //Valor fica com o conteúdo do contador //Mostrar a centena PORTD = hexcod[valorc%10]; //Faz a conta do resto da divisão por 10, para associar ao código Hexa respetivo PORTC = 0b00001101; // Liga o Display Delay_ms(2); // Delay para mostras o número PORTC = 0b00001111; //Desliga o Display valorc/=10; // Divide a variável por 10 valorm = valorc; if(valorm == 3){ valorm=0; } //Mostrar o milhar PORTD = hexcod[valorm%10]; //Faz a conta do resto da divisão por 10, para associar ao código Hexa respetivo PORTC = 0b00001110; // Liga o Display Delay_ms(2); // Delay para mostras o número PORTC = 0b00001111; //Desliga o Display valorm/=10; // Divide a variável por 10// valorm = valorc; if(valorm == 3){ valorm=0; } } valoru = uni; valord = dez; valorc = cen; valorm = mil; //Unidades PORTD = hexcod[valoru%10]; // Codigo Hexadecimal para mostrar o número no display PORTC = 0b00000111; // Liga o Display Delay_ms(1); // Delay para mostras o número PORTC = 0b00001111; //Desliga o Display valoru/=10; // Divide a variável por 10 //Dezenas PORTD = hexcod[valord%10]; // Codigo Hexadecimal para mostrar o número no display PORTC = 0b00001011; // Liga o Display Delay_ms(1); // Delay para mostras o número PORTC = 0b00001111; //Desliga o Display valord/=10; // Divide a variável por 10 //Centenas PORTD = hexcod[valorc%10]; // Codigo Hexadecimal para mostrar o número no display PORTC = 0b00001101; // Liga o Display Delay_ms(1); // Delay para mostras o número PORTC = 0b00001111; //Desliga o Display valorc/=10; // Divide a variável por 10 //Milhares PORTD = hexcod[valorm%10]; // Codigo Hexadecimal para mostrar o número no display PORTC = 0b00001110; // Liga o Display Delay_ms(1); // Delay para mostras o número PORTC = 0b00001111; //Desliga o Display valorm/=10; // Divide a variável por 10 } } PIC:
  3. @.if @Bisão1976 Olá amigos. Não vim aqui ontem porque não tive tempo, mas pode-se dizer que tive um pouco de progresso! Falando do relógio, acho que consegui fazer um programa que simula o mesmo. O programa que eu fiz, consegue fazer com que o relógio funcione autonomamente, avançando o tempo, contudo tenho um problema. Eu utilizo os Delays para poder mostrar os números no Display, ou seja, para que os números sejam todos mostrados nos displays (as unidades, dezenas, centenas e milhares) é preciso que o delay seja muito baixo, visto que o display não consegue mostrar eles ao mesmo tempo. Contudo, com um delay baixo, os cálculos necessários que o programa faz para mostrar os segundos e minutos por exemplo, também são feitos muito rápidos, fazendo assim com que o relógio passe o tempo muito rápido e não no tempo real. Poderiam dar-me uma ajuda de como resolver esse problema?? Aqui têm o programa abaixo: while(1){ valoru = uni; valord = dez; valorc = cen; valorm = mil; if(uni == 10){ // Utilizado para reiniciar as unidades uni = 0; dez++; valord = dez; } if(dez == 6){ // Utilizado para reiniciar as dezenas cen++; valorc = cen; dez = 0; valord = dez; } if(cen == 10){ // Utilizado para reiniciar as centenas cen = 0; mil++; valorm = mil; } if (cen == 4 && mil == 2){ // Utilizado para reiniciar os milhares cen = 0; mil = 0; valorc = cen; valorm = mil; } //Unidades PORTD = hexcod[valoru%10]; // Codigo Hexadecimal para mostrar o número no display PORTC = 0b00000111; // Liga o Display Delay_ms(10); // Delay para mostras o número PORTC = 0b00001111; //Desliga o Display valoru/=10; // Divide a variável por 10 //Dezenas PORTD = hexcod[valord%10]; // Codigo Hexadecimal para mostrar o número no display PORTC = 0b00001011; // Liga o Display Delay_ms(10); // Delay para mostras o número PORTC = 0b00001111; //Desliga o Display valord/=10; // Divide a variável por 10 //Centenas PORTD = hexcod[valorc%10]; // Codigo Hexadecimal para mostrar o número no display PORTC = 0b00001101; // Liga o Display Delay_ms(10); // Delay para mostras o número PORTC = 0b00001111; //Desliga o Display valorc/=10; // Divide a variável por 10 //Milhares PORTD = hexcod[valorm%10]; // Codigo Hexadecimal para mostrar o número no display PORTC = 0b00001110; // Liga o Display Delay_ms(10); // Delay para mostras o número PORTC = 0b00001111; //Desliga o Display valorm/=10; // Divide a variável por 10 uni++; } Display:
  4. @Bisão1976 Não consigo me basear no que esse vídeo mostra. O amigo usa um RTC para fazer o relógio. Eu preciso de fazer o relógio apenas com a programação em C no MicroC.
  5. @.if Neste momento eu tenho um código simples. Consigo apenas colocar os números no display. Contudo, não faço ideia de como programar para que funcione como um relógio. Aqui a minha programação: //Variáveis int milhar=0x00; int centena=0x00; int dezena=0x00; int unidade=0x00; //Configuração do TIMER0 void InitTimer0(){ T0CON = 0xC2; TMR0L = 0x06; GIE_bit = 1; TMR0IE_bit = 1; } //Interrupção do TIMER0 void Interrupt(){ if (TMR0IF_bit){ TMR0IF_bit = 0; TMR0L = 0x06; while(1){ unidade = 0x3F; PORTC = 0b00000111; PORTD = unidade; delay_ms(1); PORTC = 0b00001011; PORTD = 0x06; delay_ms(1); PORTC = 0b00001101; PORTD = 0x5B; delay_ms(1); PORTC = 0b00001110; PORTD = 0x4F; delay_ms(1); PORTC = 0b00001111; PORTD = 0x4F; } } } void main() { //Portas TRISC = 0b00000000; TRISD = 0b00000000; TRISB.F1 = 1; TRISB.F2 = 1; TRISB.F3 = 1; InitTimer0(); ANSELC = 0; ANSELD = 0; ANSELB = 0; } @.if Neste momento eu tenho um código simples. Consigo apenas colocar os números no display. Contudo, não faço ideia de como programar para que funcione como um relógio. Aqui a minha programação: //Variáveis int milhar=0x00; int centena=0x00; int dezena=0x00; int unidade=0x00; //Configuração do TIMER0 void InitTimer0(){ T0CON = 0xC2; TMR0L = 0x06; GIE_bit = 1; TMR0IE_bit = 1; } //Interrupção do TIMER0 void Interrupt(){ if (TMR0IF_bit){ TMR0IF_bit = 0; TMR0L = 0x06; while(1){ unidade = 0x3F; PORTC = 0b00000111; PORTD = unidade; delay_ms(1); PORTC = 0b00001011; PORTD = 0x06; delay_ms(1); PORTC = 0b00001101; PORTD = 0x5B; delay_ms(1); PORTC = 0b00001110; PORTD = 0x4F; delay_ms(1); PORTC = 0b00001111; PORTD = 0x4F; } } } void main() { //Portas TRISC = 0b00000000; TRISD = 0b00000000; TRISB.F1 = 1; TRISB.F2 = 1; TRISB.F3 = 1; InitTimer0(); ANSELC = 0; ANSELD = 0; ANSELB = 0; }
  6. Eu já tenho o modelo no Proteus com o display prontos. Tudo no proteus já está conectado. Contudo, tenho dificuldade com a programação e preciso de ajuda para conseguir fazer a programação certa para colocar o relógio a funcionar.
  7. Boa Tarde. Tenho um trabalho para realizar com base em Microcontroladores. O objetivo é fazer um relógio no programa Proteus com base no Microcontrolador PIC18F45K22 e a programação é feita no programa MicroC. O relógio tem de ser capaz de dar as horas e os minutos, além de se conseguir alterar as horas e os minutos consoante a vontade do utilizador. Alguém poderia me ajudar neste trabalho? Só preciso de ajuda, eu próprio irei realizar o trabalho. Estou disposto a pagar pela ajuda. Obrigado.

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!