Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > протокол MAX 1243


Автор: Serg1234 22.5.2010, 11:59
Привет всем.
Помогите разобраться с протоколом обмена.
Есть программа на Паскале
Код

b := $3F8;n := 10;
port[b+4] := 1;
delay(100);
port [b+3] := 64;
delay(500);

 port[b+4] := 0;
 d := 0;for f :=0 to n-1 do
 begin
  port[b+4] := 2;
  e := port[b+6] and 16;
  port[b+4] := 0;
  if e=16 then d := d + exp((n-1-f)*ln(2));
 end;


как это реализовать на Delphi

Автор: xvr 24.5.2010, 14:54
Протокол обмена (кстати, обычный SPI) лучше искать в первоисточнике - http://datasheets.maxim-ic.com/en/ds/MAX1242-MAX1243.pdf , а не в неизвестно каком исходнике неизвестно для чего написанном

Автор: Serg1234 24.5.2010, 18:10
спасибо xvr
эти схемы мне знакомы, но мне тяжело из них алгоритм обмена получить.
Код который я приводил - он работает, но написан на Паскале для DOS, а надо на Delphi. 
Если есть инфа - буду очень признателен.

Автор: xvr 24.5.2010, 19:04
Цитата(Serg1234 @  24.5.2010,  18:10 Найти цитируемый пост)
эти схемы мне знакомы, но мне тяжело из них алгоритм обмена получить.
Странно, на странице 9 этот обмен расписан во всех подробностях

Цитата

Код который я приводил - он работает, но написан на Паскале для DOS, а надо на Delphi. 
Из кода непонятно как подключен сам АЦП. Догадываюсь, что через принтерный порт. Под Windows работать не будет (без специального драйвера), т.к. система к портам не пускает. 
С драйвером будет, с тем же самым кодом. Однако за такую строку
Код

if e=16 then d := d + exp((n-1-f)*ln(2));
надо расстреливать из рогатки  smile 

Автор: Serg1234 26.5.2010, 14:19
Цитата

надо расстреливать из рогатки  

Я бы тоже расстрелял тех, кто такой протокол обмена придумал.
АЦП подключен к COM порту.
Мне приходилось работать с эл.весами, сканером - там все просто и понятно, отправил строку в порт, получил обратно значение.
На странице  9 приведены схемы импульсов, на как их преобразовать в код?
xvr Если это просто и понятно для тебя - напиши пожалуйста пример. Что необходимо отправить в COM порт, чтобы потом считать из этого порта значения.

Автор: xvr 26.5.2010, 17:28
Цитата(Serg1234 @  26.5.2010,  14:19 Найти цитируемый пост)
АЦП подключен к COM порту.
К каким конкретно ногам порта какие ноги АЦП подключены?

Цитата

Если это просто и понятно для тебя - напиши пожалуйста пример.
Могу на С++ написать (для Builder'а подойдет)
Цитата

Что необходимо отправить в COM порт, чтобы потом считать из этого порта значения. 
Мне кажется, что 'отправить в COM порт' будет недостаточно, там похоже используется махание ногами под прямым управлением программы.

Автор: Serg1234 27.5.2010, 16:49
TLC 1549
clock - 7
cs - 4
data - 8
на рисунке приведена схема.
http://ipicture.ru/upload/100527/dGdI90TwO6.jpg
Цитата

Могу на С++ написать (для Builder'а подойдет)

Попробую разобраться. Главное понять принцип работы с портом.


Автор: xvr 27.5.2010, 20:26
Не могу посмотреть схему - ipicture лежит. 
Прога будет примерно такая
Код

HANDLE com_port;

void set_ncs(bool is_on) {EscapeCommFunction(com_port,is_on?SETDTR:CLRDTR);}
void set_clk(bool is_on) {EscapeCommFunction(com_port,is_on?SETRTS:CLRRTS);}
bool get_data() {DWORD s; GetCommModemStatus(com_port,&s); return (s&MS_CTS_ON)!=0;}


void open_dac()
{
 com_port=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
 set_ncs(true);
 set_clk(false);
}

void close_dac()
{
 CloseHandle(com_port);
}

int read_dac()
{
 set_ncs(false);
 int acc=0;
 for(int i=0;i<10;++i)
  {
   if (get_data()) acc|=1<<(9-i);
   set_clk(true);
   set_clk(false);
  }
 set_ncs(true);
 return acc;
}

В зависимости от схемы в функциях set_* и get_data может потребоваться проинвертировать параметр и/или возвращаемое значение

Автор: Serg1234 29.5.2010, 19:55
спасибо xvr, буду пробовать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)