Страница 2 из 3
Добавлено: Вс ноя 18, 2007 19:37:38
KT315B
Именно заработало - сейчас померял более точным мультиметром - все ок, спасибо за советы! Теперь вот думаю, как "разобрать" байт по битам =)
Добавлено: Вс ноя 18, 2007 20:16:11
tych
KT315B писал(а):2Тыч: дык она и не будет шевелиться - там-же одни нули передаются...
А каким образом вы определите что передача соответствует даташиту ???

Добавлено: Вс ноя 18, 2007 20:22:30
Mozart
Код: Выделить всё
inline unsigned char SPI(int data)
{
static int temp = 0x01;
if (temp && data)
{
temp = (temp << 1);
return 1;
}
else
{
temp = (temp << 1);
return 0;
}
}
вот вам код... разбора байта на биты...
Добавлено: Вс ноя 18, 2007 20:29:16
tych
А зачем int ?
Добавлено: Вс ноя 18, 2007 20:30:30
Mozart
потому что 10 бит!
Добавлено: Вс ноя 18, 2007 20:33:04
tych
Mozart писал(а):потому что 10 бит!
тогда зачем
код... разбора байта на биты...
Добавлено: Вс ноя 18, 2007 20:33:55
Mozart
потому что в памяти мк они хранятся не по битам а по байтам...
Добавлено: Вс ноя 18, 2007 20:35:21
Mozart
вообще конечно было хорошо сделать указатель на бит и гулять этим указателем.. только такой тип как бит не совсем существует... его приходится вводить искусственно через структуру... [/code]
Добавлено: Вс ноя 18, 2007 20:35:41
tych
Mozart писал(а):потому что в памяти мк они хранятся не по битам а по байтам...
Теперь я спокоен. У новичков в голове будет полная ясность.
Добавлено: Вс ноя 18, 2007 20:37:20
Mozart
кажется это и так ясно...
Добавлено: Вс ноя 18, 2007 20:51:11
Mozart
Код: Выделить всё
#include "avr\io.h"
#include "avr\delay.h"
inline unsigned char SPI(int data)
{
static int temp = 0x01;
if (temp > 512)
temp = 1;
if (temp & data)
{
temp = (temp << 1);
return 1;
}
else
{
temp = (temp << 1);
return 0;
}
}
void main(void)
{
PORTB=0x00;
DDRB=0xFF;
while (1)
{
PORTB &=~(1 << 0); // /SS=0
for(unsigned char i=0; i < 10; i++)
{
PORTB &=~(1 << 5);
PORTB |= (SPI(0b0101010101) << 5);
PORTB &= ~ (1 << 7); // Тактирование (SCK)
_delay_us(50);
PORTB |= (1 << 7);
_delay_us(50);
}
PORTB |= (1 << 0); // /SS=1
_delay_ms(1000);
}
}
вот код... всё вроде бы работает...
Добавлено: Вс ноя 18, 2007 20:55:02
Mozart
вообще я такой хернёй как программной реализацие СПИ первый раз занимаюсь... это наверно от лени или от того что просто больше делать нечего...
попробуйте лучше с инт0 и то что я вам предложил... это гораздо интереснее и всё у вас будет работать гораздо быстрее...
здесь уходит время на отправку 10 бит... уходит время на вытаскивание битов из байта... уходит время на проверку условия... и т.д. а там будет два прерывания... и + нормальные настройки СПИ...
Добавлено: Пн ноя 19, 2007 02:39:12
KT315B
Да я уже, в принципе, написал готовую функцию для работы с AD4802... Не без вашей помощи, конечно! Все работает - уже даже на усилок в роли регулятора громкости цеплял - пашет...
Код: Выделить всё
void AD8402(char PotNum,char Data)
{
int Cnt;
Cnt=2; // Выводим два бита адреса (номер потенциометра)
SS1=0; // Передача начата
while(Cnt)
{
MOSI=PotNum & 0b10;
SCK=1; // Тактируем
delay_us(50);
SCK=0;
PotNum <<=1; // Сдвигаем влево на 1 бит
Cnt--;
}
Cnt=8; // Выводим 8 бит значение положения движка (wiper)
while(Cnt)
{
MOSI=Data & 0b10000000;
SCK=1;
delay_us(50);
SCK=0;
Data <<=1;
Cnt--;
}
SS1=1; // Передача завершена
}
Добавлено: Пн ноя 19, 2007 02:55:19
tych
Выложи рабочий проект чтоб посимулировать.
Добавлено: Пн ноя 19, 2007 03:07:07
KT315B
Эх, все-бы тебе просимулировать!

Добавлено: Пн ноя 19, 2007 10:36:36
Mozart
просто советы... лучше пользоваться префиксной форму... чем постфиксной... (где-то читал говорят что быстрее работает)... cnt бы чаром объявили бы тоже... но это так...
Добавлено: Пн ноя 19, 2007 18:25:58
tych
KT315B писал(а):Эх, все-бы тебе просимулировать!

Да вот посимулировал. И заметил что на подъеме клока у вас меняются данные ! ИМХО не красиво это.
Советую привести диаграмму к рисунку из ДШ и проверить передавая 1010101...
Чтоб при защелкивании данных подъемом клока они были стабильны.
Добавлено: Вт ноя 20, 2007 18:45:42
KT315B
Некрасиво, согласен =) Но дык в железе-то ведь работает! Уже встроил это чудо в свой усилок - нормально регулирует =)
Добавлено: Вт ноя 20, 2007 19:44:50
tych
Лучше работать уверенно по срединке допустимого параметра а не на краю обрыва

за которым уже не работает.
И код рабочий приложите. может кому сгодится.
Добавлено: Вт ноя 20, 2007 20:15:35
KT315B
Дык код-то приложил - там в функции AD8402() все описано =) Могу еще приложить вариант функции для работы с несколькими чипами, только надо оно?