Проекты на bascom avr. BASCOM AVR – конфигурируем порты МК. Подключаем кнопку. Основные отличия BASCOM от QBasic

Ну не нравится мне этот ваш Wiring. А еще он почему-то у меня очень ме-е-едленно компилирует, а потом долго думает перед прошивкой.
Я постараюсь рассказать об альтернативной среде для программирования AVR-контроллеров, которая совмещает в себе редактор кода, компилятор, и отладчик-симулятор. К тому же, в последих версиях среда без лишних телодвижений может использоваться с загрузчиком Arduino(т.е. без переделки платы, перепрошивки загрузчика и т.д.)

Установка

Идем на Офсайт , или просто переходим по второй ссылке в конце топика — сразу начнет загружаться демо-версия среды(30Мб). Демо всего лишь означает, что она позволит собирать проекты, чей вес в скомпилированном виде не превышает 4Кб. Для большинства проектов этого хватает(ага, особенно для Attiny2313), а если нет — кряк для последний версии на рутрекере придется купить, благо он стоит не очень дорого — 89 евро .
Установка совершенно обычная, если у кого-то не запускается в Win7 и выше — установите режим совместимости с XP. Под вайном работает совершенно нормально. Собственно, можно и не устанавливать — просто скопировать папку, вполне себе portable-версия.

Использование

Основное окно:


Все кнопки снабжены подсказками, и думаю нет нужны пояснять что и где находится.
В последних версиях ее очень пристойно перевели на русский язык, который можно включить в Options — Environment — IDE — Language — Russian.

Вот у меня завалялась копия платы Arduino Nano, которую я долгое время использовал при отладке, прошивая напрямую, через разъем программатора, из-за нелюбви к Arduino IDE.


Попробуем что-нибудь написать для нее. Для начала необходимо установить тип МК — Atmega168, делается это вот такой строкой: $regfile = "m168def.dat"
Почему строка такая, думая понятно. Конечно, установить тип контроллера можно и в Настройки — Компилятор — МК, но в тексте удобнее. Посмотреть как называются файлы для разных контроллеров можно в папке с программой(c:\Program Files\MCS Electronics\BASCOM-AVR\*.dat).
Устанавливаем тактовую частоту: $crystal = 16000000
16МГц. Ни на что не влияет, кроме отсчета временных промежутков(waitms). Не устанавливает частоту для контроллера. Ее вы по прежнему должны выставлять сами, программирую Fuse-блок. Впрочем, для Arduino этим можно и не заморачиваться.
Конфигурируем порты: Config Portb.5 = Output
Никаких номерных пинов, только хардкор. Смотрим в даташит конкретному контроллеру, и видим имена портов:

PD1 = portd.1, pb4 = portb.4
Можно и устанавливать каждый порт по отдельности, а просто написать: Config Portb = Output

Запускаем безусловный цикл(можно и без него, тогда программа выполнится только один раз при запуске контроллера) Do Loop

И внутри него, например, моргаем светодиодом: Toggle Portb.5
Portb.5 это тоже самое что pin 13 в ардуине. Соответствия(если вы привыкли к такому наименованию портов) можно посмотреть здесь:

Синтаксис очень простой и напоминает basic. 7 типов переменных: Bit, Byte, Integer, Word, Long, Single, String.
Которые обьявляются в начале программы вот так: Dim A as Single
Очень простое подключение к экранам на контроллере HD44780: Config lcd = 16 *2 Config lcdpin = PIN, DB4 = PORTB.1 ,DB5=PORTB.2 ,DB6=PORTB.3 ,DB7=PORTB.4 ,E=PORTB.5 ,RS=PORTB.6 Config lcdmode = PORT
И такой же простой вывод на них текста: Lcd "Hello, habr! " ; time
Но несмотря на простоту, есть управление курсором, встроенный редактор символов, поддержка кириллицы.
Простая генерация звука: Sound, Portb.0 , 100 , 500
Что означает, выдать на PB0 меандр частотой 500гц и длительностью 100мс.
Генерация тонов DTMF: Dtmfout, 15 , 100
15-й тон в течении 100мс.
Работа с UART(как с железным, так и программным): Dim Name as String * 10 $Baud = 9600 Input "Hello, print you name" , Name Print "Name: " ; Name
Работа с прерываниями: On Int0 Button - Имя подпрограммы Config Int0 = Low Level - Прерывание по низкому уровню Enable Interrupts - Включить прерывания Enable Int0 Button: Incr Cntr Return
С таймерами: Config Timer0 = Timer , Prescale = 64 - Настраиваем таймер и предделитель On Timer0 Pulse: - Имя подпрограммы Enable Interrupts - Включить прерывания Enable Timer0 Pulse: Incr Cntr Return

Прошивка Arduino

В последней версии разработчики добавили поддержку загрузчика Ардуины, и нам необходимо только сделать несколько настроек.
Options — Programmer — ARDUINO . После чего указать com-порт, и скорость.


В моем случае скорость надо было обязательно указать именно 19200, иначе плата не прошивалась. Посмотреть параметры всех плат можно в файле по адресу arduino-1.0.1\hardware\arduino\boards.txt
Кстати, там же есть и размер памяти, и частота кристалла:
nano.name=Arduino Nano w/ ATmega168 nano.upload.maximum_size=14336 nano.upload.speed=19200 nano.bootloader.low_fuses=0xff nano.bootloader.high_fuses=0xdd nano.bootloader.extended_fuses=0x00 nano.build.mcu=atmega168 nano.build.f_cpu=16000000 L

Альтернативный способ загрузки(мне не нравится встроенный прошивальщик своей медлительностью) — с помощью AVRDUDE, мощнейшего консольного программатора.
Скачиваем последнюю версию вот отсюда , например avrdude-5.11.tar.gz . Распаковываем в папку с программой.
Идем в Options — Programmer — External Programmer , и указываем в после Programm путь до исполняемого файла:
«C:\Program Files\MCS Electronics\BASCOM-AVR\ARVDUDE\avrdude.exe»
А в после ниже — параметры в таком виде:
-C «C:\Program Files\MCS Electronics\BASCOM-AVR\ARVDUDE\avrdude.conf» -p atmega168 -P com2 -c arduino -b 19200 -U flash:w:{FILE}:i
Все понятно из названий, показываем где лежит конфиг, указываем тип контроллера, порт, протокол, скорость, работа с флешем, запись, и файл. Ставим галочку Use HEX file.
Для пущей радости можно отметить и пункт Program after compile — чтоб скомпилировать и прошить одной кнопкой.
При сборке показывается потребление программой доступного флеша:

А потом запускается ARVDUDE:

Еще сбоку можно включить справку по пинам выбранного контроллера(есть по умолчанию, а если нет, то включается View — Pin Layout ):

При наведении курсора на пин, показывает его имя и описание.
Если этого недостаточно, то можно скачать даташит и включить View — PDF Viewer :

Еще одна классная вещь — встроенный отладчик с симуляцией железа, бреак-поинтами и пошаговым выполнением.


Включается нажатием на кнопку с красной микросхемой, конечно, предварительно надо скомпилировать программу.

А на сладкое — код, компилируемый в bascom значительно меньше по размеру и выполняется часто быстрее, чем код от Arduino IDE.
Например, стандартный blink(мигание светодиодом):
Для Arduino: void setup() { pinMode(13 , OUTPUT); } void loop() { digitalWrite(13 , HIGH); digitalWrite(13 , LOW); }
Компилируется в hex размером 3078(!!!) байт, и дергает пин с частотой 210кГц:

А в Bascom, записанный вот так: $regfile = "m168def.dat" $crystal = 16000000 Config Portb.5 = Output Do Toggle Portb.5 Loop
Занимает 553 байта(в пять раз меньше) hex, и мигает уже с частотой 1,6МГц:

15 сентября 2012 в 22:56

Альтернатива Wiring для Arduino - BASCOM-AVR

  • DIY или Сделай сам
  • Tutorial

Ну не нравится мне этот ваш Wiring. А еще он почему-то у меня очень ме-е-едленно компилирует, а потом долго думает перед прошивкой.
Я постараюсь рассказать об альтернативной среде для программирования AVR-контроллеров, которая совмещает в себе редактор кода, компилятор, и отладчик-симулятор. К тому же, в последих версиях среда без лишних телодвижений может использоваться с загрузчиком Arduino(т.е. без переделки платы, перепрошивки загрузчика и т.д.)

Установка

Идем на Офсайт , или просто переходим по второй ссылке в конце топика - сразу начнет загружаться демо-версия среды(30Мб). Демо всего лишь означает, что она позволит собирать проекты, чей вес в скомпилированном виде не превышает 4Кб. Для большинства проектов этого хватает(ага, особенно для Attiny2313), а если нет - кряк для последний версии на рутрекере придется купить, благо он стоит не очень дорого - 89 евро .
Установка совершенно обычная, если у кого-то не запускается в Win7 и выше - установите режим совместимости с XP. Под вайном работает совершенно нормально. Собственно, можно и не устанавливать - просто скопировать папку, вполне себе portable-версия.

Использование

Основное окно:


Все кнопки снабжены подсказками, и думаю нет нужны пояснять что и где находится.
В последних версиях ее очень пристойно перевели на русский язык, который можно включить в Options - Environment - IDE - Language - Russian.

Вот у меня завалялась копия платы Arduino Nano, которую я долгое время использовал при отладке, прошивая напрямую, через разъем программатора, из-за нелюбви к Arduino IDE.


Попробуем что-нибудь написать для нее. Для начала необходимо установить тип МК - Atmega168, делается это вот такой строкой:
$regfile = "m168def.dat"
Почему строка такая, думая понятно. Конечно, установить тип контроллера можно и в Настройки - Компилятор - МК, но в тексте удобнее. Посмотреть как называются файлы для разных контроллеров можно в папке с программой(c:\Program Files\MCS Electronics\BASCOM-AVR\*.dat).
Устанавливаем тактовую частоту:
$crystal = 16000000
16МГц. Ни на что не влияет, кроме отсчета временных промежутков(waitms). Не устанавливает частоту для контроллера. Ее вы по прежнему должны выставлять сами, программирую Fuse-блок. Впрочем, для Arduino этим можно и не заморачиваться.
Конфигурируем порты:
Config Portb.5 = Output
Никаких номерных пинов, только хардкор. Смотрим в даташит конкретному контроллеру, и видим имена портов:

PD1 = portd.1, pb4 = portb.4
Можно и устанавливать каждый порт по отдельности, а просто написать: Config Portb = Output

Запускаем безусловный цикл(можно и без него, тогда программа выполнится только один раз при запуске контроллера)
Do Loop

И внутри него, например, моргаем светодиодом:
Toggle Portb.5
Portb.5 это тоже самое что pin 13 в ардуине. Соответствия(если вы привыкли к такому наименованию портов) можно посмотреть здесь:

Синтаксис очень простой и напоминает basic. 7 типов переменных: Bit, Byte, Integer, Word, Long, Single, String.
Которые обьявляются в начале программы вот так: Dim A as Single
Очень простое подключение к экранам на контроллере HD44780:
Config lcd = 16*2 Config lcdpin = PIN, DB4 = PORTB.1,DB5=PORTB.2,DB6=PORTB.3,DB7=PORTB.4,E=PORTB.5,RS=PORTB.6 Config lcdmode = PORT
И такой же простой вывод на них текста:
Lcd "Hello, habr! " ; time
Но несмотря на простоту, есть управление курсором, встроенный редактор символов, поддержка кириллицы.
Простая генерация звука:
Sound, Portb.0, 100, 500
Что означает, выдать на PB0 меандр частотой 500гц и длительностью 100мс.
Генерация тонов DTMF:
Dtmfout, 15, 100
15-й тон в течении 100мс.
Работа с UART(как с железным, так и программным):
Dim Name as String * 10 $Baud = 9600 Input "Hello, print you name", Name Print "Name: " ; Name
Работа с прерываниями:
On Int0 Button - Имя подпрограммы Config Int0 = Low Level - Прерывание по низкому уровню Enable Interrupts - Включить прерывания Enable Int0 Button: Incr Cntr Return
С таймерами:
Config Timer0 = Timer , Prescale = 64 - Настраиваем таймер и предделитель On Timer0 Pulse: - Имя подпрограммы Enable Interrupts - Включить прерывания Enable Timer0 Pulse: Incr Cntr Return

Прошивка Arduino

В последней версии разработчики добавили поддержку загрузчика Ардуины, и нам необходимо только сделать несколько настроек.
Options - Programmer - ARDUINO . После чего указать com-порт, и скорость.


В моем случае скорость надо было обязательно указать именно 19200, иначе плата не прошивалась. Посмотреть параметры всех плат можно в файле по адресу arduino-1.0.1\hardware\arduino\boards.txt
Кстати, там же есть и размер памяти, и частота кристалла:

Nano.name=Arduino Nano w/ ATmega168 nano.upload.maximum_size=14336 nano.upload.speed=19200 nano.bootloader.low_fuses=0xff nano.bootloader.high_fuses=0xdd nano.bootloader.extended_fuses=0x00 nano.build.mcu=atmega168 nano.build.f_cpu=16000000L

Альтернативный способ загрузки(мне не нравится встроенный прошивальщик своей медлительностью) - с помощью AVRDUDE, мощнейшего консольного программатора.
Скачиваем последнюю версию вот отсюда , например avrdude-5.11.tar.gz . Распаковываем в папку с программой.
Идем в Options - Programmer - External Programmer , и указываем в после Programm путь до исполняемого файла:
«C:\Program Files\MCS Electronics\BASCOM-AVR\ARVDUDE\avrdude.exe»
А в после ниже - параметры в таком виде:
-C «C:\Program Files\MCS Electronics\BASCOM-AVR\ARVDUDE\avrdude.conf» -p atmega168 -P com2 -c arduino -b 19200 -U flash:w:{FILE}:i
Все понятно из названий, показываем где лежит конфиг, указываем тип контроллера, порт, протокол, скорость, работа с флешем, запись, и файл. Ставим галочку Use HEX file.
Для пущей радости можно отметить и пункт Program after compile - чтоб скомпилировать и прошить одной кнопкой.
При сборке показывается потребление программой доступного флеша:

А потом запускается ARVDUDE:

Еще сбоку можно включить справку по пинам выбранного контроллера(есть по умолчанию, а если нет, то включается View - Pin Layout ):

При наведении курсора на пин, показывает его имя и описание.
Если этого недостаточно, то можно скачать даташит и включить View - PDF Viewer :

Еще одна классная вещь - встроенный отладчик с симуляцией железа, бреак-поинтами и пошаговым выполнением.


Включается нажатием на кнопку с красной микросхемой, конечно, предварительно надо скомпилировать программу.

А на сладкое - код, компилируемый в bascom значительно меньше по размеру и выполняется часто быстрее, чем код от Arduino IDE.
Например, стандартный blink(мигание светодиодом):
Для Arduino:
void setup() { pinMode(13, OUTPUT); } void loop() { digitalWrite(13, HIGH); digitalWrite(13, LOW); }
Компилируется в hex размером 3078(!!!) байт, и дергает пин с частотой 210кГц:

А в Bascom, записанный вот так:
$regfile = "m168def.dat" $crystal = 16000000 Config Portb.5 = Output Do Toggle Portb.5 Loop
Занимает 553 байта(в пять раз меньше) hex, и мигает уже с частотой 1,6МГц:

В предыдущей статье мы рассмотрели простой пример моргания светодиодом и научились пользоваться встроенным программатором в BASCOM AVR . Теперь настало время подробнее ознакомится с настройкой портов микроконтроллера на примере работы с кнопкой. Для этого используем наш контроллер MRC 40(ATmega 32) с установленным экспериментальным модулем.

Для начала кратко и упрощенно рассмотрим внутреннюю структуру микроконтроллера... Порт имеет три части...

DDR переключает режимы работы порта - режим INPUT (вход) или OUTPUT (выход). Он осуществляет коммутацию элементов внутри микроконтроллера.

PORT представляет из себя набор из 8 выходных ключей, которые могут выдерживать нагрузку в 50мА. К примеру можно управлять светодиодом и прочими внешними элементами с небольшой нагрузкой.

PIN является набором из 8 входных логических элементов, которые могут быть установлены как 1 или 0. Когда установлен логический уровень "0", то на ножке МК установлено напряжение от 0 до примерно 0.1 вольт, если установлен логический уровень 1, то напряжение на ножке МК от 2,5 вольт до VCC (напряжение питания микроконтроллера, в данном рассматриваемом случае это 5В).

CONFIG PORTB = OUTPUT

Вы устанавливаете все выводы порта B в режим выхода.

Когда вы выполняете эту строку...

CONFIG PORTB = INPUT

Вы устанавливаете все выводы порта B в режим входа.

Если вы выполните следующие команды...

CONFIG PORTB = OUTPUT

CONFIG PORTB.2 = INPUT

Тогда только вывод 2 порта B (PORTB.2) установлен в режим входа, остальные установлены на выход.

Почему?

Потому что PORTB.2 не соединен электрически внутри МК со схемой входа, он может работать только в режиме «выход».

Не смотря на то, что при CONFIG PORTB .2 = INPUT не читается PORTB .2, второй вывод все равно конфигурируется на вход и прочитать его можно черезPIND .2.

Теперь рассмотрим все вышесказанное на примере обработки состояния кнопки.

Итак, мы имеем кнопку и светодиод (на экспериментальном модуле для MRC 40 все это хозяйство имеется в наличии). Кнопка подключенана ножку 2 порта С (PORTC .2), а светодиод на ножку 0 порта В (PORTB .0). Нам необходимо сделать так, что бы при нажатии на кнопку загорался светодиод.

Пишем программу…


"сайт

Config Portb.0 =Output " конфигурируем вывод 2 порта B на ВЫХОД - подключаем к нему светодиод

Do " начало цикла программы

If Pinc.2 =0 Then " УСЛОВИЕ - если на 2-й ножке порта С низкий логический уровень то...
Portb.0 = 1 " устанавливаем на ножке 0 порта В высокий логический уровень (светодиод горит)
Else " в противном случае...
Portb.0 = 0 " устанавливаем на ножке 0 порта В низкий логический уровень (светодиод не горит)
End If"конец условия
Loop
End

На будущее при написании программ для МК очень удобно пользоваться командой присвоения имен - ALIAS . С помощью нее различным переменным можно присвоить уникальные имена.

Перепишем программу с использованием команды ALIAS .

"считываем состояние порта (подключаем кнопку)
"сайт

$regfile = "m32def.dat" " используемый микроконтроллер ATmega32 (MRC40 с универсальным модулем)
$crystal = 16000000 " частота установленного кварца 16 mHz

Config Portb.0 = Output " конфигурируем вывод 2 порта B на ВЫХОД - подключаем к нему светодиод
Config Pinc.2 = Input " конфигурируем вывод 2 порта С на ВХОД - подключаем к нему кнопку

Led Alias Portb.0 " присваиваем имя LED выводу 0 порта B
Button Alias Pinc.2 " присваиваем имя Button выводу 2 порта С

Do " начало цикла программы

If Button = 0 Then " УСЛОВИЕ - если на 2-й ножке порта С низкий логический уровень то...
Led = 1 " устанавливаем на ножке 0 порта В высокий логический уровень (светодиод горит)
Else " в противном случае...
Led = 0 " устанавливаем на ножке 0 порта В низкий логический уровень (светодиод не горит)
End If "конец условия

Loop
End

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

О!… мы забыли проDDR…

Пришло время разобраться и с этим зверем =)

С помощью DDR мы имеем возможность настроить весь порт одной строчкой кода. Как мы писали выше, функцией DDR является переключение режимов работы порта. Внутри микроконтроллера выводы портов пронумерованы в следующем порядке - 76543210 . Таким образом, мы можем одним бинарным числом установить состояния PORT /PIN порта.

Посмотрим на пример ниже…

CONFIG PORTB = OUTPUT

При такой конфигурации порта В на всехвыводах порта DDR установлен в 1.

CONFIG PORTB = INPUT

А при такой конфигурации порта В на всехвыводах портаDDR установлен в 0.

Так что же это нам дает? А вот что!

К примеру нам надо сконфигурировать порт B таким образом

CONFIG PORTB = OUTPUT

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

Что же нужно, чтобы начать?
Вот что потребуется, чтобы написать первую программу - светодиодную моргалку:
- Компьютер с параллельным портом под управлением Win9x или круче
- Установленный на него BASCOM AVR
- Даташит на МК AT90S2313
- Программатор
- Тестовая установка с пресловутым МК


Все это будет подробно описано ниже. Настоятельно рекомендую использовать AT90S2313 !

Компьютер
На компе должна стоять ОС Windows 95 (или понавороченнее). Если вы хотите использовать простой самодельный программатор, то непременно потребуется параллельный порт. К тому же, если ваша ОС из породы NT, то для нормальной работы потребуется маленькая утилитка. Но о ней позже.

Установка BASCOM
Выкачайте бесплатную версию BASCOM. Эта версия не позволяет компилировать код, выходной размер которого более 2КБ (на самом деле для нас это не проблема, этого за глаза хватит). Распакуйте архив во временную папку, запустите setup.exe и следуйте указаниям установки. Банально просто, не правда ли?

Сборка (или покупка) программатора
Программатор - это устройство, загружающее скомпилированный код в программную память МК. Что может быть проще, чем купить программатор? Если вы купили STK500, то помимо программатора вы получите кучу вкусностей, например светодиоды. Купили? Значит, валите отсюда, вам тут точно делать нечего. Гораздо проще и приятнее (да и намного дешевле) собрать собственный программатор. Схем в Сети очень много. Рекомендую использовать совместимый с STK200/300 программатор. Так же для аппарата потребуется управляющая программа. Здесь и в дальнейшем будет использоваться TWinAVR. Она проста в обращении и даже не требует установки.
Самый удобный способ программирования - внутрисхемный. Как это? Да очень просто. Вы ставите на плату с готовым устройством разъём и подцепляете к нему специализированные лапки МК. Использовать эти лапки для чего-то еще не рекомендуется. Например, если программа МК начнет выполняться при подключенном программаторе, что-нибудь да погорит. Конечно, это не проблема при использовании большого МК с достаточным числом портов. Но при использовании слабеньких МК в условиях жесткой экономии ног нужно некоторое решение. Одно из них - применение программатора с шинным формирователем. Его выводы могут находиться в трех состояних: логические 1, 0 и еще Z-состояние с высоким сопротивлением выхода. Вот тогда при программировании ничего не погорит.

В целом процесс прошивки выглядит следующим образом:
1. Подадим землю на вывод Reset. Это переведет МК в режим программирования.
2. Установим на ножке MOSI (ножка приема данных) необходимый логический уровень, согласно программе.
3. Подадим на тактовую ножку импульс логической 1. МК считает значение с ножки MOSI и положит в память.
4. Повторим шаги 2 и 3, пока в память не запишется слово.
5. Считаем это слово через ножку MISO (выход данных с МК).
6. Сравним полученное слово с отправленным.
7. Повторяем все, пока вся программа не будет загружена и проверена.

Программатор должен быть запитан от внешнего источника +5 вольт, так как мы используем шинный формирователь только для переключения уровней. Остерегайтесь того, что некоторые современные ПК и ноутбуки не выдают не полные +5 вольт, а только +3. Печально...

ПО для программатора
Раздобудьте TWinAVR, например, трением. Эта программа заставляет ПК взаимодействовать с МК через программатор. Программа не требует установки, просто распакуйте в любое удобное место и запускайте.

Купить


Теперь надо научить программу использовать напряжение с пинов порта для управления шинным формирователем. Откройте окно настроек, уберите галочку Vcc. Теперь напряжение на порте появляется только при запущенной программе. Если теперь использовать это напряжения для программирования, то в тот момент, когда программа неактивна, напряжение на порту исчезает, и выводы формирователя оказываются как раз в Z-состоянии. Кстати, проверьте заодно настройки LPT порта. Его адрес по умолчанию &378 (проверьте в BIOS). Если нет, то срочно меняйте настройки.

Программа UserPort
Если вы используете OC Windows семейства NT, TWinAVR не сможет получить прямого доступа к LPT порту. Эта проблема решается использованием специальной утилиты, дающей прямой доступ к порту. Одна из них - UserPort. Её нужно установить и настроить перед использованием TWinAVR. Сначала скачайте архив с программой. Распакуйте его и скопируйте файл userport.sys в C:\Windows\System32\drivers. Запустите userport.exe. В левом списке выберите 3BC-3BF и 3E8-3FF и нажмите "Remove". Повторите эти же действия для всех записей в правом окне. В конце в левом окне должно остаться 200-37F. Нажмите "Start". Теперь к указанным адресам всегда будет прямой доступ. Если вам нужен LPT порт для других целей, например принтера, то запустите userport.exe и нажмите "Stop". Работа драйвера будет остановлена.
Настройка BASCOM по умолчанию
Свежеустановленный BASCOM уже и так имеет кучу разнообразных настроек. Но все таки не помешает посмотреть, что же там творится такое. Нажимаем Options->Compiler->Chip:

Вкладка "Chip" позволяет вам выбрать любой из поддерживаемых типов контроллеров. Выберем для первых экспериментов AT90S2313 (а бесплатная версия ничего серьезнее вам и не предложит). Теперь, если мы сохраним наш проект.bas, рядом с ним будет еще и конфигурационный файл, например такой (http://decada.org.ru/project/lessons/bascom_avr/03/ledflasher.cfg. Это текстовый файл, который можно открыть любым редактором. Он содержит все настройки, которые вы задали для своего проекта. Это очень простой способ управлять настройками. Однако, если вы захотите передать кому-нибудь свой проект, то, помимо исходного файла, не забудьте передать и.cfg файл с настройками компилятора. Второй очень удобный способ (возможно, более простой для опытных пользователей) - помещение всех настроек прямо в исходный код программы. При этом код выглядит примерно так:

Первая строка кода указывает на то, что мы будем использовать контроллер AT90S2313, и компилятору нужно загрузить соответствующий файл описаний. Вторая строка указывает, что мы будем использовать кварцевый резонатор на 4МГц. Все служебные слова можно просмотреть в справке BASCOM (Help->Index):

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

Моргало светодиодное
Светодиодная моргалка - это, пожалуй, примерно тоже, что и "Hello world!", только с хардкорным электрическим уклоном. Это тот самый этап, когда вы будете готовы к запуску целой системы и проверки её работоспособности.

Для начала соберите небольшую тестовую схему.

К микроконтроллеру в стандартной обвязке (под стандартной обвязкой имеется ввиду источник питания и кварцевый резонатор с подтягивающими конденсаторами) необходимо подключить светодиод. Анодом подключите его к любому выводу порта D (читайте даташит, смотрите распиновку!), а катодом - к земле через резистор 220-560 ом.
Теперь приступим. Запустите BASCOM, создайте новый проект (File->New).

В появившемся окне редактора наберите следующую программу:

Заметьте: редактор осуществляет подсветку синтаксиса при вводе. Это очень удобно, сразу заметно, если вы где-то допустили ошибку. В этой простейшей программе порт D настраивается на вывод. Потом на него подается значение 255. Таким образом все биты порта примут значение 1. Обратите внимание, что аппаратно доступны только младшие 7 бит (PD0-PD6).
По истечении 50 миллисекунд на порту D устанавливается значение 0, и все его биты также принимают значение 0. Через 50 миллисекунд цикл повторяется. В результате светодиод очень часто моргает. После того, как вы ввели текст, нажмите File->Save и сохраните файл проекта в подходящее место. Назовите его ledflasher.bas. Так как BASCOM создает множество файлов после компиляции, неплохо было бы сохранять каждый проект в отдельную папку.

Зададим теперь настройки контроллера. Жмем Options->Compiler->Chip:


Чип по умолчанию установлен как AT90S2313:

По умолчанию значение тактовой частоты установлено 10 МГц, но так как мы используем кварц на 4 МГц, выберите значение 4000000 из списка Frequency. Необходимо задавать тактовоую частоту кварца, который будет использоваться в схеме, так как все временные величины в программе рассчитываются из этого значения:

После того, как вы сохранили проект, нажмите Program->Compile (F7). BASCOM проверит синтаксис, и, если не найдет ни одной досадной ошибки, скомпилирует программу и скажет, сколько памяти она займет в МК указанного типа:

Теперь убедитесь, что питание на вашу схему подано, программатор подключен к устройству и ПК:

В BASCOM нажмите Program->Send to chip (F4). Если вы настроили BASCOM на использование внешнего компилятора, описаного ранее,появится окно TWinAVR. Дальше эта программа сделает следующее:

Остановит работу МК (подаст 0 на линию сброса)
- Подключит шинный формирователь (74HCT244) к лапкам МК
- Поместит содержимое ledflasher.bin в программную память МК
- Сравнит загруженную программу с оригиналом
- Отключит шинный формирователь от МК
- Освободит линию сброса (подаст 1), МК начнет выполнять программу.

При программировании информация о текущих процессах отображается в отдельном окне:

После завершения программирования вам придется вручную закрыть TWinAVR, этого BASCOM за вас не сделает. В награду за наши старания мы получим шустро моргающий светодиод. Теперь поиграемся с кодом программы. Измените значения после команды Waitms, чтобы изменить время вспышек и пауз между ними. Нажмите F7, чтобы перекомпилировать программу, перепрограммируйте чип клавишей F4 и следите за изменениями в работе! Теперь, когда все подключено, вы заметите, что при следующей загрузке компьютера контроллер не включится, пока вы не запустите TWinAVR. Это происходит оттого, что компьютер удерживает линию сброса на низком уровне, а TWinAVR сбрасывает её после записи программы или чтения конфигурации.

Бейсик в BASCOM
Разработчики BASCOM утверждают, что он не является "диалектом" бейсика. Однако его код невероятно похож на Microsoft QBasic. Если вы рождены на заре компутерной цивилизации, то, наверное, вспомните голый DOS, веселый Norton и, конечно же, Quick Basic. Погуглите вокруг и вы найдете огромные кучи бесполезной или интересной информации, а также дофига пособий по бейсику (они вам непременно пригодятся!).

Основные отличия BASCOM от QBasic

Одно действие на строке
BASCOM не позволяет производить более одной математической операции на одной строке.
Так писать нельзя:


Эта особенность объясняется тем, что МК под любыми угрозами не выполнит за один такт два действия. А разбивать сложную строку на составляющие BASCOM за вас не будет.

Операторы ввода/вывода
Оператор INPUT в QBasic возвращает введеные пользователем с клавиатуры данные. В BASCOM он считывает данные по RS-232 с UART микроконтроллера. Аналогично, в QBasic оператор PRINT выводит данные на экран, а в BASCOM он выводит их по RS-232 на UART. Предполагается, что вы уже умеете писать на бейсике для ПК. Дальше будет несколько статей про особенности использования переменных, массивов и прочих неотъемлемых атрибутов языка программирования. На страницах часто встречается такое слово, "переменная". А кто-нибудь вообще объяснил, что это такое? А это всего лишь мнемоническое представление ячейки памяти с некоторыми данными, которе используется в процедурах для быстрого осуществления доступа к памяти. Ничего сложного, правда? Мы используем слово переменная, подразумевая, что данные в этой злосчастной ячейке могут изменяться. (а если данные не меняются, то такие ущербные переменные мы называем константы). Давайте для примера как-нибудь обозначим количество букв в слове. Объявим переменную BUKVO. В слове хренлогрыз десять букв. Поэтому положим в переменную BUKVO значение 10. В реальности мы положим число 10 в область памяти, зарезервированную переменной BUKVO. Когда в программе мы обратимся к этой переменной, BASCOM на самом деле обратится к участку памяти, закрепленному за этой переменной. Компилятор сам придумывает и запоминает, где какую переменную хранить. Нам об этом можно даже не думать.

Имена переменных
Имя переменной может быть до 32 символов длиной. В названии можно использовать цифры и латинские буковки. Убедитесь, что выбранное имя не совпадает со служебными словами. Например, нельзя создавать переменную с названием "Config". Имена переменных НЕ чувствительны к регистру.

В BASCOM есть следующие типы переменных:
Bit
Хранит значение 0 или 1. Используйте этот тип для хранения состояния кнопки, переключателя, ножки порта ввода/вывода - всего, что может быть включено или выключено.

Byte
Хранит в памяти один байт (8 бит). Испотльзуйте этот тип для хранения числа от 0 до 255 или для символа. Особенно полезно использовать этот тип в маленьких МК, когда память очень ограничена. Храните в этой переменной любое число, которое сюда влезет. Но помните: если к переменной типа byte со значением 255 прибавить 1, то она сбросится до 0.

Integer
Эта переменная занимает в памяти два байта и хранит числа от -32768 до +32767. Так как один бит зарезервирован под знак числа, оставшиеся 15 делятся пополам на положительные и отрицательные значения. Храните в этом типе все числа, которым нужен знак, а также все числа, которые вписываются в указанный диапазон. Кстати, при переполнении переменной данного типа, её значение изменится с +32767 на -32768.

Word
Это двухбайтный тип, не имеющий знака. Для хранения числа доступны все 16 бит, поэтому диапазон допустимых чисел от 0 до 65535. Эту переменную можно использовать для сравнительно больших величин, не имеющих знака. При переполнении значение 65535 изменяется до 0.

Long
Переменная такого типа занимает в памяти 4 байта. Из 32 бит один отводится под знак, а все остальные хранят модуль числа. Таким образом, хранимый диапазон составляет от -2147483648 до +2147483647. В переменной типа Long можно хранить все значения, которые не влезли в Integer. При переполнении, как и все переменные, сбросится до минимального значения диапазона.

Single
Четырехбайтный тип для хранения чисел с плавающей точкой. Запоминает числа от 1.5х10^45 до 3.4х10^38 со знаком. Используйте только его для хранения дробных чисел. Например, если вы положите число 3.1415926 в переменную типа Integer, то обратно получите только 3, так как дробная часть пропадет. Переменная типа Single может хранить большой диапазон дробных положительных и отрицательных чисел. Но будьте внимательны: вы можете потерять некоторую точность при преобразованиях. Например:

После этих операций в переменной A окажется значение 0.9876543. Это потому, что переменная помнит 9 символов (включая целую часть и точку).

String
Переменная этого типа помнит строку из нескольких символов. Каждый символ занимает в памяти один байт. Последовательность символов заканчивается так называемым "нулевым байтом", поэтому он также занимает место в памяти. Главное в выборе типа переменной - определиться, какие типы данных в ней будут храниться. Выбирайте тип наименьшего размера, в который еще вписывается необходимое число, чтобы не тратить память попусту. Также помните, что при использовании типа Integer программа будет гораздо компактнее и быстрее, чем при использовании типа Single. Операции с плавающими точками во все времена были довольно медленным занятием.

Работа со строками
Строка - это такая переменная, которая хранит в себе последовательность символов. Она используется для ввода/вывода текста или длинных чисел. Строка объявляется так:

Переменная Message может хранить до 10 символов. Каждый символ занимает один байт. BASCOM добавляет дополнительный байт, обозначающий конец строки. Максимальная длина строки таким образом составляет 254 символа.

В BASCOM есть большой арсенал функций для работы со строками:

Массивы
Массив - это всего лишь группа переменных одного типа, объединенных общим названием и различающихся индексом - порядковым номером элемента. Рассмотрим, например, номера домов на улице:

Мы создаём массив переменных Integer, каждая из которых помнит "свой" номер дома. Объявлется массив очень просто, так же, как и переменные:

Теперь посмотрим, можно ли положить в ячейку памяти имя владельца дома вместо номера:

Такой массив объявляется так:

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

Заметьте, в BASCOM нумерация элементов массива всегда начинается с 1, а не с 0, как это делается во многих других компиляторах.
Тип переменной Index может быть любым, кроме Bit, Single и Double.

Данные
Выражение DATA служит для хранения неизменяемых данных в программной памяти. Они не съедят драгоценные байты оперативной памяти, где хранятся переменные. Хранить тут можно любые виды информации. Как только она потребуется, она может быть считана в переменную при помощи операторов Read или Restore. Учтите, тип переменной должен совпадать с типом хранящихся данных! Оператору DATA должна предшествовать метка с названием блока данных. Допустим, у нас есть 4 байта для управления какой-нибудь микросхемы:

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

Обратите внимание:
. Строки с данными идут в конце программы, после оператора завершения работы End.
. В блоке данных все целочисленные значения должны оканчиваться с %
. Все значения типа Single c !
. Все значения типа Long с &
. Значения типа Byte не требуют специального символа в конце

Можно извлечь из блока данных нужное значение с помощью функции Lookup. она возвращает из списка Data значение с указанным порядковым номером (аналогично массивам).

Получим значение Calindex=5. Lookdown должна знать число элементов в блоке данных (в нашем случае 10), чтобы она смогла найти нужное значение. (Lookdown вроде бы работает только с данными типа byte)

Функции и программы
Подпрограммы и функции используются, когда у вас есть несколько одинаковых фрагментов кода в различных частях программы. Допустим, у вас есть такая программа:


Во втором случае, подпрограмма - единственное место, где считывается значение АЦП. В основной программе дважды происходит вызов подпрограммы - для считывания значений 0 и 1 каналов АЦП. Преимущество подпрограммы в том, что повторяющиеся участки кода используются в тексте программы только один раз. Если вдруг потребуется изменить код, это придётся сделать лишь один раз. Когда используется много повторяющихся фрагментов, вам придется изменять каждый из них. Однажды вы таки забудете исправить один из фрагментов и будете очень долго искать проблему.

Подпрограмма вызывается таким образом:

Подпограмма имеет название и может иметь дополнительные параметры. В данном случае это ADCchannel и ADCval. подпограмма использует параметр ADCchannel, чтобы считать значение с нужного канала.

Купить

Программаторы, средства разработки и отладки для DSP,
средства разработки и отладки для ПЛИС-ПАИС


Считанное значение помещается в ADCval и возвращается подпрограммой по достижении её конца - End Sub. Поэтому параметры могут работать в обоих направлениях - от основной программы к подпрограмме и наоборот. Можно указать подпрограмме, что данные ей параметры нужно оставить неизмененными. Для этого при объявлении используется команда Byval. Тогда BASCOM создаст в памяти копию этой переменной и будет работать с ней. Исходная переменная останется нетронутой, что бы не происходило с ней в подпрограмме. В вышеописанном примере с переменной ADCchannel не происходят изменения в подпрограмме, так как она специально описана в объявлении подпрограммы.
Обратный параметр - Byref - устанавливается по умолчанию. Его можно не указывать. В том случае все изменения, которые подпрограмма делает с переменной, останутся после её работы.

Как вы уже поняли, подпограммы, как и переменные, должны быть объявлены в программе заранее:


Вот еще замечательный пример (http://decada.org.ru/project/lessons/bascom_avr/09/logbar.bas) использования подпрограмм. Подключите ЖКИ к AT90S2313 по стандартной схеме компилятора и наблюдайте за работой программы (или можете сделать это в симуляторе).

В этом примере основная программа генерирует случайные числа для отображения в виде столбца. Затем она вызывает подпограмму Bar с параметром Logvalue. Подпрограмма, в свою очередь, рассчитывает количество полностью закрашеных символов, затем выбирает заранее описаный символ из 1-4 вертикальных черточек. Наконец, она заполняет оставшееся место на экране пробелами, чтобы убрать следы предыдущих показаний.

Функции

Функции подобны подпрограммам, но они возвращают хотя бы одно значение вызвавшей программе. Например:

В строке DDSWord = MakeDDSWord(Frequency) функция MakeDDSWord вызывается с аргументом Frequency. Функкция должна вернуть хотя бы одно значение, но возможно (хотя и жутко нелогично для функций) изменение аргументов, данных функции. Чтобы разрешить это сделать, используйте параметры Byval и Byref, как и для подпрограмм.

Локальные переменные
В подпрограмме или функции можно объявить переменные, существующие только внутри неё. Они недоступны из основной программы. Для объявления такой переменной используйте оператор Local:


Все типы переменных, за исключением Bit, могут быть объявлены как локальные. Переменные типа Bit всегда глобальные.
Прерывания и таймеры. Допустим, у вас есть BASCOM программа, которая зацикленно выполняет какое-то сложное и запутанное действо, и вам вдруг захотелось остановить это задание и заставить контроллер сделать что-то другое. Очевидное аппаратное решение - добавить кнопку "STOP".

| Рейтинг: 0.0 /0



Среда разработки программного кода для микроконтроллеров серии AVR на языке, подобном стандартному Бейсику.

Семейство 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, могут быть отлажены на моделях в или на макетных платах.

Перед скачиванием приложения с родного сайта необходимо знать, что Bascom выпущен в трех вариантах. Помимо Bascom-AVR, существует среда Bascom-LT для микросхем AT89Cx051 и Bascom-8051 для серии 8051. Основное отличие демо версии – отсутствие возможности компиляции программ размером более 4 КБ. Работать можно лишь с самыми младшими моделями линейки AVR-микроконтроллеров. Но, для знакомства с программой, этого более чем достаточно, потому что установка Bascom-AVR, настройка и написание программы – это не самое сложное. Как правило, большинство трудностей возникают из-за незнания особенностей используемого программного и аппаратного обеспечения. Любая интересующая справочная информация, мануалы и подробные описания команд выложены на сайте разработчиков, но, к сожалению, на английском языке.
Русского языка в программе нет. Работающий любительский перевод найти в сети очень сложно. Ознакомиться с уроками по Bascom-AVR можно

Приложение Bascom-AVR предназначено для работы на базе платформы Windows 98, NT, 2000, XP, Vista и 7. Совместимость с последними версиями операционных систем полная.

Распространение программы: Freeware (бесплатная с ограничением на код 4 кБ) и Shareware (платная), цена - от 79 евро