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