Diferencia entre leer PUERTO y PIN

¿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 lectura PUERTO: (la lectura del pin no es útil aquí)

Montaje f=1MHZ ATmega8 Necesito complementar PORTB cada 1ms.(Dutycycle=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
¿Se supone que debemos usar nuestras bolas de cristal para averiguar qué microcontrolador (y para el código: qué lenguaje de programación) está usando?
Lo siento, está editado.
¿Es este su propio código o es de un ejemplo? Si es un ejemplo, ¿de dónde viene? ¿Por qué dices "leer pin no es útil aquí"?
Lo he probado antes en el estudio AVR. ¿Crees que IN R17, PINB es correcto?

Respuestas (3)

PUERTO es el búfer de SALIDA, PIN es el búfer de ENTRADA.

Cuando desee configurar 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 de 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 ver las hojas de datos completas).

Este bloque de circuito se repite para cada pin. Ocho de ellos 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 del medio se usa cuando el pin está configurado como una salida
  3. La ruta más baja se usa cuando el pin está configurado como una 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).

+1 También vale la pena señalar que cuando los puertos están configurados como entradas, escribir 1 en cualquier bit de PORT habilita la resistencia de extracción interna en ese pin.
¿Cuándo debo leer PORT?
Usted lee desde PIN. Leer desde PORT no te dará nada útil.
@usuario: leer desde PORT le dará el estado de las resistencias pull-up (ya sea que el pull-up esté habilitado para ese pin o no), pero como menciona Matt Young, eso no es tan útil.
Agregué una muestra de lectura PORT
@Hanna: lo veo, pero (1) ¿por qué quieres leer PORT? y (2) ¿en qué idioma está escrito ese fragmento?
pondre codigo completo y descripcion

Estoy completamente de acuerdo con la respuesta de DrFriedParts , 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 puerto/pin está configurado como salida la resistencia pullup está activada (cuando DDR= 0, puerto/pin configurado como entrada). De esta manera, un puerto puede usarse (de una manera bastante tonta) como almacenamiento general o para pasar información sobre el estado de los pullups de salida/entrada, 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: habiendo escrito a PORT, sabes cuál PORTes el valor de.

¿Me puede dar un código mejor? ¿Y por qué IN R17, PINB no responde allí?
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á simplemente tratando de alternar un puerto a una frecuencia y ciclo de trabajo en particular?
si!!!solo esto

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 del puerto como un byte de RAM observable externamente.

Por otro lado, para esta aplicación en particular, podría simplemente mantener el valor en un registro y ni siquiera tendría que volver a leer el registro PORT.

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