En este tutorial de como utilizar el microcontrolador ATmega16 voy a utilizar el lenguaje ensamblador (assembler) ya que considero a este como el más óptimo para aprender a programarlos, además ayuda a entender con mayor facilidad sus recursos.
También utilizaré el lenguaje C debido a que la gran cantidad de ejemplos referenciales que podemos encontrar y que una vez aprendido nos ayuda significativamente a realizar proyectos de mayor complejidad.
Las características del uC ATmega16:
- CPU de 131 instrucciones.
- 32 registros de propósito general (cada uno de 8 bits)
- Memoria de programa flash de 16KBytes
- Memoria SRAM de 1KByte
- 32 líneas de entrada/salida
- 3 timers (se puede generar hasta 4 PWM)
- ADC de 10 bits
- Comparador Analógico
- Comunicación serial USART, SPI, TWI
- Timer Watchdog
- Contador de tiempo real
Registros Trabajo:
Existen 32 registros de trabajo, los 16 primeros registros (R0 – R15) solo aceptan ciertas instrucciones en lenguaje ensamblador mientras que los últimos 16 registros las aceptan todas.
Para explicar esto con más detalle voy a hacer referencia al AVR Instruction Set.
La nomenclatura que se encuentra es la siguiente:
- Rd: Registro destino
- Rr: Registro fuente
- R: Resultado después de la ejecución de una instrucción.
- K: Dato constante
- k: Dirección constante
- b: Bit en un registro de propósito general o en un registro Entrada/Salida
- s: Bit en el registro de estado (SREG)
- A: Dirección de un registro Entrada/Salida
- q: Desplazamiento para direccionamiento directo
SREG:
- I: Habilitación global de interrupciones
- T: Copiar bits
- H: Acarreo auxiliar
- S: Signo
- V: Desbordamiento
- N: Negación
- Z: Cero
- C: Acarreo principal
Para poder programar en lenguaje ensamblador debemos entender a profundidad cómo funcionan las instrucciones, por ejemplo tenemos la instrucción ADD:
En la parte de “Operands” nos dice que los registros destino que participan son los 32 y los registros fuente que participan son los 32, también podemos ver que las banderas que cambian en el SREG son H,S,V,N,Z,C
Otra parte importante a tener en cuenta en la programación es que podemos formar 3 registros (X, Y, Z) de 16 bits de la siguiente manera:
R26 : R27 = X
R28 : R29 = Y
R30 : R31 = Z