Estoy intentando escribir un contador de ceros y unos en conjunto con el AVR ATmega328P.
Para elegir entre unos y ceros, tengo un interruptor en PC5.
Para la entrada hay 8 conmutadores conectados a PORTB y uno a un pin en PORTC.
Los bits son así:
- PC1 (bit más significativo)
- PB7
- ... PB0 (bit menos significativo)
Para la salida, tengo que enviar los ceros o los que cuentan a una pantalla de 7 segmentos.
Estoy intentando leer el PORTB, usar una máscara (ANDI) para obtener el bit menos significativo, comparar si es uno o menor (cero), agregar uno a un registro dependiendo de si es cero o de uno a otro registro si es uno , desplace la entrada (LSR) para seguir comprobando y así sucesivamente.
La lectura del interruptor de control y la impresión de la pantalla no son un problema, pero encontré algunas circunstancias en las que se complica un poco. Por ejemplo, ¿cómo concatenar en un registro el valor de PORTB y el pin en PORTC?
Estoy tratando de usar un ciclo y en algún momento tendré que comprobar si ya tengo los 9 bits y ellos enviarán el conteo, ¿debo usar un contador?
Hice una serie de formas más fáciles de implementar este problema, pero no se encontró información relevante.
Begin:
IN R23, PINB
Jump:
ANDI R23, 0x01
CPI R23,0x01
BRLO Zero
BREQ One
Shift:
IN R23, PINB
LSR R23
RJMP Jump
Zero:
INC R18
INC R16 //counter??
RJMP Shift
One:
INC R17
INC R16//counter??
RJMP Shift
La idea del contador no se ha completado, solo un ejemplo de la actualización. Para el contador (INC R16), también me falta el bit en PC0. Me las arreglé para leer después de leer PORTB, pero estaba tratando de usar una implementación más elegante. Sé que tengo que revisar el contador al principio para ver si está listo y enviar la salida si es.
Muchas gracias por la ayuda. (: