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

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

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

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



PZEM-004T

Сообщений 121 страница 150 из 153

121

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

Аргументируйте ?

Это моё личное мнение.
Я редко пишу на ассемблере. Так в лом разбираться в этих регистрах и переходах. Хотя знаю его и иногда использую.

0

122

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

0

123

sva-don написал(а):

И что это мы привязались именно к 25 символам.

По теме - требуется 25... ;)
Я начинал "испытания" с 4-х, пробовал и строку из 50-ти.

В любом случае, хоть у меня, хоть у Александра, хоть у вас - прием идет по требуемому количеству. ;)

0

124

приемник из 110 поста на Bascom

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

  Const Simulation = 0

  Const Const_bootloader = 123

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

  Const Const_baud_usart_0 = 230400       ' Скорость трансляции 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

'-----------------  Используемые переменные 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

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

  Gosub Usart_0_clearing_buffer_receive

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

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

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

  Print "Начало программы"

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

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

          If Usart_0_flag_data_input > 0 Then

              Print "Count " ; Usart_0_count_received_symbols

              Temp_count_usart_0 = Usart_0_amount_rxd_symbols - 1

              For Count_usart_0 = 1 To Temp_count_usart_0
                  Print Hex(usart_0_input_buffer_byte(count_usart_0));
              Next Count_usart_0

              Print Hex(usart_0_input_buffer_byte(usart_0_amount_rxd_symbols))

              Gosub Usart_0_clearing_buffer_receive

              Usart_0_flag_data_input = 0
              Goto Main
          End If



   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 = Udr0

    If Temp_udr_0 = Const_bootloader Then
        Goto Apply_bootloader
    End If

    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
        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

'===============================================================================
  Apply_bootloader:
'-------------------------------------------------------------------------------
    Config Watchdog = 16
    Reset Watchdog
    Start Watchdog

    Wait 1
'-------------------------------------------------------------------------------
  Return
'===============================================================================

0

125

Код:
'===============================================================================
  Const Simulation = 0

  $map       ' Получаем карту распределения памяти компилятором Bascom
   '$regfile = "m128Rfa1.dat"
  $regfile = "m128can.dat"
'  $regfile = "m128def.dat"
 $crystal = 16000000                                        ' Используемый контроллер
  '$crystal = 18432000                                       ' 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
'-----------------  Используемые переменные 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 Count_usart As Byte
  Dim Temp_count_usart As Byte
'===============================================================================
'--------------  Разрешаем работу необходимых прерываний  ----------------------
'===============================================================================
  Gosub Usart_0_clearing_buffer_receive
'------------  Разрешаем работу всех включенных прерываний  --------------------
  Enable Interrupts
'===============================================================================
'         Предварительная проверка и запуск
'===============================================================================
  Print "Начало программы"
'===============================================================================
'                   Г Л А В Н Ы Й         Ц И К Л
  Main:
'===============================================================================
          If Usart_0_flag_data_input > 0 Then
              Print "Count " ; Usart_0_count_received_symbols
              Temp_count_usart = Usart_0_amount_rxd_symbols - 1
              For Count_usart = 1 To Temp_count_usart
                  Print Hex(usart_0_input_buffer_byte(count_usart));
              Next Count_usart
              Print Hex(usart_0_input_buffer_byte(usart_0_amount_rxd_symbols))
              Gosub Usart_0_clearing_buffer_receive
              Usart_0_flag_data_input = 0
              Goto Main
          End If



   Idle       ' Отправляем МК на тихий час
'===============================================================================
  Goto Main
End
'===============================================================================



'===============================================================================
  Usart_0_clearing_buffer_receive:
'-------------------------------------------------------------------------------
    For Count_usart = 1 To Usart_0_count_received_symbols
        Usart_0_input_buffer_byte(count_usart) = 0
    Next Count_usart
    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:
'-------------------------------------------------------------------------------
    !Push R16
    !In R16 , Sreg
    !Push R16
    !push R17
    !push R26
    !push R27
    !IN R17 , UDR0
   'Проверка на BootLoader
    !cpi R17 , 123
    !BREQ Apply_bootloader       'Перейти если равно
   'Если не BootLoader принимаем все символы
    !ldi R16 , 1
    !sts {Usart_0_flag_resived_usart} , R16
'    !cpi R17 , 13       'Если приняли "конец строки"
'    !BREQ Exit_input_data_usart
'    !cpi R17 , 10       'Если приняли "перевод каретки"
'    !Breq Copy_bufer_usart       'Input_sumbol
   Input_sumbol:
    Loadadr Temp_usart_0_input_buffer_str , X
    !lds R16 , {usart_0_count_received_symbols}
    !add R26 , R16
    !clr R16
    !adc R27 , R16
    !ST X , R17
    !lds R16 , {Usart_0_count_received_symbols}
    !inc R16
    !sts {Usart_0_count_received_symbols} , R16
    !cpi R16 , Usart_0_amount_rxd_symbols       'Если приняли нужное количество символов
    !BRSH Copy_bufer_usart       'Перейти если равно или больше

   Exit_input_data_usart:
    !pop R27
    !pop R26
    !pop R17
    !pop R16
    !Out Sreg , R16
    !Pop R16
    !reti
'-------------------------------------------------------------------------------
  Return
'===============================================================================
  Copy_bufer_usart:
'-------------------------------------------------------------------------------
   'Запрещаем прерывания от RxD
    !lds R16 , Ucsr0b
    !andi R16 , &B_0111_1111
    !sts Ucsr0b , R16
    !push R18
    !push R30
    !push R31
    Loadadr Temp_usart_0_input_buffer_byte(1) , X
    Loadadr Usart_0_input_buffer_byte(1) , Z
    !lds R16 , {usart_0_count_received_symbols}
    !ldi R18 , 0
   Repeat_copy_sumbol:
    !ld R17 , X       'Забираем данные
    !st X+ , R18       'Пишем "0"
    !st Z+ , R17       'Сохраняем данные
    !dec R16
    !brne Repeat_copy_sumbol
    !pop R31
    !pop R30
    !pop R18
    !sts {Usart_0_flag_resived_usart} , R18
    !ldi R18 , 1
    !sts {Usart_0_flag_data_input} , R18
    !rjmp Exit_input_data_usart
'===============================================================================
  Apply_bootloader:
'-------------------------------------------------------------------------------
    Config Watchdog = 16
    Reset Watchdog
    Start Watchdog
    Wait 1
'-------------------------------------------------------------------------------
  Return
'========================================================


Я правильно подключил атмегу128 ?

Отредактировано olegkaras (2019-07-11 20:05:14)

0

126

sva-don-Ну и вот что получилось в результате. Всё прекрасно работает.

Какой у вас BASCOM ? У меня ваш пример не компилится.

0

127

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

Я правильно подключил атмегу128 ?


нет

для 128 этот вариант

0

128

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

Какой у вас BASCOM ? У меня ваш пример не компилится.

У меня 2.0.8
А какая ошибка выскакивает? Сделай скрин.
В более старых программах не компилилась строка  If Ischarwaiting() = 1 Then
Если так, то нужно сначала присвоить переменной это значение, а потом проверять.
Например так.

Dim R as Byte

R =  Ischarwaiting()
If R = 1 Then

Далее по тексту

Отредактировано sva-don (2019-07-12 10:22:05)

0

129

Где взять 2.0.8 ?http://s9.uploads.ru/t/V2dze.png

0

130

Строка 15. Должно быть:
Dim D(25) As ...

Строка 33...
Если используете COM2 (строка 11), то почему пытаетесь читать из #2 ;)

0

131

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

Где взять 2.0.8 ?

Купить.  8-)
Но этого не нужно.
Скорее всего надо было кое что поправить.
Попробуй вот так:

Код:
$regfile = "m128def.dat"                                    'Контроллер
$crystal = 16000000                                         'Определение частоты кварца
$baud = 9600                                                'Скорость обмена по COM1
$hwstack = 16                                               ' hardware stack
$swstack = 32                                               'software stack
$framesize = 64                                             'frame space
CONFIG SUBMODE = NEW

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

'---------------------------------- ПЕРЕМЕННЫЕ --------------------------------
Dim D(25) as Byte                                           'Массив для приёма
Dim i as Byte
Dim R as Byte
'---------------------------------- Подпрограммы ------------------------------
'Очистка буфера
Sub ClearBuffer
   For i = 1 to 25
      D(i) = 0
   Next i
End Sub
'------------------------------------------------ Начало работы ------------------------------------------------------------------------------------
ENABLE INTERRUPTS

Main:
   R = Ischarwaiting()
   If R = 1 Then
      Call ClearBuffer
      i = 1
      While _RS_HEAD_PTR0 <> _RS_TAIL_PTR0                  'Проверка кольцевого буфера
         D(i) = Inkey()                                     'Пишем в массив
         Incr i
         Waitms 10
      Wend
      Clear SERIALIN
'Напечатаем принятое
      For i = 1 to 25
         Print "{013}D(" ; i ; ") = " ; HEX(D(i));
      Next i
   End If

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

   End


Теперь программа переведена на Мегу128 с частотой 16 мГц и обменом по COM1.
Если не получится, то можно ещё попробовать следующее.
Убрать строку CONFIG SUBMODE = NEW
Перенести подпрограмму ClearBuffer после слова END, а перед переменными продекларировать поlпрограмму.
Declare Sub ClearBuffer

Отредактировано sva-don (2019-07-15 09:47:48)

0

132

"Братья поднебесные" кинули с доставкой модуля...
Пролежал на таможне по вине отправителя (неполный адрес получателя), был отправлен назад...
Адрес был изначально сообщен в полном объеме...

Запустил спор, тянули гады почти месяц...
Только сегодня вернули деньги...

После отпуска буду искать более адекватного продавца... ;)

0

133

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

"Братья поднебесные" кинули с доставкой модуля...
Пролежал на таможне по вине отправителя (неполный адрес получателя), был отправлен назад...
Адрес был изначально сообщен в полном объеме...

Запустил спор, тянули гады почти месяц...
Только сегодня вернули деньги...

После отпуска буду искать более адекватного продавца...

SIM900

0

134

Ссылка
Подскажите вчем дело .Если в файле "правка V12 " активна строка 146 "Printbin" то переменные такие как "Номер_am_pzem_004t" все время сбрасывается на ноль.

Отредактировано olegkaras (2020-02-01 23:44:11)

0

135

http://forumuploads.ru/uploads/0000/25/b8/1390/t67569.png

0

136

olegkaras, все ваши ссылки с переадресацией кидают меня куда-то в тьму тараканью, антивирь ругается (даже два, так как я сменил его).
Потом до бесконечности мигает "Нажмите РАЗРЕШИТЬ чтобы продолжить", экран очищается и так по кругу.
может какой-то обменник будете использовать? мне как бы не надо, но вдруг у кого-то еще такая же пурга :(

+1

137

Александр Д. написал(а):

вдруг у кого-то еще такая же пурга

У меня тоже самое! :flag:

+1

138

Все мои ссылки ведут на Гугл диск. А как по другому файл выложить ?

0

139

жпс.ру уже давно стал вирусной помойкой... ;)
С весны 2019-го уже туда - ни ногой...

0

140

sva-don написал(а):

Купить.  
Но этого не нужно.
Скорее всего надо было кое что поправить.
Попробуй вот так:

Теперь программа переведена на Мегу128 с частотой 16 мГц и обменом по COM1.
Если не получится, то можно ещё попробовать следующее.
Убрать строку CONFIG SUBMODE = NEW
Перенести подпрограмму ClearBuffer после слова END, а перед переменными продекларировать поlпрограмму.
Declare Sub ClearBuffer

Отредактировано sva-don (2019-07-15 09:47:48)

Куда в этом примере вставить свою програму чтобы она не висела если по уарт ни чего не передают, и как избавится от Waitms 10 ?

Отредактировано olegkaras (2020-02-04 20:49:47)

0

141

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

Куда в этом примере вставить свою програму чтобы она не висела если по уарт ни чего не передают, и как избавится от Waitms 10 ?

Отредактировано olegkaras (Вчера 20:49:47)

Ждём программу.

0

142

Код:

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

  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 At Pzem(4) Overlay                 'забираем 1 и 2 байт, т.к., Word - это 2 байта
  Dim Ток_1 As Word At Pzem(6) Overlay                      'забираем 3 и 4 байты, т.к., Dword - это 4 байта
  Dim Ток_2 As Word At Pzem(8) Overlay                      'забираем 3 и 4 байты, т.к., Word - это 2 байта
  Dim Мощность_1 As Word At Pzem(10) Overlay                'забираем 3 и 4 байты, т.к., Dword - это 4 байта
  Dim Мощность_2 As Word At Pzem(12) Overlay                'забираем 3 и 4 байты, т.к., Word - это 2 байта
  Dim Частота As Word At Pzem(18) Overlay                   'забираем 5 и 6 байты, т.к., Word - это 2 байта



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

  Dim Ток_pze_ind As Dword
  Dim A As Dword
  Dim Ток_pze_1 As Word At A + 0 Overlay
  Dim Ток_pze_2 As Word At A + 2 Overlay


  Dim Мощность_pze_ind As Dword
  Dim B As Dword
  Dim Мощность_pze_1 As Word At B + 0 Overlay
  Dim Мощность_pze_2 As Word At B + 2 Overlay

  Dim Частота_pze As Word

  Dim Strin_univ As String * 8
  Dim Номер_ат_pzem_004t As Byte
  Dim Пауза_pzem_004t As Byte
  Dim 12_раз As Byte
'===============================================================================
'--------------  Разрешаем работу необходимых прерываний  ----------------------
'===============================================================================

  Gosub Usart_0_clearing_buffer_receive

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

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

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

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

'                   Г Л А В Н Ы Й         Ц И К Л
  Main:
'===============================================================================
'Printbin &HF8 ; &H04 ; &H00 ; &H00 ; &H00 ; &H0A ; &H64 ; &H64
 '------------  Разрешаем работу всех включенных прерываний  --------------------
'  Enable Interrupts
'===============================================================================


          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)

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

              Next Count_usart_0

              Gosub Usart_0_clearing_buffer_receive


              Usart_0_flag_data_input = 0
              Goto Main
          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 < 60 Then Пауза_pzem_004t = Пауза_pzem_004t + 1

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




    Напряжение_pze = Напряжение
    Swap Напряжение_pze

    Ток_pze_1 = Ток_1
    Ток_pze_2 = Ток_2
    Swap Ток_pze_1
    Swap Ток_pze_2
    Ток_pze_ind = A

    Мощность_pze_1 = Мощность_1
    Мощность_pze_2 = Мощность_2
    Swap Мощность_pze_1
    Swap Мощность_pze_2
    Мощность_pze_ind = B


    Частота_pze = Частота




   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
   '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

    'If Temp_udr_0 = Const_bootloader Then
'        Goto Apply_bootloader
'    End If

    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

    'For I = 1 To 25
'      Temp_usart_0_input_buffer_byte(i) = 0
'   Next I



    Goto Exit_input_data_usart

'===============================================================================
 ' Apply_bootloader:
'-------------------------------------------------------------------------------
    'Config Watchdog = 16
'    Reset Watchdog
'    Start Watchdog

'    Wait 1
'-------------------------------------------------------------------------------
  Return
'===============================================================================


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

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

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


Вот код к нему есть вопрос. В железе и протеусе наблюдается такое. Если передавать 25 символов то кое как работает , а если скажем передавать 30 символов то строка как то сдвигается   и виснет передача строки. В роде как прием не прекращается после приема 25 строк.

Отредактировано olegkaras (2020-02-09 15:43:27)

0

143

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

Вот код к нему есть вопрос.

Для начала определитесь, какая будет максимальная длина строки и все буферы/массивы подгоните под этот размер, но с некоторым запасом.
Допустим, надо 30 символов - сделайте 32.

0

144

Строка - 25 символов , а если в место 25 ти вдруг приедет больше то это не должно выбивать контролер с колии (в друг это помеха какая то длинная). То есть идет передача 25 символов все ОК и вдруг пришло 26 , дальше 25 как положено но контроллер принимает уже с ошибками.

Отредактировано olegkaras (2020-02-09 16:40:19)

0

145

Так не принимайте больше 25.
Ограничивайте на уровне приема.

Вдогонку...
В этой (ниже) каше самому то все понятно ? ;)

Usart_0_input_data:
....
Copy_bufer_usart:
....

Например, в первой вы отключаете ВСЕ прерывания:
Disable Interrupts
Затем во второй:
Disable Urxc...

0

146

Это я пробовал отключать уарт после приема 25 символов на ни чего не вышло.

0

147

Рабочий вариант. Адаптируйте для своих нужд.
Необходимые "25" я уже вписал... ;)

Код:
Dim countsym As Byte                             ‘ Счетчик принятых символов
Dim recsym As Byte                               ‘ Принятый код символа USART
Dim buffstr As String * 25                       ‘ Буфер приема USART, 25 символов
Dim flagmess As Byte                             ‘ Флаг «Есть принятое сообщение USART»

..........

прием_UART:
recsym = UDR                                    ' Забираем содержимое аппаратного буфера USART

If countsym < 26 Then                           ' Считаем количество принятых символов
        buffstr = buffstr + Chr(recsym)         ' Если мало, то добавляем его в буфер принятого по USART сообщения
        Incr countsym                           ' Увеличиваем счетчик
Else                                            ' Иначе выключаем приём и ставим метку, что приём закончен
        Disable URXC                            ' Выключаем приём, пока не обработаем принятое сообщение
        countsym = 0                            ' Сбрасываем счётчик символов, готовим к следующему приёму
        flagmess = 1                            ' Флаг устанавливаем в 1.
End If
Return

0

148

Спасибо , протестирую , хоть уже ни в что не верю  :dontknow:

0

149

Код:
 $regfile = "m128def.dat"                                   'Контроллер
$crystal = 16000000                                         'Определение частоты кварца
$baud = 9600                                                'Скорость обмена по COM1
$hwstack = 16                                               ' hardware stack
$swstack = 32                                               'software stack
$framesize = 64                                             'frame space
Config Submode = New

'Конфигурация RS232
Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Serialin = Buffered , Size = 25

'------------------------------- 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


'------------------------------------------------ Начало работы ------------------------------------------------------------------------------------
Enable Interrupts


'------------------- 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

 Cls                                                        ' Очищаем LCD
    Setfont Color8x8_rus

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


'---------------------------------- ПЕРЕМЕННЫЕ --------------------------------
Dim Pzem(25) As Byte                                        'Массив для приёма

Dim I As Byte
Dim R As Byte
Dim Остальное As Byte

Dim Напряжение As Word At Pzem(4) Overlay                   'забираем 1 и 2 байт, т.к., Word - это 2 байта
  Dim Ток_1 As Word At Pzem(6) Overlay                      'забираем 3 и 4 байты, т.к., Dword - это 4 байта
  Dim Ток_2 As Word At Pzem(8) Overlay                      'забираем 3 и 4 байты, т.к., Word - это 2 байта
  Dim Мощность_1 As Word At Pzem(10) Overlay                'забираем 3 и 4 байты, т.к., Dword - это 4 байта
  Dim Мощность_2 As Word At Pzem(12) Overlay                'забираем 3 и 4 байты, т.к., Word - это 2 байта
  Dim Частота As Word At Pzem(18) Overlay                   'забираем 5 и 6 байты, т.к., Word - это 2 байта




  Dim Напряжение_pze As Word

  Dim Ток_pze_ind As Dword
  Dim A As Dword
  Dim Ток_pze_1 As Word At A + 0 Overlay
  Dim Ток_pze_2 As Word At A + 2 Overlay


  Dim Мощность_pze_ind As Dword
  Dim B As Dword
  Dim Мощность_pze_1 As Word At B + 0 Overlay
  Dim Мощность_pze_2 As Word At B + 2 Overlay

  Dim Частота_pze As Word

  Dim Strin_univ As String * 8
  Dim Номер_ат_pzem_004t As Byte
  Dim Пауза_pzem_004t As Word

 Dim Countsym As Byte                                       '‘ Счетчик Принятых Символов
Dim Recsym As Byte                                          '‘ Принятый код символа USART
Dim Buffstr As String * 25                                  '‘ Буфер приема USART, 25 символов
Dim Flagmess As Byte                                        '‘ Флаг «Есть принятое сообщение USART»

'..........

Прием_uart:
Recsym = Udr                                                ' Забираем содержимое аппаратного буфера USART

If Countsym < 26 Then                                       ' Считаем количество принятых символов
        Buffstr = Buffstr + Chr(recsym)                     ' Если мало, то добавляем его в буфер принятого по USART сообщения
        Incr Countsym                                       ' Увеличиваем счетчик
Else                                                        ' Иначе выключаем приём и ставим метку, что приём закончен
        Disable Urxc                                        ' Выключаем приём, пока не обработаем принятое сообщение
        Countsym = 0                                        ' Сбрасываем счётчик символов, готовим к следующему приёму
        Flagmess = 1                                        ' Флаг устанавливаем в 1.

Напряжение_pze = Напряжение
    Swap Напряжение_pze

    Ток_pze_1 = Ток_1
    Ток_pze_2 = Ток_2
    Swap Ток_pze_1
    Swap Ток_pze_2
    Ток_pze_ind = A

    Мощность_pze_1 = Мощность_1
    Мощность_pze_2 = Мощность_2
    Swap Мощность_pze_1
    Swap Мощность_pze_2
    Мощность_pze_ind = B


    Частота_pze = Частота




   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

 If Номер_ат_pzem_004t = 0 Then
   Номер_ат_pzem_004t = 1
    Printbin &HF8 ; &H04 ; &H00 ; &H00 ; &H00 ; &H0A ; &H64 ; &H64
   End If

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

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







        End If


Return



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

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

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

Туговато адаптируется.

0

150

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

Туговато адаптируется.

Разумеется, если не туда подтыкать... ;)

Приведенная п/п прием_UART - заменитель (назовем это так) вашей связки "Usart_0_input_data ... Copy_bufer_usart", обработчик прерывания URXC, вызов которого в последнем листинге у вас отсутствует.
Выделяем обработчик из общего листинга !!!

Продолжаем... ;)
Имеем объявленный массив:
Dim Pzem(25) As Byte                            'Массив для приёма

Следовательно логичнее было бы:
Прием_uart:
Recsym = Udr                                        ' Забираем содержимое аппаратного буфера USART

If Countsym < 26 Then                           ' Считаем количество принятых символов
        Pzem(Countsym) = Recsym
....

Сказал же - "адаптировать", а не приткнуть ! ;)

Отредактировано Nord (2020-02-09 22:28:24)

0