viernes, junio 13, 2008

Paso 21: Ejemplos de aplicación 2º Parte - Atmega16

Otro de los aspectos que concierne al desarrollo de nuestro proyecto final de carrera, tiene que ver con el microcontrolador de Atmel, Atmega16.

Éste microcontrolador de 8 bits, presenta una serie de características que lo hacen especialmente funcional con nuestros requerimientos. La principal deficiencia que nos presenta el hardware disponible, es el escaso número de entradas y salidas discretas de la placa adquisidora para poder realizar el ciclo de control de manera integral en la PC.

Por éste motivo, el microcontrolador Atmega16 nos permite, por un lado, establecer la comunicación con la PC por medio de RS-232, y por el otro, realizar una interfaz apropiada para la salida de 2 canales PWM en un amplio rango de frecuencias. También, en caso de ser necesario, se encargará de detectar los pulsos de los 2 encoders montados sobre la estructura.

A continuación publicamos dos ejemplos de aplicación, realizados durante la fase de diseño para probar los módulos de salida PWM y de comunicación por medio de la USART.

El entorno de desarrollo elegido es WinAVR , el compilador GNU GCC y la librería de C para AVR avr-libc. Si bien los ejemplos están pensados para Atmega16, también pueden aplicarse a otros modelos de la familia, como Atmega32, Atmega8, etc. por medio de modificaciones menores.

PWM.c (con interrupciones)


#include <avr/io.h>
#include <avr/boot.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr\sfr_defs.h>

enum { UP, DOWN };

INTERRUPT (SIG_OVERFLOW0) /*SIG_OUTPUT_COMPARE0*/
{
static unsigned char direction;
static unsigned char pwm;

switch (direction)
{
case UP:
if (++pwm == 255)
direction = DOWN;
break;

case DOWN:
if (--pwm == 0)
direction = UP;
break;
}

OCR0 = pwm;
return (0);
}


int main (void)
{
/* Define PB3 como salida PWM (pin 4)*/
DDRB = (1 <<3);

TCCR0 = (0 << FOC0)|(1 << WGM00)|(1 << COM01)|(0 << COM00)|(1 << WGM01)|(1 << CS02)|(0 << CS01)|(0 << CS00);

/* valor de comparacion inicial */
OCR0 = 0;

TIMSK = (1 << TOIE0);
sei();

for (;;)

return (0);
}


RS232.c (Envía y recibe caracteres por polling)

#include <avr/io.h>
#include <avr/boot.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr\sfr_defs.h>

#define FOSC 1000000 // clock en Hz

/* prototipos de funcion */
void bucle (void);
void uart_enviar(unsigned char *, unsigned char);
unsigned char uart_recibir(void);

/* variables globales */
unsigned int cuenta;


int main (void)
{

UBRRH=0x00;
UBRRL=0x0C; //Baud rate = 4800
UCSRA=0x00;

UCSRB=0x18; //TXEN=1 y RXEN=1 (Habilitacion Transmision y Recepcion)

UCSRC=0x86; //1 bit Stop. 8 bits por Caracter

bucle();
}

void uart_enviar (unsigned char *dato, unsigned char cant_dato)
{
unsigned char i;

for(i = 0; i < cant_dato; i++)
{
UDR = *(dato+i);
while(!(UCSRA & (1<<TXC)));
UCSRA=0x40;
}

}


unsigned char uart_recibir(void)
{

while( !( UCSRA & ( 1 << RXC) ) );

return UDR;
}


void bucle(void)
{
unsigned char rx;
unsigned char *cadena = "Tx y Rx Test\n";

cuenta = 0;

while(1)
{
rx = uart_recibir();

uart_enviar(cadena, strlen(cadena) );
}
}

No hay comentarios.: