четверг, 2 апреля 2015 г.

Тест Kit-платы V850ES от Renesas c автопоиском устройства (датчик влажности и температуры DHT-21)

 

На отладочной плате V850ES/JG3-L распаян процессор µPD70F3793GC с 512-ю килобайтами FLASH, 40-ка килобайтами RAM и 20-ю мегагерцами тактовой (максимум) и 9-ю UART. Разумеется картину дополняет FULL Speed USB2.0 контроллер:
  • 32-bit ultra low power consumption V850ES/JG3-L (µPD70F3793GC);
  • V850ES/Jx3-L Demonstration GUI;
  • LED, temperature sensor, humidity sensor and external connectors for user usage;
  • WriteEZ5 Flash programming tool;
  • Applilet software for easy code generation;
  • PC connection, debug and Flash programming via USB;
  • Manuals, demo tutorial and sample programs for easy start up;
  • IAR Systems Embedded Workbench for V850 (code size limited to 32kB).

Адрес датчика постоянный 0x80. Основные команды для управления:
  • 0xE3 (измерить температуру, прямой SCL);
  • 0xE5 (измерить влажность, прямой SCL);
  • 0xF3 (измерить температуру, с инверсным SCL);.
  • 0xF5 (измерить влажность, с инверсным SCL);
  • 0xE6 (записать данные в регистр);
  • 0xE7 (читатать данные из регистра);
  • 0xFE (перезагрузка).
Пользовательские данные представляют собой 16-ти битное число, которое хранится в двух регистрах – MSB и LSB. Как и в случае с датчиком DS18S/B20, данные (2 байта регистров MSB и LSB) нужно преобразовать к нормальному виду по следующим формулам 1 и 2:
T [°С] = -46.85 + 175.72 x St / 256; (1)
Rh [%] = -6 + 125 x Srh / 256; (2)
Перехватим обмен с V850.USB:


Если внимательно присмотреться, то «наметанный глаз» сразу заметит не что иное как  ASC (аски) — коды. Т.е. управляющая прошивка процессора передает уже готовые к употреблению данные с датчика (как в большинстве весов ...да-да, обычных электронных весов):
50 13 05 08 14 00 09 11 0D 0A
48 2A 13 0D 0A
50 14 05 08 14 00 09 11 0D 0A
50 15 05 08 14 00 09 11 0D 0A
54 1D 30 0D 0A
50 16 05 08 14 00 09 11 0D 0A
48 29 15 0D 0A
50 17 05 08 14 00 09 11 0D 0A
50 18 05 08 14 00 09 11 0D 0A
54 1D 31 0D 0A
50 19 05 08 14 00 09 11 0D 0A
48 28 61 0D 0A
50 20 05 08 14 00 09 11 0D 0A
50 21 05 08 14 00 09 11 0D 0A
54 1D 31 0D 0A
50 22 05 08 14 00 09 11 0D 0A
48 28 57 0D 0A
50 23 05 08 14 00 09 11 0D 0A
50 24 05 08 14 00 09 11 0D 0A
54 1D 32 0D 0A
Чтобы вам было понятнее, приведем некоторые расшифровки этого обмена (лога):
000001 11:50:10.364  50 58 02 00 01 06 01 00 0D 0A 54 1D 1E 0D 0A    PX........T....  1-2-3 байт времени младшим байтом впереди 0D 0A #10 #13 - перевод строки 54= T 30.93
000002 11:50:11.356  50 59 02 00 01 06 01 00 0D 0A 48 2D 09 0D 0A    PY........H-...  48 = H 41.43
000003 11:50:12.357  50 00 03 00 01 06 01 00 0D 0A                   P.........
000004 11:50:13.349  50 01 03 00 01 06 01 00 0D 0A 54 1D 21 0D 0A    P.........T.!..
000005 11:50:14.350  50 02 03 00 01 06 01 00 0D 0A 48 2D 08 0D 0A    P.........H-...
000006 11:50:15.341  50 03 03 00 01 06 01 00 0D 0A
Где:
50 16 14 14 13 00 09 11 0D 0A  время
48 29 3D 0D 0A                 влажность
50 17 14 14 13 00 09 11 0D 0A  время
50 18 14 14 13 00 09 11 0D 0A  время
54 1F 19 0D 0A                 температура
50 19 14 14 13 00 09 11 0D 0A  время
48 29 3A 0D 0A                 влажность
50 20 14 14 13 00 09 11 0D 0A  время
50 21 14 14 13 00 09 11 0D 0A  время
54 1F 18 0D 0A                 температура
Таким образом, сначала идут два пакета по 15 байт (с 0-го по 14-й):
0  - ASC код 50 = "P"
1  - секунды (с момента инициализации)
2  - минуты
3  - часы
4  - день
5  - неизвестно
6  - месяц
7  - год в формате XX
8  - ASC код 0D = CR (перевод каретки)
9  - LF
10 - ASC код 54 = "T" (тип параметра)/ASC код 48 = "H"
11 - LH младший байт параметра
12 - HH старший байт параметра
13 - CR (перевод каретки)
14 - LF
и еще один интервальный пакет по 10 байт. 

Практика

Разбор кодограммы:
type tb = array[1..255] of Char;  // Определяем символьный массив
     pb = ^tb;


procedure TForm1.rec(Sender:TObject; Buffer: pointer; BufferLength: Word);
var PX : pb;
    i  : integer;
    str: string;
begin
 PX:= buffer; str:='';

 // ЛОГГИРОВАНИЕ ===================================
 for i:= 1 to BufferLength do begin
  str:= str +inttohex(ord(PX^[i]), 2) +  end; Memo1.Lines.Add(str);

 // РАЗБОР КОДОГРАММЫ ==============================

 // время/дата-
 if ord(PX^[1])= $50 then begin
  sb.Panels[0].Text:= inttohex(ord(PX^[4]), 2) + +
                      inttohex(ord(PX^[3]), 2) + +
                      inttohex(ord(PX^[2]), 2);
  sb.Panels[1].Text:= inttohex(ord(PX^[5]), 2) + +
                      inttohex(ord(PX^[7]), 2) + +
                      inttohex(ord(PX^[8]), 2)
 end;


 // температура-
 if ord(PX^[1]) = $54 then
  t.Caption:= format('%d.%d', [ord(PX^[2]), ord(PX^[3])]);

                   // format('%.2f',
                   //  [-46.85 + 175.2*(((ord(PX^[2])shl 8) or ord(PX^[3]))/65536)]
                   // ); // 1f 19 = 31.28

 // влажность-
 if BufferLength = 15 then // + 10 fix - два пакета склеены
  if ord(PX^[1 + 10])= $48 then
   h.Caption:= format('%d.%d', [ord(PX^[2 + 10]), ord(PX^[3 + 10])]);

                   // format('%.2f',
                   // [-6 + 125*(((ord(PX^[2])shl 8) or ord(PX^[3]))/65536)]
                   //); //

 // end РАЗБОР КОДОГРАММЫ =======================
Тестовое приложение


скачать


Комментариев нет:

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

В комментариях уважайте собеседника, внимательно читайте посты и не додумывайте. Просьбы и предложения из разряда: «можно ваш Skype/Viber/телефон», «напишите мне в vk/FB», а также другие им подобные — игнорируются. Выход новых версий ПО, внешняя ссылка, переставшая работать с течением времени и т.п. не является основанием для претензий. Желающие спокойно подискутировать и высказаться — Welcome. Желающие спонсировать блог — Donate. Нарушение этих простых правил ведет к бану и удалению комментариев без предупреждения.