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

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

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

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



PZEM-004T

Сообщений 151 страница 180 из 302

151

Если передаём 25 знаков (строка), то обязательно делаем +1 байт, т.к. баском для конца строки использует 0.
Следовательно, если передаём именно данные (где может быть и 0 в данных), то лучше делать передачу через массив с оверлеем на строковую переменную (с правилами описанными выше).

зы: а глюки в передачи данных - это верный признак того, что передача/приём сбивается внешним процессом. Тут либо на время передачи запрещаем прерывания, либо используем аппаратный буфер МК (если он есть).

0

152

Почему с этим уартом такие проблемы ?  Как то этот пзэмец 004т  с Ардуино работает и ни чего не мешает ,а тут то конец строки не тот  8-) то ещё что то танцевать мешает .

0

153

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

Почему с этим уартом такие проблемы ?

Это не с UART проблемы, а с разбором принимаемого.
UART, особенно "железный", работает "железно".

Как-то от Nextion обрабатываю строки по 25...30 символов и все нормально... ;)

Отредактировано Nord (2020-02-15 23:16:14)

+1

154

Подскажите как регистры UDR сбросить на 0 ?

0

155

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

Подскажите как регистры UDR сбросить на 0 ?

Любое действие с записью в этот регистр будет провоцировать передачу по UART.
Полистайте про бит UDRE регистра UCSRA.

0

156

Можно как то разобрать массив без оверлей ?

Отредактировано olegkaras (2020-02-28 13:19:49)

0

157

В байтовый массив или в отдельные байты.

0

158

(Dim Pzem(25) As Byte) = F8041408988BF800017A7D0003073D000001F4005F0000930E

вырезать скажем 0898 и перевести в число должно получится 2200, эти оверлей как ложка дехтя, всю картину портят .

0

159

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

(Dim Pzem(25) As Byte) = F8041408988BF800017A7D0003073D000001F4005F0000930E
            вырезать скажем 0898 и перевести в число должно получится 2200, эти оверлей как ложка дехтя, всю картину портят .

Используйте позиции в массиве.

Значение "08" будет в Pzem(4).
Значение "98" будет в Pzem(5).

Выполняем:
(Pzem(4) * 256) + Pzem(5) = 2200... ;)

А в чем затыка с оверлеями-то ? ;)
Объявляем:
Dim A As Word
Dim A1 As Byte At A + 0 Overlay
Dim А2 As Byte At A + 1 Overlay

.....
Выбираем из массива:
A1 = Pzem(4)
A2 = Pzem(5)...  Все !

В переменной А будет 2200... ;)

Отредактировано Nord (2020-02-28 14:15:32)

0

160

А если 08 переведено уже в десятичное число и 98 то из них можно как то получить результат ?

0

161

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

А если 08 переведено уже в десятичное число и 98 то из них можно как то получить результат ?

(8 * 256) + 152...
;)

+1

162

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

Отредактировано olegkaras (2020-02-28 14:17:56)

0

163

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

Проблема в том что если по уарт приходит мусор...

Для контроля за мусором есть CRC, в вашем случае - последние два байта.
F8041408988BF800017A7D0003073D000001F4005F0000930E

После приема строки - считаете CRC для принятого, сравниваете с указанными байтами.
Если не сходится, то принятые значения не принимать.
Методику подсчета CRC для этого модуля я не знаю. ;)

Проще избавиться от мусора (найти причину его появления).

0

164

Мусор , похоже появляется если строка больше отмерянных 25. Я не пойму почему страдают переменные которые не какого отношения не имеют к приему.

0

165

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

(8 * 256) + 152...

А четыре числа как сложить?

0

166

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

Мусор , похоже появляется если строка больше отмерянных 25. Я не пойму почему страдают переменные которые не какого отношения не имеют к приему.

Ну проходили же уже... ;)
Приняли 25 байтов, начинаете обрабатывать, а тут еще 10 (допустим) прилетают...
Эти 10 и портят, т.к. считаются принятой строкой и попадают в обработку.

Установите размер приема 25 байт.
Принятый объем меньше или больше этого - не обрабатывать.

0

167

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

А четыре числа как сложить?

1024 * A + 512 * B + 256 * C + D = ....

0

168

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

1024 * A + 512 * B + 256 * C + D

8 + 9 + 10 бит?
Обычно выполняют сдвиг на 8, 16  и 24 бита. То есть.

Код:
Result = a<<24 | b<<16 | c<<8 | d

В баскоме код будет иметь другой вид.

0

169

Пётр написал(а):

8 + 9 + 10 бит?

Нет, тут непонятное (лично мне) желание уйти от оверлеев... ;)
Два или четыре байта положить в Word или в Dword соответственно.

0

170

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

Я не пойму почему страдают переменные которые не какого отношения не имеют к приему.


Потому, что идёт накладка переменных !

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

0

171

ТАК работает
Код:
'===============================================================================

  Const Simulation = 0

  Const Const_bootloader = 123



  $map                                                      ' Получаем карту распределения памяти компилятором Bascom
  $regfile = "m128def.dat"                                  ' Используемый контроллер
  $crystal = 16000000                                       ' 8 МГц    , кварц для стабильной работы USART во всём диапазоне скоростей передачи и приёма
  $framesize = 128                                          'размер области используемой и необходимой для преобразований
  $hwstack = 128                                            ' Размер аппаратного стека
  $swstack = 128                                            ' Размер программного стека


  Const Const_baud_usart_0 = 9600                           ' Скорость трансляции USART_0

  Const Usart_0_amount_rxd_symbols = 25                     'Количество принимаех символов

  Const Usart_0_const_size_buffer = 100                     ' Размер буферов приёма и передачи, USART_0

  Const Usart_0_input_const_size_buffer = 100               ' Размер буферов приёма и передачи, USART_0

  Config Com1 = Const_baud_usart_0 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
  'Ucsr0a.1 = 1       ' Двойная скорость работы USART, скорость трансляции = $baud * 2

'---------------  Обработчики прерываний USART_0  ------------------------------
  On Urxc Usart_0_input_data                                'Nosave       ' Переход на подпрограмму обработки прерывания после окончания приёма данных по USART


 '------------------------------- Setup -----------------------------------------
$lib "glcd-Nokia1616ap.lib"
Config Graphlcd = Color , Cs1 = Porte.7 , Si = Portb.2 , Sclk = Portb.1 , Rst = Portb.3

Const Portrait = 1                                          '1=Portrait, 0=Landscape
Const Rotate_180 = 0                                        '1=Rotated,  0=Not Rotated

'------------------- Variables & Constants -------------------------------------
Const Blue = &B00000011                                     ''predefined contants are making programming easier
Const Yellow = &B11111100
Const Red = &B11100000
Const Green = &B00011100
Const Black = &B00000000
Const White = &B11111111
Const Brightgreen = &B00111110
Const Darkgreen = &B00010100
Const Darkred = &B10100000
Const Darkblue = &B00000010
Const Brightblue = &B00011111
Const Orange = &B11111000
Const Violet = &B11100011



'*******************************************************************************
'*******************************************************************************


'-----------------  Используемые переменные USART_0  ---------------------------
  Dim Usart_0_flag_resived_usart As Byte                    ' Флаг сигнализирующий о том, что идёт приём по USART_0
  Dim Usart_0_flag_data_input As Byte                       ' Флаг сигнализирующий о том, что приняты ноые данные по USART_0
  Dim Usart_0_flag_transmitted As Byte                      ' Флаг сигнализирующий о том, что идёт передача по USART_0
  Dim Usart_0_count_transmitter As Byte                     ' Считаем количество переданных символов по USART_0
  Dim Usart_0_count_received_symbols As Byte                ' Считаем количество принятых символов

  Dim Temp_usart_0_count_rxd_symbols As Byte                ' Временно считаем количество принятых символов

  Dim Temp_usart_0_input_buffer_str As String * Usart_0_input_const_size_buffer
  Dim Temp_usart_0_input_buffer_byte(usart_0_input_const_size_buffer) As Byte At Temp_usart_0_input_buffer_str Overlay

  Dim Usart_0_input_buffer_str As String * Usart_0_input_const_size_buffer
  Dim Usart_0_input_buffer_byte(usart_0_input_const_size_buffer) As Byte At Usart_0_input_buffer_str Overlay

 Dim Usart_0_output_buffer_str As String * Usart_0_const_size_buffer       ' Строковый буфер приёма USART_0

  Dim Usart_0_temp_rxd_str As String * Usart_0_const_size_buffer


  Dim Temp_udr_0 As Byte
  Dim Count_usart_0 As Byte
  Dim Temp_count_usart_0 As Byte


  Dim Pzem(25) As Byte




  Dim I As Byte
  Dim Напряжение_pze As Integer

  Dim Ток_pze_ind As Dword

  Dim КВТ_ч_pze_ind As Dword

  Dim Мощность_pze_ind As Dword


  Dim Частота_pze As Word
  Dim косф_pze_ind As Dword

  Dim Strin_univ As String * 8
  Dim Номер_ат_pzem_004t As Byte
  Dim Пауза_pzem_004t As Byte
  Dim 12_раз As Byte
  Dim КОНТРОЛЬ As Byte
  'Dim напряжение As String * 25

  Dim Buff_str_1  As String * 3
  Dim Buff_str_2 As String * 3
  Dim Buff_str_3 As String * 3
  Dim Buff_str_4  As String * 3
  Dim Buff_str_5  As String * 3
  Dim A as word
  Dim B as word
  Dim C as word
  Dim D as word
  Dim X1 as word
  Dim X2 as word
  Dim X3 as word
  '===============================================================================
'--------------  Разрешаем работу необходимых прерываний  ----------------------
'===============================================================================

  Gosub Usart_0_clearing_buffer_receive

'------------  Разрешаем работу всех включенных прерываний  --------------------
  Enable Interrupts
'===============================================================================

'         Предварительная проверка и запуск

'===============================================================================

 ' Print "Начало программы"
   Cls                                                      ' Очищаем LCD
    Setfont Color8x8_rus
'===============================================================================

'                   Г Л А В Н Ы Й         Ц И К Л
  Main:


          If Usart_0_flag_data_input > 0 Then

              For Count_usart_0 = 1 To Usart_0_amount_rxd_symbols

    '##################################################################################################

                  Pzem(count_usart_0) = Usart_0_input_buffer_byte(count_usart_0)

    '##################################################################################################
                 reset Udr '[color=red]без этого строка сдвигается на три байта в вправо[/color]
              Next Count_usart_0

              Gosub Usart_0_clearing_buffer_receive


              Usart_0_flag_data_input = 0

          End If

   'Printbin &HF8 ; &H04 ; &H00 ; &H00 ; &H00 ; &H0A ; &H64 ; &H64

   If  Номер_ат_pzem_004t = 0 Then
   Номер_ат_pzem_004t = 1

    Printbin &HF8 ; &H04 ; &H00 ; &H00 ; &H00 ; &H0A ; &H64 ; &H64
End If

If Пауза_pzem_004t < 30 Then Пауза_pzem_004t = Пауза_pzem_004t + 1

If Пауза_pzem_004t > 29 Then
Пауза_pzem_004t = 0
Номер_ат_pzem_004t = 0
End If

'напряжение = Pzem

'УЗНАЕМ НАПРЯЖЕНИЕ
Buff_str_1 = str(Pzem(4))
Buff_str_2 = str(Pzem(5))
A=VAL(Buff_str_1)
B=VAL(Buff_str_2)
напряжение_pze = A*256
напряжение_pze = напряжение_pze+B



'УЗНАЕМ ТОК
Buff_str_1 = str(Pzem(6))
Buff_str_2 = str(Pzem(7))
Buff_str_3 = str(Pzem(8))
Buff_str_4 = str(Pzem(9))
A=VAL(Buff_str_3)
B=VAL(Buff_str_4)
C=VAL(Buff_str_1)
D=VAL(Buff_str_2)
X1=1024*A
X2=512*B
X3=256*C
X3=X3+D
X1=X1+X2
ток_pze_ind=X1+X3

'УЗНАЕМ МОЩНОСТЬ
Buff_str_1 = str(Pzem(10))
Buff_str_2 = str(Pzem(11))
Buff_str_3 = str(Pzem(12))
Buff_str_4 = str(Pzem(13))
A=VAL(Buff_str_3)
B=VAL(Buff_str_4)
C=VAL(Buff_str_1)
D=VAL(Buff_str_2)
X1=1024*A
X2=512*B
X3=256*C
X3=X3+D
X1=X1+X2
мощность_pze_ind=X1+X3

'УЗНАЕМ квт*Ч
Buff_str_1 = str(Pzem(14))
Buff_str_2 = str(Pzem(15))
Buff_str_3 = str(Pzem(16))
Buff_str_4 = str(Pzem(17))
A=VAL(Buff_str_3)
B=VAL(Buff_str_4)
C=VAL(Buff_str_1)
D=VAL(Buff_str_2)
X1=1024*A
X2=512*B
X3=256*C
X3=X3+D
X1=X1+X2
КВТ_ч_pze_ind=X1+X3
   ' Частота_pze = Частота
'УЗНАЕМ ЧАСТОТУ
Buff_str_1 = str(Pzem(18))
Buff_str_2 = str(Pzem(19))
A=VAL(Buff_str_1)
B=VAL(Buff_str_2)
Частота_pze = A*256
Частота_pze = Частота_pze+B
'УЗНАЕМ КОСФ
Buff_str_1 = str(Pzem(20))
Buff_str_2 = str(Pzem(21))
A=VAL(Buff_str_1)
B=VAL(Buff_str_2)
косф_pze_ind = A*256
косф_pze_ind = косф_pze_ind+B


Strin_univ = Str(напряжение_pze)                         'выводим на ЛСД  напряжениЕ :
Strin_univ = Format(strin_univ , "000.0")
Lcdat 1 , 1 , Strin_univ , Orange , Blue


  Strin_univ = Str(ток_pze_ind)                             'выводим на ЛСД ток :
Strin_univ = Format(strin_univ , "000.000")
Lcdat 9 , 1 , Strin_univ , Orange , Blue

Strin_univ = Str(мощность_pze_ind)                          'выводим на ЛСД мощность :
Strin_univ = Format(strin_univ , "00000.0")
Lcdat 17 , 1 , Strin_univ , Orange , Blue

Strin_univ = Str(КВТ_ч_pze_ind)                          'выводим на ЛСД квт*ч :
Strin_univ = Format(strin_univ , "0000.00")
Lcdat 25 , 1 , Strin_univ , Orange , Blue

Strin_univ = Str(Частота_pze)                          'выводим на ЛСД частоту  :
Strin_univ = Format(strin_univ , "00.0")
Lcdat 33 , 1 , Strin_univ , Orange , Blue

Strin_univ = Str(косф_pze_ind)                          'выводим на ЛСД косф :
Strin_univ = Format(strin_univ , "0.00")
Lcdat 41 , 1 , Strin_univ , Orange , Blue


КОНТРОЛЬ=КОНТРОЛЬ+1

Strin_univ = Str(Пауза_pzem_004t)                          'выводим на ЛСД минимальную уставку по напряжению :
Strin_univ = Format(strin_univ , "000")
Lcdat 49 , 1 , Strin_univ , Orange , Blue
   'Idle                                                     ' Отправляем МК на тихий час
'===============================================================================



  Goto Main


 End
'===============================================================================





'===============================================================================
  Usart_0_clearing_buffer_receive:
'-------------------------------------------------------------------------------
    For Count_usart_0 = 1 To Usart_0_count_received_symbols
        Usart_0_input_buffer_byte(count_usart_0) = 0
    Next Count_usart_0

    Usart_0_count_received_symbols = 0                      ' Сбрасываем счётчик принятых символов USART_0
    Usart_0_flag_data_input = 0
    Usart_0_flag_resived_usart = 0
      Enable Urxc
'-------------------------------------------------------------------------------
  Return
'===============================================================================




'===============================================================================
  Usart_0_input_data:
'-------------------------------------------------------------------------------
    Temp_udr_0 = Udr



    Usart_0_flag_resived_usart = 1

   Input_sumbol:
    Incr Usart_0_count_received_symbols

    Temp_usart_0_input_buffer_byte(usart_0_count_received_symbols) = Temp_udr_0

    If Usart_0_count_received_symbols => Usart_0_amount_rxd_symbols Then
       Disable Interrupts
        !lds R16 , Ucsr0b
    !andi R16 , &B_0111_1111
    !sts Ucsr0b , R16


        Goto Copy_bufer_usart
    End If



   Exit_input_data_usart:

'-------------------------------------------------------------------------------
  Return
'===============================================================================
  Copy_bufer_usart:
'-------------------------------------------------------------------------------
    Disable Urxc

    For Count_usart_0 = 1 To Usart_0_count_received_symbols
        Usart_0_input_buffer_byte(count_usart_0) = Temp_usart_0_input_buffer_byte(count_usart_0)
        Temp_usart_0_input_buffer_byte(count_usart_0) = 0
    Next Count_usart_0

    Usart_0_flag_resived_usart = 0
    Usart_0_flag_data_input = 1

      Goto Exit_input_data_usart




   '--------------------  Используемые шрифты  ----------------------------------------
'=================================================

$include "color8x8_RUS.font"
'$include "font8x12rus.font"
'$include "color16x16RUS3.font"
'$include "Color8x8.font"

  '=================================================

reset Udr 'без этого строка сдвигается на три байта в вправо

ТАК не работает
Код:
'===============================================================================

  Const Simulation = 0

  Const Const_bootloader = 123



  $map                                                      ' Получаем карту распределения памяти компилятором Bascom
  $regfile = "m128def.dat"                                  ' Используемый контроллер
  $crystal = 16000000                                       ' 8 МГц    , кварц для стабильной работы USART во всём диапазоне скоростей передачи и приёма
  $framesize = 128                                          'размер области используемой и необходимой для преобразований
  $hwstack = 128                                            ' Размер аппаратного стека
  $swstack = 128                                            ' Размер программного стека


  Const Const_baud_usart_0 = 9600                           ' Скорость трансляции USART_0

  Const Usart_0_amount_rxd_symbols = 25                     'Количество принимаех символов

  Const Usart_0_const_size_buffer = 100                     ' Размер буферов приёма и передачи, USART_0

  Const Usart_0_input_const_size_buffer = 100               ' Размер буферов приёма и передачи, USART_0

  Config Com1 = Const_baud_usart_0 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
  'Ucsr0a.1 = 1       ' Двойная скорость работы USART, скорость трансляции = $baud * 2

'---------------  Обработчики прерываний USART_0  ------------------------------
  On Urxc Usart_0_input_data                                'Nosave       ' Переход на подпрограмму обработки прерывания после окончания приёма данных по USART


 '------------------------------- Setup -----------------------------------------
$lib "glcd-Nokia1616ap.lib"
Config Graphlcd = Color , Cs1 = Porte.7 , Si = Portb.2 , Sclk = Portb.1 , Rst = Portb.3

Const Portrait = 1                                          '1=Portrait, 0=Landscape
Const Rotate_180 = 0                                        '1=Rotated,  0=Not Rotated

'------------------- Variables & Constants -------------------------------------
Const Blue = &B00000011                                     ''predefined contants are making programming easier
Const Yellow = &B11111100
Const Red = &B11100000
Const Green = &B00011100
Const Black = &B00000000
Const White = &B11111111
Const Brightgreen = &B00111110
Const Darkgreen = &B00010100
Const Darkred = &B10100000
Const Darkblue = &B00000010
Const Brightblue = &B00011111
Const Orange = &B11111000
Const Violet = &B11100011



'*******************************************************************************
'*******************************************************************************


'-----------------  Используемые переменные USART_0  ---------------------------
  Dim Usart_0_flag_resived_usart As Byte                    ' Флаг сигнализирующий о том, что идёт приём по USART_0
  Dim Usart_0_flag_data_input As Byte                       ' Флаг сигнализирующий о том, что приняты ноые данные по USART_0
  Dim Usart_0_flag_transmitted As Byte                      ' Флаг сигнализирующий о том, что идёт передача по USART_0
  Dim Usart_0_count_transmitter As Byte                     ' Считаем количество переданных символов по USART_0
  Dim Usart_0_count_received_symbols As Byte                ' Считаем количество принятых символов

  Dim Temp_usart_0_count_rxd_symbols As Byte                ' Временно считаем количество принятых символов

  Dim Temp_usart_0_input_buffer_str As String * Usart_0_input_const_size_buffer
  Dim Temp_usart_0_input_buffer_byte(usart_0_input_const_size_buffer) As Byte At Temp_usart_0_input_buffer_str Overlay

  Dim Usart_0_input_buffer_str As String * Usart_0_input_const_size_buffer
  Dim Usart_0_input_buffer_byte(usart_0_input_const_size_buffer) As Byte At Usart_0_input_buffer_str Overlay

 Dim Usart_0_output_buffer_str As String * Usart_0_const_size_buffer       ' Строковый буфер приёма USART_0

  Dim Usart_0_temp_rxd_str As String * Usart_0_const_size_buffer


  Dim Temp_udr_0 As Byte
  Dim Count_usart_0 As Byte
  Dim Temp_count_usart_0 As Byte


  Dim Pzem(25) As Byte
  Dim напряжение_сырое As Word
Dim A4 As Byte At напряжение_сырое + 0 Overlay
Dim A5 As Byte At напряжение_сырое + 1 Overlay
 Dim ток_сырой As DWord
Dim A8 As Byte At ток_сырой + 0 Overlay
Dim A9 As Byte At ток_сырой + 1 Overlay
Dim A6 As Byte At ток_сырой + 2 Overlay
Dim A7 As Byte At ток_сырой + 3 Overlay
 Dim мощность_сырая As DWord
Dim A12 As Byte At мощность_сырая + 0 Overlay
Dim A13 As Byte At мощность_сырая + 1 Overlay
Dim A10 As Byte At мощность_сырая + 2 Overlay
Dim A11 As Byte At мощность_сырая + 3 Overlay
 Dim энергия As DWord
Dim A16 As Byte At энергия + 0 Overlay
Dim A17 As Byte At энергия + 1 Overlay
Dim A14 As Byte At энергия + 2 Overlay
Dim A15 As Byte At энергия + 3 Overlay
 Dim частота_сырая As Word
Dim A18 As Byte At частота_сырая + 0 Overlay
Dim A19 As Byte At частота_сырая + 1 Overlay
 Dim косинус_сырой As Word
Dim A20 As Byte At косинус_сырой + 0 Overlay
Dim A21 As Byte At косинус_сырой + 1 Overlay
 Dim напряжение As Single
Dim ток As Single
Dim мощность As Single
Dim частота As Single
Dim косинус As Single




  Dim I As Byte
  Dim Напряжение_pze As Integer

  Dim Ток_pze_ind As Dword

  Dim КВТ_ч_pze_ind As Dword

  Dim Мощность_pze_ind As Dword


  Dim Частота_pze As Word
  Dim косф_pze_ind As Dword

  Dim Strin_univ As String * 8
  Dim Номер_ат_pzem_004t As Byte
  Dim Пауза_pzem_004t As Byte
  Dim 12_раз As Byte
  Dim КОНТРОЛЬ As Byte
  'Dim напряжение As String * 25


  '===============================================================================
'--------------  Разрешаем работу необходимых прерываний  ----------------------
'===============================================================================

  Gosub Usart_0_clearing_buffer_receive

'------------  Разрешаем работу всех включенных прерываний  --------------------
  Enable Interrupts
'===============================================================================

'         Предварительная проверка и запуск

'===============================================================================

 ' Print "Начало программы"
   Cls                                                      ' Очищаем LCD
    Setfont Color8x8_rus
'===============================================================================

'                   Г Л А В Н Ы Й         Ц И К Л
  Main:


          If Usart_0_flag_data_input > 0 Then

              For Count_usart_0 = 1 To Usart_0_amount_rxd_symbols

    '##################################################################################################

                  Pzem(count_usart_0) = Usart_0_input_buffer_byte(count_usart_0)

    '##################################################################################################
                 'reset Udr
              Next Count_usart_0

              Gosub Usart_0_clearing_buffer_receive


              Usart_0_flag_data_input = 0

          End If

   'Printbin &HF8 ; &H04 ; &H00 ; &H00 ; &H00 ; &H0A ; &H64 ; &H64

   If  Номер_ат_pzem_004t = 0 Then
   Номер_ат_pzem_004t = 1

    Printbin &HF8 ; &H04 ; &H00 ; &H00 ; &H00 ; &H0A ; &H64 ; &H64
End If

If Пауза_pzem_004t < 30 Then Пауза_pzem_004t = Пауза_pzem_004t + 1

If Пауза_pzem_004t > 29 Then
Пауза_pzem_004t = 0
Номер_ат_pzem_004t = 0
End If




A4 = Pzem(4) : A5 = Pzem(5) : A6 = Pzem(6) : A7 = Pzem(7) : A8 = Pzem(8)
A9 = Pzem(9) : A10 = Pzem(10) : A11 = Pzem(11) : A12 = Pzem(12) : A13 = Pzem(13)
A14 = Pzem(14) : A15 = Pzem(15) : A16 = Pzem(16) : A17 = Pzem(17)
A18 = Pzem(18) : A19 = Pzem(19) : A20 = Pzem(20) : A21 = Pzem(21)
 напряжение = напряжение_сырое / 10
ток = ток_сырой / 1000
мощность = мощность_сырая / 10
частота = частота_сырая / 10
косинус = косинус_сырой / 100




Strin_univ = Str(напряжение)                         'выводим на ЛСД  напряжениЕ :
Strin_univ = Format(strin_univ , "000.0")
Lcdat 1 , 1 , Strin_univ , Orange , Blue


  Strin_univ = Str(ток)                             'выводим на ЛСД ток :
Strin_univ = Format(strin_univ , "000.000")
Lcdat 9 , 1 , Strin_univ , Orange , Blue

Strin_univ = Str(мощность)                          'выводим на ЛСД мощность :
Strin_univ = Format(strin_univ , "00000.0")
Lcdat 17 , 1 , Strin_univ , Orange , Blue

Strin_univ = Str(энергия)                          'выводим на ЛСД квт*ч :
Strin_univ = Format(strin_univ , "0000.00")
Lcdat 25 , 1 , Strin_univ , Orange , Blue

Strin_univ = Str(Частота)                          'выводим на ЛСД частоту  :
Strin_univ = Format(strin_univ , "00.0")
Lcdat 33 , 1 , Strin_univ , Orange , Blue

Strin_univ = Str(косинус)                          'выводим на ЛСД косф :
Strin_univ = Format(strin_univ , "0.00")
Lcdat 41 , 1 , Strin_univ , Orange , Blue


КОНТРОЛЬ=КОНТРОЛЬ+1

Strin_univ = Str(Пауза_pzem_004t)                          'выводим на ЛСД минимальную уставку по напряжению :
Strin_univ = Format(strin_univ , "000")
Lcdat 49 , 1 , Strin_univ , Orange , Blue
   'Idle                                                     ' Отправляем МК на тихий час
'===============================================================================



  Goto Main


 End
'===============================================================================





'===============================================================================
  Usart_0_clearing_buffer_receive:
'-------------------------------------------------------------------------------
    For Count_usart_0 = 1 To Usart_0_count_received_symbols
        Usart_0_input_buffer_byte(count_usart_0) = 0
    Next Count_usart_0

    Usart_0_count_received_symbols = 0                      ' Сбрасываем счётчик принятых символов USART_0
    Usart_0_flag_data_input = 0
    Usart_0_flag_resived_usart = 0
      Enable Urxc
'-------------------------------------------------------------------------------
  Return
'===============================================================================




'===============================================================================
  Usart_0_input_data:
'-------------------------------------------------------------------------------
    Temp_udr_0 = Udr



    Usart_0_flag_resived_usart = 1

   Input_sumbol:
    Incr Usart_0_count_received_symbols

    Temp_usart_0_input_buffer_byte(usart_0_count_received_symbols) = Temp_udr_0

    If Usart_0_count_received_symbols => Usart_0_amount_rxd_symbols Then
       Disable Interrupts
        !lds R16 , Ucsr0b
    !andi R16 , &B_0111_1111
    !sts Ucsr0b , R16


        Goto Copy_bufer_usart
    End If



   Exit_input_data_usart:

'-------------------------------------------------------------------------------
  Return
'===============================================================================
  Copy_bufer_usart:
'-------------------------------------------------------------------------------
    Disable Urxc

    For Count_usart_0 = 1 To Usart_0_count_received_symbols
        Usart_0_input_buffer_byte(count_usart_0) = Temp_usart_0_input_buffer_byte(count_usart_0)
        Temp_usart_0_input_buffer_byte(count_usart_0) = 0
    Next Count_usart_0

    Usart_0_flag_resived_usart = 0
    Usart_0_flag_data_input = 1

      Goto Exit_input_data_usart




   '--------------------  Используемые шрифты  ----------------------------------------
'=================================================

$include "color8x8_RUS.font"
'$include "font8x12rus.font"
'$include "color16x16RUS3.font"
'$include "Color8x8.font"

  '=================================================

И увеличение САБ буфера  :nope: не помогает , переменные такие как Номер_ат_pzem_004t живут своей жизнью. Вот и ухожу от этих оверлаев.

Отредактировано olegkaras (2020-02-29 17:01:09)

0

172

Не работает в каком месте ?

Странно с вычислениями...
Ведь это (выделено) - из учебника по информатике ;)

'УЗНАЕМ НАПРЯЖЕНИЕ
Buff_str_1 = str(Pzem(4))
Buff_str_2 = str(Pzem(5))
A=VAL(Buff_str_1)
B=VAL(Buff_str_2)
напряжение_pze = A*256
напряжение_pze = напряжение_pze+B

...и это (для "взрослых дядей и тётей" ;) )

Dim напряжение_сырое As Word
Dim A4 As Byte At напряжение_сырое + 0 Overlay
Dim A5 As Byte At напряжение_сырое + 1 Overlay

A4 = Pzem(4) : A5 = Pzem(5)
напряжение = напряжение_сырое / 10

...по сути идентичные операции.

Разница в этом непонятном это преобразовании:
Buff_str_1 = str(Pzem(4))
Buff_str_2 = str(Pzem(5))
A=VAL(Buff_str_1)
B=VAL(Buff_str_2)

Байт преобразовать в строку, затем снова в байт...
Ведь в массиве Pzem(хх) окромя байтов ничего изначально быть не может,
т.к. объявлено Dim Pzem(25) As Byte ;)

Делайте сразу:
напряжение_pze = Pzem(4)*256
напряжение_pze = напряжение_pze+Pzem(5)

Отредактировано Nord (2020-02-29 18:29:40)

+1

173

http://forumfiles.ru/uploads/0000/25/b8/1111/t26220.jpg
Вот выписка из протеуса - тот код что не работает.

Отредактировано olegkaras (2020-02-29 20:39:51)

0

174

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

Делайте сразу:
напряжение_pze = Pzem(4)*256
напряжение_pze = напряжение_pze+Pzem(5)


Да , действительно так проще .

+1

175

< 10 кВтч, единица дисплея - Wh (1 кВт = 1000 Вт), например: 9999 Вт
≥10кВтч, единица дисплея - кВтч, например: 9999,99 кВтч

< 1000 Вт, отображается один десятичный знак, например: 999,9 Вт
≥1000 Вт, отображается только целое число, например: 1000 Вт

Математики подскажите каким образом это в баскоме определить когда точку ставить ?

Отредактировано olegkaras (2020-02-29 21:35:12)

0

176

Функция Format вам в помощь.

0

177

1.Как эту строку правильно перевести в число?   00 02 4C 73
1024 * A + 512 * B + 256 * C + D = .... - так не получается.
ЕКСЕЛЬ переводит ее в число 150643 так и должно быть .
У меня получается так :
02 - в дес 2
4С - в дес 76
73 - в дес 115
(76*256)+115=19571
(2*512)+19571=20592
Что не так ?

2. Как из числа 10007 получить 1001 , последний разряд отнять окрулив его до 1 и поставить в место предпоследнего разряда , как то так считается мощность и энергия.

0

178

Как эту строку правильно перевести в число?   00 02 4C 73

A=VAL(...)
А дальше - по накатанной. ;)

мощность = мощность / 10
мощность = ROUND( мощность )
Переменная "мощность" должна быть SINGLE !

0

179

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

1024 * A + 512 * B + 256 * C + D = .... - так не получается.

Я писал почему. PZEM-004T
Для каждого байта нужно 8 бит, т. е. сдвиг на число кратное 8. То что предложил Nord работать не будет.

0

180

1024 * A + 512 * B + 256 * C + D = .... - так не получается.

Потому, что нарушена последовательность подстановки... ;)
Должно быть: 1024 * C + 512 * D + 256 * A + B

То что предложил Nord работать не будет.

Отчего ? ;)
Калькулятор правильно считает...
Excel тот же результат выдает...
В Bascom другая арифметика ? ;)

0