jueves, 17 de abril de 2014

CONFIGURACION DE MICROCONTROLADOR CON CRYSTAL 20 MHZ Y USART

                        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