Как послать 10 бит по SPI? (CodeVision AVR)

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1269
Зарегистрирован: Пт июл 21, 2006 15:05:19
Откуда: плод воображения

Сообщение KT315B »

Именно заработало - сейчас померял более точным мультиметром - все ок, спасибо за советы! Теперь вот думаю, как "разобрать" байт по битам =)
R2AIV 73!
Контактная информация:
Реклама
Э...
Аватара пользователя
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва

Сообщение tych »

KT315B писал(а):2Тыч: дык она и не будет шевелиться - там-же одни нули передаются...
А каким образом вы определите что передача соответствует даташиту ??? :shock:
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Контактная информация:
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 413
Зарегистрирован: Пт мар 10, 2006 12:23:05
Откуда: Moscow

Сообщение 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;
	}
}
вот вам код... разбора байта на биты...
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
Контактная информация:
Э...
Аватара пользователя
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва

Сообщение tych »

А зачем int ?
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Аватара пользователя
Сообщения: 413
Зарегистрирован: Пт мар 10, 2006 12:23:05
Откуда: Moscow

Сообщение Mozart »

потому что 10 бит!
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
Контактная информация:
Реклама
Э...
Аватара пользователя
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва

Сообщение tych »

Mozart писал(а):потому что 10 бит!
тогда зачем
код... разбора байта на биты...
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Контактная информация:
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 413
Зарегистрирован: Пт мар 10, 2006 12:23:05
Откуда: Moscow

Сообщение Mozart »

потому что в памяти мк они хранятся не по битам а по байтам...
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 413
Зарегистрирован: Пт мар 10, 2006 12:23:05
Откуда: Moscow

Сообщение Mozart »

вообще конечно было хорошо сделать указатель на бит и гулять этим указателем.. только такой тип как бит не совсем существует... его приходится вводить искусственно через структуру... [/code]
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
Контактная информация:
Э...
Аватара пользователя
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва

Сообщение tych »

Mozart писал(а):потому что в памяти мк они хранятся не по битам а по байтам...
Теперь я спокоен. У новичков в голове будет полная ясность.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 413
Зарегистрирован: Пт мар 10, 2006 12:23:05
Откуда: Moscow

Сообщение Mozart »

кажется это и так ясно...
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 413
Зарегистрирован: Пт мар 10, 2006 12:23:05
Откуда: Moscow

Сообщение 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); 
   }
}
вот код... всё вроде бы работает...
Вложения
spi.rar
(33.16 КБ) 249 скачиваний
Последний раз редактировалось Mozart Вс ноя 18, 2007 20:56:37, всего редактировалось 2 раза.
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 413
Зарегистрирован: Пт мар 10, 2006 12:23:05
Откуда: Moscow

Сообщение Mozart »

вообще я такой хернёй как программной реализацие СПИ первый раз занимаюсь... это наверно от лени или от того что просто больше делать нечего...

попробуйте лучше с инт0 и то что я вам предложил... это гораздо интереснее и всё у вас будет работать гораздо быстрее...

здесь уходит время на отправку 10 бит... уходит время на вытаскивание битов из байта... уходит время на проверку условия... и т.д. а там будет два прерывания... и + нормальные настройки СПИ...
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1269
Зарегистрирован: Пт июл 21, 2006 15:05:19
Откуда: плод воображения

Сообщение 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; // Передача завершена


}
R2AIV 73!
Контактная информация:
Э...
Аватара пользователя
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва

Сообщение tych »

Выложи рабочий проект чтоб посимулировать.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1269
Зарегистрирован: Пт июл 21, 2006 15:05:19
Откуда: плод воображения

Сообщение KT315B »

Эх, все-бы тебе просимулировать! 8)
Вложения
ad8402.rar
(38.42 КБ) 267 скачиваний
R2AIV 73!
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 413
Зарегистрирован: Пт мар 10, 2006 12:23:05
Откуда: Moscow

Сообщение Mozart »

просто советы... лучше пользоваться префиксной форму... чем постфиксной... (где-то читал говорят что быстрее работает)... cnt бы чаром объявили бы тоже... но это так...
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
Контактная информация:
Э...
Аватара пользователя
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва

Сообщение tych »

KT315B писал(а):Эх, все-бы тебе просимулировать! 8)
Да вот посимулировал. И заметил что на подъеме клока у вас меняются данные ! ИМХО не красиво это.

Изображение

Советую привести диаграмму к рисунку из ДШ и проверить передавая 1010101...

Чтоб при защелкивании данных подъемом клока они были стабильны.
Последний раз редактировалось tych Вт ноя 20, 2007 19:57:03, всего редактировалось 1 раз.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1269
Зарегистрирован: Пт июл 21, 2006 15:05:19
Откуда: плод воображения

Сообщение KT315B »

Некрасиво, согласен =) Но дык в железе-то ведь работает! Уже встроил это чудо в свой усилок - нормально регулирует =)
R2AIV 73!
Контактная информация:
Э...
Аватара пользователя
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва

Сообщение tych »

Лучше работать уверенно по срединке допустимого параметра а не на краю обрыва :lol: за которым уже не работает.

И код рабочий приложите. может кому сгодится.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1269
Зарегистрирован: Пт июл 21, 2006 15:05:19
Откуда: плод воображения

Сообщение KT315B »

Дык код-то приложил - там в функции AD8402() все описано =) Могу еще приложить вариант функции для работы с несколькими чипами, только надо оно?
R2AIV 73!
Контактная информация:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»