E/S extendida ATmega128

Esta es la primera vez que trabajo con un microcontrolador "más grande", ATmega128. Hasta ahora he trabajado con ATmega328, ATmega8, etc.

Al leer la hoja de datos, no entendí un par de puntos

  • Ese conjunto de instrucciones AVR puede admitir un máximo de 64 ubicaciones de E/S. ¿Porqué es eso? ¿El conjunto de instrucciones AVR acepta 6 bits para una ubicación de E/S?

  • Para acomodar las E/S extendidas en ATmega128 (160 adicionales), estas 160 ubicaciones se han asignado a la SRAM interna justo después de las 64 existentes. De hecho, de la SRAM de 4 KB que proporciona ATmega128, estas ubicaciones de E/S extendidas ocupan 160. ¿Qué sucede si el conjunto de fusibles de compatibilidad ATmega103 (programado por defecto)? Entonces, ¿tengo acceso a estas 160 ubicaciones?

  • ¿Cómo accedo exactamente a estas ubicaciones extendidas? La hoja de datos solicita usar LD/LDS/LDD y ST/STS/STD. Cualquier ejemplo de esto, ya que nunca antes había usado el ensamblaje. Estoy un poco confundido sobre cómo se integraría esto en mi flujo de trabajo de código C. Digamos que necesito acceder a DDRF y PORTF. ¿Necesitaría saber su dirección (en SRAM) por adelantado o hay alguna macro en avr-gcc?

¡Cualquier muestra de código o enlace para leer y comprender arriba sería genial!

Respuestas (1)

Ese conjunto de instrucciones AVR puede admitir un máximo de 64 ubicaciones de E/S. ¿Porqué es eso? ¿El conjunto de instrucciones AVR acepta 6 bits para una ubicación de E/S?

La mayoría de las instrucciones AVR ponen sus argumentos como parte del código de la máquina . IN, OUT, SBIy CBIno tienen más de 6 bits disponibles para argumentos.

Para acomodar las E/S extendidas en ATMega128 (160 adicionales), estas 160 ubicaciones se han asignado a la SRAM interna justo después de las 64 existentes. Entonces, en efecto, de la SRAM de 4 KB que proporciona ATMega128, estas ubicaciones de E/S extendidas ocupan 160.

Incorrecto. Todos los 4kiB están disponibles, 160 direcciones más arriba.

¿Qué sucede si el juego de fusibles de compatibilidad ATMega103 (programado por defecto)? Entonces, ¿tengo acceso a estas 160 ubicaciones?

No. Pierde los 160 registros extendidos (y la SRAM retrocede para llenarlos) más los últimos 96 bytes de SRAM.

¿Cómo accedo exactamente a estas ubicaciones extendidas?

Con instrucciones normales de acceso a la memoria.

La hoja de datos solicita usar LD/LDS/LDD y ST/STS/STD. Cualquier ejemplo de esto, ya que nunca antes había usado el ensamblaje.

LDS R1, $61
ORI R1, $08
STS R1, $61
LDS R1, $62
ANDI R1, $F7
STS R1, $62

Estoy un poco confundido sobre cómo se integraría esto en mi flujo de trabajo de código C. Digamos que necesito acceder a DDRF y PORTF. ¿Necesitaría saber su dirección (en SRAM) por adelantado o hay alguna macro en avr-gcc?

AVR Libc maneja todo eso por usted.

DDRF |= _BV(PF3);
PORTF &= ~_BV(PF3);
Así que básicamente desprogramo el fusible de compatibilidad ATMega103 en ATMega128 y luego uso PORTC/G/F extendido como de costumbre. ¿correcto?
En el nivel C, sí.