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 Example
tiene 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 0xBC
que 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
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.
babú james
Majenko
Majenko
babú james
babú james
Majenko
10111PPrrrrrPPPP out P,r
por 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.