TipsC

4
Tips para programación en C Al igual que todo programa en C, el mismo consiste de una función principal llamada main() y antes de ésta, se deben agregar las librerías específicas para cada función utilizada. La librería donde están las definiciones del micro AVR que se va a utilizar es io.h por lo que debe colocarse siempre: #include<avr/io.h> Las librerías que trae el compilador se pueden colocar entre signos < > o entre comillas dobles “ ”. No es así con librerías creadas por el usuario, que sólo admiten comillas dobles. Dentro de las librerías que trae el compilador, podemos mencionar: <ctype.h>: funciones de operaciones con caracteres <math.h>: funciones matemáticas <stdint.h>: tipos enteros estándar <stdlib.h>: Utilidades generales <string.h>: funciones de manejo de cadenas de caracteres Específicas de AVR <avr/interrupt.h>: manejo de interrupciones <avr/io.h>: definiciones específicas del dispositivo AVR <avr/power.h>:manejo de reducción de energía <avr/wdt.h>: manejo del timer Watchdog <util/crc16.h>: cálculo de CRC <util/delay.h>: funciones para lazos de retardobusy-wait <util/parity.h>: generación de bit de paridad <util/setbaud.h>: macros de ayuda para cálculos de baud rate entre otras. Nota: Tener en cuenta que no todas las funciones de librerías del estándar ANSI tienen su correspondencia con librerías WIN-GCC. Para una mejor implementación de programas y uso de funciones genéricas, se aconseja leer el manual avr-libc-user-manual del compilador que se encuentra en el C:\WINAVR- xxxxxxxx\doc\avr-libc\.

description

f

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.