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

Posted by Reason89 | 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)

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