• I






      
           

Научно-популярный образовательный ресурс для юных и начинающих радиолюбителей - Popular science educational resource for young and novice hams

Основы электричества, учебные материалы и опыт профессионалов - Basics of electricity, educational materials and professional experience

КОНКУРС
language
 
Поиск junradio

Радиодетали
ОК
Сервисы

Stock Images
Покупка - продажа
Фото и изображений


 
Выгодный обмен
электронных валют

Друзья JR



JUNIOR RADIO





Работа с BASCOM AVR (обзор статей грамотных людей) 1



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







 
Что же нужно, чтобы начать?
Вот что потребуется, чтобы написать первую программу - светодиодную моргалку:
- Компьютер с параллельным портом под управлением 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, например, трением. Эта программа заставляет ПК взаимодействовать с МК через программатор. Программа не требует установки, просто распакуйте в любое удобное место и запускайте.

Купить

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


Теперь надо научить программу использовать напряжение с пинов порта для управления шинным формирователем. Откройте окно настроек, уберите галочку 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".
 

 
Главный недостаток этого метода заключается в том, что мы потратим кучу времени на выполнение чего-то запутанного, и в итоге мы просто пропустим момент нажатия кнопки. Другими словами, кнопка будет нажата и уже отпущена к тому моменту, как программа дойдет до процедуры проверки Pind.2. Очевидно, что нам нужен другой способ проверить нажатую кнопку, независимо от хода выполнения других процедур.
 
 






Просмотров: 11387 | Добавил: Chinas | Рейтинг: 0.0/0








Необходимо добавить материалы...
Результат опроса Результаты Все опросы нашего сайта Архив опросов
Всего голосовало: 372



          

Радио для всех© 2024