Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



PZEM-004T

Сообщений 31 страница 60 из 133

31

Вот пример извлечения  из блока данных , как можно ДАТЕ присвоить переменную ?

Dim ICode as Byte
Dim Codeindex as Byte
...
Codeindex = 3
ICode = Lookup(Codeindex, IC1codes)

Ic1codes:
Data &H09 , &H77 , &H14 , &H23

0

32

Никак. Только константу. Это же не область RAM, а флеша (статика).

0

33

RDW написал(а):

Никак. Только константу. Это же не область RAM, а флеша (статика).


Тогда как быть если у меня переменная состоит из масива F8 04 14 08 E7 00 77 00 00 00 BA 00 00 00 1B 00 00 01 F4 00 45 00 00 , то как извлечь из этого блока определенные данные ?

0

34

Перечитываю тут опять всю тему...

olegkaras написал(а):

Как эту переменную
Const Usart_0_input_const_size_buffer = 250
Dim Temp_usart_0_input_buffer_byte(usart_0_input_const_size_buffer) As Byte
преобразовать в строку , или как из нее вытащить определенные данные ?

...эта переменная имеет примерно такое значение
TEMP_USART_0_INPUT_BUFFER_BYTE = 0xF8 0x04 0x14 0x08 0xE7 0x00 0x77 0x00 0x00 0x00 0xBA 0x00 0x00 0x00 0x1B 0x00 0x00 0x01 0xF4 0x00 0x45 0x00 0x00 0xF8 0x00 0xE7

Зачем такой огроменный размер буфера (выделено), если входная строка всего 26 (в последнем варианте 23) значений ?
Вечером еще раз присланое попытаюсь покопать... ;)

Отредактировано Nord (2019-06-19 15:30:10)

0

35

Посмотри пожалуйста , а то ни чего у меня не получается.
Размер буфера я пробовал уменьшать , все равно не работает.
В примере переменная которую нужно разбомбить называется - Korotko, я ее по твоему совету укоротил , раньше она была длинной ( TEMP_USART_0_INPUT_BUFFER_BYTE), укорачивание тоже не помогло.

Отредактировано olegkaras (2019-06-19 18:14:56)

0

36

В файле ZTE.bas что делают эти строки:
Print_usart_0 "{248}" , 1                                   '1-ожидаем окончания трансляции; 0-идем дальше
Print_usart_0 "{004}" , 1                                   '1-ожидаем окончания трансляции; 0-идем дальше
...и далее ?

Здесь нет никакой "трансляции", это обращение к п/пр, расположенной в подключаемом файле.
Что мешает сделать банальный Print.... ?
Приемник не будет отвечать на каждый принятый байт, поэтому "'1-ожидаем окончания трансляции" - нафантазированное излишество.
Я не нашел в даташите подтверждения этой логике...

Строка Count = Split(korotko , Ar(1) , ",") в этом же файле ругается правильно, т.к. переменная определена не в этом файле, а в подключаемом.

Дальше рыть пока не буду... ;)

Избавьтесь от $include, они вас путают (не знаю, зачем вы это вообще распылили)...

У вас гайки делают в Норвегии, а болты к ним - в Антарктиде, скручивают уже на вашем компе... ;)
Зачем ???!!! ;)

В Протеусе у вас два МК.
Один, как понимаю, эмулирует датчик, а второй обрабатывает инфу.
Вот и сделайте ДВЕ программы для ДВУХ МК, чтоб один передавал, а другой принимал.

Начните с приема/передачи одного байта.
Устаканите - увеличивайте объемы.

UART - штука простая до безобразия ! ;)

Отредактировано Nord (2019-06-19 22:39:45)

0

37

Начнем сначала... ;)

Требуется дать команду модулю для передачи измеренных значений.
Передаем. Andrusha в #16 предложил нормальный вариант:
Printbin &HF8 ; &H04 ; &H00 ; &H00 ; &H00 ; &H0A ; &H64 ; &H64 ;
Только, как требует даташит, посылка должна заканчиваться кодами 13 и 10 (DEC).
Поэтому добавляем еще строку:
Print

Дальше начинаем отлавливать ответ от модуля.
Зная, что должны принять не менее 26 байт, определяем размер приемного буфера.
Принимаем полученные значения.
Начинаем разбирать строку.

Все эти шаги для UART уже разжеваны тут для состояния зубной пасты... ;)

0

38

В файле ZTE.bas что делают эти строки:
Print_usart_0 "{248}" , 1                                   '1-ожидаем окончания трансляции; 0-идем дальше
Print_usart_0 "{004}" , 1                                   '1-ожидаем окончания трансляции; 0-идем дальше
...и далее ?
Здесь нет никакой "трансляции", это обращение к п/пр, расположенной в подключаемом файле.

Подключаемый файл - не мой я его взял с этого форума. В этом файле как раз и находится -1-ожидаем окончания трансляции; 0-идем дальше.
Выдача масива по кускам - потому что если выдаю код одной строкой в протеусе и в железе в место нужного кода код с пропусками.

Строка Count = Split(korotko , Ar(1) , ",") в этом же файле ругается правильно, т.к. переменная определена не в этом файле, а в подключаемом.
Даже если переменная определена  в этом файле - ругается (вроде из за того что переменная должна быть String а не бит.

В Протеусе у вас два МК.
Один, как понимаю, эмулирует датчик, а второй обрабатывает инфу.
Вот и сделайте ДВЕ программы для ДВУХ МК, чтоб один передавал, а другой принимал.

Так и есть датчик -PZEM-014 , прием - ZTE

+1

39

Nord написал(а):

Начнем сначала...

Требуется дать команду модулю для передачи измеренных значений.
Передаем. Andrusha в #16 предложил нормальный вариант:
Printbin &HF8 ; &H04 ; &H00 ; &H00 ; &H00 ; &H0A ; &H64 ; &H64 ;
Только, как требует даташит, посылка должна заканчиваться кодами 13 и 10 (DEC).
Поэтому добавляем еще строку:
Print

....


С передачей команд проблем нет , проблема с приемом .
13 и 10 в конце вроде как не нужны с ними модуль не отвечает , я запускал китайскую програму для работы с этим модулем и смотрел монитором портов за посылками и ни 13 ни 10 ни где не обнаружил

Отредактировано olegkaras (2019-06-19 23:15:57)

0

40

olegkaras написал(а):

С передачей команд проблем нет , проблема с приемом.

Откуда уверенность, что с передачей проблем нет ? ;)
Как проверяется ?
Если улетело от МК - еще не значит, что "все гуд"... ;)

У вас в руках готовый модуль !
Зачем в данном варианте Протеус ? ;)
Если модуль без нагрузки - ничего (!) не мешает общаться с ним ОДНИМ МК, выводя получаемую информацию на какой-либо дисплей...
Требуется ОДИН МК, одна прошивка без каких-то подключений, в которой будут иметься все необходимые переменные нужного формата... ;)
Зачем усложнять себе путь ?  Чтоб потом с гордой, натертой и потной шеей его преодолеть ? ;)

Подключаемые файлы полезны, когда они отточены автором и пригодны для универсального применения.

0

41

Проблем нет потому что при отправке команды мк-ром на модуль я от модуля принимаю терминалом ПК то что нужно,а вот если бы это принять мк- ром тогда да...
И дисплей есть, вот только принять толком неполучается.

Отредактировано olegkaras (2019-06-19 23:53:47)

0

42

olegkaras написал(а):

Проблем нет потому что при отправке команды мк-ром на модуль я от модуля принимаю терминалом ПК то что нужно,а вот если бы это принять мк- ром тогда да...И дисплей есть, вот только принять толком неполучается.

Значит, движуха все-таки есть... ;)
Что принимает терминал ?  Представьте, плиз.

Только не в виде "из масива F8 04 14 08 E7..." ;)
Тут непонятно кто расставляет пробелы, которых при обычном приеме быть не должно...
Должна быть или слитная строка или конкретные знаки-разделители, но не пробелы.

0

43

В не раз упоминаемом мной примере Александра "Приём по USART в прерывании." можно принимать в буфер указываемого размера нужную последовательность (независимо от её начинки) по потом безбедно разлопачивать принятое уже указанными ранее способами.

Что мешает ?
Или не до конца поняли работу этим способом ?

0

44

Если Александр это Saha1973 то это его пример и есть ,но этот пример работает если модуль в конце отправляет 13 10 а так как мой модуль этого не делает то данные принятые в от модуля находятся только в битовой перемменой в переменной стринг данных нет и не будет пока в конце ни придут 1013. Завтра выложу то что принимает терминал. Один модуль сим 900 ети 1310 валит и вначале и в конце строки другой zte004 вообще при передаче про них не упоминает ,ни какого стандарта 😉

Отредактировано olegkaras (2019-06-20 00:25:19)

0

45

olegkaras написал(а):

Если Александр это Saha1973 то это его пример и есть ,но этот пример работает если модуль в конце отправляет 13 10

Так поставьте свой индикатор "конца".
Допустим, это будет последовательность 00 E7 (из вашего примера).

Там же можно (если подумать) заканчивать прием по достижении счетчика принятых байт нужного значения, что будет в вашем варианте гораздо полезнее.

Указанный пример очень гибкий в применении, если голову приложить, за что он мне и нравится. ;)

0

46

Этот конец постоянно меняется.
В общем самому разобраться мне трудно вато.

Отредактировано olegkaras (2019-06-20 00:31:41)

0

47

olegkaras написал(а):

Этот конец постоянно меняется.
В общем самому разобраться мне трудно вато.

"Трудно" или ""вато" (плиз без обид ;) )... ;)

Используйте способ приема по количеству байт.
Там есть строка:

Incr Счетчик_принятых_символов       ' Считаем количество принятых символов


Дальше разложить ? ;)

Отредактировано Nord (2019-06-20 00:59:28)

0

48

olegkaras написал(а):

Завтра выложу то что принимает терминал. Один модуль сим 900 ети 1310 валит и вначале и в конце строки другой zte004 вообще при передаче про них не упоминает ,ни какого стандарта

Так у вас изначальная каша в приеме.
Разделяйте передающих.
На уровне приема.

Если все на UART - проще простого, но возможны пропуски посылок (издержки).

Если на разных интерфейсах - флаги занятости (большинство модулей их понимает) или запросы повторной передачи.

0

49

Завтра попробую разобраться со счётчиком.

0

50

Nord написал(а):

Значит, движуха все-таки есть...
Что принимает терминал ?  Представьте, плиз.

Только не в виде "из масива F8 04 14 08 E7..."
Тут непонятно кто расставляет пробелы, которых при обычном приеме быть не должно...
Должна быть или слитная строка или конкретные знаки-разделители, но не пробелы.


Вот терминал принимает от PZEM-004 при обращении к нему микроконтроллером.
F8 04 14 09 12 00 00 00 00 00 00 00 00 01 0E 00 00 01 F4 00 00 00 00 F8 B9
тоже самое
HTerm:
F8 04 14 09 12 00 00 00 00 00 00 00 00 01 0E 00 00 01 F4 00 00 00 00 F8 B9

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

Мне нужно в этом месте изменить условие , вместо 13 10 вставить если Usart_0_count_received_symbols >24
    !cpi R17 , 13                                           'Если приняли "конец строки"
    !BREQ Exit_input_data_usart_0

    !cpi R17 , 10                                           'Если приняли "перевод каретки"
    !Breq Copy_bufer_usart_0                                'Input_sumbol

Отредактировано olegkaras (2019-06-20 21:27:25)

0

51

olegkaras написал(а):

Вот терминал принимает от PZEM-004 при обращении к нему микроконтроллером.
F8 04 14 09 12 00 00 00 00 00 00 00 00 01 0E 00 00 01 F4 00 00 00 00 F8 B9
тоже самое HTerm:
F8 04 14 09 12 00 00 00 00 00 00 00 00 01 0E 00 00 01 F4 00 00 00 00 F8 B9
в общим все терминалы которые у меня есть принимают таким образом.

Согласен...
Это то, что мы видим в окна терминала.
А что за символ в качестве разделителя, который мы видим, как пробел ? Его ASCII - код ?

olegkaras написал(а):

Мне нужно в этом месте изменить условие , вместо 13 10 вставить

И что мешает ? ;)

0

52

ВОТ ASCII
?<4><20><\b>?<\0><\0><\0><\0><\0><\0><\0><\0><1><14><\0><\0><1>?<\0><\0><\0><\0><27><24>

0

53

olegkaras написал(а):

ВОТ ASCII
?<4><20><\b>?<\0><\0><\0><\0><\0><\0><\0><\0><1><14><\0><\0><1>?<\0><\0><\0><\0><27><24>

Вы меня не поняли... ;)
В режиме ACSII-отображения терминал намусорит не меньше... ;)

Начало принятой строки - F8 04 14...
F8, <что-то>, 04, <что-то>, 14, <что-то>...
Вот это <что-то> имеет какое-то значение ?

Покажите ПОЛНУЮ цепочку принятого.
Ожидаю, что в ней будет или 25 информационных байт или 25 информационных байт + 24 байта-разделителя.

0

54

Вот архив , в архиве файл и программа  (анализатора) которой смотреть этот файл , пробелов не видать.Ссылка

0

55

olegkaras написал(а):

...пробелов не видать.

Уже веселее...
Значит, зная конкретное количество принятых байт, можем преспокойно разложить строку.
Предлагаемый вариант - концепция, не конечное решение.

Dim <строка> As String * 25         ' сюда принимаем от модуля
Dim Ar(25) As Byte
Dim vartxt As String * 1
Dim varnum As Byte

For a = 1 To 25
      vartxt = Mid(<строка>, a, 1)
      varnum = Asc(vartxt)
      At(a) = varnum
Next a

Можно через оверлеи, но дробить строку все равно придется Mid'ом, т.к. нет разделителей...

Отредактировано Nord (2019-06-21 00:32:53)

+1

56

Вот 100% работающий код для приёма строк символов, любых.

Код:
'Конфигурация RS232
Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config SERIALIN = BUFFERED , size = 50

main:
      If Ischarwaiting = 1 Then
         i = 1
         Waitms 100
         While _RS_HEAD_PTR1 <> _RS_TAIL_PTR1               'Проверка кольцевого буфера
            D(i) = Inkey
            Incr i
         Wend
         Clear Serialin

   CONFIG POWERMODE = IDLE                                  'Уснём
   GoTo Main

Потом делайте с этим массивам всё, что нужно. Без всяких Mid и прочих танцев с бубнами.
Единственное, что нужно знать, это расположение информации в массиве, т.е. где начинается первое значение, где второе и т.д., а также что это значение из себя представляет. Толи это Byte, толи Single, а толи String.
Как же превратить этот массив в нужные нам значения?
Очень просто.
Эси это байт, то тупо присваиваем переменной типа Byte значение из массива, например A=D(1)
Если это Word или Integer, то B=MakeInt(D(3),D(2))
Если это Single.
  Tmp=VarPtr(VarSingle)
         For i = N to N + 3
            Out Tmp , D(i)
            Incr Tmp
         Next
В результате в переменной VarSingle будет значение.
По моему проще некуда.

Отредактировано sva-don (2019-06-21 09:55:53)

+3

57

Nord написал(а):

Printbin &HF8 ; &H04 ; &H00 ; &H00 ; &H00 ; &H0A ; &H64 ; &H64 ;
Только, как требует даташит, посылка должна заканчиваться кодами 13 и 10 (DEC).
Поэтому добавляем еще строку:
Print

Читаем Help:

When you end a line with a semicolon, no linefeed and carriage return will be added.

Перевод:

Когда вы заканчиваете строку точкой с запятой, перевод строки и возврат каретки не добавляются.

Достаточно убрать последнюю точку с запятой.

olegkaras написал(а):

Тогда как быть если у меня переменная состоит из масива F8 04 14 08 E7 00 77 00 00 00 BA 00 00 00 1B 00 00 01 F4 00 45 00 00 , то как извлечь из этого блока определенные данные ?

Если бы вы хотя бы чуть-чуть почитали форум, не говоря уже о ХЕЛПЕ, то большинство вопросов разрешились бы сами собой. Но видимо вы привыкли на все готовенькое. Вот этим кодом я принимаю 10-ти байтную посылку от ДФплеера. Что мешает вам переделать этот код под себя?  Но, я уверен, вы этот пример даже не видели.

+1

58

Andrusha написал(а):

Читаем Help:
...
Достаточно убрать последнюю точку с запятой

Согласен "на все 100", только, если вы заметили, я стараюсь не давать готовых решений, а подтолкнуть собеседника к поиску. ;)
Потому иногда распыляюсь... ;)

Andrusha написал(а):

olegkaras написал(а):
...
Если бы вы хотя бы чуть-чуть почитали форум, не говоря уже о ХЕЛПЕ, то большинство вопросов разрешились бы сами собой.

Плюсуюсь ;)
Уже сколько было предложено, а строка так и не разжевана... ;)

Интересно, как мне удается уже больше года принимать и разбирать по три блока по 48 байт в каждом с каждого устройства (УПП в РВ оболочке) в шахте модулями НС-12 ? ;)
Питающее напряжение, напряжение при запуске, токи пусковые и номинальные, температура двигателей и воздуха, время выхода из пускового режима, длина шагов нарастания частоты, текущее время, время по режимам...

+1

59

Как строку Vxod = &H08 ; &H98 превратить в число ? Должно быть 2200 а у меня получается Вольты_число = 3553

Vxod = Mid(vxod , 4 , 2)                                 
  Вольты_число = Hexval(vxod)

Отредактировано olegkaras (2019-06-26 22:27:57)

0

60

olegkaras написал(а):

Как строку Vxod = &H08 ; &H98 превратить в число ?
Должно быть 2200 а у меня получается
Вольты_число = 3553
Vxod = Mid(vxod , 4 , 2)
Вольты_число = Hexval(vxod)

1. Попробуйте подключить $lib "hexval.lbx"
2. Убедитесь, что MID считывает именно те позиции, которые нужны.

PS. Только что попробовал - указанный код считает правильно...

0