Este es un problema de ejemplo en mi libro. Suponiendo que el pin 5 del puerto 4 está conectado a un amplificador que controla un altavoz, la solución se da como,
La frecuencia del medio C es $$ f = 261.63 \ \ text {Hz} $$ Por lo tanto, el período de tiempo es, $$ T = \ frac1 {f} = 3822 \ \ mu s $$
El programa para producir una onda cuadrada con ese período es,
LOOP1: OUT 4H ;Send bit to speaker
MVI C,86H ;Set count to 134
LOOP2: DCR C ;Count down
JNZ LOOP2 ;Test count
CMA ;Reset bit 5
NOP ;Fine tune
NOP ;Fine tune
JMP LOOP1 ;Go for next half cycle
El número de estados T se da como, OUT (10), MVI (7), DCR (4), JNZ (10 si es verdadero, si no 7), CMA (4), NOP (4), JMP (10 ).
Con una frecuencia de reloj de 1 MHz, LOOP2 (para medio ciclo) se ejecuta durante 1912 microsegundos, lo cual es lo suficientemente cerca. LOOP1 debería ejecutarse de nuevo y enviar el complemento de lo que estaba anteriormente en el bit 5 del puerto 4. Pero creo que no.
Cuando finaliza LOOP2, el acumulador tiene 00H sobrante del registro C. CMA cambia el acumulador a FFH. NOP y JMP no cambian el acumulador. Entonces, el LOOP1 itera para el siguiente semiciclo, OUT envía el contenido del acumulador al puerto 4, es decir, FFH cuyo bit 5 es 1, cada vez. Entonces no hay una onda cuadrada, es solo una señal alta. Entonces, ¿cómo produce una C media?