27 МОСКОВСКАЯ ВСТРЕЧА
Форум самогонщиков Сайт Барахолка Магазин 27 МОСКОВСКАЯ ВСТРЕЧА

BASCOM-AVR - альтернативная среда разработки для Arduino

Форум самогонщиков Автоматика
Mnz Магистр Город 254 86
20 Февр. 16, 00:38
На форуме в одной из тем был затронут вопрос альтернативных сред разработки для плат Arduino, которые нередко используются для автоматизации различных процессов. Решил вынести это обсуждение в отдельную тему, так как та где оно началось, не совсем подходящая для этого.
О применении среды Bascom для программирования Arduino было написано на хабре. Но было это давно и не правда и в современных версиях Arduino обычно установлены микроконтроллеры не ниже ATmega328P (а в некоторых и ATmega2560), в то время как в статье пишут про Arduino с микроконтроллером ATmega168. Это нужно учитывать.
BASCOM-AVR это в первую очередь среда программирования для микроконтроллеров и в ней ведется работа не с номерами выводов (как в Arduino IDE), а с именами портов и номерами их битов.
Таблица номерами выводов и с соответствующими им именами портов для Arduino nano 3.

nano30pins.gif BASCOM-AVR - альтернативная среда разработки для Arduino
nano30pins.gif BASCOM-AVR - альтернативная среда разработки для Arduino. Автоматика.


Например если необходимо работать с выводом D2 ардуины, то следует взаимодействовать с выводами PortD.2 (запись) и PinD.2 (чтение).

Интересно было бы взглянуть на считывание температуры с DS18B20. Заранее спасибо.Алексей10, 19 Февр. 16, 18:00
В простейшей случае, код будет таким
$regfile = "m328pdef.dat"                                   ' ATmega328P.
$crystal = 16000000                                        ' Частота генератора, Гц.
$hwstack = 64                                              ' Размер стеков.
$swstack = 64
$framesize = 64

' Конфигурация
$baud = 9600                                                ' По умолчанию, скорость USART = 9600 бод

Config 1wire = Portd.2                                      ' Вывод к которому подключен контакт DQ DS18B20
Config Portd.3 = Output                                    ' Вывод питания датчика
Portd.3 = 1                                                ' Для питания датчика

' Переменные и массивы
Dim 1w_data(9) As Byte                                      ' Массив данных из DS18B20
Dim 1w_2byte As Integer At 1w_data Overlay
Dim Temp As Single

Do

  1wreset                                                  ' Сброс датчика                                          ' Нет ошибок
  1wwrite &HCC                                              ' Команда "Skip ROM"
  1wwrite &H44                                              ' Команда "Convert  T".
   
  Waitms 750                                                ' Датчику нужно 750 миллисекунд для измерения температуры

  1wreset                                                  ' Сброс датчика
  1wwrite &HCC                                              ' Команда "Skip ROM"
  1wwrite &HBE                                              ' Команда "Read scratchpad"

  1w_data(1) = 1wread(2)                                    ' Чтение 2 байт из датчика в массив

  Temp = 1w_2byte / 16                                      ' Преобразование температуры в привычный нам вид.
  Print Fusing(temp , "#.#")                                ' Передача по USART измеренной температуры

Loop
Датчик подключается выводами GND, DQ и Vcc к выводам GND, D2 и D3 ардуино. Также между выводами D2 и D3 нужно включить резистор на 4.7 килоом.

ds18b20.jpg BASCOM-AVR - альтернативная среда разработки для Arduino
ds18b20.jpg BASCOM-AVR - альтернативная среда разработки для Arduino. Автоматика.


Это упрощенный код. Для большей надежности необходимо добавить проверки на наличие ошибок датчика.
$regfile = "m328pdef.dat"                                   ' ATmega328P.
$crystal = 16000000                                        ' Частота генератора, Гц.
$hwstack = 64                                              ' Размер стеков.
$swstack = 64
$framesize = 64

' Конфигурация
$baud = 9600                                                ' По умолчанию, скорость USART = 9600 бод

Config 1wire = Portd.2                                      ' Вывод к которому подключен контакт DQ DS18B20
Config Portd.3 = Output                                    ' Вывод питания датчика
Portd.3 = 1                                                ' Для питания датчика

' Переменные и массивы
Dim 1w_data(9) As Byte                                      ' Массив данных из DS18B20
Dim 1w_2byte As Integer At 1w_data Overlay
Dim Temp As Single

Do

  1wreset                                                  ' Сброс датчика
  If Err = 0 Then                                          ' Нет ошибок

    1wwrite &HCC                                          ' Команда "Skip ROM"
    1wwrite &H44                                          ' Команда "Convert  T".

    Waitms 750                                            ' Датчику нужно 750 миллисекунд для измерения температуры

    1wreset                                                ' Сброс датчика
    1wwrite &HCC                                          ' Команда "Skip ROM"
    1wwrite &HBE                                          ' Команда "Read scratchpad"

    1w_data(1) = 1wread(9)                                ' Чтение 9 байт из датчика в массив

    If 1w_data(9) = Crc8(1w_data(1) , 8) Then              ' Проверка контрольной суммы.
      Temp = 1w_2byte / 16                                ' Преобразование температуры в привычный нам вид.
      Print Fusing(temp , "#.#")                          ' Передача по USART измеренной температуры
    Else
      Print "CRC error"
    End If

  Else
    Print "Sensor error"
    Waitms 500
  End If

Loop
Теперь эту программу необходимо скомпилировать и залить в ардуино. Запустите BASCOM-AVR, скопируйте в редактор кода эту программу. Затем сохраните файл на диске и скомпилируйте программу кликнув в меню Программа по пункту Компиляция. После этого в той папке куда сохранили программу должна появится прошивка. Теперь подключаем Arduino nano 3 по USB к компьютеру. После, в меню Настройки кликаете по Программатор и в списке выбираете ARDUINO. В списке COM порт нужно выбрать порт, который присвоила система ардуине. Скорость порта должна быть 57600.

programmator.png BASCOM-AVR - альтернативная среда разработки для Arduino
programmator.png BASCOM-AVR - альтернативная среда разработки для Arduino. Автоматика.


Сохраняем эти настройки. Теперь в меню  Программа кликаем по Передать в МК и в появившемся окне, в меню МК кликаем по Писать буфер в МК. Прошивка запишется в ардуино.
Для тестирования работы, нужно запустить любую терминальную программу, в которой выбрать COM порт ардуины и скорость 9600 бод. Примерно раз в секунду ардуина будет сообщать измеренную температуру.
сообщения удалены (2)
sevpro Доктор наук Worldwide 769 281
Отв.1  20 Февр. 16, 11:33
У меня вопрос. Зачем идти через задний проход,если умеете работать с AVR напрямую, минуя кривые костыли в виде ардуино?
Алексей10 Новичок Россия 7
Отв.2  20 Февр. 16, 12:25, через 53 мин
Mnz спасибо загружу программу в ардуино и напишу о результатах.

sevpro atmega в таком корпусе что для нее сложно изготовить плату и припаять. В ардуино все припаяно. С другими блоками соединяется проводами на разъемах и паять не обязательно.

Добавлено через 3ч. 45мин.:

Не получилось загрузить программу в ардуино.
Что я делаю не так?
новый файл.PNG
новый файл.PNG BASCOM-AVR - альтернативная среда разработки для Arduino. Автоматика.
m16 Модератор Тамбов 1.9K 1K
Отв.3  20 Февр. 16, 18:05
BASCOM-AVR и Arduino
Mnz Магистр Город 254 86
Отв.4  20 Февр. 16, 21:28
Судя по строке "port not open" возможно выбран не тот COM порт что у ардуино или ардуино забыли подключить к компьютеру.
Алексей10 Новичок Россия 7
Отв.5  21 Февр. 16, 01:01
Попытался еще раз прошить и получилось. Возможно действительно перепутал порт.

Для тестирования работы, нужно запустить любую терминальную программуMnz, 20 Февр. 16, 00:38
Можно немного подробнее?
Mnz Магистр Город 254 86
Отв.6  21 Февр. 16, 17:20
Алексей10, запустите BASCOM-AVR и в меню Настройки кликните по Связь.

m_connect.png BASCOM-AVR - альтернативная среда разработки для Arduino
m_connect.png BASCOM-AVR - альтернативная среда разработки для Arduino. Автоматика.


В окне выберите COM порт ардуины, задайте скорость обмена 9600 бод и сохраните настройки.

s_connect.png BASCOM-AVR - альтернативная среда разработки для Arduino
s_connect.png BASCOM-AVR - альтернативная среда разработки для Arduino. Автоматика.


Затем подключите ардуину (предполагается что в ней есть прошивка) и в меню Инструменты кликните по Эмулятор терминала

r_terminal.png BASCOM-AVR - альтернативная среда разработки для Arduino
r_terminal.png BASCOM-AVR - альтернативная среда разработки для Arduino. Автоматика.


Откроется окно, в котором будет отображаться текст передаваемый ардуиной через COM порт.
sevpro Доктор наук Worldwide 769 281
Отв.7  21 Февр. 16, 17:41, через 21 мин
sevpro atmega в таком корпусе что для нее сложно изготовить плату и припаять. В ардуино все припаяно. С другими блоками соединяется проводами на разъемах и паять не обязательно.Алексей10, 20 Февр. 16, 12:25
Честно сказать, не вижу никаких проблем в пайке TQFP, это же не QFN в конце концов. На крайняк есть меги и в DIP корпусах. А вот то, что разводка ардуиновских плат в большинстве своем не выдерживает никакой критики, это да. Не знаю, как на оригинальных платах, но китайцы аналоговое питание делают так, что возникают большие сомнения в возможности использования АЦП AVRа, который надо сказать и так не блещет
Алексей10 Новичок Россия 7
Отв.8  22 Февр. 16, 20:52
Ура заработало!

Ардуина работает!

Добавлено через 1ч. 11мин.:

Для чего нужны строки и что значат цифры в них?
$hwstack = 64                                               ' Размер стеков.
$swstack = 64
$framesize = 64
Что значат цифры после 1wwrite?
Кот.PNG
Кот.PNG BASCOM-AVR - альтернативная среда разработки для Arduino. Автоматика.
ds18b20.PNG
ds18b20.PNG BASCOM-AVR - альтернативная среда разработки для Arduino. Автоматика.
kazu Кандидат наук Харьков 375 74
Отв.9  22 Февр. 16, 22:43
Инструкцию (доки) читают только слабаки?
Mnz Магистр Город 254 86
Отв.10  23 Февр. 16, 02:11
Для чего нужны строки и что значат цифры в них?Алексей10, 22 Февр. 16, 20:52
$hwstack - Аппаратный стек
Команда резервирует заданное количество байт, отведенных для аппаратного стека. Когда вы используете команды CALL или GOSUB в стеке запоминаются по два байта.
Когда вы используете две команды GOSUB, в стеке запоминаются 4 байта. Некоторые из инструкций также используют стек. При использовании прерываний в стеке сохраняется 32 байта.

$swstack - Программный стек
Описывает размер программного стека.
Каждая локальная переменная использует 2 байта. Каждая переменная, используемая в аргументе подпрограммы, также использует 2 байта. Если вы использовали 8 переменных в подпрограмме и 3 параметра было передано в подпрограмму, то вам необходимо:
10 * 2 = 20 байт

$framesize - Размер фрейма
Описывает размер фрейма
Каждая локальная переменная запоминается в области памяти, которая называется 'фрейм'
Когда вы имеете 2 локальных переменных и символьную переменную длиной 10 символов, необходим фрейм размером (2*2) + 11 = 15 байт
В большинстве случаев по 64 байта для стеков и фрейма бывает достаточным.

Что значат цифры после 1wwrite?Алексей10, 22 Февр. 16, 20:52
Это команды отправляемые по линии 1-Wire, в данном случае датчику DS18B20.
Из даташита. https://cdn.homedistil.ru/fs/1510/22/44768.84589.pdf
SKIP ROM [CCh] Пропуск ROM
Главное устройство может использовать эту команду, чтобы обратиться ко всем устройствам на шине одновременно. Например, главное устройство может заставить, чтобы все DS18B20 (датчики температуры) на шине, начали одновременно температурные преобразования. Для этого необходимо выдать на шину команду Пропуска ROM [CCh] сопровождаемую командой Температурного преобразования [44h]. Обратите внимание, что команда ЧТЕНИЕ ПАМЯТИ [BEh] может следовать за командой Пропуска ROM, только если на шине присутствует одно подчиненное устройство. Команда Пропуска ROM, сопровождаемая командой ЧТЕНИЕ ПАМЯТИ вызовет конфликт на уровне данных на шине, если на шине более одного подчиненного устройства, так как все устройства будут пытаться одновременно передавать данные.

Конвертировать температуру [44h]
Эта команда начинает единственное температурное преобразование. После окончания преобразования данные сохраняются в 2-байтовом температурном регистре в оперативной памяти, а DS18B20 возвращается в неактивное состояние с низким энергопотреблением.

Чтение памяти [BEh]
Эта команда позволяет Устройство управленияу читать содержание ПАМЯТИ. Передача данных начинается с наименьшего значащего бита байта 0 и продолжается до 9-ого байта (байт 8 - циклический контроль избыточности). Устройство управления может выполнить сброс, чтобы закончить чтение в любое время, если необходимо только часть данных.