Eu usei diretamente o software do Pedro. Como ele descreve, são usadas bibliotecas adicionais para controle do Timer1 (TimerOne) e do Timer2 (FlexiTimer2).
CubePWM
A nível mais baixo é o CubePWM. Em CubePWM.c está a associação dos pinos do ATmega aos LEDs (matrizes PORTMAP e BITMASK), a associação dos pinos do ATmega aos planos está fixa no código.
Para gerar várias intensidades e alternar as cores, a atualização é dividida em 32 passos. Cada passo é apresentado por 100 microsegundos (rotina Draw chamada pela interrupção do Timer1). Em cada passo só é possível apresentar uma cor em um plano. Os primeiros 16 passos são normalmente para a cor vermelha e os 16 últimos para a cor verde, porém a rotina improveBrightness pode mudar este arranjo quando uma cor não está sendo usada, para aumentar o brilho. A matriz colors indica a cor de cada plano em cada passo.
A imagem do cubo é mantida na matriz ports, diretamente como o valor dos ports B, C e D para cada passo, plano e cor.
Com esta infraestrutura são criadas rotinas para acender um LED em uma cor cor com uma certa intensidade (rotina turnOn) e para apagar um LED ou todo o cubo (rotinas turnOff).
Cube
O módulo Cube implementa alguns efeitos visuais usando a infraestrutura do CubePWM e temporizações geradas pelo Timer2.
LedCube
LedCube é o módulo principal e utiliza as funções de Cube para fazer várias animações. O resultado pode ser visto no vídeo abaixo:
Nenhum comentário:
Postar um comentário