Программный SPI для цифрового потенциометра AD8400

Posted by Nosaer | Posted in

    Столкнулся по работе с цифровым потенциометром AD8400. Вещь  интересная и довольна таки полезная. Если бы еще и с двух полярным напряжением работала, вообще бы цены не было.
    При освоении, выяснилось что по SPI должна принимать 10 бит. Два первых адрес микросхемки(в нашем случае 00), а дальше само значение от 0 до 255. Передавать через аппаратный SPI 10 бит, мне показалось сложным, потому я и решил сделать это программно. Авось кому пригодится.

# include 
# include
# define SDI PORTC.0 //данные
# define CS PORTC.1 //разрешающий
# define CLK PORTC.2 //тактирующий
void AD8400(char PotNum,char Data) // Функция передачи по SPI
{
int Cnt;
Cnt=2; // Выводим два бита адреса (номер потенциометра)
CS=0; // Передача начата
while(Cnt)
{
SDI=PotNum & 0b10;
CLK=1; // Тактируем по 50 мкс
delay_us(50);
CLK=0;
PotNum <<=1; // Сдвигаем влево на 1 бит
Cnt--;
}
Cnt=8; // Выводим 8 бит значение положения движка (wiper)
while(Cnt)
{
SDI=Data & 0b10000000;
CLK=1; // Тактируем по 50 мкс
delay_us(50);
CLK=0;
Data <<=1;
Cnt--;
}
CS=1; // Передача завершена
}
void main(void)
{
unsigned int i=0, n=0, DigPot = 0;
PORTA=0xFF;
DDRA=0xFF;
PORTB=0x00;
DDRB=0xFF;
PORTC=0xFF;
DDRC=0xFF;
PORTD=0x00;
DDRD=0x00;
#asm("sei")
while (1)
{
for (DigPot=0;i<255 ad8400="" for="" i="" igpot="255;i">255;i--)
{
AD8400(0,DigPot);
}
}
}
В исходнике последнюю строчку убираем, я так и не понял откуда она вылазит %-) Плюс убрать пробелы после # в директивах.



Comments (0)

Отправить комментарий