Paso 7: Programa el MCU
El siguiente es un ejemplo de uno de los controles de brillo de LED en el bucle principal del programa. En primer lugar, la "dirección" es comprobarse. Un 1 significa aumento de brillo; un 0 significa disminución de brillo. A continuación, el nivel es aumentar o disminuir a una tasa basada en su nivel actual. Para mantener el LED en un estado amortiguador más largo (es un montón brillante durante la mayor parte de su operación) su nivel cambia lentamente al principio. Una vez que llega a Estados más brillantes, más rápidamente cambiará el nivel. Si desea que los LEDs se comportan diferente, este es el lugar para hacer los cambios.
if(stat_flag & DIRECTION0) {/ / si LED 0 debería aumentar de brillo
Si brightness0 (brightness0 < 25) ++; Aumentar lentamente durante Estados dim
else if (brightness0 < 40) brightness0 += 5; Aumentar un poco más rápido
else if (brightness0 < 100) brightness0 += 10; Aumentar rápidamente
Else CLEAR_BIT (stat_flag, DIRECTION0); Tiempo para cambiar de dirección
}
Else {/ / si LED 0 debe disminuir en brillo
Si brightness0 (brightness0 > 40)-= 10; Disminuir rápidamente
else if (brightness0 > 25) brightness0-= 5; Disminución ligeramente más lento
else if (brightness0 > 1) brightness0--; Disminuir lentamente durante Estados dim
otro SET_BIT (stat_flag, DIRECTION0); Tiempo para cambiar de dirección
}
El siguiente ejemplo es parte de la interrupción de 100ns que enciende y apaga los LEDs. Cuenta con un contador para cada LED a 100, en el cual se enciende el LED y restablece el contador. Si el contador no está al 100, se comprueba para ver si ha alcanzado el nivel de brillo actual. En este momento, el LED se apaga y permanece apagado hasta que el contador llegue a 100. Esto se conoce como PWM (modulación de anchura de pulso) y controla con eficacia el brillo del LED.
Si (++ cnt0 == 100) {/ / 100 * 100ns = 10ms (100Hz)
LED_ON(0); Enciende LED 0
cnt0 = 0; Reiniciar contador
}
else if (cnt0 == brightness0) LED_OFF(0); Si alcanza el nivel de brillo deseado, apagar LED 0
He adjuntado el archivo principal (valentine.c) así como el fichero makefile necesario para el uso con WinAVR. También está disponible si desea programar el chip y no altera en absoluto el archivo Hex. También se incluyen en este archivo zip es el esquema para el uso en Cadsoft Eagle.