Как послать 10 бит по SPI? (CodeVision AVR)
Именно заработало - сейчас померял более точным мультиметром - все ок, спасибо за советы! Теперь вот думаю, как "разобрать" байт по битам =)
R2AIV 73!
- Реклама
А каким образом вы определите что передача соответствует даташиту ???KT315B писал(а):2Тыч: дык она и не будет шевелиться - там-же одни нули передаются...
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Код: Выделить всё
inline unsigned char SPI(int data)
{
static int temp = 0x01;
if (temp && data)
{
temp = (temp << 1);
return 1;
}
else
{
temp = (temp << 1);
return 0;
}
}если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
А зачем int ?
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
потому что 10 бит!
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
- Реклама
тогда зачемMozart писал(а):потому что 10 бит!
код... разбора байта на биты...
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
потому что в памяти мк они хранятся не по битам а по байтам...
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
вообще конечно было хорошо сделать указатель на бит и гулять этим указателем.. только такой тип как бит не совсем существует... его приходится вводить искусственно через структуру... [/code]
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
Теперь я спокоен. У новичков в голове будет полная ясность.Mozart писал(а):потому что в памяти мк они хранятся не по битам а по байтам...
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
кажется это и так ясно...
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
Код: Выделить всё
#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);
}
}
- Вложения
-
- spi.rar
- (33.16 КБ) 249 скачиваний
Последний раз редактировалось Mozart Вс ноя 18, 2007 20:56:37, всего редактировалось 2 раза.
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
вообще я такой хернёй как программной реализацие СПИ первый раз занимаюсь... это наверно от лени или от того что просто больше делать нечего...
попробуйте лучше с инт0 и то что я вам предложил... это гораздо интереснее и всё у вас будет работать гораздо быстрее...
здесь уходит время на отправку 10 бит... уходит время на вытаскивание битов из байта... уходит время на проверку условия... и т.д. а там будет два прерывания... и + нормальные настройки СПИ...
попробуйте лучше с инт0 и то что я вам предложил... это гораздо интереснее и всё у вас будет работать гораздо быстрее...
здесь уходит время на отправку 10 бит... уходит время на вытаскивание битов из байта... уходит время на проверку условия... и т.д. а там будет два прерывания... и + нормальные настройки СПИ...
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
Да я уже, в принципе, написал готовую функцию для работы с 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; // Передача завершена
}R2AIV 73!
Выложи рабочий проект чтоб посимулировать.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Эх, все-бы тебе просимулировать! 
- Вложения
-
- ad8402.rar
- (38.42 КБ) 267 скачиваний
R2AIV 73!
просто советы... лучше пользоваться префиксной форму... чем постфиксной... (где-то читал говорят что быстрее работает)... cnt бы чаром объявили бы тоже... но это так...
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
Да вот посимулировал. И заметил что на подъеме клока у вас меняются данные ! ИМХО не красиво это.KT315B писал(а):Эх, все-бы тебе просимулировать!

Советую привести диаграмму к рисунку из ДШ и проверить передавая 1010101...
Чтоб при защелкивании данных подъемом клока они были стабильны.
Последний раз редактировалось tych Вт ноя 20, 2007 19:57:03, всего редактировалось 1 раз.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Некрасиво, согласен =) Но дык в железе-то ведь работает! Уже встроил это чудо в свой усилок - нормально регулирует =)
R2AIV 73!
Лучше работать уверенно по срединке допустимого параметра а не на краю обрыва
за которым уже не работает.
И код рабочий приложите. может кому сгодится.
И код рабочий приложите. может кому сгодится.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Дык код-то приложил - там в функции AD8402() все описано =) Могу еще приложить вариант функции для работы с несколькими чипами, только надо оно?
R2AIV 73!


