Professional Documents
Culture Documents
XMEGA
Contenido
XMEGA ................................................................................................................................. 1
typedef, struct, union, enum ................................................................................................... 4
typedef: ............................................................................................................................... 4
Estructuras (struct):............................................................................................................. 5
typedef y struct ............................................................................................................... 6
Uniones (union): ................................................................................................................. 7
Enumeraciones (enum): ...................................................................................................... 8
ATXMEGA ............................................................................................................................ 9
Mdulos XMEGA .............................................................................................................. 9
Nomenclatura de registros: ........................................................................................... 10
Nomenclatura de bits: ................................................................................................... 10
Escribiendo cdigo en C para XMEGA ........................................................................... 11
Registros en los mdulos .............................................................................................. 12
Direccionamiento de mdulos ...................................................................................... 15
Mscaras de bits y mscaras de grupos de bits ............................................................. 16
Mscara de configuracin de grupo de bits .................................................................. 18
Llamadas a funciones y mdulos ................................................................................. 20
Resumen: .......................................................................................................................... 21
IO Pins .................................................................................................................................. 22
Nombre ......................................................................................................................... 22
Configurando direccin (entrada/salida): ..................................................................... 22
Controlando el valor de salida: ..................................................................................... 22
Leyendo el estado lgico de una entrada. ..................................................................... 23
Configuracin de pines ..................................................................................................... 23
Configuracin Output/Pull ........................................................................................... 23
Configuracin de salida ................................................................................................ 23
Configuracin pull ........................................................................................................ 24
Configuracin Input/Sense ........................................................................................... 24
Inversin ....................................................................................................................... 24
Configuracin de interrupciones ...................................................................................... 25
typedef:
Palabra reservada que tiene como funcin asignar un nombre o alias a tipos de datos ya
existentes.
Ejemplo de definicin:
Ejemplo de uso:
Uso de typedef
Aqu OCDR0 es un entero sin signo de ocho bits y que adems tiene el atributo volatile.
Es decir que:
Nota: volatile le dice al compilador que no opt imice nada cuando tenga que
manejar variables de este tipo.
Estructuras (struct):
Las estructuras son tipos de datos derivados - estn construidas utilizando objetos de otros
tipos. Considere la siguiente definicin de estructura:
Definicin de estructura
La palabra reservada struct indica que se est definiendo una estructura. El identificador
ejemplo es el nombre de la estructura. Las variables declaradas dentro de las llaves de la
definicin de estructura son los miembros de la estructura. Los miembros de la misma
estructura deben tener nombres nicos mientras que dos estructuras diferentes pueden tener
miembros con el mismo nombre. Cada definicin de estructura debe terminar con un punto
y coma.
Declaracin de variables
En la declaracin anterior se declara temp1 como variable del tipo ejemplo y temp2
como un array del tipo ejemplo con dimensin 3.
Para tener acceso a los miembros de una estructura utilizaremos el operador punto.
Acceso a miembros
En Atmel Studio veremos las estructuras como en la figura siguiente. Aqu se pueden ver
los valores asignados y la direccin de memoria que fue asignada a la estructura.
typedef y struct
En las declaraciones de las variables ya no se usa la palabra clave struct. El acceso a los
miembros contina hacindose mediante el operador punto.
Uniones (union):
Son un tipo de dato derivado que permite almacenar diferentes tipos de datos en las mismas
posiciones de memoria. Las uniones proporcionan una forma de manipular diferentes clases
de datos dentro de una sola rea de almacenamiento.
Las uniones son declaradas con el mismo formato que las estructuras.
Acceso a variable
Enumeraciones (enum):
Una enumeracin consta de un conjunto de constantes enteras con nombre. Un tipo de dato
enumerado es una manera de asociar nombres a nmeros, y por consiguiente de ofrecer ms
significado a alguien que lea el cdigo. La palabra reservada enum enumera
automticamente cualquier lista de identificadores que se le pase, asignndoles valores de
0, 1, 2, etc.
ATXMEGA
Mdulos XMEGA
Un AVR XMEGA est compuesto de varios bloques bsicos llamados mdulos tipo. Un
XMEGA puede tener una o ms instancias de un tipo de mdulo dado. Todas las instancias
de un tipo de mdulo tienen las mismas caractersticas y funciones.
Un mdulo tipo puede ser un USART, mientras una instancia de este tipo puede ser
USARTC0, donde el sufijo C0 indica que la instancia es el USART 0 en el puerto C.
Cada mdulo tiene una direccin base fija en el mapa de memoria I/O y todos los registros
contenidos en el mdulo tienen direcciones de desplazamiento fijas relativas a direccin
base del mdulo. De esta manera, cada registro no slo tendr una direccin absoluta en el
espacio de memoria, sino tambin una direccin relativa definida por un offset. Los
desplazamientos de las direcciones de registros son iguales para todas las instancias de un
tipo de mdulo, simplificando la tarea de escribir controladores que puedan ser usados para
todos los mdulos de un tipo especfico.
Nomenclatura de registros:
Los registros estn divididos en: Registros de control, registros de estado y registros de
datos. Un registro de control de propsito general del mdulo es llamado CTRL. S existen
mltiples sern llamados CTRLA, CTRLB, CTRLC, etc.
Para registros que tienen una funcin especfica el nombre de estos refleja esta
funcionalidad. Por ejemplo, el registro de control de interrupcin INTCTRL.
Para un registro de 16 bits, el alto (High) y bajo (Low) son accesados agregando una H o
L. Por ejemplo, CNT = CNTL y CNTH. Para registros ms grandes los bytes son
numerados. Por ejemplo CAL. Los cuatro bytes son llamados CAL0, CAL1, CAL2 y CAL3
(desde el menos al ms significativo).
Nomenclatura de bits:
Los bits en los registros pueden tener una funcin individual o ser parte de un grupo de bits
que tienen una funcin conjunta: Un bit individual puede ser un bit que habilita un mdulo,
ej. El USART ENABLE bit. Un grupo de bits puede consistir de dos o ms bits que juntos
seleccionan una configuracin especifica. Los dos bits que controlan el nivel de
interrupcin de recepcin completa del USART, RXINTLVL[1:0], es un ejemplo de un
grupo de bits. Esos dos bits ofrecen las siguientes secciones:
Bits RXINTLVL
Solamente los bits que forman parte de un grupo tendrn como sufijo un nmero.
La siguiente seccin se enfoca en cmo escribir cdigo en C para XMEGA. Los ejemplos
muestran cmo hacer el cdigo altamente legible y portable entre los diferentes dispositivos
XMEGA.
Bloque de mdulos
Para grandes proyectos, las estructuras de los mdulos proporcionan una ventaja, no slo la
legibilidad, sino tambin porque los compiladores pueden reutilizar los driver y por lo tanto
generar un cdigo muy compacto.
El mapa de entradas/salidas est dispuesto de modo tal que todos los registros para un
mdulo perifrico dado se coloquen en un bloque de memoria continua. Los registros
pertenecientes a diferentes mdulos no son mezclados. Esto hace posible organizar todos
los mdulos perifricos en estructuras, donde la direccin de la estructura define la
direccin base del mdulo. Todos los registros pertenecientes a un mdulo son elementos
de la estructura del mdulo.
Declaracin de mdulo
Uso de la estructura
Algunos registros son usados conjuntamente con otros registros para representar valores de
16 y 32 bits. Como ejemplo de esto es la declaracin de la estructura ADC de la siguiente
figura.
En la figura anterior, los registros de resultado de cada canal CH0RES, CH1RES, CH2RES,
CH3RES, y el registro de comparacin CMP, son valores de 16 bits. Ellos son declarados
usando la macro _WORDREGISTER la cual es mostrada en la siguiente figura.
Macro _WORDREGISTER
Como se ha visto, la macro WORDREGISTER usa los sufijos H y L para para los bytes
altos y bajos respectivamente. La macro usa nmeros como sufijos para indicar el orden de
los bytes. Tanto los registros de 16 como los de 32 bits pueden ser accesados en modo
16/32 bits sin usar el sufijo como se muestra en la siguiente figura.
Macro _DWORDREGISTER
Direccionamiento de mdulos
Las definiciones de todos los mdulos perifricos son encontradas en el archivo cabecera
del dispositivo. La direccin para el mdulo es especificada en ANSI C para tener
compatibilidad con muchos de los compiladores disponibles. En la siguiente figura se
muestra las definiciones de los ADC para los puertos A y B. Aqu se puede ver como las
instancias de los mdulos son desreferenciados a una direccin absoluta en la memoria, la
cual coincide con la direccin base de la instancia del mdulo. Los punteros al mdulo son
predefinidos en los archivos cabecera de cada XMEGA, por lo tanto, ya no es necesario
agregar estas definiciones a nuestro cdigo.
Los bits en los registros pueden ser manipulados usando mscaras predefinidas, o
alternativamente la posicin de los bits. No se recomienda usar la posicin de los bits. Las
mscaras de bits predefinidas estn relacionadas a bits individuales, denominados mscara
de bits o grupo de bits.
Una mscara de bit es usada tanto cuando se setea o limpia un bit. Una mscara de grupo es
principalmente usada cuando limpiamos mltiples bits en un grupo.
Considere el registro de control del Timer D, CTRLD. Los grupos de bit, los nombres de
bit, las posiciones de los bits y las mscaras de bit de este registro se pueden ver en la
siguiente tabla.
Grupos de bit, nombres de bit, posiciones y mscaras de bit para los bits del registro CTRLD.
Ya que el nombre de los bits necesita ser nico para que el compilador pueda manejarlos,
todos los bits estn prefijados con el nombre del mdulo al cual pertenecen. En muchos
casos, el nombre del tipo del mdulo esta abreviado. Para todas las definiciones de bits
relacionadas con los mdulos Timer/Counter, los nombres de los bits tienen un prefijo
TC_.
Para diferenciar entre las mscaras de bit y las posiciones de los bits se agrega un sufijo.
Para una mscara de bit, el sufijo es _bm. El nombre de la mscara de bit para el bit
EVDLY es TC_EVDLY_bm. El cdigo mostrado en la siguiente figura usa una mscara de
bit. El bit EVDLY en el registro CTRLD del Timer/Counter D0 es seteado sin alterar los
otros bits del registro.
Muchas funciones son controladas por un grupo de bits. Los bits EVACT[2:0] y
EVSEL[3:0] son grupos de bits en el registro CTRLD del Timer/Counter. Los valores de
esos bits seleccionan una configuracin especfica.
Cuando cambiamos bits en un grupo de bits, a menudo se requiere limpiar el grupo de bits
antes de asignar un nuevo valor. Para decirlo de otro modo: No es suficiente con setear los
bits que deben ser seteados, tambin se requiere limpiar los bits que deben ser limpiados.
Para que esto sea fcil se definen las mscaras de grupos de bits. Las mscaras de grupo
usan el mismo nombre como los bits en el grupo de bits y un sufijo _gm.
El cdigo de la siguiente figura muestra como la mscara de grupo se relaciona con las
mscaras de bit. En realidad, los valores de mscara de grupo son precalculados en los
archivos cabecera, entonces el compilador no necesita calcular la misma constante una y
otra vez.
La mscara de grupo de bits esta principalmente destinada para borrar una configuracin
antigua antes de escribir la nueva. En el cdigo de la siguiente figura se muestra cmo
hacerlo. El cdigo limpia el grupo de bits EVACT en el registro CTRLD del Timer/Counter
D0.
A menudo se requiere consultar la hoja de datos para investigar cul patrn de bits necesita
ser usado cuando seteamos un grupo de bits para una configuracin especifica. Esto
tambin se aplica a las lecturas o depuracin del cdigo. Para incrementar la legibilidad y
minimizar la probabilidad de setear bits incorrectamente, es que se encuentran disponibles
las mscaras de configuracin de grupo.
Inspeccionando la figura anterior podemos ver que esta es usada para seleccionar una
configuracin para los bits RXCINTLVL en el mdulo USART. Este grupo selecciona un
nivel de interrupcin alto (HI).
El grupo de bits para los niveles de interrupcin por recepcin completa est compuesto de
dos bits, RXINTLVL[1:0]. La siguiente tabla muestra las configuraciones disponibles para
este grupo. Los nombres de las configuraciones son OFF, LO, MED y HI. Estos
nombres hacen ms fcil la escritura y el mantenimiento del cdigo.
Para cambiar un grupo de bits a una configuracin nueva, el grupo de bits de configuracin
(_gc) es tpicamente usado junto con la mscara de grupo de bits (_gm), esto con el fin de
asegurarse que la configuracin vieja sea borrada primero. En la siguiente figura se aprecia
un ejemplo de esto. Aqu se limpian los bits de nivel se interrupcin para luego seleccionar
un nuevo nivel (nivel medio).
A diferencia de las mscaras de bit (_bm) y mscaras de grupo (_gm), las mscaras de
configuracin de grupo son definidas usando enumeradores. Un enumerador es definido
para cada grupo de bits. El enumerador para el grupo USART RXCINTLVL es mostrado
en la siguiente figura.
Cuando escribimos drivers para un mdulo tipo que tiene mltiples instancias, el hecho de
que todas las instancias tenga el mismo mapa de memoria puede utilizarse para hacer que el
driver sea reutilizable para todas las instancias del mismo mdulo. Si el driver toma un
argumento tipo puntero, apuntando a la instancia del mdulo, el driver se puede utilizar
para todos los mdulos de este tipo.
La funcin para inicializar y acceder a los mdulos Timer/Counter puede ser compartida
por todas las instancias del mdulo. Aunque hay una pequea sobre carga en pasar el
puntero del mdulo a las funciones, el tamao total del cdigo a menudo se reducir ya que
el cdigo es reusado para todas las instancias de cada mdulo. Incluso ms importantes, el
tiempo de desarrollo, el costo de mantenimiento, y la portabilidad pueden ser mejoradas
usando este enfoque.
El cdigo de la siguiente figura muestra una funcin que usa un puntero a un mdulo para
seleccionar una fuente de clock para cualquier Timer/Counter.
La funcin anterior toma dos argumentos: un puntero a mdulo de tipo TC0_t, y un grupo
de configuracin de tipo TC_CLKSEL_t. El cdigo en la funcin usa el puntero al mdulo
Timer/Counter para acceder al registro CTRLA y setear el nuevo clock.
El cdigo de la siguiente figura muestra como la funcin puede ser usada para configurar
diferentes mdulos Timer/Counter con diferentes fuentes de clock.
Resumen:
IO Pins
Nombre
PORTx. Ej: PORTA, PORTB, PORTC etc.
Ejemplos:
Ejemplos:
Declaracin de variable.
Pin 2 como entrada.
Lectura de estado de todos lo pines.
Filtrada para el pin 2.
Configuracin de pines
Cada pin IO tiene su propio registro - PINnCTRL.
Configuracin Output/Pull
Los bits configuracin output/pull son usados para configurar el comportamiento del driver
de salida y la configuracin pull. La siguiente tabla muestra una descripcin de las posibles
configuraciones.
Configuracin output/pull
Configuracin de salida
En la configuracin Totempole, la salida es conducida a VCC o GND segn lo
ordenado por el bit correspondiente en el registro OUT.
En la configuracin Wired-OR, la escritura de un 1 a OUTn hace que el pin n
sea conducido a VCC. Escribir un 0 en OUTn libera el pin, permitiendo al pin ser
pulleado a GND con una resistencia pull-down interna o externa.
Configuracin pull
La configuracin Buskeeper de entrada y salida provee de un retenedor dbil del
bus que mantendr el pin al mismo nivel lgico cuando el pin no es conducido a
ningn nivel lgico.
La configuracin Pull-down habilita la resistencia pull-down para un determinado
pin.
La configuracin Pull-up habilita la resistencia pull-up para un determinado pin.
Configuracin Input/Sense
Es usada para detectar un flanco o nivel en el pin de entrada. Estn disponibles cuatro
configuraciones. Se pueden detectar flancos de subida, de bajada, ambos flancos o un nivel
bajo. Tener en cuenta que el nivel alto tambin se puede detectar invirtiendo la seal en el
registro de configuracin PINnCTRL.
Configuraciones de entrada
Inversin
Seteando el bit Inverted IO-INVEN se habilita la inversin de datos tanto en entrada y
salida.
Configuracin de interrupciones
Cada puerto tiene dos interrupciones. Es posible disparar cada interrupcin por una
arbitraria combinacin de los pines del puerto.
Event System
Sistema que permite la comunicacin directa entre perifricos. Gracias a este sistema los
perifricos pueden enviar, recibir y reaccionar a eventos generados por otros perifricos.
Ejemplo: Configurando el pin para censar el nivel bajo se puede transmitir el estado del pin
como fuente de evento. El estado de un pin que es configurado como entrada puede ser
reflejado en otro pin que es salida (pin7 o pin4).
El registro CLKEVOUT en PORTCFG debe ser configurado para que sea una salida de
eventos - anteriormente fue salida de reloj.
El canal cero del sistema de eventos debe ser configurado para llevar el estado del pin de
entrada hacia el pin de salida.
Los XMEGA tienen un sistema de reloj muy flexible el cual soporta mltiples fuentes de
reloj. Este sistema incorpora dos precisos osciladores internos, soporte para cristales y
resonadores externos. Un PLL y prescalers pueden ser usados para generar un amplio rango
de frecuencias. Tambin se incorpora un DFLL que permite una calibracin automtica de
los osciladores internos.
Sistema de reloj
Prescaler A,B y C
Dividen la fuente de reloj seleccionada por mltiples factores. Estos prescaler son seteado
en registro PSCTRL. Este registro se encuentra protegido por un mecanismo de configuracin
de cambios el cual debe ser activado antes de realizar los cambios.
Valores prescaler A
Valores prescaler B y C
Seteo de prescalers
RC2MHz
Oscilador habilitado por defecto. Puede ser fuente del PLL y en caso de ser necesario puede
ser calibrado usando el DFLL.
En la siguiente figura se muestra el uso del PLL tomando como entrada el RC interno de
2MHz. La frecuencia de 2MHz es multiplicada por 2 (puede ser desde x1 hasta x16).
PLL y RC 2MHz
RC32MHz
Para usar este oscilador primero debe ser habilitado y seleccionado como fuente de reloj.
Tambin puede ser auto-calibrado usando el DFLL. Se debe tener en cuenta que cuando es
usado como fuente para el PLL es dividido por 4 antes de llegar al PLL.
Configuracin de RC32MHz
Timer/Counter 0&1
Caractersticas: Timer/Counter de 16 bits. Se pueden unir dos para formar uno de 32 bits.
Timer/Counter 0 tiene cuatro canales de comparacin y 2 el Timer/Counter 1. Generacin
de interrupciones y eventos. Puede ser usado con el sistema de eventos con para el
decodificador de cuadratura. Puede disparar transacciones del DMA.
Definiciones importantes:
Nombre Descripcin
BOTTOM Cuando el contador llega a 0x0000
MAX Cuando el contador llega a 0xFFFF
Cuando el contador llega al valor de PER o CCA. Esto en el caso de usar
TOP
el modo waveform
UPDATE Cuando se alcanza BOTTOM o TOP dependiendo del modo waveform
Diagrama de bloques
Las fuentes de clock que alimentarn el timer ya se encuentran disponibles y esperando ser
seleccionadas.
FCPU N
ftimer Tpulso
N FCPU
Configuracin
Interrupcin overflow
Ejemplo de uso del timer para contar eventos del sistema. Los eventos son
generados por el Pin5.
FCPU
fCCA
2* N *(CCA 1)
FCPU
CCA 1
2* N * fCCA
2000000
CCA 1
2*4*333
Configuracin
Configuracin
Interrupcin CCAIF
Habilitacin de salida
Ejemplo para una seal de 800Hz. CCA mostrar de duty cicle y CCB .
2000000
PER 1
4*800
Seales de salida A y B
Ejemplo para una seal de 800Hz. CCA mostrar de duty cicle y CCB .
2000000
PER
2*4*800
Seales de salida A y B
Input Capture
Configuracin de evento
Configuracin de timer
Captura y conversin
Captura de pulso
Configuracin de evento
Configuracin de timer
Captura y conversin
En el siguiente ejemplo se genera una seal de 1Hz por PC0 (se usa el timer C0), y
el ancho del pulso (500mSeg) es medido por el timer C1.
Captura de frecuencia
En el siguiente ejemplo se genera una seal de 5Hz por PC0 (se usa el timer C0), y
esta frecuencia es medida por el timer C1 mediante PC1.
Captura y conversin
USART
Configuracin de usart
Encoder
Lectura de datos
DMAC
Caractersticas:
Transaccin DMA
Es una operacin completa de lectura y escritura entre memorias y/o perifricos. Una
transaccin es hecha en bloques de datos, y el tamao de la transaccin (nmero de bytes a
transferir) es seleccionado desde el software y controlado por el tamao del bloque y la
configuracin del contador de repeticin.
Transferencia de rfaga
Ya que el DMA usa el mismo bus de datos que el CPU, una transferencia en bloque se
divide en pequeas rfagas de 1, 2, 4 u 8 bytes. Esto significa que el DMA ocupar el bus
hasta que todos los bytes en la rfaga sean transferidos.
Transaccin DMA
Transferencia Memoria-Memoria
En el siguiente ejemplo se transfiere un grupo de datos almacenados en tx hacia rx.
Declaracin de variables
Al iniciar la transaccin
Al finalizar la transaccin
ADC
Single-ended Input
Todos los pines pueden ser usados como entrada.
El resultado puede ser con sin signo.
VINP (V )
RES *(4096)
VREF
Obtencin y conversin
Resultado de la conversin
VINP
RES *(4096)
VREF
Conversin de resultado
Resultado de la conversin
Configuracin de ADC
Resultados de la conversin
Ejemplo del uso del modo diferencial. La entrada positiva es PB0 el negativo es
PA3.
Resultados de la conversin
Ejemplo del uso del modo diferencial con ganancia (x2). La entrada positiva es PA4
el negativo es PA5.
Resultados de la conversin
Transferencia Perifrico-Memoria
ADC Memoria
En el siguiente ejemplo se toma 100 muestras del CH0 del ADC. Estas muestras son
tomadas cada 10ms y son disparadas mediante por un timer mediante un canal de
eventos que lleva e evento overflow. El fin de cada conversin del ADC dispara una
transferencia del DMA hacia un espacio de memoria.
Resultados de la conversin
DAC
CHnDATA
VDACn VREF
4095
En el siguiente ejemplo se muestra el uso conjunto del ADC, DAC, Timer, Evento
del sistema y el DMA. El timer, mediante un canal de eventos, dispara una
conversin del ADC (CH0 pin0), el fin de conversin dispara la transferencia del
DMA desde el ADC hacia el DAC.
Los coeficientes estan calculados para una frecuencia de muestreo de 1000Hz y una
frecuencia de corte de 190Hz.
Las muestras del ADC son tomadas en cada interrupcin de un timer, en la misma
interrupcin es calculada la salida del filtro y puesta en el DAC.
Seales en el osciloscopio
En el siguiente ejemplo se usa el filtro RC pasa baja para generar una seal senoidal.
f PWM
La frecuencia de la seal es: fsin
# Puntos
Seal filtrada