ATmega128 Extended I / O

1

Este es mi primer momento de trabajar 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 toma 6 bits para una ubicación de E / S?

  • Para acomodar la E / S extendida en ATmega128 (160 más), estas 160 ubicaciones se asignaron a la SRAM interna justo después de las 64 existentes. Entonces, de hecho, de la SRAM de 4KB que proporciona ATmega128, 160 son ocupadas por estas ubicaciones de E / S extendidas. ¿Qué sucede si se establece el fusible de compatibilidad ATmega103 (programado de forma predeterminada)? ¿Tengo acceso a estas 160 ubicaciones entonces?

  • ¿Cómo accedo exactamente a estas ubicaciones extendidas? La hoja de datos solicita utilizar LD / LDS / LDD y ST / STS / STD. Cualquier ejemplo de esto como nunca he usado el montaje antes. Estoy un poco confundido sobre cómo se integrará 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 ejemplo de código o enlace para leer y entender arriba sería genial!

    
pregunta Ankit

1 respuesta

4
  

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

La mayoría de las instrucciones de AVR ponen sus argumentos como parte de la palabra de código de máquina . IN , OUT , SBI y CBI no tienen más de 6 bits disponibles para argumentos.

  

Para acomodar la E / S extendida en ATMega128 (160 más), estas 160 ubicaciones se asignaron a la SRAM interna justo después de las 64 existentes. Entonces, de hecho, de la SRAM de 4KB que proporciona ATMega128, 160 son ocupadas por estas ubicaciones de E / S extendidas.

Incorrecto. Todo el 4kiB está disponible, 160 direcciones más arriba.

  

¿Qué sucede si se establece el fusible de compatibilidad ATMega103 (programado de forma predeterminada)? ¿Tengo acceso a estas 160 ubicaciones entonces?

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

  

¿Cómo accedo exactamente a estas ubicaciones ampliadas?

Con instrucciones normales de acceso a la memoria.

  

La hoja de datos solicita utilizar LD / LDS / LDD y ST / STS / STD. Cualquier ejemplo de esto como nunca he usado el ensamblaje antes.

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á esto en mi flujo 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 se encarga de todo eso por ti.

DDRF |= _BV(PF3);
PORTF &= ~_BV(PF3);
    
respondido por el Ignacio Vazquez-Abrams

Lea otras preguntas en las etiquetas