Estoy usando un ATmega328p para controlar this Módulo LED RGB. El ATmega está en un Arduino Uno, pero lo estoy programando en C, sin utilizando las bibliotecas de Arduino.
Para alimentar el módulo RGB, también estoy usando una fuente de alimentación de 12V. Para alimentar el Arudino Uno estoy usando la alimentación USB. Lo conecté de la siguiente manera:
- Módulo LED RGB 12V - > Fuente de alimentación de 12V 12V
- Módulo LED RGB GND - > Fuente de alimentación de 12V GND
- Módulo LED RGB SDI - > ATmega PORTB0
- Módulo LED RGB SCK - > ATmega PORTB1
- Módulo LED RGB GND - > ATmega GND
Ahora si envío algunos datos R = 0xFF, G = 0xFF, B = 0xFF (establezca SDI a 5V y realice cada segundo 24 pulsos SCK) de acuerdo con la hoja de datos no sucede nada. Las luces se quedan apagadas. Pero al azar descubrí que si desconecto la fuente de alimentación de 12 V y la conecto nuevamente al azar, a veces las luces se encienden en un color aleatorio. Así que no tengo ni idea de qué está pasando.
¿Qué puede causar este comportamiento? ¿Qué puedo hacer para encontrar el error?
#include <avr/io.h>
// 16ms delay.
static void delShort()
{
TCCR0B = 0;
TCCR0A = 0;
TIMSK0 = 0;
TCNT0 = 0;
GTCCR = 0;
TIFR0 = TIFR0 | (1 << TOV0);
TCCR0B = (1 << CS02) | (1 << CS00);
while(!(TIFR0 & (1 << TOV0)))
{
}
TCCR0B = 0;
}
// 1000ms delay.
static void delLong()
{
for(unsigned char lI = 0; lI < 61; ++lI)
{
delShort();
}
}
static void ledSetup()
{
PORTB &= ~(1 << PORTB0);
DDRB |= (1 << DDB0);
PORTB &= ~(1 << PORTB1);
DDRB |= (1 << DDB1);
}
static void ledWrite(uint32_t pData)
{
uint32_t lValue = pData;
for(uint8_t lIndex = 0; lIndex < 24; ++lIndex)
{
if(lValue & 0x1)
{
PORTB |= (1 << PORTB0);
}
else
{
PORTB &= ~(1 << PORTB0);
}
delShort();
PORTB |= (1 << PORTB1);
delShort();
PORTB &= ~(1 << PORTB1);
delShort();
lValue = lValue >> 1;
}
}
void main(void)
{
ledSetup();
delLong();
while (1)
{
delLong();
ledWrite(0xFFFFFFFF);
}
}