Vous êtes sur la page 1sur 4

Tips para programacin en C

Al igual que todo programa en C, el mismo consiste de una funcin principal llamada main() y
antes de sta, se deben agregar las libreras especficas para cada funcin utilizada.
La librera donde estn las definiciones del micro AVR que se va a utilizar es io.h por lo que
debe colocarse siempre:
#include<avr/io.h>
Las libreras que trae el compilador se pueden colocar entre signos < > o entre comillas dobles
. No es as con libreras creadas por el usuario, que slo admiten comillas dobles.
Dentro de las libreras que trae el compilador, podemos mencionar:
<ctype.h>: funciones de operaciones con caracteres
<math.h>: funciones matemticas
<stdint.h>: tipos enteros estndar
<stdlib.h>: Utilidades generales
<string.h>: funciones de manejo de cadenas de caracteres

Especficas de AVR
<avr/interrupt.h>: manejo de interrupciones
<avr/io.h>: definiciones especficas del dispositivo AVR
<avr/power.h>:manejo de reduccin de energa
<avr/wdt.h>: manejo del timer Watchdog
<util/crc16.h>: clculo de CRC
<util/delay.h>: funciones para lazos de retardobusy-wait
<util/parity.h>: generacin de bit de paridad
<util/setbaud.h>: macros de ayuda para clculos de baud rate

entre otras.
Nota:
Tener en cuenta que no todas las funciones de libreras del estndar ANSI tienen su
correspondencia con libreras WIN-GCC.
Para una mejor implementacin de programas y uso de funciones genricas, se aconseja leer
el manual avr-libc-user-manual del compilador que se encuentra en el C:\WINAVRxxxxxxxx\doc\avr-libc\.

Uso de la macro _BV()


Es muy comn que un bit necesite ser puesto a nivel 1 a nivel 0 en algn registro de E/S.
Mientras que la documentacin provee nombres nemotcnicos para varios bits de los registros
de E/S, las definiciones especficas del dispositivo AVR (avr/io.h) reflejan estos nombres en
definiciones como constantes numricas.
Por ejemplo si vemos en las definiciones del registro SPCR en avr/iomx8.h
#define SPCR _SFR_IO8 (0x2C)
/* SPCR */
#define SPIE 7
#define SPE

#define DORD 5
#define MSTR 4
#define CPOL 3
#define CPHA 2
#define SPR1 1
#define SPR0 0

En orden de acceder a un bit particular como un valor de byte, se usa la macro _BV(). La
implementacin de esta macro es justamente el desplazamiento de bits, es decir:
_BV(3) => 1 << 3 => 0x08
Por ejemplo si queremos setear el SPR1 en SPCR, haremos
SPCR |= _BV(SPR1);

==

SPCR |= _BV(1);

Si queremos clarear el SPR1,


SPCR &= ~_BV(SPR1);

donde | (OR lgica)


& (AND lgica)
~ (negado)

Manejo de Interrupciones
Para el manejo de interrupciones se hace uso de la funcin ISR (en versiones anteriores Signal)
includa en <avr/interrupt.h>. Hay funciones particulares:
sei();

//habilita interrupcin global (I)

cli();

//deshabilita interrupcin global (I)

La forma de llamar a la interrupcin es


ISR(vector_de_interrupcion, atributos) { cdigo rutina de interrupcin. }
Donde vector_de_interrupcion puede ser uno de los indicados en la tabla siguiente para el
ATmega168:
Nombre del vector

Descripcin

ADC_vect

ADC Conversion Complete

ANALOG_COMP_vect

Analog Comparator

EE_READY_vect

EEPROM Ready

INT0_vect

External Interrupt 0

INT1_vect

External Interrupt 1

PCINT0_vect

Pin Change Interrupt Request 0

PCINT1_vect

Pin Change Interrupt Request 1

PCINT2_vect

Pin Change Interrupt Request 2

SPI_STC_vect

Serial Transfer Complete

SPM_READY_vect

Store Program Memory Read

TIMER0_COMPA_vect

TimerCounter0 Compare Match A

TIMER0_OVF_vect

Timer/Counter0 Overflow

TIMER1_CAPT_vect

Timer/Counter Capture Event

TIMER1_COMPA_vect

Timer/Counter1 Compare Match A

TIMER1_COMPB_vect

Timer/Counter1 Compare MatchB

TIMER1_OVF_vect

Timer/Counter1 Overflow

TIMER2_COMPA_vect

Timer/Counter2 Compare Match A

TIMER2_COMPB_vect

Timer/Counter2 Compare Match A

TIMER2_OVF_vect

Timer/Counter2 Overflow

USART_RX_vect

USART, Rx Complete

USART_TX_vect

USART, Tx Complete

USART_UDRE_vect

USART Data Register Empty

WDT_vect

Watchdog Timeout Interrupt

Atributos puede tomar uno de los siguientes valores:


ISR_BLOCK: Idntica a una ISR sin atributos especificados. Las interrupciones globales son
inicialmente deshabilitadas por el hardware AVR cuando entran en la rutina de interrupcin,
sin que el compilador modifique el estado.
ISR_NOBLOCK: la rutina de interrupcin corre con I (interrupcin global) inicialmente
habilitado. El flag de habilitacin de interrupcin es activado por el compilador tan pronto
como sea posible para asegurar un retardo mnimo para interrupciones anidadas.
Este mtodo puede usarse para crear ISR anidadas, sin embardo debe tenerse la precaucin de
evitar overflow del stack, o evitar entrar indefinidamente a la ISR para esos casos donde el
hardware AVR no limpia el flag de interrupcin antes de entrar a la ISR.
ISR_NAKED: Aqu el usuario es responsable de la preservacin del estado de la mquina
incluyendo el registro SREG, como en poner al final de la rutina la funcin reti().
ISR_ALIASOF(target_vector): la ISR es enlazada a otra ISR, especificada en target_vector. Esto
es compatible con GCC 4.2 o superior.

Vous aimerez peut-être aussi