ws2801/ws2801.cpp

80 lines
1.9 KiB
C++
Raw Normal View History

2017-01-05 12:32:34 +01:00
/*
* ws2801.cpp
*
* Created: 26-12-16 21:57:10
* Author: Adrien
*/
2017-02-05 18:11:25 +01:00
#define F_CPU 16000000UL
2017-01-05 12:32:34 +01:00
#include <avr/io.h>
2017-02-05 18:11:25 +01:00
#include <util/delay.h>
2017-01-05 12:32:34 +01:00
#include <stdlib.h>
2017-02-05 18:11:25 +01:00
2017-02-05 17:15:13 +01:00
#include "ws2801.h"
2017-01-05 12:32:34 +01:00
/*
L'espace mémoir à envoyer au ci est constituer comme ça :
ciN |-----------0-----------||-----------1-----------||...||-----------N-----------| Ci numéro
coulB |R7...R0|G7...G0|B7...B0||R7...R0|G7...G0|B7...B0||...||R7...R0|G7...G0|B7...B0| Valeur Couleurs bit n
coul |--RED--|-GREEN-|--BLUE-||--RED--|-GREEN-|--BLUE-||...||--RED--|-GREEN-|--BLUE-| Valeur Couleurs
bitN |7.....0|7.....0|7.....0||7.....0|7.....0|7.....0||...||7.....0|7.....0|7.....0| Bit n
t[] |---0---|---1---|---2---||---3---|---4---|---5---||...||-3*N+0-|-3*N+1-|-3*N+3-| Emplacement dans le tableau
Pour l'envois, il faut commencer par le bit 7 !
*/
2017-02-05 17:15:13 +01:00
main()
2017-02-05 18:11:25 +01:00
{
return 0;
}
2017-01-05 12:32:34 +01:00
ws2801::ws2801(uint8_t pin_clk, uint8_t pin_data, uint8_t *port, uint8_t nbr_ci)
{
this->pin_clk = pin_clk;
this->pin_data = pin_data;
this->port = port;
this->nbr_ci = nbr_ci;
2017-02-05 18:11:25 +01:00
PORTB;
2017-02-05 17:15:13 +01:00
data = (uint8_t*)calloc(3*nbr_ci, 1);
2017-01-05 12:32:34 +01:00
ddr = port-1;
2017-02-05 17:15:13 +01:00
*ddr |= (1<<pin_clk)|(1<<pin_data);
2017-01-05 12:32:34 +01:00
}
void ws2801::conf(uint8_t pin_clk, uint8_t pin_data, uint8_t *port, uint8_t nbr_ci)
{
this->pin_clk = pin_clk;
this->pin_data = pin_data;
this->port = port;
this->nbr_ci = nbr_ci;
2017-02-05 17:15:13 +01:00
data = (uint8_t*)realloc(data,3*nbr_ci);
2017-01-05 12:32:34 +01:00
ddr = port-1;
2017-02-05 17:15:13 +01:00
*ddr |= (1<<pin_clk)|(1<<pin_data);
}
void ws2801::toSend(uint8_t LEDn, uint8_t val, Color couleur)
{
*(data+32*LEDn+couleur) = val;
}
void ws2801::toSend(uint8_t LEDn, uint8_t val)
{
*(data+LEDn) = val;
}
void ws2801::send()
{
sendRaw(data, 3*nbr_ci);
2017-01-05 12:32:34 +01:00
}
2017-02-05 17:15:13 +01:00
void ws2801::sendRaw(uint8_t *data,uint8_t size)
2017-01-05 12:32:34 +01:00
{
2017-02-05 17:15:13 +01:00
int i,j,m;
for(i=0;i<size;i++)
{
for(j=0,m=0x80;j<8;j++)
{
*port &= ~(_BV(pin_clk));
2017-02-05 18:11:25 +01:00
if(!i&&!j)
_delay_us(500);
2017-02-05 17:15:13 +01:00
*port = (*port&(~(_BV(pin_data))))|((data[i]&m)?_BV(pin_data):0);
if(m==0x01)
m=0x80;
else
m>>=1;
}
}
2017-01-05 12:32:34 +01:00
}