Amigos, sigo sin dar en la tecla pese a los cambios y ajustes que se me ocurren o proponen.
Acá posteo el código casi como eran mis pruebas originales de 8 bits.
Digamos que intento hacer lo más básico que hay, nada raro pero no funciona.
Agregué en un RAR los dos archivos Main y Makefile por si alguien lo quiere simular.
A ver si encuentran algo que yo no. No sé.
Saludos y gracias
Un detalle que encontré recién haciendo otra prueba, los datos están a la salida sólo en el primer microsegundo que conecto la tensión, luego desaparecen.
O sea, como si algo pusiera los datos en 0 pero yo no pongo nada en cero.
¿Por qué desaparecen?
Pregunto... ¿data <<= 1 acaso no es temporal, o quiere decir que el dato se va desplazando y al no haber mas datos se completa con 0?
Si es eso, me quiero morir por mi error.
Acá posteo el código casi como eran mis pruebas originales de 8 bits.
Digamos que intento hacer lo más básico que hay, nada raro pero no funciona.
Agregué en un RAR los dos archivos Main y Makefile por si alguien lo quiere simular.
A ver si encuentran algo que yo no. No sé.
PHP:
#include <avr/io.h>
#include <stdint.h>
#define Pixel_PORT PORTB
#define Pixel_DDR DDRB
#define Pixel_DOUT PINB1 //DataOut pin location
#define Pixel_SCK PINB0 //Clock pin location
#define PixelDataHigh() (Pixel_PORT|=(1<<Pixel_DOUT))
#define PixelDataLow() (Pixel_PORT&=(~(1<<Pixel_DOUT)))
//Si declaro globalmente los datos, o sea esta linea, no tengo señal de datos a la salida. Ver más abajo otra linea comentada.
uint8_t data[13]={0xFF,0xAA,0x00,0xAA,0xAA,0x00,0x00,0xAA,0x00,0xAA,0xAA,0x00,0x00};
void PixelInit(void)
{
// Set Pixel_DOUT and Pixel_SCK output, all others input
Pixel_DDR = (1<<Pixel_DOUT)|(1<<Pixel_SCK);
}
int main(void) {
// Inicializa los pines de MCU
PixelInit();
while(1){
for (uint8_t s=0;s<13;s++)
{
// Si declaro los datos aqui funciona bien, pero si lo declaro global no tengo datos a la salida ¿por qué?
//uint8_t data[13]={0xFF,0xAA,0x00,0xAA,0xAA,0x00,0x00,0xAA,0x00,0xAA,0xAA,0x00,0x00};
// Shift MSB
for (uint8_t i=0;i<16;i++)
{
if (data[s] & 0x80)
{
Pixel_PORT |= (1<<Pixel_DOUT); // Data High
}
else
{
Pixel_PORT &= ~(1<<Pixel_DOUT); // Data Lo
}
if ( (i &0x01) == 0) //Si la variable es impar se cumple el IF
{
Pixel_PORT|=(1<<Pixel_SCK); // SCK high
}
else
{
Pixel_PORT&=(~(1<<Pixel_SCK)); // SCK low
}
data[s] <<= 1; // shift
}
}
}
}
Un detalle que encontré recién haciendo otra prueba, los datos están a la salida sólo en el primer microsegundo que conecto la tensión, luego desaparecen.
O sea, como si algo pusiera los datos en 0 pero yo no pongo nada en cero.
¿Por qué desaparecen?
Pregunto... ¿data
Si es eso, me quiero morir por mi error.
Adjuntos
Última edición por un moderador: