Ir ao conteúdo

Posts recomendados

Postado

Boa noite,

Sou novo aqui, técnico em eletrônica, um especialista em placas de circuito eletrônicos e gosto muito conhecer projetos em mikroc, peguei aqui um codigo na net em mikroc de um cronometro com hs min segundos e milessimos, mas quem postou o codigo não deu respostas as perguntas nas postagens, e assim dificultando estudo do projeto, este é o código, fiz a placa e funcionou perfeitamente,com pic 16f628a gostaria se alguém poderia me ajudar, o disparo do cronometro você tem que apertar o botao e soltar ai começa o cronometro, e para o cronometro parar tenho que apertar de novo e soltar o botão,, gostaria de saber se poderia iniciar o cronometro apertando o botão e ao solta lo o cronometro iria parar, certo que alguém possa me dar aprendizado nesse sentido fico grato desde já.

 

sbit LCD_RS at RB6_bit;

sbit LCD_EN at RB1_bit;

sbit LCD_D4 at RB2_bit;

sbit LCD_D5 at RB3_bit;

sbit LCD_D6 at RB4_bit;

sbit LCD_D7 at RB5_bit;

sbit LCD_RS_Direction at TRISB6_bit;

sbit LCD_EN_Direction at TRISB1_bit;

sbit LCD_D4_Direction at TRISB2_bit;

sbit LCD_D5_Direction at TRISB3_bit;

sbit LCD_D6_Direction at TRISB4_bit;

sbit LCD_D7_Direction at TRISB5_bit;

sbit Zerar at PORTB.B7;

unsigned MicroSegundos at TMR1L;

typedef struct

{

char minutos;

char segundos;

unsigned mSegundos;

}Cronometro;

Cronometro Crono = {0,0,0};

//1us( contagem dos microsegundos )

void Timer1_Init()

{

T1CON = 0b00000000; //Prescaler 1:1 e stop

}

//1ms

void Timer0_Init()

{

OPTION_REG = 0x81; //prescaler 1:4

TMR0 = 6; // (4/clock) * (256 - 6) * 4 = 1ms

TMR0IE_Bit = 0; //stop

}

void Interrupt()

{

if( TMR0IF_Bit )

{

TMR0IF_Bit = 0;

TMR0 = 6;

MicroSegundos = 0;

Crono.mSegundos++;

if( Crono.mSegundos >= 1000 )

{

Crono.mSegundos = 0;

Crono.segundos++;

if( Crono.segundos >= 60 )

{

Crono.segundos = 0;

Crono.minutos++;

if( Crono.minutos >= 99 )

{

Crono.minutos = 0;

}

}

}

}

else if( INTF_Bit ) // Iniciar/Pausar

{

INTF_Bit = 0;

TMR0IF_Bit = 0;

TMR0 = 6;

TMR0IE_Bit = ~TMR0IE_Bit;

TMR1ON_Bit = ~TMR1ON_Bit;

}

}

void main()

{

char flag = 0;

#define zerar_flag flag.B1

CMCON = 7;

Lcd_Init();

Lcd_Cmd( _LCD_CURSOR_OFF );

Lcd_Out( 1, 5, " m s ms us" );

TRISB.B7 = 1;

GIE_bit = 1;

PEIE_Bit = 1;

INTE_Bit = 1;

MicroSegundos = 0;

Timer0_Init();

Timer1_Init();

while(1)

{

if( Zerar ) zerar_flag = 1;

if( !Zerar && zerar_flag )

{

zerar_flag = 0;

Crono.minutos = 0;

Crono.segundos = 0;

Crono.mSegundos = 0;

MicroSegundos = 0;

}

Lcd_Chr( 2, 5, Crono.minutos/10 + '0' );

Lcd_Chr_CP( (Crono.minutos%10) + '0' );

Lcd_Chr_CP(':');

Lcd_Chr_CP( Crono.segundos/10 + '0' );

Lcd_Chr_CP( (Crono.segundos%10) + '0' );

Lcd_Chr_CP(':');

Lcd_Chr_CP( Crono.mSegundos/100 + '0' );

Lcd_Chr_CP( (Crono.mSegundos/10%10) + '0' );

Lcd_Chr_CP( (Crono.mSegundos%10) + '0' );

Lcd_Chr_CP(':');

Lcd_Chr_CP( MicroSegundos/100 + '0' );

Lcd_Chr_CP( (MicroSegundos/10%10) + '0' );

Lcd_Chr_CP( (MicroSegundos%10) + '0' );

}

}

cronometro.bmp

Postado

Olá. Claro que pode. Olhei beeem por cima. Parece que o código já sai contando e quando pressionado e mantido, ele pausa e depois de solto ele zera e ao pressionar de novo inicia a contagem.

Acho que algo funcional seria:

while(1)

{

if(Zerar){

Timer0_Init();

Timer1_Init();

zerar_flag = 1;

while (Zerar);

zerar_flag = 1;

Crono.minutos = 0;

Crono.segundos = 0;

Crono.mSegundos = 0;

MicroSegundos = 0;

}

Lcd_Chr( 2, 5, Crono.minutos/10 + '0' );

Lcd_Chr_CP( (Crono.minutos%10) + '0' );

Lcd_Chr_CP(':');

Lcd_Chr_CP( Crono.segundos/10 + '0' );

Lcd_Chr_CP( (Crono.segundos%10) + '0' );

Lcd_Chr_CP(':');

Lcd_Chr_CP( Crono.mSegundos/100 + '0' );

Lcd_Chr_CP( (Crono.mSegundos/10%10) + '0' );

Lcd_Chr_CP( (Crono.mSegundos%10) + '0' );

Lcd_Chr_CP(':');

Lcd_Chr_CP( MicroSegundos/100 + '0' );

Lcd_Chr_CP( (MicroSegundos/10%10) + '0' );

Lcd_Chr_CP( (MicroSegundos%10) + '0' );

}

}

 

 

OBS: ACHOOO

nunca trabalhei com mikroc

Mas a ideia é que ao pressionar, acione o timer e aguarde ser solta ( while (Zerar) ) e ao soltar, pare o timer e zere as variáveis.

Mas olhei bem por cima, mas não é nada muito complicado. E já digo que essa não é uma maneira correta de se fazer (didaticamente até é aceitável)

Abs

Visitante
Este tópico está impedido de receber 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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!