Sei sulla pagina 1di 5

PRCTICA 2: PROGRAMACION EN LENGUAJE C PARA

MICROCONTROLADORES
Antamba Jefferson

Facultad de Ingeniera Elctrica y Electrnica, Laboratorio de Sistemas de Control con Microcontroladores,


Departamento de Automatizacin y Control Industrial,
Escuela Politcnica Nacional
Quito, Ecuador

jeffersonv1995@hotmail.com

ABSTRACT- En el presente documento se detallan los RECURSOS DE MICROCONTROLADOR


requerimientos solicitados en el Trabajo Preparatorio para
el desarrollo de la prctica 2: Programacin en Lenguaje C Convertidor Anlogo Digital ADC
para Microcontroladores del Laboratorio de Control con
Microcontroladores. Se incluyen esquemas, diagrama de USART
flujo y anexos del sistema a implementar.
25 pines (mnimo)

I. OBJETIVOS
1.1. Familiarizar al estudiante con el lenguaje C para
microcontroladores AVR mediante el uso de Atmel
Studio.

II. TRABAJO PREPARATORIO


2.1. Se desea implementar un sistema microprocesado en
el cual se tenga un contador de 8 bits
ascendente/descendente el cual se visualizar en Figura 1.- Anlisis E/O del Microcontrolador
displays 7 segmentos conectados al microcontrolador,
el modo de funcionamiento (ascendente/ descendente)
ser controlado desde el HMI mediante comunicacin JUSTIFICACIN DE MICROCONTROLADOR
serial; adicionalmente implementar un multmetro
digital (0V - 5V), cuyo valor de voltaje debe Se escogi el microcontrolador ATMEGA 164P porque se
visualizarse en un display de pluma tipo analgico en dispone del microcontrolador por su utilizacin en semestres
el HMI. El programa para el microcontrolador debe anteriores y adems de que cumple con todos los recursos
ser desarrollado en C y el HMI en un lenguaje Visual necesarios para la realizacin de la prctica.
(LabView, Visual Basic, Visual C++, etc.).

ANLISIS DE ENTRADAS Y SALIDAS

ENTRADAS

1 canal ADC.

Botn de Reset.

Pin de recepcin serial.

SALIDAS

Puerto con cuatro bits de control (Displays).

Puerto de 8 bits para control (Displays)

Pin de Transmisin serial. Figura 2.- Microcontrolador Atmega164P


DIAGRAMA DE FLUJO III. REFERENCIAS

[1] National Instruments, Comunicacin Serial Utilizando


LabVIEW con un Microcontrolador Disponible en:
http://www.ni.com/white-paper/7907/es/
[2] CONTROL CON MICROCONTROLADORES, Nelson
Sotomayor
[3] Fundamentals of the C Programming Language.
Disponible en:
http://microchipdeveloper.com/tls2101:start

AUTOR: Antamba Jefferson

Biografa: Nac el 27 de mayo de 1995 en Santo Domingo,


Ecuador. Tengo bachillerato en Ciencias, especialidad Fsica
y Matemtica del colegio "Julio Moreno Espinosa", obtenida
en 2013. Estoy estudiando Ingeniera Electrnica y Control
en la Facultad de Ingeniera Elctrica y Electrnica en la
Escuela Politcnica Nacional.

Figura 3.- Diagrama de flujo

ESQUEMA DEL CIRCUITO

Figura 4.- Esquema del circuito


ANEXOS:

1. CDIGO FUENTE
a) MICROCONTROLADOR
#define F_CPU 8000000UL
#define BAUD 9600
#define My_ubrr F_CPU/16/BAUD-1

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

// FUNCIONES
void config_puertos();
void conf_adc(uint8_t MODE);
uint16_t get_adc(uint8_t PORT);
void USART_Init( unsigned int ubrr);
void USART_Transmit( unsigned char data );
unsigned char USART_Receive( void );
void num_bcd(uint8_t numero);
void barrido(uint8_t units, uint8_t tens, uint8_t hundreds);

// VARIABLES
uint16_t medida;
uint8_t dato_recibido;
int
display[10]={0b11000000,0b11111001,0b10100100,0b10110000,0b10011001,0b10010010,0b10000010,0b11111000
,0b10000000,0b10010000};
uint8_t centenas, decenas, unidades;

int main(void)
{
config_puertos();
conf_adc(1);
USART_Init(My_ubrr);
sei();
while (1)
{
medida=get_adc(0);
USART_Transmit((uint8_t)medida>>8); // PARTE ALTA
USART_Transmit((uint8_t)medida>>0); // PARTE BAJA
num_bcd(dato_recibido);
barrido(unidades, decenas, centenas);
}
}

void config_puertos()
{
DDRA=0; // PA0 ADC converter
PORTA=0b11111110;
DDRB=0b00001111; // PB0...3 control displays
PORTB=0b11111111;
DDRC=255; // 7seg
PORTC=0;
DDRD=0b00000010;
PORTD=0b11111100;
}

void conf_adc(uint8_t MODE)


{
/**
@ MODE=1 REF ext 5V
@ MODE=2 REF int 1.1V
@ MODE=3 REF int 2.56V
*/
ADMUX&=~(3<<6);
ADMUX|=(MODE<<6); //Escoger Modo
ADCSRA|=(1<<ADEN)|(3<<ADPS0); //Prescaler de 8
DIDR0=0x0F; // Deshabilita la configuracion de entrada y salida
}

uint16_t get_adc(uint8_t PORT)


{
ADMUX&=0xC0; //Mantener REF
ADMUX|=(PORT<<MUX0); //Escoger puerto de lectura
ADCSRA|=(1<<ADSC); //Inicia conversin
while(!((ADCSRA&(1<<ADSC))==0)); //Esperar que finalice conversin
return ADCW;
}

void USART_Init( unsigned int ubrr)


{
/*Set baud rate */
UBRR0H = (unsigned char)(ubrr>>8);
UBRR0L = (unsigned char)ubrr;
/* Enable receiver and transmitter */
UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);
/* Set frame format: 8data, 2stop bit */
UCSR0C = (1<<USBS0)|(3<<UCSZ00);
}

void USART_Transmit( unsigned char data )


{
/* Wait for empty transmit buffer */
while ( !( UCSR0A & (1<<UDRE0)) )
;
/* Put data into buffer, sends the data */
UDR0 = data;
}

unsigned char USART_Receive( void )


{
/* Wait for data to be received */
while ( !(UCSR0A & (1<<RXC0)) )
;
/* Get and return received data from buffer */
return UDR0;
}

ISR(USART0_RX_vect)
{
dato_recibido=USART_Receive();
}

void num_bcd(uint8_t numero)


{
centenas=numero/100;
numero=numero-centenas*100;
decenas=numero/10;
unidades=numero-decenas*10;
}

void barrido(uint8_t units, uint8_t tens, uint8_t hundreds)


{
uint8_t numero_bdc[3]={hundreds, tens, units};
uint8_t con[3]={4, 2, 1};
for (int i=0; i<3; i++)
{
PORTB=con[i];
PORTC=display[numero_bdc[i]];
_delay_ms(10);
PORTC=255;
_delay_ms(5);
}
}
b) INTERFAZ

2. SIMULACIONES

Potrebbero piacerti anche