Diferencia entre leer PORT y PIN

9

¿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
Hanna
fuente
¿Se supone que debemos usar nuestras bolas de cristal para averiguar qué microcontrolador (y para el código: qué lenguaje de programación) está utilizando?
Wouter van Ooijen
Lo siento, está editado.
Hanna
¿Es este tu propio código o es un ejemplo? Si es un ejemplo, ¿de dónde viene? ¿Por qué dices que "el pin de lectura no es útil aquí"?
angelatlarge
Lo he probado antes en AVR studio. ¿Crees que EN R17, PINB es correcto?
Hanna

Respuestas:

13

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).

ingrese la descripción de la imagen aquí

Comenzando en el cuadrado más a la izquierda (que representa la conexión física con el mundo exterior), puede ver tres caminos:

  1. La ruta más alta es la resistencia pull-up seleccionable por software
  2. La ruta intermedia se usa cuando el pin está configurado como salida
  3. La ruta más baja se usa cuando el pin está configurado como entrada

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).

DrFriedParts
fuente
+1 También vale la pena señalar que cuando los puertos se configuran como entradas, escribir 1 en cualquier bit de PUERTO habilita la resistencia de extracción interna en ese pin.
Matt Young
¿Cuándo debería leer PORT?
Hanna
Leíste del PIN. Leer desde PORT no te dará nada útil.
Matt Young
@user: la lectura de PORT le dará el estado de las resistencias pull-up (si el pull-up está habilitado para ese pin o no), pero como menciona Matt Young, eso no es tan útil.
DrFriedParts
Agregué una muestra de lectura PORT
Hanna
4

Estoy de acuerdo con la respuesta de DrFriedParts por completo, sin embargo, quiero agregar que, de hecho, puede leer PORTpara averiguar si el puerto / pin está configurado como SALIDA alta o baja (cuando DDR= 1, puerto / pin configurado como salida) o si el interno la resistencia pullup está activada (cuando DDR= 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 escenario

Quizás una parte de su programa escribe algo en los puertos o activa / desactiva pullups, y la otra parte del programa lee PORTpara averiguar cómo está configurado. Leer PORTinmediatamente después de escribir PORTno tiene sentido: después de haber escrito PORT, sabes cuál es el valor de PORT.

angelatlarge
fuente
¿Me puede dar un código mejor? ¿Y por qué EN R17, PINB no responde allí?
Hanna
No está claro en su pregunta qué está tratando de hacer ... ¿puede aclarar eso en su pregunta: cuál es el objetivo de este fragmento de código? ¿Estás intentando alternar un puerto a una frecuencia y ciclo de trabajo particulares?
angelatlarge
sí !!! solo esto
Hanna
1

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.

microtherion
fuente
Entonces, ¿por qué leer el PIN es incorrecto?
Hanna
El valor que obtiene del PIN depende, en principio, de lo que se adjunta al pin externamente, y en su aplicación en particular, solo le interesa el valor que escribió anteriormente (esto es, por supuesto, bastante atípico de I / O pines). Sin embargo, en la práctica, esperaría que los valores de PORT y PIN sean idénticos aquí (¿lo probó?).
microtherion
Sí, lo he probado antes en el estudio AVR. Creo que lo que dijiste es verdad. Solo necesitamos complementar el valor del puerto ...
Hanna