A continuación se presentara un programa
básico de comunicación entre un microcontrolador AVR, en específico un ATMEGA48
y una computadora con el fin de mostrar una aplicación sencilla utilizando un
cristal externo de 20 MHz para utilizar un baud rate superior al que se utiliza
con el resonador interno de 8 MHz.
DESCRIPCIÓN:
Lo primero que se describirá será la
configuración del reloj con el que trabajara nuestro microcontrolador,
posteriormente se describirá el circuito y el programa, para finalizar se
mostraran imágenes del funcionamiento.
CONFIGURACIÓN
DE FUSES:
Primeramente se decide los parámetros de
funcionamiento con las que funcionara nuestro microcontrolador.
FUSE HIGH BYTE
·
External
reset
·
debugWIRE
enable
·
Enable
serial program and
data downloading
·
Watchdog
timer always on
·
EEPROM
memory is
preserved
through the chip
erase.
·
Brown-out
detector trigger
level.
FUSE LOW BYTE
·
Divide
clock by 8
·
Clock
output
·
Select
start-up time
·
Select
clock source
Para la configuración de fuse high se
configura como DC con lo que queda de la siguiente manera:
·
1:
External reset
·
1:
debugWIRE enable
·
0:
Enable serial program and
data downloading(programed)
·
1:
Watchdog timer always on
·
1:
EEPROM memory is
preserved
through the chip
erase.
·
100:
Brown-out detector trigger
level.(4.3V typ).
Para la configuración de fuse low se
determinó como D7:
·
1:
Divide clock by 8.(programed)
·
1:
Clock output.
·
01:Select
start-up time
·
1001:
Select clock source
Con esta configuración podrá utilizarse el
cristal externo de 20 MHz con un bod level de 4.3V, sin preescalamiento, sin
salida de reloj, con un retraso de inicio de 14 CK.
CIRCUITO:
El circuito se conforma de dos partes
principales, el microcontrolador y el MAX232. El microcontrolador realiza la toma de
decisiones de acuerdo a los datos recibidos permitiendo con esto cambiar el
estado de dos leds conectado a PB1 y PB0 dependiendo del dato enviado por la
computadora.
La parte que se desea destacar es la conexión
del cristal de 20 MHz con dos capacitores de 22 pF para estabilizar la
frecuencia, este cristal se conectara en PB6 y PB7.
MICROCONTROLADOR:
En este caso primeramente se define la
frecuencia de reloj como 20 MHz y el baudrate con la que en realidad trabajara
nuestro microcontrolador, en este caso será de 115200 en el programa en
circuito físico y 38400 en simulación esto es ya que el componente COMPIM solo admite hasta 57600. De no
definirse se tomara por defecto una velocidad de reloj de 20 MHz y un baud rate
de 38400, esto estará definido en la librería que establecerá la comunicación.
#define F_CPU 20000000UL
#define BAUD 115200
En seguida se agregara nuestra librería para
realizar la comunicación.
#include "UART0_setbaud.h"
A continuación se agrega la cabecera de
interrupciones, las macros para el control de los registros y una variable.
#include
<avr/interrupt.h>
#define
setbit(sfr,bit) (_SFR_BYTE(sfr)|=(_BV(bit)))
#define
clearbit(sfr,bit) (_SFR_BYTE(sfr)&=~(_BV(bit)))
#define
bittoggle(sfr,bit)(_SFR_BYTE(sfr)^=_BV(bit))
unsigned char
volatile dato;
ISR(USART_RX_vect):
Dentro de la rutina de servicio de
interrupción se tomara la decisión mediante funciones if la acción que se
realizara.
dato=RECIBIR();
Dentro del primer if se cambiara el estado
en que se encuentra el pin PB0 esto si se ha ingresado los valores 3, 6 o 9
mediante el teclado. En el segundo if se cambia el estado actual del pin PB1 si
se ingresan los caracteres 1, 5 u 8.
if(dato=='3'||dato=='6'||dato=='9'){
bittoggle(PORTB,PB0);
}else if(dato=='1'||dato=='5'||dato=='8'){
bittoggle(PORTB,PB1);
}
Para finalizar se reenvía el numero recibido
para que el usuario pueda confirmar el funcionamiento del circuito.
TRANSMITIR(dato);
INT
MAIN:
Dentro de la función main se configura a PB0
y PB1 como salidas y también se configura el registro USART0 con lo siguiente:
·
Sin
paridad
·
Dos
bits de stop
·
8
bist de datos.
setbit(DDRB,DDB0);
setbit(DDRB,DDB1);
UART0(NONE,2,8);
Se configura el bit de interrupción para la
recepción de datos.
setbit(UCSR0B,RXCIE0);
sei();
NOTA:
Alguna duda o aclaración pueden ingresarla
en los comentarios, al final agregare el link del programa y la simulación.
PROGRAMA:
/*
* ECHO.c
*
* Created: 17/04/2014
15:00:12
* Author: TERRAFORMARS
*/
#include <avr/io.h>
#define F_CPU 20000000UL
#define BAUD 115200
#include
"UART0_setbaud.h"
#include
<avr/interrupt.h>
#define
setbit(sfr,bit) (_SFR_BYTE(sfr)|=(_BV(bit)))
#define
clearbit(sfr,bit) (_SFR_BYTE(sfr)&=~(_BV(bit)))
#define
bittoggle(sfr,bit)(_SFR_BYTE(sfr)^=_BV(bit))
unsigned char volatile dato;
ISR(USART_RX_vect){
dato=RECIBIR();
if(dato=='3'||dato=='6'||dato=='9'){
bittoggle(PORTB,PB0);
}else if(dato=='1'||dato=='5'||dato=='8'){
bittoggle(PORTB,PB1);
}
TRANSMITIR(dato);
}
int
main(void)
{
setbit(DDRB,DDB0);
setbit(DDRB,DDB1);
UART0(NONE,2,8);
setbit(UCSR0B,RXCIE0);
sei();
while(1)
{
//TODO:: Please write your application
code
}
}
IMÁGENES:
EJECUCIÓN DE PROGRAMA EN PROTOBOARD:
CONFIGURACIÓN DE FUSES PARA UTILIZAR CRISTAL DE 20 MHZ.
CONEXIÓN DE CRISTAL:
CIRCUITO EN ISIS PROTEUS:
EJECUCIÓN DE PROGRAMA CON TERA TERM:
PROGRAMA EN ATMEL STUDIO:
LINK
https://mega.co.nz/#!c9sVxQQY!QZw4H0xpTWB_2VbolgRX7aydC9KP3_rU_Taf94j5Q2c
No hay comentarios:
Publicar un comentario