Статья №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  настоящей  статьи.