¿Cuál es la diferencia entre leer PORTA y PINA? ¿Cuál es la relación entre un puerto y sus pines? ¡Estoy realmente confundido! muestra de PUERTO de lectura: (el pin de lectura no es útil aquí)
Montaje f = 1MHZ ATmega8 Necesito complementar a PORTB cada 1 ms. (Ciclo de trabajo = 50%)
LDI R16,$FF
OUT DDRB,R16
MAIN: LDI R16,00
DELAY:CPI R16,200
BREQ LOOP
INC R16
RJMP DELAY
loop:IN R17,PORTB
COM R17
OUT PORTB,R17
OUT R17,PORTB
RJMP MAIN
Respuestas:
PORT es el búfer de SALIDA, PIN es el búfer de ENTRADA.
Cuando desee establecer el pin en un voltaje "alto" o "bajo", escriba en el registro PORT.
Cuando desee saber qué voltaje se presenta actualmente a un pin, lea el registro PIN.
Los bits de estos registros representan los pines correspondientes del puerto de entrada / salida de propósito general.
Aquí hay un esquema simplificado de la electrónica dentro del AVR conectado a un solo pin (vaya aquí para obtener hojas de datos completas).
Este bloque de circuito se repite para cada pin. Ocho de estos forman un puerto (puerto A, por ejemplo).
Comenzando en el cuadrado más a la izquierda (que representa la conexión física con el mundo exterior), puede ver tres caminos:
Cabe señalar que algunos o todos estos circuitos se pueden omitir cuando el pin se comparte con un periférico interno. Por ejemplo, el convertidor de analógico a digital (ADC).
fuente
Estoy de acuerdo con la respuesta de DrFriedParts por completo, sin embargo, quiero agregar que, de hecho, puede leer
PORT
para averiguar si el puerto / pin está configurado como SALIDA alta o baja (cuandoDDR
=1
, puerto / pin configurado como salida) o si el interno la resistencia pullup está activada (cuandoDDR
=0
, puerto / pin configurado como entrada). De esta forma, se puede usar un puerto de puerto (de una manera bastante tonta) como almacenamiento general o para pasar información sobre el estado de las salidas de entrada / salida, como en el siguiente escenarioQuizás una parte de su programa escribe algo en los puertos o activa / desactiva pullups, y la otra parte del programa lee
PORT
para averiguar cómo está configurado. LeerPORT
inmediatamente después de escribirPORT
no tiene sentido: después de haber escritoPORT
, sabes cuál es el valor dePORT
.fuente
Para sus propósitos, leer desde PORT realmente tiene sentido: los pines en cuestión son pines de salida, y simplemente desea leer el último valor que escribió, alternarlo y volver a escribirlo. Entonces está utilizando el registro de puerto como un byte de RAM externamente observable.
Por otro lado, para esta aplicación en particular, simplemente podría mantener el valor en un registro y ni siquiera tendría que volver a leer el registro PORT.
fuente