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

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

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

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



PZEM-004T

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

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