TipsC
-
Upload
sergio-zuniga-quispe -
Category
Documents
-
view
212 -
download
0
description
Transcript of TipsC
-
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
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:
: funciones de operaciones con caracteres
: funciones matemticas
: tipos enteros estndar
: Utilidades generales
: funciones de manejo de cadenas de caracteres
Especficas de AVR
: manejo de interrupciones
: definiciones especficas del dispositivo AVR
:manejo de reduccin de energa
: manejo del timer Watchdog
: clculo de CRC
: funciones para lazos de retardobusy-wait : generacin de bit de paridad
: 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:\WINAVR-
xxxxxxxx\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 6
#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 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 . 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.