Professional Documents
Culture Documents
[MICROCONTROLADORES AVANZADOS]
UPIITA-IPN
ndice
1. Objetivos .................................................................................................................................. 2
1.1 Objetivo General. .............................................................................................................. 2
1.2 Objetivos Especficos. ...................................................................................................... 2
2. Material Empleado. ................................................................................................................. 2
3. Desarrollo. ............................................................................................................................... 3
3.1 Sensores ............................................................................................................................ 3
3.2 Procesamiento de informacin. ....................................................................................... 4
3.3 Actuacin. .......................................................................................................................... 6
3.5 Programacin. ................................................................................................................... 7
3.5.1 MrLCD.h...................................................................................................................... 7
3.5.2 MrLCD.c ...................................................................................................................... 7
3.5.3 Proyecto.c ................................................................................................................... 9
4. Resultados............................................................................................................................. 12
5. Conclusiones. ........................................................................................................................ 14
Prctica 3: Timer.
[MICROCONTROLADORES AVANZADOS]
UPIITA-IPN
1. Objetivos
1.1 Objetivo General.
Disear un sistema que implemente todo lo visto en el curso de
microcontroladores avanzados.
2. Material Empleado.
- Microcontrolador ATMEGA32
- LCD 16x2
- Sensor de Humedad Analgico
- Sensor de Temperatura (LM35)
- Bomba de pecera
- Relevador
- Cable conversin USB-SERIAL
- Potencimetro
- Fuente de 5 volts
- Transistor Tip 120
Prctica 3: Timer.
[MICROCONTROLADORES AVANZADOS]
UPIITA-IPN
3. Desarrollo.
Se realiz un sistema de medicin de humedad y temperatura ambiente para
poder mantener la tierra con un nivel de humedad de acuerdo a la necesidad del
usuario.
El proyecto comprende diversas reas funcionales que sern explicadas por fases
como se muestra en la Figura 1.
3.1 Sensores
Prctica 3: Timer.
[MICROCONTROLADORES AVANZADOS]
UPIITA-IPN
Fig. 4 ATMEGA32.
Los datos enviados por los sensores llegarn al microcontrolador ATMEGA32 (Fig.
4) en 2 de sus 8 entradas analgicas, con lo cual se habilitar la lectura de datos
con ADC que la hoja de datos del microcontrolador.
Con la informacin obtenida, se har una conversin a datos comunes como
porcentaje en el caso de la humedad y C en el de la temperatura, los cuales
Prctica 3: Timer.
[MICROCONTROLADORES AVANZADOS]
UPIITA-IPN
Adems, para abarcar otro de los requerimientos del proyecto, se agreg una
comunicacin por puerto serial (Fig. 6), configurada a 9600 baudios, que enviar la
temperatura a la computadora.
Prctica 3: Timer.
[MICROCONTROLADORES AVANZADOS]
UPIITA-IPN
3.3 Actuacin.
Prctica 3: Timer.
[MICROCONTROLADORES AVANZADOS]
UPIITA-IPN
3.5 Programacin.
A continuacin se colocar por partes el cdigo que el microcontrolador antes
mencionado manej para su programacin.
3.5.1 MrLCD.h
Este archivo incluye toda la programacin de las caractersticas de la LCD.
#ifndef MrLCD
#define MrLCD
#include <avr/io.h>
#include <stdlib.h>
#define
#define
#define
#define
#define
#define
#define
MRLCDsCRIB
DataDir_MRLCDsCRIB
MRLCDsCONTROL
DataDir_MRLCDControl
LightSwitch
ReadWrite
BiPolarMood
PORTB
DDRB
PORTD
DDRD
5
7
2
void Check_If_MrLCDisBusy(void);
void Peek_A_Boo(void);
void Send_A_Command(unsigned char command);
void Send_A_Character(unsigned char Character);
void Send_A_String(char *StringOfCharacters);
void Goto_MRLCDsLocation(uint8_t x, uint8_t y);
void InitializeMrLCD(void);
void Send_A_StringToMrLCDWithLocation(uint8_t x, uint8_t y, char
*StringOfCharacters);
void Send_An_IntegerToMrLCD(uint8_t x, uint8_t y, int IntegerToDisplay, char
NumberOfDigits);
#endif
3.5.2 MrLCD.c
Este archivo hace las operaciones propuestas en MrLCD.h.
#include "MrLCD.h"
void Check_If_MrLCDisBusy(void)
{
DataDir_MRLCDsCRIB = 0;
MRLCDsCONTROL |= (1 << ReadWrite);
MRLCDsCONTROL &= ~1 << BiPolarMood;
while(MRLCDsCRIB >= 0x80) // D7 PORTB Pin7 0b10000000 0x80, est ocupado
{
Peek_A_Boo();
}
DataDir_MRLCDsCRIB = 0xFF; // 0xFF 11111111
Prctica 3: Timer.
[MICROCONTROLADORES AVANZADOS]
UPIITA-IPN
}
void Peek_A_Boo()
{
MRLCDsCONTROL |= (1 << LightSwitch);
asm volatile ("nop");
asm volatile ("nop");
MRLCDsCONTROL &= ~1 << LightSwitch;
}
void Send_A_Command(unsigned char Command)
{
Check_If_MrLCDisBusy();
MRLCDsCRIB = Command;
MRLCDsCONTROL &= ~ ((1 << ReadWrite) | (1 << BiPolarMood));
Peek_A_Boo();
MRLCDsCRIB = 0;
}
void Send_A_Character(unsigned char Character)
{
Check_If_MrLCDisBusy();
MRLCDsCRIB = Character;
MRLCDsCONTROL &= ~ (1 << ReadWrite);
MRLCDsCONTROL |= (1 << BiPolarMood);
Peek_A_Boo();
MRLCDsCRIB = 0;
}
void Send_A_String(char *StringOfCharacters)
{
while(*StringOfCharacters > 0)
{
Send_A_Character(*StringOfCharacters++);
}
}
char firstColumnPositionsForMrLCD[2] = {0,64};
void Goto_MRLCDsLocation(uint8_t x, uint8_t y)
{
Send_A_Command(0x80 + firstColumnPositionsForMrLCD[y] + x);
}
void Send_A_StringToMrLCDWithLocation(uint8_t x, uint8_t y, char
*StringOfCharacters)
{
Goto_MRLCDsLocation(x, y);
Send_A_String(StringOfCharacters);
}
void Send_An_IntegerToMrLCD(uint8_t x, uint8_t y, int IntegerToDisplay, char
NumberOfDigits)
{
char StringToDisplay[NumberOfDigits];
itoa(IntegerToDisplay, StringToDisplay, 10);
Send_A_StringToMrLCDWithLocation(x, y, StringToDisplay);
Send_A_String(" ");
Prctica 3: Timer.
[MICROCONTROLADORES AVANZADOS]
UPIITA-IPN
}
void InitializeMrLCD()
{
DataDir_MRLCDControl |= (1 << LightSwitch) | (1 << ReadWrite) | (1 <<
BiPolarMood);
Send_A_Command(0x01);
Send_A_Command(0x38);
Send_A_Command(0b00001110);
3.5.3 Proyecto.c
El archivo principal del proyecto en donde se hacen todas las operaciones,
lecturas y salidas de datos.
#include <avr/io.h>
#include <avr/interrupt.h>
#include "MrLCD.h"
uint16_t
uint16_t
unsigned
unsigned
PorHum = 0;
Tempo = 0;
char var=0;
char var1=0;
//EEPROM
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEWE))
;
/* Set up address and data registers */
EEAR = uiAddress;
EEDR = ucData;
/* Write logical one to EEMWE */
EECR |= (1<<EEMWE);
/* Start eeprom write by setting EEWE */
EECR |= (1<<EEWE);
}
// UART
void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) )
;
/* Put data into buffer, sends the data */
UDR = data;
}
unsigned char USART_Receive( void )
{
/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) )
Prctica 3: Timer.
[MICROCONTROLADORES AVANZADOS]
UPIITA-IPN
;
/* Get and return received data from buffer */
return UDR;
}
int main(void)
{
InitializeMrLCD();
Send_A_StringToMrLCDWithLocation(0,0,"HHumedad:");
Send_A_StringToMrLCDWithLocation(0,1,"TTemp C:");
DDRC=0x03;
ADCSRA |= 1<<ADPS2;
ADMUX |= 1<<REFS0 | 1<<REFS1;
ADCSRA |= 1<<ADIE;
ADCSRA |= 1<<ADEN;
sei();
ADCSRA |= 1<<ADSC;
/////////////////////////////////////////////////////////////////////////////
/////////////////////////
//UBRRH
//configura a 9600
UBRRL =51;
//habilita RX y TX y parcialmente configura a 8 bits
UCSRB |= (1<<RXEN) | (1<<TXEN) | (0<<UCSZ2);
//brinda acceso al registro
//modo asincrono
//sin paridad
//1 bit de paro
//configra a 8bits
UCSRC |= (1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) |
(1<<UCSZ0) | (1<<UCSZ1);
/////////////////////////////////////////////////////////////////////////////
/////////////////////////
while (1)
{
}
}
ISR(ADC_vect)
{
uint8_t theLow = ADCL;
uint16_t theTenBitResult = ADCH<<8 | theLow;
PorHum=theTenBitResult;
Tempo=theTenBitResult/40;
switch (ADMUX)
{
case 0xC0:
Send_An_IntegerToMrLCD(10, 0, PorHum+10000 , 5);
if (PorHum>500)
{
Prctica 3: Timer.
10
[MICROCONTROLADORES AVANZADOS]
UPIITA-IPN
PORTC=0x01;
}
else
{
PORTC=0x00;
}
var1=PorHum;
EEPROM_write(0x00,var1);
ADMUX = 0xC1;
break;
case 0xC1:
Send_An_IntegerToMrLCD(10, 1, Tempo+10000, 5);
var=Tempo;
USART_Transmit(var);
ADMUX = 0xC0;
break;
default:
//Default code
break;
} ADCSRA |= 1<<ADSC;
}
Prctica 3: Timer.
11
[MICROCONTROLADORES AVANZADOS]
UPIITA-IPN
4. Resultados.
Prctica 3: Timer.
12
[MICROCONTROLADORES AVANZADOS]
UPIITA-IPN
En el caso del protocolo de comunicacin, se conect por medio del circuito USB/TTL
antes propuesto a la computadora, en donde los RX y TX del microcontrolador eran
enviados y ledos a travs de la terminal que provee el software Mikro C en su plataforma
para AVR. Se configur a 9600 baudios y al conectarse se pudo ver la temperatura.
Prctica 3: Timer.
13
[MICROCONTROLADORES AVANZADOS]
UPIITA-IPN
5. Conclusiones.
Conforme el proyecto se iba trabajando, surgieron muchas dificultades para que
su funcionamiento fuera el adecuado, desde las variaciones de las lecturas de los
datos en la LCD, hasta las salidas irregulares de respuestas para la actuacin
correcta de la bomba. Pero finalmente se pudo ver mediante un proyecto simple,
la gran utilidad que tienen los microcontroladores en la ingeniera mecatrnica, ya
que nos sirven como intermediarios y cerebros del trabajo de nuestros
dispositivos. Se pudo apreciar la gran cantidad de aplicaciones y posibilidades que
un microcontrolador como el AVR ATMEGA32 poda darnos para resolver las
problemticas que nos aquejaban y con una eficacia bastante buena.
Prctica 3: Timer.
14