Comprender la ficha técnica de Atmega168P

Estoy en el proceso de leer el documento mencionado anteriormente desde aquí .

En la página 21, segundo párrafo de la sección 8.5 I/O Memory, la línea 6 es la siguiente:

Cuando se utilizan los comandos IN y OUT específicos de E/S, se deben utilizar las direcciones de E/S 0x00 - 0x3F.

Sin embargo, en la página 224, la fila 1 de la tabla, primera columna, Assembly Code Exampletiene la última línea de la siguiente manera:

out TWCR, r16

Pero según la declaración de la página 21, la instrucción anterior es incorrecta ya que TWCR tiene la dirección de memoria 0xBCque se indica en la fila 6 de la página 396.

¿Hay algo mal aquí, o lo estoy entendiendo mal?

Por favor ayuda.

Editar: archivo de definiciones

Respuestas (1)

Lo estás entendiendo mal. Sí, TWCR tiene una dirección de memoria de 0xBC, pero esa no es su dirección de E/S.

Hay dos formas de acceder al puerto: a través de IO y a través de la memoria. En C, cuando asigna un valor a esa dirección, cambia la dirección para que sea la dirección IO y usa una instrucción de entrada o salida en lugar de cargar o almacenar instrucciones.

-- editar --

Mirando el archivo de definiciones que ha publicado, hay un poco:

; ***** I/O REGISTER DEFINITIONS *****************************************
; NOTE:
; Definitions marked "MEMORY MAPPED"are extended I/O ports
; and cannot be used with IN/OUT instructions
....
.equ    TWCR    = 0xbc  ; MEMORY MAPPED

Sospecho que en realidad la hoja de datos es incorrecta. No sería sorprendente que toda esa sección sobre TWI se copiara palabra por palabra de otra hoja de datos cuya interfaz TWI está asignada a E/S y no a memoria, como ATMega32. No es raro.

Pero estoy hablando de ensamblaje, no de C.
Sí, pero también está confundiendo direcciones de memoria y direcciones IO. La dirección de memoria es 0xBC, pero la dirección de E/S no lo es. No sé en qué archivo están definidas las direcciones IO o lo buscaría.
Solo estoy usando C como ejemplo: escribe en la dirección de memoria , la cambia a la dirección io y usa OUT.
He añadido un enlace al archivo de definiciones. Me cuesta entenderlo.
Exactamente, cuando intenté depurar un código de prueba en Atmel Studio, mostraba el error "fuera de rango"
El problema que tienen es que el código de operación de SALIDA solo tiene 6 bits para almacenar la dirección: 10111PPrrrrrPPPP out P,rpor lo que la dirección máxima que puede usar es 2^6-1, o 63 (0x3F). Pronto llenaron eso, por lo que tuvieron que idear otras formas de hacerlo. Algunos chips usan OUT para algunos periféricos, algunos para otros, y no hay (o hay muy poco) terreno común entre ellos.