Paso 2: Código fuente explicó
El programa fluye como sigue:Inicio:
Registros claros
Datos del sistema de dirección en los puertos de interés
Loop0:
Si no hay entrada, no producir ninguna salida
Si de entrada, seguir
Note0:
¿entrada = note0?
Si es así, los valores de carga en los registros de contador de tiempo que las funciones de salida producen la frecuencia de la onda cuadrada correcta
Si no, continúe
(Producir un bucle NoteX para cada nota posible en 8 octavas)
Hola:
aumento alto de salida (1)
timerhi:
define cuánto tiempo la salida se mantiene alto
lo:
Procesamiento de salida baja (0)
timerlo:
define cuánto tiempo permanecerá bajo la salida (0)
entrada:
Verifique si la entrada ha cambiado
Si es así, utiliza trucos sucios para loop0
Si no, vaya a hola
Hay muchas "islas rjmp" que dejaron el programa de regreso al inicio... este microcontrolador no es compatible con el código de operación de jmp y rjmp sólo puede traerle a una función dentro de una distancia de un cierto número de instrucciones. Solucionamos esto por la "siembra" el programa rjmp declaraciones que se omiten en el "descenso" al programa, pero se puede utilizar para subir hasta el inicio del programa.
ADVERTENCIA de error: En alguna parte 3/4 bajando la escala, hay un racimo de unas notas (3-4) que no toda la razón. De los 3 valores utilizados para r30, el más utilizado es incorrecto (demasiado baja), probablemente calcularon mal el número del reloj de ciclos en algún lugar, o tal vez poner un valor incorrecto para el r29 en algún sitio... Yo solo voy a trabajar alrededor de él, arreglarlo si lo desea (y me dicen que el error fue!)
ADVERTENCIA de INEFICIENCIA: sé, podía haber sólo usé PWM y alguna mesa EEPROM, pero por el momento lo pensé, ya estaba trabajando de esta manera.