sábado, 2 de junio de 2018

CRONOMETRO AVR ATMEGA

Este es el programa de un cronómetro, con reinicio y pausa, implementado en un Atmega164p, los el tiempo se muestra en un display de 8 segmentos x4.
Circuito


/*
 * cronometro.c
 *
 * Created: 10/03/2016 8:43:06
 *  Author: Toshiba Satellite
 */ 


#include 
#define F_CPU 1000000UL
#include 
#include 

unsigned char u,d,c,m;
int contador,segundo;   //por q va hasta 9999
unsigned char display[10]={0b00111111,0b00000110,0b01011011,0b01001111,0b01100110,0b01101101,0b01111101,0b000000111,0b01111111,0b01101111};

void configurar(void);

int main(void)
{
 configurar();
 while(1)
 {
  u=segundo%10;
  m=segundo/1000;
  c=(segundo-m*1000)/100;
  d=(segundo-m*1000-c*100)/10;
  
  PORTA=display[u];
  PORTC=0b11111110;
  _delay_ms(5);
  PORTC=255;   //apagar
  PORTA=display[d];
  PORTC=0b11111101;
  _delay_ms(5);
  PORTC=255;
  PORTA=display[c];
  PORTC=0b11111011;
  _delay_ms(5);
  PORTC=255;
  PORTA=display[m];
  PORTC=0b11110111;
  _delay_ms(5);
  PORTC=255;
  
 }
}

void configurar(void)
{
 //configuracion de puertos
 DDRA=255;//salida
 DDRC=255;
 
 //configuracion de timer
 TCCR0A=0b00000010;
 OCR0A=38;
 TCCR0B=0b00000000;
 TIMSK0=0b00000010;
 TIFR0=TIMSK0;     //bajando banderas
 
 //configuracionde interrupciones externas
 EICRA=0b00101010;
 EIMSK=0b00000111;
 
 EIFR=0b00000111;//solo para simulacion
 
 sei();
}

//interrupcion por comparacion del timer 0
ISR(TIMER0_COMPA_vect)
{
 contador++;
 if (contador>100)
 {
  segundo++;
  contador=0;
 }
 
}

//INTERRUPCIONES EXTERNAS
//pausa
ISR(INT0_vect)
{
 TCCR0B=0b00000000;
}

//arrancar
ISR(INT1_vect)
{
 TCCR0B=0b00000100;
}

//reinicio
ISR(INT2_vect)
{
 segundo=0;
}


//

No hay comentarios.:

Publicar un comentario