Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Programacion en C
Programacion en C
//*****************************************************************************
//
// Titulo
:
// Autor
:
// Fecha
: 2007-03-29
// Version
: 1.0
// Target MCU
: Atmel AVR series
//
//
//*****************************************************************************
// ------------------------------------------------------------------------------------------------------------//************************* Inclusin de Libreras *******************************
// ------------------------------------------------------------------------------------------------------------#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 *******************
// -------------------------------------------------------------------------------------------------------------
} //Fin while
return 0;
}
// __________________________________________________________________________
WinAVR dispone de una serie de libreras que pueden incluirse dentro del programa de la cual se
dispone la respectiva documentacin, algunas son del estndar C y otras propias del WinAVR.
Como ejemplo
Variables Globales:
Las variables comunes, slo son accesibles desde la funcin 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 funcin main().
Ej.
Volatile int var_1, var_2;
Es aconsejable aunque no obligatorio definir las variables globales como volactiles para indicarle al
compilador que no sobreescriba sobre esta posicin de memoria.
Definiciones y Macros:
Mediante ciertas directivas se puede asignar a algn smbolo definido por el programador una
determinada expresin.
Ejemplos:
#define
s1
#define
larger( x, y)
#define
_BV(bit)
(1 << (bit))
#define
set_bit(value, bit)
(value=((value) | _BV(bit)))
Rutinas de Interrupcin:
Son funciones cuyo cuerpo definen lo que se debe ejecutar en el momento que se presente una
determinada interrupcin.
Ej.
ISR(TIMER0_OVF_vect)
{
PORTA=PORTA ^ 0x02;
}
No es necesario hacer un salto explcito a esta funcin, ni ejecutar alguna instruccin de retorno.
El nombre de los diferentes vectores de interrupcin se definen en la librera <avr/io.h>.
/* External Interrupt Request 0 */
INT0_vect
/* External Interrupt Request 1 */
INT1_vect
/* External Interrupt Request 2 */
INT2_vect
/* Timer/Counter0 Overflow */
TIMER0_OVF_vect
/* Timer/Counter0 Compare Match */
TIMER0_COMP_vect
/* Timer/Counter1 Overflow */
TIMER1_OVF_vect
/* Timer/Counter1 Capture Event */
TIMER1_CAPT_vect
/* Timer/Counter1 Compare Match A */
TIMER1_COMPA_vect
/* Timer/Counter1 Compare Match B */
TIMER1_COMPB_vect
/* Timer/Counter2 Overflow */
TIMER2_OVF_vect
/* Timer/Counter2 Compare Match */
TIMER2_COMP_vect
Declaracin de Funciones:
En este campo debe colocarse la declaracin de las funciones a emplear con el prototipo de la funcin.
Ej.
int mi_funcion(int var1, int var2, float var3);
Declaracin de Variables:
Las variables que se definan aqu tienen un mbito local, no son accesibles desde las funciones.
Inicializacin de Registros:
Se establecen los valores de los registros de propsito especfico 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.
#define TCNT1 _SFR_IO16(0x2C)
#define TCNT1L _SFR_IO8(0x2C)
#define TCNT1H _SFR_IO8(0x2D)
Habilitacin de Interrupciones:
Habilitacin de los diferentes bits de interrupcin
Ej.
TIMSK=(1<<TOIE0);
sei(); //Habilitacin del bit de interrupcin global.
INTRODUCCIN AL LENGUAJE C
PARA EL COMPILADOR WINAVR
uint8_t
uint16_t
uint32_t
uint64_t
Operadores
Operador condicional
expresson1 ? expression2 : expression3
Si expresin1 es verdadera entonces se usa la expresion2, de lo contrario la expresin3.
(x)>(y) ? (x) : (y)
Ejercicios
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 sla sentecia entre un para de llaves, no es obligacin 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;
while ( i < 128)
{
PORTB = 2*i;
i++;
}
(b)
x=100;
y=0;
x=100;
y=0;
do
{
y= ?
y= ?
y= 2*x;
x++;
} while ( x < 50);
For
for(i=0;i<=10;i++)
{
Var=2*i-1;
}
Break y Continue
Estas instrucciones permiten interrumpir una instruccin cclica. En el caso de la instruccin break,
sta hace que el bucle ms interno que la contenga finalice inmediatamente sin tener en cuenta la
condicin. La instruccin continue por su parte, finaliza la iteracin actual sin salir del ciclo.
Ejemplo:
PUERTOS DE E/S
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);
PORTB |= (1<<PB4) | (1<<PB5);
(1 << (bit))
//Escala 1024
//Inicializa el temporizador
//Escala 64
//Inicializa el temporizador
//Escala 1024
//Inicializa el temporizador
TIMSK= (1<<TOIE0);
ISR(TIMER1_OVF_vect)
{
TCNT1=T1_INI;
frac++;
if(frac>=10)
{
segundos++;
frac=0;
PORTA=PORTA ^(1<<2);
}
}
TIMSK= (1<<TOIE1);
ISR(TIMER2_OVF_vect)
{
TCNT2=T2_INI;
frac++;
if(frac>=10)
{
segundos++;
frac=0;
PORTA=PORTA ^(1<<2);
}
}
TIMSK= (1<<TOIE2);