Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Se presenta una plantilla genérica para un programa escrito para el compilador C de WinAVR
//*****************************************************************************
//
// Titulo :
// Autor :
// Fecha : 2007-03-29
// Version : 1.0
// Target MCU : Atmel AVR series
//
//
//*****************************************************************************
// -------------------------------------------------------------------------------------------------------------
//************************* Inclusión de Librerías *******************************
// -------------------------------------------------------------------------------------------------------------
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <inttypes.h>
#include "lcd_lib.h"
// -------------------------------------------------------------------------------------------------------------
//*********************** Definiciones de Variables Globales *******************
// -------------------------------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------------------------
// ************************* Definiciones y Macros *****************************
// -------------------------------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------------------------
// ************************ Rutinas de Interrupción ****************************
// -------------------------------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------------------------
// ************************* Declaración de Funciones **************************
// -------------------------------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------------------------
// **************************** Cuerpo del Programa ****************************
// -------------------------------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------------------------
// ********************** DECLARACIÓN DE VARIABLES **********************
// -------------------------------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------------------------
// ************** CONFIGURACIÓN DE LOS PUERTOS DE E/S *******************
// -------------------------------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------------------------
// ********************* INICIALIZACIÓN DE REGISTROS **********************
// -------------------------------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------------------------
// ****************** HABILITACIÓN DE INTERRUPCIONES ********************
// -------------------------------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------------------------
// ************** INICIALIZACIÓN DE FUNCIONES Y VARIABLES ***************
// -------------------------------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------------------------
// ******************** CICLO PRINCIPAL DE EJECUCIÓN **********************
// -------------------------------------------------------------------------------------------------------------
while (1)
{
} //Fin while
return 0;
}
// -------------------------------------------------------------------------------------------------------------
//********************* DEFINICIÓN DE FUNCIONES **************************
// -------------------------------------------------------------------------------------------------------------
// __________________________________________________________________________
WinAVR dispone de una serie de librerías que pueden incluirse dentro del programa de la cual se
dispone la respectiva documentación, algunas son del estándar C y otras propias del WinAVR.
Como ejemplo
Variables Globales:
Las variables comunes, sólo son accesibles desde la función donde se encuentra definida, si se requiere
que la variable sea accesible desde cualquier parte del programa, es necesario declararla como global.
Para esto simplemente se define antes de la función main().
Ej.
Es aconsejable aunque no obligatorio definir las variables globales como volactiles para indicarle al
compilador que no sobreescriba sobre esta posición de memoria.
Definiciones y Macros:
Mediante ciertas directivas se puede asignar a algún símbolo definido por el programador una
determinada expresión.
Ejemplos:
#define s1 2
Rutinas de Interrupción:
Son funciones cuyo cuerpo definen lo que se debe ejecutar en el momento que se presente una
determinada interrupción.
Ej.
ISR(TIMER0_OVF_vect)
{
PORTA=PORTA ^ 0x02;
No es necesario hacer un salto explícito a esta función, ni ejecutar alguna instrucción de retorno.
/* Timer/Counter0 Overflow */
TIMER0_OVF_vect
/* Timer/Counter1 Overflow */
TIMER1_OVF_vect
/* Timer/Counter2 Overflow */
TIMER2_OVF_vect
/* USART, Rx Complete */
USART_RXC_vect
/* USART, Tx Complete */
USART_TXC_vect
/* EEPROM Ready */
EE_RDY_vect
/* Analog Comparator */
ANA_COMP_vect
Declaración de Funciones:
En este campo debe colocarse la declaración de las funciones a emplear con el prototipo de la función.
Ej.
Inicialización de Registros:
Se establecen los valores de los registros de propósito específico de acuerdo con las configuraciones de
los diferentes recursos.
TCNT1=0xA2B7;
En el archivo cabecera de cada dispositivo se tienen asignados los nombres de los registros.
Habilitación de Interrupciones:
Habilitación de los diferentes bits de interrupción
Ej.
TIMSK=(1<<TOIE0);
Ej.
LCDinit();
INTRODUCCIÓN AL LENGUAJE C
PARA EL COMPILADOR WINAVR
Enteros: El Ansi C implementa los tipos int y long int, para datos enteros de 16 y 32 bits.
Int8_t uint8_t
Int16_t uint16_t
Int32_t uint32_t
Int64_t uint64_t
(a) 5 / 2 + 20 % 6
(b) 4 * 6 / 2 - 15 / 2
(c) 5 * 15 / 2 / (4 - 2)
(d) 8 = = 16 || 7 != 4 && 4 < 1
(e) (4 * 3 < 6 || 3 > 5 - 2) && 3 + 2 < 12
Estructuras de Control
If - Else
if (expression1)
{
-------;
..-------;
} else if (expression2)
{
--------;
--------;
} else if (expression3)
{
---------;
---------;
}else
{
---------;
---------;
}
Ejemplo:
If (opcion= = 1)
{
Y=A+B;
}else if (opcion= =2)
{
Y=A-B;
} else if (opcion= =3)
{
Y= A*B;
}else
{
Y=A/B;
}
Cuando se tiene una sóla sentecia entre un para de llaves, no es obligación colocar éstas.
If (opcion= = 1)
Y=A+B;
else if (opcion= =2)
Y=A-B;
else if (opcion= =3)
Y= A*B;
else
Y=A/B;
Switch
switch (expression)
{
case constant expression1:
-----------;
-----------;
Break;
case constant expression2:
-----------;
-----------;
Break;
default constant expression2:
-----------;
-----------;
Break;
}
Ejemplo:
switch (opcion)
{
case 1:
Y=A+B;
Break;
case 2:
Y=A-B;
Break;
case 3:
Y=A*B;
Break;
default 3:
Y=A/B;
Break;
}
While
while(expression)
{
---------;
---------;
}
do - While
do
{
------------;
..------------;
} while(expression);
Ejemplo;
(a) (b)
x=100; x=100;
y=0; y=0;
y= ¿? y= ¿?
For
for(i=0;i<=10;i++)
{
Var=2*i-1;
}
Break y Continue
Estas instrucciones permiten interrumpir una instrucción cíclica. En el caso de la instrucción break,
ésta hace que el bucle más interno que la contenga finalice inmediatamente sin tener en cuenta la
condición. La instrucción continue por su parte, finaliza la iteración actual sin salir del ciclo.
Ejemplo:
for (i=0; i<100;i++)
{
if(i==10)
continue;
PUERTOS DE E/S
DDRx
Para configurar la dirección del puerto.
1 configura como salida
0 Configura como entrada
PORTx
Se emplea para enviar información por el puerto.
En caso que un determinado pin se configure como entrada, y por medio del registro PORTx se
coloque en 1, se habilita la correspondiente resistencia de pull-up.
Se recomienda que los pines que no se utilicen se les habiliten esta resistencia.
PINx
Lee el estado del puerto x
Ej.
DDRB = 0x1F;
DDRB = (1 << DDB0) | (1 << DDB1) | (1 << DDB2) | (1 << DDB3) | (1 << DDB4);
PORTB = 0x04;
PORTB = PORTB | 0x04;
PORTB |= (1<<PB2); Equivalente a la instrucción anterior.
PORTB |= (1<<PB4) | (1<<PB5); Pone los pines 4 y 5 en alto sin alterar los demás.
PORTB &= ~( (1<<PB4) | (1<<PB5) ); Pone los pines 4 y 5 en 0 sin alterar los demás.
OCR0=128;
TCCR0=(1<<WGM01)|(1<<COM00)|(1<<CS01);
//Salida cambia de estado
OCR0=128;
TCCR0=(1<<WGM00)|(1<<COM01)|(1<<CS01);
TCCR1B=(1<<CS11)|(1<<CS10); //Escala 64
TCNT1=T1_INI; //Inicializa el temporizador
OCR1A=256;
TCCR1A=(1<<COM1A0); //Salida cambia de estado
TCCR1B=(1<<WGM12)|(1<<CS11); //Escala 8 cambio cada 256us (OCR1A)
Timer 1 como PWM fase correcta de 10 bits
OCR1A=256;
TCCR1A=(1<<WGM11)|(1<<WGM10)|(1<<COM1A1)|(1<<COM1B1);
OCR2=128;
TCCR2=(1<<WGM21)|(1<<COM20)|(1<<CS21); //Salida cambia de estado
OCR2=128;
TCCR2=(1<<WGM20)|(1<<COM21)|(1<<CS21); //Salida cambia de estado
TCCR2=(1<<CS22)|(1<<CS20);
ASSR=(1<<AS2);
EJEMPLO DE INICIALIZACIÓN DE INTERRUPCIONES
ISR(TIMER0_OVF_vect)
{
TCNT0=T0_INI;
frac++;
if(frac>=10)
{
segundos++;
frac=0;
PORTA=PORTA ^(1<<2);
}
}
ISR(TIMER1_OVF_vect)
{
TCNT1=T1_INI;
frac++;
if(frac>=10)
{
segundos++;
frac=0;
PORTA=PORTA ^(1<<2);
}
}
ISR(TIMER2_OVF_vect)
{
TCNT2=T2_INI;
frac++;
if(frac>=10)
{
segundos++;
frac=0;
PORTA=PORTA ^(1<<2);
}
}