Статья №4
Прежде, чем приступить к дальнейшему рассмотрению применения Bascom для микроконтроллеров AVR, хотелось бы познакомить читателей с переменными типа cтрока , которые нам понадобятся при знакомстве и рассмотрении последующих разделов . Итак.
Строка – это переменная, которая заключает в себе последовательность символов. Она используется для ввода- вывода текста или «длинных чисел». Пример объявления строки:
Dim Mes as String* 10
Из этого примера мы видим, что переменная Mes может доходить до десяти символов. Каждый символ занимает один байт. Bascom добовляет дополнительный байт, обозначающий конец строки. Максимальная длина строки составляет 254 символа.
Переменные типа строка позволяют сэкономить пространство оперативной памяти, где хранятся переменные, поскольку они (строки) работают с блоками данных , которые расположены в программной памяти.
Рассмотрим функции, позволяющие работать со строками.
BIN – переводит число в его двоичное представление.
Dim Portsate as String *8
PortD = 152
Portstate = Bin (PortD) ‘результат Рortstat = 10011000
Format – форматирует входную строку, согласно определённому формату.
Dim Vxod as String *6
Dim Vyxod as String *8
Vxod = “38.869”
Vyxod = Format (Vxod, “+000.00”) ‘ результат Vyxod = “+038.86”
Fusing – форматирует переменную типа Single согласно формату строки, также может выполнять округление.
Dim Xval as Single
Dim Pstring as String*4
Xval = 16.379
Pstring = Fusing (Xval, “format”) ‘ результат - Pstring = “16.4”
Hex – переводит число в его шестнадцатеричное значение.
Dim Hval as Integer
Hval = 12345
Pstring = Hex (Hval) ‘ результат Pstring = “3039”
Hexval – переводит строку с шестнадцатеричным числом в десятичное.
Dim Dval as Integer
Dim Instring as String*2
Instring = “10”
Dval = Hexval (Instring0) ‘ результат - Dval = 16
Insr – возвращает положение подстроки в строке.
Dim Complstring as String*13
Dim Substring as Sring*6
Dim Pval as Integer
Complstring = “Bascom curse”
Substring = “curse”
Pval = Insr (Complsring, Substring) ‘ Pval = 8
Lcase – обращает все символы строки в нижний регистр.
Dim Instring as String*13
Dim Lowstring as String*13
Instring = “Bascom Course”
Lowstring = Lcase (Instring) ‘результат – Lowstring = “bascom curse”
Left – возвращает несколько символов с начала строки.
Dim Instring as String*13
Dim Leftstring as String*3
Dim Pval as Integer
Instring = “Bascom Cursus”
Pval = 3
Leftstring = Left (Instring, Pval) ‘ результат – Leftstring = “Bas”
Len – возвращает длину строки.
Dim Instring as String*20
Dim Lval as Integer
Instring = “Bascom tasks”
Lval = Len (Instring) ‘ результат - Lval = 12
Ltrim – удаляет пробелы в начале статьи.
Dim Instring as String*10
Dim Pstring as String*10
Insring = “ course”
Pstring = Ltrim (Instring) ‘ результат - Pstring = “course”
Mid – возвращает часть из середины строки.
Dim Instring as String*13
Dim Pstring as String*3
Dim Sval as Integer
Dim Nval as Integer
Instring = “Bascom Course”
Sval = 4
Nval =3
Pstring = Mid (Instring, Sval, Nval) ‘результат – Pstring = “com”
Mid – также можно использовать для замещения части строки другой строкой.
Dim Instring as String*13
Dim Pstring as String*3
Instring = “Bascom is not easy”
Pstring = “very”
Sval = 10
Nval =4
Mid (Pstring, Sval, Nval) = Instring ‘результат – Instring = “Bascom is very easy”
Right – возвращает несколько символов с конца строки.
Dim Instring as String*13
Dim Rightstring as String*3
Dim Pval as Integer
Instring = “Bascom Course”
Pval = 3
Rightstring = Right (Instring, Pval) ‘результат – Rightstring = “rse”
Rtrim – удаляет пробелы в конце строки.
Dim Instring as String*10
Dim Pstring as String*10
Instring = “ course “
Pstring = Rtrim (Psting) ‘результат - Pstring = “ course”
Space – создаёт строку, состоящую из пробелов, что весьма удобно при форматировании текста и организации бегущей строки на ЖК дисплее.
Dim Pstring as String*10
Dim Nval as Integer
Nval = 4
Pstring = Space (Nval) ‘ результат - Pstring = “ “
Str – преобразует число в строковое значение.
Dim Pstring as String*10
Dim Varval as Integer
Varval = 15436
Pstring = Str (Varval) ‘ результат - Pstring = “ 15436”
String – возвращает строку из нескольких символов указанного ASCII кода.
Dim Pstring as String*10
Dim Nchar as Integer
Dim Charcode as Byte
Nchar = 6
Charcode = 88
Pstring = String (Nchar, Charcode) ‘ результат - Pstring = “XXXXX”
Trim - удаляет пробелы в начале и конце строки.
Dim Instring as String*10
Dim Pstring as String*10
Instring = “ course “
Pstring = Trim (Instring) ‘ результат – Pstring = “course”
Поговорим далее о протоколе связи RS-232. На сегодняшний день – это устоявшийся протокол, хотя он был описан ещё в 60-х годах прошлого столетия. Американская компания Electronis Industries Association разрабатывала способ соединения больших серверных машин с периферией (например, терминалами). Разработка называлась «Рекомендованный стандарт» (“Recommened standart”), а число 232 было просто номером разработки. Гораздо позже она стала называться официальным стандартом EIA-232. В 1991 году была описана последняя версия протокола EIA-232E. Однако большее распространение получило название RS-232, поэтому и мы будем применять его.
Рассмотрим далее работу протокола RS – 232 в Bascom. RS – 232 - это протокол последовательного обмена. По нему информация передаётся последовательно (бит за битом) в персональный компьютер и из компьютера. Сам стандарт описывает два логических уровня:
- напряжение от -25 вольт до -3 вольт передаёт логическую единицу (1)
- напряжение от +3 вольт до +25 вольт передаёт логический ноль (0).
Разнополярное напряжение делает работу линии связи более устойчивой к внешним помехам (наводкам напряжения) и влиянию ёмкости линии передачи, нежели простая передача данных TTL уровня.
Отметим, что интервал напряжений от -3 вольт до +3 вольт получается неопределённым. Однако на практике это обычно не так. В большинстве случаев напряжение выше +2.5 вольт интерпретируется, как логический ноль, а всё, что ниже его – как логическая единица. RS -232 - асинхронный протокол. Это означает, что тактовые импульсы не разделены с данными. Поэтому обе стороны должны знать скорость обмена данными (baud-rate). Стандарт RS – 232 описывает аппаратный механизм «рукопожатия» (handshaking), используя несколько линий передачи данных. Мы воспользуемся тремя самыми важными:
- RxD – приём данных (пин порта 2);
- TxD – передача данных (пин порта 3);
- GND – земля (пин порта 5).
Под портом имеется в виду стандартный разъём DB9-M (папа) на компьютере. Следует отметить, что в настоящее время данные порты уходят в прошлое. Их сменили порты USB, о которых мы поговорим позже. Но в связи с тем, что на RS-232 существует и выпускается ещё множество изделий, вы легко можете приобрести переходник USB – RS-232.
Приём и передача данных происходят с помощью UART – Universal Asynchronous Rceiver Transmitter (универсальный асинхронный приёмо-передатчик). В персональном компьютере - это чип, находящийся под управлением центрального процессора. В микроконтроллерах AVR – это небольшая часть кристалла. UART при приёме данных опрашивает пин входа и определяет присланную информацию (0 или 1) и, когда приём байта завершён, может сгенерировать прерывание для считывания байта из входного буфера. При передаче UART считывает байт из входного буфера и отсылает биты с определённой задержкой в соответствии со скоростью обмена. Если входной буфер пуст, UART также может сгенерировать прерывание, сообщив программе, что можно отправлять следующий байт.
Командами на прерывание являются:
- Urxc – по окончании приёма;
- Utxc – по окончании передачи.
В UART AVR используются логические уровни 0 и 5 вольт (TTL), поэтому для согласования со стандартом RS – 232 необходимо использовать преобразователь (конвертор) уровней типа MAX3232 (MAX232), который преобразует уровни напряжения до нужного и инвертирует их. (! Но, если соединяются два микроконтроллера, то можно соединять на прямую, преобразователь не нужен.)
В качестве примера приведём схему, представленную на Рис.1. Она состоит лишь из микроконтроллера, преобразователя уровней, разъёма DB-9F и ЖК индикатора типа MT-16S2H (фирма – изготовитель МЭЛТ).
Скорость обмена определяется настройками Bascom (см. Рис.7), а также зависит от тактовой частоты контроллера. Откроем вкладку Communications в настройках. Посмотрим на окно Error. В нём показано отклонение внутренней скорости UART от выбранной из списка. Следует отметить, что данное отклонение не должно превышать 2%, иначе информация будет искажена, или процесс приёма-передачи может не состояться вообще. Выберем скорость обмена = 9600 бит/с. При тактовой частоте микроконтроллера ошибка составляет 0,14 %.
Ещё одной особенность Bascom по отношению к QBasic является использование операторов ввода – вывода. Оператор INPUT в QBasic возвращает введённые с клавиатуры данные, в Bascom же он считывает данные по RS-232 на UART микроконтроллера. В QBasic оператор PRINT выводит данные на экран, а в Bascom он выводит их по RS-232 с UART.
Запись в RS-232 осуществляется, как при использовании команды Print, например:
Dim Name as String*12
Dim Age as Integer
Name = “Hello”
Age =40
Print “Name:”;Name;”Age:”;Age
Это выведет на терминал: “Name: Hello Age: 40”. Нестроковые переменные будут отформатированы перед выводом.
Пример чтения из RS-232:
Input “Name:”, Name
Прошу обратить внимание на то, что в качестве разделителя Input использует запятую (,), а Lcd и Print точку с запятой (;).
Блок – схема программы для проверки работы RS-232 “UART1” представлена на Рис.2. Она состоит из цикла, в котором происходит чтение микроконтроллером двух чисел из RS-232, их суммирование и запись суммы в RS-232. Сама программа приводится ниже.
Программа ”UART”:
$Regfile = "attiny2313a.dat"
$Crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
config Pind.6 = Output 'конфигурирование PD6
dim Firstnumber as Integer 'объявление переменных
dim Secondnumber as Integer
dim Sum as Integer
do
Set PORTD.6 'включить PD6
Firstnumber = 0
Secondnumber = 0
Input "Enter first number:" , Firstnumber ' чтение из RS-232 первого числа
Input "Enter second number:" , Secondnumber 'чтение из RS-232 второго числа
Sum = Firstnumber + Secondnumber 'определение суммы двух чисел
Print "Sum:" ; Sum ‘ запись суммы в терминал компьютера
Reset PORTD.6 'выключение PD6
Loop
End 'end program
Программа находится в приложении 1 данной статьи. Её можно просимулировать см. Рис.3.
А можно проэмулировать, используя окно терминала Tools Terminal emulator см.Рис.4.
Естественно, что микроконтроллеры также могут совершать обмен информацией с помощью UART и между собой. Ниже представлены два устройства, одно из которых - передатчик Рис.5, а другое является приёмником Рис.6.
При нажатии кнопок портаВ передатчика включаются соответствующие светодиоды приёмника. Передатчик имеет механизм антидребезга и работает по внешнему прерыванию INT0, благодаря четырём диодам, образующих вместе с подтягивающим резистором 10 КОм на входе INT0 элемент «ИЛИ», прерывание происходит при нажатии любой кнопки . Следует отметить, что расстояние между приёмником и передатчиком не должно превышать 10 метров, поскольку сигнал имеет уровни TTL и на более длинной линии передачи подвергается искажениям. Ниже приводятся тексты программ для передатчика и для приёмника.
Программа передатчика (“TXD”) состоит из основного цикла DO…LOOP и подпрограммы обработки прерываний Button, при выполнении которой приёмнику отсылается код нажатой кнопки.
Программа ”TXD”:
$regfile = "attiny2313a.dat" 'настройки
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
Config Pind.1 = Output 'конфигурация вывода TxD
Config Debounce = 75 'задежка на входные сигналы 75мс
Config Int0 = Falling 'прерывание - по спаду импульса
Dim Info As Byte 'объявление переменной
On Int0 Button 'обозначение подпрограммы прерываний
Ddrb = &B00000000 'инициализация порта В
Portb = &B00001111
Enable Interrupts 'разрешение прерываний
Enable Int0
Do 'основной цикл
Loop
Button: 'подпрограмма обработки прерываний
Waitms 75 'задержка 75мс
Info = Portb 'считывание кода кнопки из порта В
Print " " ; Info 'передача кода кнопки
Return
End 'end program
Программа приёмника (“RXD”) состоит из основного цикла DO…LOOP и подпрограммы обработки прерываний по окончанию приёма, где принятый код отображается светодиодами, подключёнными к порту В.
Программа ”RXD”:
$regfile = "attiny2313a.dat" 'настройки
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
Config Pinb.0 = Input 'конфигурация входа RxD
Dim Info As Byte 'объявление переменной
Ddrb = &B11111111 'инициализация порта В
Portb = &B00000000
On Urxc Button 'определение подпрограммы прерываний по окончании приёма
Enable Interrupts 'разрешение прерываний
Enable Urxc
Do 'основной цикл
Loop
Button: 'подпрограмма прерываний
Input " " , Info 'приём кода кнопки
Portb = Info 'отображение кода кнопки на порту В
Return
End 'end program
Программы для передатчика (“TXD”) и приёмника (“RXD”) находятся в папке приложение 1 настоящей статьи.