Pin de ensamblaje ATmega2560 lee y compara el problema lógico

2

Pido disculpas si mi pregunta fue vaga.

Programa: Atmel Studio 6

Estoy tratando de hacer un programa que entre en un bucle del cual solo saldrá cuando un pin se agote.

;Set PA0 high before entering loop checking for low
CBI DDRA,DDA0       ;PA0 to input
SBI PINA0,0         ;PA0 pull-up enable
;PA0 is now input & high

chklow: inc r16     ; Increase r16
in r18,PORTA0       ; Copies PINA0 to r18
cpi r18,0           ; Compares r18 to 0
brne chklow         ; Branch if PA0 is not low
nop             ; Loop exit (do nothing)

Lo que sucede es que cuando configuro PINA0, PORTA0 se pone alto. Supongo que esto es bueno, es como si presionara un botón adjunto a PINA0.

Ahora entro en el bucle y tengo mi cuadro de vista de E / S arriba, así que veo que PORTA0 está configurado. Esta es la casilla más a la derecha en PORTA.

Pero "en r18, PORTA" no hace que r18 se convierta en '1' ... permanece en 0.

Y así, el bit Z se establece en 1 porque la comparación tuvo éxito y la rama no se produce.

¿Qué pasa? Quiero que el bucle continúe indefinidamente hasta que baje el PORTA0.

EDITAR: Lo cambié ahora, usando tu consejo:

CBI DDRA,DDA0           ;PA0 to input
SBI PORTA0,0            ;PA0 pull-up enable


chklow:
in r18,PORTA        ; Copies PINA0 to r18
cpi r18,0x00        ; Compares r18 to 0
brne chklow         ; Branch if PA0 is not low
nop             ; Loop exit (do nothing)

Entonces, lo que cambié fue que copié todo el byte PORTA, en lugar de intentar copiar el bit PORTA0, que no es posible (al menos usando mi método), y ahora funciona. Gracias;)

También, sé que esta es una solución sucia, porque falla si se establece CUALQUIER bit en el Pin A, pero puedo refinar eso más adelante, este es un prototipo funcional: D

    
pregunta DrOnline

1 respuesta

1

Un par de cosas que me hacen fruncir el ceño:

SBI PINA0,0         ;PA0 pull-up enable

Según la hoja de datos:

  

Se asignan tres ubicaciones de direcciones de memoria de E / S para cada puerto, una para el Registro de datos - PORTx, Registro de dirección de datos - DDRx y los pines de entrada del puerto - PINx. La ubicación de E / S de los pines de entrada del puerto es solo de lectura, mientras que el registro de datos y el registro de dirección de datos son de lectura / escritura. Sin embargo, escribir una lógica de uno en un bit en el registro de PINx, dará como resultado un cambio en el bit correspondiente en el registro de datos. Además, el bit de desactivación de extracción - PUD en MCUCR desactiva Función de pull-up para todos los pines en todos los puertos cuando se establece.

Para habilitar el pull-up debes escribir en PORTA no en PINA0 . También note la diferencia PINA0 y PINA en su código. No puede leer un solo bit desde un puerto IO, debe leer todo el byte. Luego puedes marcar uno o más bits en el byte leído usando AND , SBRC o SBRS .

nop             ; Loop exit (do nothing)

No use nop para "no hacer nada", porque el microcontrolador avanzará a la siguiente instrucción en flash que puede ser cualquier cosa , incluida una instrucción de un programa anterior que estaba en Flash si no fue sobreescrito. Cualquier cosa puede pasar desde allí.

    
respondido por el jippie

Lea otras preguntas en las etiquetas