Програмирование BASCOM AVR

Ответить на тему
 

porno_killer ®

Стаж: 6 лет 6 месяцев

Сообщений: 58

Симпатии: 2

Всё о программировании микроконтроллеров семейства ATMEL в BASCOM AVR

Официальный сайт проекта - http://www.mcselec.com
Последняя рабочая версия(сам пользуюсь) - https://tas-ix.net/viewtopic.php?p=890718#890718
Тематические сайты:
www.avr.ru
www.avrproject.ru
www.bascomavr.3bb.ru

Описание

Среда разработки программного кода для микроконтроллеров серии AVR компании Atmel на языке, подобном стандартному Бейсику.
Семейство 8-битных AVR-микроконтроллеров имеет одинаковый набор команд, присущий RISC-архитектуре, что означает легкость портирования программ под разные чипы. Скорость выполнения команд в четыре раза быстрее, чем у PIC-микроконтроллеров от Microchip. Bascom-AVR (от слов Basic Compiler) является превосходным компилятором, который помимо основной функции написания программ и трансляции их в машинных код в формате .hex понятный микроконтроллеру, позволяет построчно проводить отладку-симуляцию и прошивать микросхемы прямо из среды разработки с помощью программатора, например, STK200/STK300 или внешних утилит, таких как USBASP_AVRDUDE_PROG. Имеется текстовый редактор и справочно-информационная система.
Bascom-AVR – пакет для быстрой разработки, сравнительно простой в освоении, подходящий тем, у кого нет времени и сил изучать программирование на С++. Код, создаваемый этой средой, отнюдь не изящен, но компактен и быстр в исполнении. Программный пакет поддерживает основные функции чипов AVR, такие как счетчики и таймеры, аналого-цифровое преобразование, широтно-импульсную модуляцию, UART, шину I2C. Чрезвычайно экономит время поддержки различных внешних устройств: кнопок, датчиков, графических индикаторов и небольших ЖК-дисплеев, цифробуквенных табло, клавиатур 3х4 или 4х4, клавиатур PS/2 и многого другого. Программы, написанные в Bascom-AVR, могут быть отлажены на моделях в Proteus или на макетных платах.
Перед скачиванием приложения с родного сайта необходимо знать, что Bascom выпущен в трех вариантах. Помимо Bascom-AVR, существует среда Bascom-LT для микросхем AT89Cx051 и Bascom-8051 для серии 8051. Основное отличие демо версии – отсутствие возможности компиляции программ размером более 4 КБ. Работать можно лишь с самыми младшими моделями линейки AVR-микроконтроллеров. Но, для знакомства с программой, этого более чем достаточно, потому что установка Bascom-AVR, настройка и написание программы – это не самое сложное. Как правило, большинство трудностей возникают из-за незнания особенностей используемого программного и аппаратного обеспечения. Любая интересующая справочная информация, мануалы и подробные описания команд выложены на сайте разработчиков, но, к сожалению, на английском языке.
Русского языка в программе нет. Работающий любительский перевод найти в сети очень сложно. Ознакомиться с уроками по Bascom-AVR можно здесь
Приложение Bascom-AVR предназначено для работы на базе платформы Windows 98, NT, 2000, XP, Vista и 7. Совместимость с последними версиями операционных систем полная.

ПРИМЕР 1 - Конфигурация портов

Рассмотрим самый простой пример: к микроконтроллеру Attiny2313 подключен светодиод и кнопка. Чтобы далеко не ходить, давайте сконфигурируем порты как в первом примере: т.е. PortB.0 - выход, сюда подключим светодиод; и PortB.1 - вход, сюда подключим кнопку. Получаем вот такую схему:

Светодиод будет гореть если на анод (т.е. на PortB.0), будет подана логическая единица. Сразу после конфигурирования в качестве выхода, на ножке устанавливается низкий уровень и светодиод гореть не будет.
Кнопка подключена таким образом, что при нажатии на входе порта установится логический 0 (говорят, что прижимаем порт к земле).
Теперь нужно пояснить для чего нужен резистор R1. Дело в том что после конкурирования порта в качестве входа, на этом входе устанавливается так называемое высокодисперсное состояние - состояние при котором на входе нет какого-либо четкого уровня. И в зависимости от внешних помех на входе может быть как логический ноль, так и логическая единица. Это ведет к непредсказуемой логике работы программы. В нашем случае активным состоянием выбран логический ноль, это состояние на входе будет означать что кнопка нажата. Так вот чтобы избежать помех и четко зафиксировать высокий уровень на входе порта когда кнопка еще не нажата, используется подтягивающий резистор в несколько килоом.
Теперь приступим к написанию программы и придумаем алгоритм. Для начала напишем очень простую программу,которая будет постоянно опрашивать вход и если микроконтроллер увидит что кто-то нажал кнопку, зажжет светодиод.
===============================================================
$regfile = "2313def.dat" 'указываем компилятору что работать будем с Attiny2313
$crystal = 1000000 'частота работы микроконтроллера 1МГц
Config Portb.0 = Output 'устанавливаем PortB.0 в качестве выхода
Config Portb.1 = Input 'устанавливаем PortB.1 в качестве входа
Do 'начало главного цикла
If Pinb.1 = 0 Then 'условие: если на входе обнаружен низкий уровень
Portb.0 = 1 'устанавливаем на выходе высокий уровень
Else 'иначе, если это условие не выполняется
Portb.0 = 0 'на выходе будет низкий уровень
End If
Loop 'повторяем весь цикл сначала
End 'конец программы
===============================================================
Заметьте, что считывание состояния на входе происходит по команде Pin, а установка нужного уровня на выходе - по команде Port.
После компиляции программы (нажимаем F7), полученный *.hex файл прошиваем в микроконтроллер. Программатор, с помощью которого происходит прошивка программатора, можно собрать самостоятельно, схем в интернете очень много. Я лично остановил свой выбор на программаторе USBasp.

ПРИМЕР 2 - Аналогово-Цифровой Преобразователь (АЦП)

Микроконтроллер - цифровой прибор, который понимает и работает только с цифровыми сигналами (нулями и единицами). Но вокруг нас все сигналы представлены в аналоговой форме - освещение, температура и давление, влажность, звуки - все это непрерывно меняющиеся физические величины.
Для того чтобы обрабатывать аналоговые сигналы, в большинство микроконтроллеров AVR встроен АЦП (ADC–analog digital converter) – аналого-цифровой преобразователь.
Аналогово-Цифровой Преобразователь служит для преобразования аналогового сигнала на входе в цифровую форму, понятную для МК. Практически во всех современных микроконтроллерах от AVR имеется 10 битный АЦП, позволяющий оцифровывать аналоговый сигнал с дискретностью 1024 значений. Этого достаточно чтобы, например, делать замеры напряжений (в разумных пределах), снимать показания с различных датчиков, таких как фотодиод и термопара, делать анализаторы спектра и многое другое.
Примерная работа преобразования приведена на рисунке ниже; через равные промежутки времени (ось X) происходит считывание значения напряжения на входе АЦП (ось Y). Так как АЦП имеет ограниченную разрешающую способность, появляется дискретность (дробление) значений.

Величина по оХ называется частотой дискретизации, чем больше частота тем точнее может быть полученная информация о сигнале. АЦП в мк AVR может работать на частотах дискретизации от 50 до 200 кГц, это значит что микроконтроллер может до 200-х раз в секунду считывать уровень напряжения на входе АЦП.
Для того чтобы начать работать с преобразователем его сперва необходимо сконфигурировать. В Bascom-AVR конфигурирование АЦП сводится всего к одной строчке:

Config Adc = SINGLE , Prescaler = 128 , Reference = Avcc

здесь Adc - режим считывания значения: Single - единичное считывание, также может быть Free (режим постоянной работы преобразователя)
Prescaler = 128 - выбираем частоту дискретизации путем деления частоты кварца на определенное число (также может быть 2,4,8,16,32,64 или Auto). Если выбрать Auto, то компилятор сам выберет подходящую частоту работы АЦП
Reference – выбор источника опорного напряжения, у этого параметра может быть несколько значений:
Aref – внешний источник, Avcc – напряжение питания схемы, Internal – внутренний ИОН на 2,56 вольт или в некоторых микроконтроллерах 1,1 вольт.
Для того чтобы посмотреть работу АЦП можно собрать вот такую простую схему на микроконтроллере ATmega8 (или на любом другом камне имеющем на борту цифро-аналоговый преобразователь).

В качестве опорного напряжения для АЦП будет использоваться встроенный стабилизатор, у Atmega8 этот стабилизатор выдает 2,56 вольт. А для того чтобы этот стабилизатор заработал нужно подать напряжение на ножку AVCC. Для того чтобы уменьшить шумы по питанию и увеличить качество работы стабилизатора, принято подавать питание на эту ножку через дроссель (L1) номиналом 10÷100 мкГн, а так же соединять с землей через керамический конденсатор 100 нанофарад (С1). Но для простого тестирования, конечно можно убрать эти элементы и соединить ножку AVCC напрямую с VCC.
Вход АЦП (ADC0) соединим с переменным резистором (потенциометр), таким образом получится делитель напряжения, который позволит менять напряжение на этой ножке.
тестовый исходник работы с АЦП в Bascom-AVR
$regfile = "m8def.dat" 'микроконтроллер ATmega8
$crystal = 1000000 'частота работы 1МГц
$baud = 1200 'скорость передачи 1200 бод
'конфигурируем АЦП
Config Adc = Single , Prescaler = 128 , Reference = Internal
Dim R As Word 'переменная R в которую будем записывать показания с АЦП
Start Adc 'запускаем пребразователь
'этой командой на преобразователь поступает питание
'работу преобразователя также можно остановить в любой момент
'для этого пишем команду:
'Stop Adc
Do 'бесконечный цикл
R = Getadc(0) 'считываем нулевой канал АЦП и записываем в переменную
Print R 'печатаем значение в терминал
Waitms 500 'ждем полсекунды и повторяем
Loop
End

Изменяя напряжение на ножке ADC0 с помощью переменного резистора, мы увидим как меняется значение считанное с АЦП. На рисунке ниже показан скрин терминала с данными, которые получил с АЦП

При вращении ручки потенциометра можно заметить одну странность: если плавно увеличивать напряжение на входе АЦП, то в определенный момент показания перестанут расти, а значение переменной остановится на значении 1023. На самом деле это означает, что АЦП достиг максимального предела измерения. Если в этот момент измерить напряжение на входе АЦП то мы получим значение примерно 2,56 вольт, что равняется выбранному значению опорного напряжения. Отсюда можно сделать вывод, что АЦП измеряет напряжение на входе только в пределах от нуля до значения ИОН.
Так как изменение значения с АЦП меняются пропорционально напряжению на входе, для удобства можно пользоваться вот таким рисунком.

К примеру, получив значение c АЦП 599 можно примерно прикинуть сколько соответствует этому вольт на входе. А чтобы увеличить диапазон измеряемого напряжения, нужно использовать резисторный делитель.

ПРИМЕР 3 - Подключаем контроллер к ПК через COM порт (RS-232-UART)

Необходимость подключения контроллера к персональному компьютеру возникает при различных обстоятельствах - отладка программы (мониторинг состояния портов, результаты вычислений и тп.) ,управление и контроль посредством ПК, считывание данных с подключенных к контроллеру сенсоров и датчиков. Соединение с ПК возможно посредством различных интерфейсов – LPT-порт, COM-порты (протокол RS-232), USB и тп. Все они обладают набором, как достоинств, так и недостатков. Самым распространенным интерфейсом, в любительской практике, является соединение с помощью COM-порта. Подобное соединение довольно простое в схемотехническом плане, недорогое и обладает достаточной скоростью обмена информацией для большинства любительских проектов. В данном материале опишем самый простой способ организации информационного обмена через COM-порт с помощью компилятора BASCOM AVR.
Непосредственно на самом протоколе обмена RS-232 заострять внимание не будем. Схема подключения довольно проста - для согласования TTL уровней применена микросхема MAX232CPE.

Перечислим основные команды компилятора BASCOM AVR примененных в нашем примере (используем аппаратный UART микроконтроллера
- $BAUD – глобальная установка скорости информационного обмена UART.
- INPUT – ввод данных различных форматов.
- PRINT – отправить данные в порт RS-232.
Опишем подробнее использование данных команд:
Команда $BAUD
Синтаксис команды - $BAUD = var
Var – скорость порта, которую вы хотите использовать для информационного обмена (числовое значение)
Примечание:
Скорость обмена, установленная в программе микроконтроллера, должна совпадать с настройками COM-порта компьютера. В противном случае устойчивого соединения не будет.
Пример:
$regfile = "m32def.dat" ' используем ATmega32
$crystal = 16000000 ' частота установленного кварца 16 mHz
$baud = 19200 ' скорость порта 19200 бит/с.
Команда INPUT
Синтаксис команды - INPUT [" prompt" ] , var[ , varn ]
INPUT #ch, var[ , varn ]
Promt – текстовая информация (опционально)
Var,varn – вводимые значения
Сh – номер канала (в многоканальном режиме) в который осуществляется ввод информации
Пример:
Input "Введите значение " , V ' ввод переменной с текстовым сообщением
Input V1 'ввод переменной
Команда PRINT
Синтаксис команды - PRINT [#channel , ] var ; " constant"
Channel – выбор канала для вывода информации в многоканальном режиме
Var – переменные, константы различных форматов, для вывода
”constant” – вывод какой либо текстовой информации
Пример:
Print "выводим переменную А " ; A ' вывод текста и переменной
Print 'вывод пустой строки
Print "Выводим текст” 'вывод текстовой информации

Для простого информационного обмена этих команд будет вполне достаточно.
Естественно BASCOM AVR обладает более широкими возможностями в данном плане – организация программного UART на несколько каналов, буферизация и тд и тп. Со всеми командами вы можете ознакомится на официальном сайте компилятора.
Используем вышеперечисленные команды для написания простой программы, которая продемонстрирует простой обмен информацией через COM-порт. Задачей программы будет вывод введенного с клавиатуры текста на терминал.
'ввод и вывод информации через COM-порт
$regfile = "m32def.dat" ' используем ATmega32
$crystal = 16000000 ' частота установленного кварца 16 mHz
$baud = 19200 ' скорость порта 19200 бит/с.
Dim A As String * 15 'объявляем переменную – строка не более 15 символов
Do
Input "What is your name? " , A 'ввод текста с клавиатуры
Print "Hello! " ; A ' вывод сообщения вместе с ранее введенным текстом
Print ' вывод пустой строки
Wait 1 ' задержка 1 секунда
Loop
End
Собственно вот и все… Очень просто и прекрасно работает =)

Не забываем, что в настройках компьютера, скорость порта должны быть выставлена идентично скорости в программе. В BASCOM AVR есть встроенный терминал COM-порта, его настройки для данного примера должны быть выставлены подобным образом

ПРИМЕР 4 - Работа с дисплеем 16x2 на контроллере HD44780 в Bascom-AVR

Жидкокристаллические дисплеи на контроллере HD44780 (а также совместимом с ним KS0066) очень распространены благодаря простому методу работы с ними, а так же небольшой цене. В зависимости от исполнения дисплея, они позволяют выводить от 8-и до 40-ка символов в каждой строке, строк может быть одна, две или четыре. Чаще всего встречаются 8*2 (восемь символов*две строки), 16*2 и 20*4.
Для примера рассмотрим распиновку индикатора 16*2 (у всех дисплеев на контроллере HD44780 она похожа)

У каждого дисплея на контроллере HD44780 для подключения имеется 14 выводов + 2 вывода для подсветки (если она имеется):
Земля, GND
Напряжение питания, Vcc (+5V)
Настройка контрастности, Vo
Выбор регистра, R/S
Чтение/запись, R/W
Сигнал разрешения чтения/записи, E
Bit 0, D0
Bit 1, D1
Bit 2, D2
Bit 3, D3
Bit 4, D4
Bit 5, D5
Bit 6, D6
Bit 7, D7
Питание подсветки для дисплеев с подсветкой, LED +
Питание подсветки для дисплеев с подсветкой, LED -

Данные в дисплей загружаются по шине данных (D0-D7), при этом контроллер поддерживает как 8-и, так и 4-х битное подключение. 4-х битное подключение экономит ножки микроконтроллера и чаще всего достаточно для многих задач (при 8и битном подключении можно быстрее загружать данные в контроллер дисплея, но нам пока это ни к чему, поэтому не будем его рассматривать). Для 4-х битного подключения используются 4 последних бита шины (D4-D7).
В качестве примера будем использовать дисплей 20х4, подключенный к микроконтроллеру ATmega8 по 4х битному интерфейсу по схеме ниже

Дисплей требует для питания 5 вольт, делителем на резисторе R1 настраивается контрастность отображаемых символов, вывод R/W подключается к земле (т.е. выбрана постоянная запись в дисплей). Подключать оставшиеся выводы можно к любым свободным ножкам микроконтроллера. Конфигурация ножек для подключения дисплея у микроконтроллера ATmega8 будет выглядеть следующим образом:
$regfile = "m8def.dat" 'выбранный тип микроконтроллера
$crystal = 1000000 'частота работы 1 МГц
Config Lcd = 20 * 4 'указываем какой у нас дисплей
'и конфигурируем ножки для подключения
Config Lcdpin=Pin,Db4=PortB.3, Db5=PortB.2, Db6=PortB.1, Db7=PortB.0,E=PortB.4,Rs=PortB.5
А дальше уже можно выводить информацию на дисплей: буквы, цифры, специальные символы, а если извернуться и псевдографику. Для вывода данных на дисплей нужно знать несколько команд:
CLS - очистка дисплея
LCD - вывести данные на дисплей (пример: Lcd "Hello world" выведет надпись Hello world)
Locate - установка места на индикаторе с которого начнется выводится текст (пример: Locate 1,5 установит курсор на 5-е знакоместо первой строчки и текст выводимый командой LCD будет начинаться отсюда)
CURSOR ON / OFF / BLINK / NOBLINK - включает или отключает отображение и мигание курсора, по умолчанию он включен (пример: отключим курсор командой Cursor Off)
А теперь напишем вот такую небольшую программку, которая выведет надпись на дисплей:
$regfile = "m8def.dat" 'выбранный тип микроконтроллера
$crystal = 1000000 'частота работы 1 МГц
Config Lcd = 20 * 4 'указываем какой у нас дисплей
'и конфигурируем ножки для подключения
Config Lcdpin=Pin,Db4=Portb.3, Db5=Portb.2, Db6=Portb.1, Db7=Portb.0,E=Portb.4,Rs=Portb.5
Cursor Off 'выключим отображение курсора
Cls 'очистим дисплей
Lcd "LCD 20*4 HD44780" 'выводим текст в первой строке
Locate 2 , 8 'переводим курсор на вторую строку, восьмое знакоместо
Lcd "AVRproject.ru" 'выводим текст
End
Также в Bascom-AVR есть еще несколько дополнительных команд для работы с дисплеями:
UPPERLINE - возвращает курсор на самую верхнюю строчку дисплея.
LOWERLINE - перевод курсора на вторую строку
THIRDLINE - перевод курсора на третью строку
FOURTHLINE - перевод курсора на четвертую строку
HOME - также возвращает курсор на верхнюю строчку, но в отличии от команды UPPERLINE эта команда может принимать дополнительные значения: если после нее поставить букву L, T или F то курсор переместится в начало строчки, название которой начинается с соответствующей буквы (пример: для того чтобы переместить курсор в начало третьей строки, нужно написать команду HOME T )
пример кода для вывода информации на дисплей с использованием этих команд:
$regfile = "m8def.dat" 'выбранный тип микроконтроллера
$crystal = 1000000 'частота работы 1 МГц
Config Lcd = 20 * 4 'указываем какой у нас дисплей
'и конфигурируем ножки для подключения
Config Lcdpin=Pin,Db4=Portb.3, Db5=Portb.2, Db6=Portb.1, Db7=Portb.0,E=Portb.4,Rs=Portb.5
Cursor Off 'выключим отображение курсора
Cls 'очистим дисплей
Lcd "*** HD44780 LCD ***" 'выводим текст в первой строке
Lowerline 'переходим на вторую строку
Lcd "Line number 2" 'выводим текст
Thirdline 'переходим на третью строку
Lcd "AaBbCcDdEeFfGgHfIiJj" 'выводим на третьей строке
Fourthline 'переходим на четвертую строку
Lcd "1234567890" 'печатаем на четвертой строчке
End 'конец программы

SHIFTLCD LEFT / RIGHT - сдвигает текст в строке на которой находится курсор на одну позицию влево или вправо.
SHIFTCURSOR LEFT / RIGHT - сдвигает курсор на одну позицию влево или вправо
и пример того как использовать сдвиг текста:
$regfile = "m8def.dat" 'выбранный тип микроконтроллера
$crystal = 1000000 'частота работы 1 МГц
Dim A As Byte 'переменная для организации цикла
Config Lcd = 20 * 4 'указываем какой у нас дисплей
'и конфигурируем ножки для подключения
Config Lcdpin=Pin,Db4=Portb.3, Db5=Portb.2, Db6=Portb.1, Db7=Portb.0,E=Portb.4,Rs=Portb.5
Cursor Off 'выключим отображение курсора
Cls 'очистим дисплей
Locate 1 , 11 'устанавливаем курсор на первой строке, десятом знакоместе
Lcd "Bascom-AVR" 'выведем текст
'цикл сдвига влево
For A = 1 To 10 'повторяем этот цикл пока переменная А не достигнет значения 10
Shiftlcd Left 'сдвинем текст влево
Waitms 300 'задержка 300 миллисекунд
Next A 'увеличиваем значение переменной А на 1
'цикл сдвига вправо
For A = 1 To 10 'повторяем цикл пока переменная А не достигнет значения 10
Shiftlcd Right 'теперь сдвинем текст вправо
Waitms 300 'задержка 300 миллисекунд
Next A 'увеличиваем значение переменной А на 1
'продолжаем выполнение программы
Wait 1 'задержка 1 секунда
Home F 'устанавливаем курсор на нижнюю строчку
Lcd "END PROGRAM" 'и выводим надпись
End 'конец программы

ПРИМЕР 5 - Радиомодули nRF24L01

В общих чертах, это радиомодули, работающие на частоте 2.4 ГГц с подключением к микроконтроллеру по SPI-интерфейсу. Для работы требуется напряжение в диапазоне от 1,8 до 3,6 вольт, входы/выходы толерантны к 5 вольтам, поэтому при подключении к пяти вольтовым устройствам дополнительные согласующие цепи ставить нет необходимости.
Для подключения радиомодуля выведена гребенка контактов, распиновка приведена ниже:

Так как на плате модуля предусмотрен разъем для подключения, для удобства собрал небольшую платку. На этой отладочной плате стоит микроконтроллер Atmega8A с обвязкой из внешнего кварца, кнопки сброса и пары светодиодов, ответный разъем под модуль и разъем для подключения программатора.

Схема всего этого дела выглядит следующим образом:

Для подключения радиомодуля использованы ножки аппаратного SPI микроконтроллера, поэтому разъемы подключения модуля и подключения программатор дублируют друг друга. Это сделано, чтобы удобней было прошивать микроконтроллер на отладночной платке, например, если использовать программатор который подает на схему 5 вольт, а для NRF24L01 это слишком большое напряжение. Чтобы перепрошить управляющий микроконтроллер, достаточно выдернуть трансивер с платы, перепрошить и всунуть его обратно - без лишней возни с перепайкой.
Код для работы с модулем целиком взят с примера AN #151 на официальном сайте mcselec.com
Горит зеленый светодиод (D1) - приемник готов к работе. При приеме данных загорается красный светодиод (D2)

Вторую схему - для передатчика - собрал на макетке по той же схеме. Разъем на трансивере оказался не подходящим для того чтобы вставлять плату в макетку и поэтому соединил все проводами.

Скорость для соединения приемника с терминалом выставляется 19200 бод. При старте приемник напечатает "RX_device" а дальше - то, что получит с передатчика. В примере передаются постоянные данные "AA+BB+CC+11+#посылки"
На скрине ниже видно, что номера посылки прыгают, это из-за того что я включал/выключал передатчик пока бродил по двору (максимальное удаление метров 30-40). А видимо проверка CRC в приемнике не пропускала некоторые посылки от передатчика из-за ошибок передачи.

Оптимизированный код от пользователя Valera18 только для atmega8
В коде удаленны не используемые (действия и регистры).
Данная прошивка передаёт данные "AA+BB+CC+11+№посылки".
Передатчик:
$regfile = "m8def.dat"
$crystal = 8000000
Declare Sub W_register(byval C_bytes As Byte)
'SPI (nRF24L01) команды
Const Write_reg = &H20 'Определить Команду Записи В Реестр
Const Wr_tx_pload = &HA0 'Определить Tx Полезной Нагрузки Адрес Регистра
Const Flush_tx = &HE1 'Определить Флеш Tx Зарегистрировать Команду
'SPI (nRF24L01) регистры (адреса)
Const Config_nrf = &H00 'Config адрес регистра
Const En_aa = &H01 'Включить Автоматическое Подтверждение регистрации адрес
Const En_rxaddr = &H02 'Включено Rx адреса " адрес регистра"
Const Rf_ch = &H05 'RF channel' адрес регистра
Const Rf_setup = &H06 'РФ Setup " (Настройка) адрес регистра"
Const Status = &H07 'Статус " адрес регистра"
Const Rx_addr_p0 = &H0A 'rx адрес Pipe0 " зарегистрировать адрес"
Const Tx_addr = &H10 'TX address (адрес)
Dim D_bytes(6) As Byte , W As Byte
'Config оборудования
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1
'Программное обеспечение SPI НЕ работает с nRF24L01, используйте оборудование SPI только, но эсэсовцы pin-код должен управляться нашей функцией
Config Portb.1 = Output : Ce Alias Portb.1 'CE pin is output
Config Portb.2 = Output : Ss Alias Portb.2 'SS pin is output
Config Pinb.0 = Input : Irq Alias Pinb.0 'IRQ pin is input
'подключение светодиодов индикации
Config Portd.4 = Output : Red_led Alias Portd.4
Spiinit
Do
Incr W
If W = 250 Then
W = 0
End If
Set Ce
Waitms 10
Reset Ce
Reset Ss
Red_led = 1
D_bytes(1) = Flush_tx 'Flush the TX_fifo буфера
Call W_register(1)
D_bytes(1) = Write_reg + Status 'Reset IRQ бит
D_bytes(2) = &B00110000
Call W_register(2)
Gosub Setup_tx 'Настройка nrf240l01 для TX
D_bytes(1) = Wr_tx_pload 'Положи 5 байт в TX pload буфера
D_bytes(2) = &HAA 'Байт 1
D_bytes(3) = &HBB 'Байт 2
D_bytes(4) = &HCC 'Байт 3
D_bytes(5) = &H11 'Байт 4
D_bytes(6) = W 'Байт 5 будет увеличиваться каждый цикл
Call W_register(6) 'Запись 6 байт для регистрации
Waitms 2
Set Ce 'Set CE на короткий миг, чтобы передать буфер fifo
Waitms 1
Reset Ce
Red_led = 0
Wait 1
Loop
'Sub подпрограмм
Sub W_register(byval C_bytes As Byte) 'Пишите зарегистрировать с SPI
Reset Ss 'Руководство управления СС контакт, установить СС низких до смещение, байт
Spiout D_bytes(1) , C_bytes 'Shiftout байты данных SPI корыта, C_bytes это количество байт, которые будут написаны
Set Ss 'Set СС высокого
End Sub
Setup_tx: 'Подготовка к TX
D_bytes(1) = Write_reg + Tx_addr 'TX адрес
D_bytes(2) = &H34
D_bytes(3) = &H43
D_bytes(4) = &H10
D_bytes(5) = &H10
D_bytes(6) = &H01
Call W_register(6)
D_bytes(1) = Write_reg + Rx_addr_p0 'RX адрес для pipe0
D_bytes(2) = &H34
D_bytes(3) = &H43
D_bytes(4) = &H10
D_bytes(5) = &H10
D_bytes(6) = &H01
Call W_register(6)
D_bytes(1) = Write_reg + En_aa 'Enable auto ACK на pipe0
D_bytes(2) = &H01
Call W_register(2)
D_bytes(1) = Write_reg + En_rxaddr 'Включить RX адрес для pipe0
D_bytes(2) = &H01
Call W_register(2)
D_bytes(1) = Write_reg + Rf_ch 'Настройка каналов
D_bytes(2) = 40 'Частота 2440 MГц
Call W_register(2)
D_bytes(1) = Write_reg + Rf_setup 'Настройка РФ -> Выходной мощности 0 дБм, datarate 2 Мбит / с и МШУ прибыль по
D_bytes(2) = &H0F
Call W_register(2)
D_bytes(1) = Write_reg + Config_nrf 'Настройка CONFIG -> I=0 (TX_device), PWR_UP=1, CRC 2bytes, Включить CRC
D_bytes(2) = &H0E
Call W_register(2)
Return
Приёмник
$regfile = "m8def.dat"
$crystal = 8000000
'Заявить отдельные подпрограммы
Declare Sub R_register(byval Command As Byte , Byval C_bytes As Byte)
Declare Sub W_register(byval C_bytes As Byte)
'SPI (nRF24L01) команды
Const Write_reg = &H20 'Определить Команду Записи В Реестр
Const Rd_rx_pload = &H61 'Define Rx Полезной Нагрузки Адрес Регистра
'SPI (nRF24L01) регистры (адреса)
Const Config_nrf = &H00 'Config адрес регистра
Const En_aa = &H01 'Включить Автоматическое Подтверждение регистрации адрес
Const En_rxaddr = &H02 'Включено Rx адреса " адрес регистра"
Const Rf_ch = &H05 'RF channel' адрес регистра
Const Rf_setup = &H06 'РФ Setup " (Настройка) адрес регистра"
Const Status = &H07 'Статус " адрес регистра"
Const Rx_addr_p0 = &H0A 'rx адрес Pipe0 " зарегистрировать адрес"
Const Rx_pw_p0 = &H11 'rx полезной нагрузки ширина , Pipe0 " зарегистрировать адрес"
Const Fifo_status = &H17 'fifo - Регистр Состояния " регистрация адреса"
Dim D_bytes(6) As Byte , B_bytes(5) As Byte
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1
'Программное обеспечение SPI НЕ работает с nRF24L01, используйте оборудование SPI только, но эсэсовцы pin-код должен управляться нашей функцией
Config Portb.1 = Output : Ce Alias Portb.1 'CE pin is output
Config Portb.2 = Output : Ss Alias Portb.2 'SS pin is output
Config Pinb.0 = Input : Irq Alias Pinb.0 'IRQ pin is input
Spiinit
Set Ce
Waitms 10
Reset Ce
Reset Ss
Print "RX_device"
Call R_register(status , 1) 'Читать Регистр СОСТОЯНИЯ
Reset Ce 'Set CE низко, чтобы получить доступ к регистрам
Gosub Setup_rx 'Настройка nRF24L01 для RX
Waitms 2
Set Ce 'Set nRF20L01 в режиме приема
Do
If Irq = 0 Then 'Подождите, пока IRQ происходит, pin-код становится низким на прерывание
Reset Ce 'Ресивер должен быть включен до чтения pload
Call R_register(rd_rx_pload , 5) 'Читать 5 байт RX pload регистрации
Print "Pload : " ; Hex(b_bytes(1)) ; Hex(b_bytes(2)) ; Hex(b_bytes(3)) ; Hex(b_bytes(4)) ; Hex(b_bytes(5))
D_bytes(1) = Write_reg + Status 'Сброс RX_DR бит состояния
D_bytes(2) = &B01000000 'Напиши 1 до RX_DR бит для сброса IRQ
Call W_register(2)
Set Ce 'Включить приемник снова
Waitms 2
End If
Loop
'Sub подпрограмм
Sub W_register(byval C_bytes As Byte) 'Пишите зарегистрировать с SPI
Reset Ss 'Руководство управления СС контакт, установить СС низких до смещение, байт
Spiout D_bytes(1) , C_bytes 'Shiftout байты данных SPI корыта, C_bytes это количество байт, которые будут написаны
Set Ss 'Set СС высокого
End Sub
Sub R_register(byval Command As Byte , Byval C_bytes As Byte) As Byte 'C_bytes = Count_bytes, номер off байт для чтения
Reset Ss 'Ручное управление СС контакт, установить на низком уровне до переход в/из байт
Spiout Command , 1 'Первый shiftout в реестр, который будет читать
Spiin B_bytes(1) , C_bytes 'Прочитал назад байты из SPI направлять по nRF20L01
Set Ss 'Установить СС обратно на высоком уровне
End Sub
Setup_rx: 'Подготовка к RX
D_bytes(1) = Write_reg + Rx_addr_p0 'RX адрес для pipe0
D_bytes(2) = &H34
D_bytes(3) = &H43
D_bytes(4) = &H10
D_bytes(5) = &H10
D_bytes(6) = &H01
Call W_register(6) 'Отправить 6 байт для SPI
D_bytes(1) = Write_reg + En_aa 'Enable auto ACK на pipe0
D_bytes(2) = &H01
Call W_register(2)
D_bytes(1) = Write_reg + En_rxaddr 'Включить RX адрес для pipe0
D_bytes(2) = &H01
Call W_register(2)
D_bytes(1) = Write_reg + Rf_ch 'Настройка каналов
D_bytes(2) = 40 'Частота 2440 MГц
Call W_register(2)
D_bytes(1) = Write_reg + Rx_pw_p0 'Set RX pload ширина для pipe0
D_bytes(2) = 5
Call W_register(2)
D_bytes(1) = Write_reg + Rf_setup 'Настройка РФ -> Выходной мощности 0 дБм, datarate 2 Мбит / с и МШУ прибыль по
D_bytes(2) = &H0F
Call W_register(2)
D_bytes(1) = Write_reg + Config_nrf 'Настройка CONFIG -> I=1 (RX_device), PWR_UP=1, CRC 2bytes, Включить CRC
D_bytes(2) = &H0F
Call W_register(2)
Return


Последний раз редактировалось: porno_killer (2014-11-04 18:29), всего редактировалось 8 раз(а)

Создавать темы 01-Ноя-2014 17:15

[Профиль]  [ЛС] 

crumb

Стаж: 7 лет 1 месяц

Сообщений: 160

Симпатии: 9

а почему решили пользоваться BASCOM а не Code Vision AVR ?

Создавать темы 01-Ноя-2014 18:20

[Профиль]  [ЛС] 

porno_killer ®

Стаж: 6 лет 6 месяцев

Сообщений: 58

Симпатии: 2

Для меня язык программирования BASIC ближе, я програмирую на VB 6.0 Стал изучать МК недавно для развития программных решений за пределы ПК.

Создавать темы 01-Ноя-2014 18:26

[Профиль]  [ЛС] 

crumb

Стаж: 7 лет 1 месяц

Сообщений: 160

Симпатии: 9

Заметьте, что считывание состояния на входе происходит по команде Pin, а установка нужного уровня на выходе - по команде Port.
В CVAVR тоже также

Создавать темы 01-Ноя-2014 19:55

[Профиль]  [ЛС] 

porno_killer ®

Стаж: 6 лет 6 месяцев

Сообщений: 58

Симпатии: 2

возможно, но мне посоветовали эту я с неё начал поэтому не хотелось прыгать для мох разработок всё есть. а вы в чём работаете?

Создавать темы 01-Ноя-2014 20:23

[Профиль]  [ЛС] 

exxtreme

Стаж: 5 лет 8 месяцев

Сообщений: 63

Симпатии: 18

Я в Atmel Studio 6.0.. оказалась в чем то поинтересней кодвижена.. кстати по форумам было вычитано, что AS лучше компилирует (более чище) чем CVA.

Создавать темы 01-Ноя-2014 22:09

[Профиль]  [ЛС] 

crumb

Стаж: 7 лет 1 месяц

Сообщений: 160

Симпатии: 9

а вы в чём работаете?
В CVAVR , я сравнительно недавно начал изучать программирование и микроконтроллеры, поэтому CVAVR для меня легче, там есть Code Wizard генератор кода, но считается что луяше на AS переходить, быстрее отвык-ниш от холявы

Создавать темы 01-Ноя-2014 23:03

[Профиль]  [ЛС] 

exxtreme

Стаж: 5 лет 8 месяцев

Сообщений: 63

Симпатии: 18

890830
а вы в чём работаете?
но считается что луяше на AS переходить, быстрее отвык-ниш от холявы
Дело не в халяве.. там есть очень удобная штука, выплывает после первых написанных букв список команд.. так, что возможно там есть и своя халява :) .. есть еще 8 уроков одного чела... там как раз на AS + немного затрагивается ассемблер, но как всегда лень выкладывать, хотя очень интересно..

Создавать темы 02-Ноя-2014 21:06

[Профиль]  [ЛС] 

porno_killer ®

Стаж: 6 лет 6 месяцев

Сообщений: 58

Симпатии: 2

Добавил пример работы с АЦП

Создавать темы 02-Ноя-2014 22:18

[Профиль]  [ЛС] 

crumb

Стаж: 7 лет 1 месяц

Сообщений: 160

Симпатии: 9

891111Добавил пример работы с АЦП
чёт подозрительно маленький код bw , невидно конфигурации и инициализации UART, можешь под спойлером выложить скопированное прям с баскома?

Создавать темы 03-Ноя-2014 00:27

[Профиль]  [ЛС] 

crumb

Стаж: 7 лет 1 месяц

Сообщений: 160

Симпатии: 9

Дело не в халяве.. там есть очень удобная штука, выплывает после первых написанных букв список команд.. так, что возможно там есть и своя халява
да про это в курсе, но я имел ввиду другое, что в CVAVR зашел в Визард настроил контроллер, жмёшь кнопку и он генерит код.
есть еще 8 уроков одного чела... там как раз на AS + немного затрагивается ассемблер, но как всегда лень выкладывать, хотя очень интересно..
ну выложи хотя-бы на файлообменник

Создавать темы 03-Ноя-2014 00:34

[Профиль]  [ЛС] 

porno_killer ®

Стаж: 6 лет 6 месяцев

Сообщений: 58

Симпатии: 2

891135
891111Добавил пример работы с АЦП
чёт подозрительно маленький код bw , невидно конфигурации и инициализации UART, можешь под спойлером выложить скопированное прям с баскома?
Добавил статью про UART

Создавать темы 03-Ноя-2014 09:40

[Профиль]  [ЛС] 

crumb

Стаж: 7 лет 1 месяц

Сообщений: 160

Симпатии: 9

Добавил статью про UART
Прикольно, в CVAVR код длиннее получился бы, например там перед основной функцией всегда идёт настройка портов как минимум

Создавать темы 03-Ноя-2014 13:13

[Профиль]  [ЛС] 

porno_killer ®

Стаж: 6 лет 6 месяцев

Сообщений: 58

Симпатии: 2

891217
Добавил статью про UART
Прикольно, в CVAVR код длиннее получился бы, например там перед основной функцией всегда идёт настройка портов как минимум
в BASCOM тоже есть такое, если на МК нет аппаратного, АЦП его можно настроить. но на тех МК где есть аппаратный АЦП всё просто.
вот пример:
Программная реализация
За основу возьмём микроконтроллер без аппаратного UART – ATtiny13. Чтобы в BASCOM-AVR реализовать программный UART нужно, сначала сконфигурировать порты ввода\вывода на передачу TXD:

Open " порт : скорость , биты , чётность , стоп биты " For Output As #1

И на приём RXD:
Open " порт : скорость , биты , чётность , стоп биты " For Input As #2
Порт необходимо указывать так: com ножка ввода\вывода, например: comb.3 порт на ножку ввода\вывода PB.3 . Скорость, биты, четность и стоп биты указывать как обычно.
Пример команды конфигурации на передачу TXD:
Open "comb.3:9600,8,n,1" For Output As #1
Пример команды конфигурации на приём RXD:
Open "comb.4:9600,8,n,1" For Input As #2
После конфигурации с программным UART можно работать с помощью команд на передачу: Print #1 , данные и на приём: Input #2 , переменная

Создавать темы 03-Ноя-2014 17:02

[Профиль]  [ЛС] 

porno_killer ®

Стаж: 6 лет 6 месяцев

Сообщений: 58

Симпатии: 2

Добавил пример "Работа с дисплеем 16x2 на контроллере HD44780 в Bascom-AVR" и "
Главная » Статьи » Как подключить
Радиомодули nRF24L01"

Создавать темы 04-Ноя-2014 18:17

[Профиль]  [ЛС] 
Показать сообщения:    
Ответить на тему

Текущее время: 18-Ноя 20:58

Часовой пояс: UTC + 5



Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы