¿Cómo hacer un contador de ceros y unos?

1

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. (:

    
pregunta Mac

3 respuestas

2

Examinar el LSB, clasificarlo como 0 o 1, luego cambiar a la derecha y pasar al siguiente bit suena como una estrategia razonable. No está claro en qué está exactamente estancado, pero su enfoque básico tiene sentido.

Otra forma de hacer esto si la velocidad fuera muy importante es usar los 8 bits como un índice en una tabla, que luego le dice explícitamente cuántos 0s y cuántos 1s en el byte. En realidad, solo hace falta que te cuente uno de ellos. El otro es 8-N.

    
respondido por el Olin Lathrop
2

Si uno tiene un valor de byte b, puede contar rápidamente el número de bits que se configuran utilizando la siguiente estrategia:

  1. Comience con b = ((b & 0xAA)>1) + (b & 0xAA); . Los bits 6-7 de b ahora tendrán un valor de dos bits que contiene el número de bits establecidos en {6,7}; los bits 4-5 indicarán cuántos bits se configuraron en {4,5}, etc.
  2. Luego ejecuta b = ((b & 0xCC)>>2) + (b & 0x33); . Los bits 4-7 de b ahora tendrán un valor de cuatro bits que contiene el número de bits establecidos en {4,5,6,7}, y los bits 0-3 tendrán un valor de cuatro bits que contiene el número de conjuntos bits en {0,1,2,3}.
  3. Finalmente, b = (b >> 4) + (b & 0x0F). Ahora b contendrá el número total de bits que se configuraron.

El enfoque es susceptible también a cantidades de 16 o 32 bits; con cantidades de 16 bits requerirá cuatro pasos, y con cantidades de 32 bits requerirá cinco.

    
respondido por el supercat
1

No tienes suficiente reputación para comentar. Pero, si pudiera sumar todas las entradas, el resultado será el número de unidades.

    
respondido por el Haris778

Lea otras preguntas en las etiquetas