Главная » Bascom-8051, Basic, Железо » Начальная инициализация системы Bascom-8051

0

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

установки и поэтому явно избыточен.

Определить   модель   микроконтроллера   указанием   имени   файла,   содержащего    имена    и   адреса используемых  регистров.  Можно  не  указывать,  но  тогда  имя  файла  компилятор  возмет  из  меню  “Option”- “Compiler”-“Misc”.

$Regfile "8052.DAT "

В большинстве случаев требуется более 2 КБайт программной памяти.

$large                                 ‘определим модель большой памяти

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

‘——– определение констант ——–

Dim Cit As Const &H10                  ‘константа интегратора температуры *10 мс Const Cit = &H10                       ‘так нужно записывать в последних версиях ‘Переменные: определение битов ——–

Dim N_dat As Bit                       ‘бит "Есть новые данные" Dim B_entx As Bit                      ‘разрешен прием

Dim B_temp As Bit                      ‘временные битовые данные

Таким образом, можно определить привычные имена битов SFR.

Ri Alias Scon.0                        ‘бит RI Ti Alias Scon.1                        ‘бит TI Ren Alias Scon.4                       ‘бит Ren ‘——– определение байтов ———-

Dim Temp As Byte                       ‘временные данные Dim R_ch As Byte                       ‘принятый символ Dim R_cch As Byte                      ‘указатель буфера

Dim Rang As Byte                       ‘предел уровня (ослабление) Dim Frng As Byte                       ‘предел частоты

‘——– определение двухбайтовых —-

Dim R_bw As Integer                    ’16-разр. двоичный код загрузки

Dim R_rd As Integer                    ’16-разр. резервный код ЦАП

‘——– определение четырехбайтовых -

Dim R_bd As Long                       ’32-разр. двоичный код загрузки

Dim Tmpl As Long                       ’32-разр. временые данные

‘——– определение переменных в формате с плаваюшей точкой

Dim R_frq As Single                    ‘регистр значения частоты

Dim R_fld As Single                    ‘регистр кода загрузки

‘——– определение строковых переменных

Dim R_lin As String * 6                ‘введеная строка Dim R_tmp As String * 5                ‘временая строка ‘———————

При использовании в программе процедур их нужно объявить в этом месте.

‘Declare Sub Wrb_24c01(badr As Byte , Value As Byte) ‘Declare Sub Rdb_24c01(badr As Byte , Value As Byte) ‘———————

Определим имена портов, подключенных к физическим устройствам.

‘подключение синтезатора AD9850

B_data Alias P1.3 : B_clk Alias P1.4 : B_fqud Alias P1.5 : B_ress Alias P1.7 ‘———————

‘подключение ЦАП опорного уровня AD766

B_datu Alias P1.0 : B_clku Alias P1.1 : B_ldu Alias P1.2 ‘———————

Далее предусмотрено два варианта подключения: первый для целевой программы (рабочий), второй – для

отдадки в эмуляторе, построенном на процессоре с шестью портами – 80C51GB, где порт P5 замещает порт P0, а порт P4 используется вместо P2.

‘подключение поляризованных реле с 87C52

‘B_dar0 Alias P0.0 : B_dar1 Alias P0.1 : B_dar2 Alias P0.2 : B_dar3 Alias P0.3 ‘B_cor0 Alias P2.7 : B_cor1 Alias P0.4 : B_cor2 Alias P0.5 : B_cor3 Alias P0.6

‘———————

‘!!! только в эмуляторе подключение поляризованных реле с 80C51GB

B_dar0 Alias P5.0 : B_dar1 Alias P5.1 : B_dar2 Alias P5.2 : B_dar3 Alias P5.3

B_cor0 Alias P4.7 : B_cor1 Alias P5.4 : B_cor2 Alias P5.5 : B_cor3 Alias P5.6

‘———————

Начиная  с  этой  строки,  компилятор  формирует  исполняемый  код  –  команды  установки  внутренних

регистров. Первая команда в блоке инициализации компилятора – установка стека, вслед за массивом переменных, определенных выше. Если стек устанавливается “вручную”, это самое подходящее место для того, чтобы записать вставить директиву, запрещающую такой способ вычисления стека.

$Nosp

Sp = &h7f                             ‘начало стека 80h

‘———————

Вариант установки конфигурации внутренних устройств микроконтроллера без применения специальных

операторов Bascom.

‘$Noinit       ‘устанавливать конфигурацию будем “вручную“

‘Tcon = &h50 : Tmod = &h22 : T2con = &h34 : Scon = &h70 : Load Timer2 = &hffd9 ‘———————

Нормальная установка конфигурации внутренних устройств микроконтроллера.

‘TIMER0 в режиме 16-бит. таймера с внутр. тактир. для часов реального времени

Config Timer0 = Timer , Gate = Internal , Mode = 1 : Start Timer0 ‘———————

Установка режима последовательного канала.

‘TIMER2 в режиме 16-бит. таймера с внутр. тактир. для синхронизации UART

$baud = 9600                           ‘скорость 9.6 кБ

$crystal = 12000000                    ‘при кварце 12 МГц

Config Timer2 = Timer , Gate = Internal , Mode = 2

Если в тексте программы отсутствуют операторы  Print и Input необходимо добавить следующие

строки.

‘ вариант с тактированием от таймера 1

‘TIMER1 в режиме 8-бит. таймера с внутр. тактир. для синхронизации UART Config Timer1 = Timer , Gate = Internal , Mode = 2

Scon = &H52                          ‘режим приемопередатчика

Th1 = 243                            ‘константа скорости

Pcon = &H80 : Start Timer1           ‘выключить доп. делитель на 2 и стартовать

‘———————

‘ вариант с тактированием от таймера 2

‘Timer2 в режиме 16 -бит. таймера с внутр. тактир. для синхронизации Uart

Config Timer2 = Timer , Gate = Internal , Mode = 2

Scon = &H52                          ‘режим приемопередатчика

Rcap2h = &HFF : Rcap2l = &HA5 : Start Timer2 ‘———————

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

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

On Timer0 Timer_0_int Nosave           ‘вектор прерывания

On Serial Ser_int Nosave               ‘вектор прерывания послед. канала

Enable Timer0                          ‘разрешить прерывание таймера 0

Enable Serial                          ‘разрешить прерывание послед. канала Priority Set Serial                    ‘наивысший приоритет послед. канала Enable Interrupts                      ‘вообще разрешить прерывания

‘———————

Производим   действия,   например,   обеспечивающие   работоспособность   программы   в    эмуляторе,

выполненном на другом типе процессора.

‘!!! —————–

‘только в эмуляторе 80C51GB дополнительно инициализируем

Th0 = &HD8 : Tl0 = &HFD             ‘чтобы прерыв. наступила не позже 10 мс Oscr = &HE1 : Oscr = &H1E           ‘выключить контроль частоты генератора Wdtrst = &H1E : Wdtrst = &HE1       ‘сбросить будильник

P4 = &HFF : P5 = &HFF               ‘уст. эмулирующие порты как в эмулируемые

‘———————

Производим очистку памяти и всех будующих переменных

Clr_mem:

$asm

Mov R0 , #&hff     ;от верхнего значения

;    Mov R0 , Sp        ;или от указателя стека (он уже установлен)

Clrmem:

$end Asm

‘———————

;до нуля

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

‘инициализировать переменные

N_dat = 1                              ‘бит "Новые данные" R_cch = Varptr(r_lin)                  ‘указатель буфера

R_ot = 0                               ‘интегратор термодатчика – нет перегрева

‘———————

Устанавливаем порты процессора в состояние, безопасное для внешних устройств или обеспечивающее

их нормальное функционирование (еще лучше, если это состояние соответствует режиму сброса).

‘подготовить линии управления к работе

Reset B_data : Reset B_clk : Reset B_fqud : Reset B_ress       ‘с синтезатором

Set B_datu : Set B_clku : Set B_ldu    ‘с опорным ЦАП

‘———————

Настало  время  провести  более  глубокую  инициализацию  и  проверку  всей  системы,   управляемой

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

инициализации.

‘определим размер индикатора

Config Lcd = 16 * 2

‘определим подключение линий управления индикатора к портам

Config Lcdpin, Db4 = P1.4, Db5 = P1.5, Db6 = P1.6, Db7 = P1.7, E = P3.2, Rs = P3.4

‘определим изображение дополнительных символов

Deflcdchar 0 , 31 , 17 , 17 , 17 , 17 , 17 , 31 , 0

Deflcdchar 1 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 31

Deflcdchar

2

,

241

,

234

,

228

,

224

,

228

,

234

,

241

,

224

Deflcdchar

3

,

241

,

234

,

228

,

241

,

234

,

228

,

224

,

224

Deflcdchar

4

,

228

,

234

,

241

,

228

,

234

,

241

,

224

,

224

Deflcdchar

5

,

228

,

234

,

241

,

234

,

228

,

224

,

224

,

224

Deflcdchar

6

,

228

,

234

,

241

,

234

,

245

,

241

,

241

,

224

Deflcdchar

7

,

238

,

234

,

234

,

234

,

255

,

241

,

241

,

224

Cls        ‘подготовим индикатор к работе

Lcd “V7-64 ver.3_7”  ‘выдадим стартовое сообщение

‘———————

При наличии последовательного канала, связанного с другой ЭВМ, сейчас необходимо послать

сообщение, устанавливающее логическое соединение.

Print “1_ON”         ‘сообщим о включении

‘———————

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

данных  энергонезависимой  памяти  (вычислив  контрольную  сумму),  хранящей  переменные   данные  между сессиями работы микроконтроллера или блок калибровочных констант. При обнаружении ошибки сообщаем об этом,  и  при  получении  подтверждения  о  принятом   сообщении  переинициализируем  память  (записываем

начальные значения, которые обеспечат правильную работоспособность системы). Если имеются еще какие-либо

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

Gosub Test_CS_EEPROM                    ‘Проверяем контрольную сумму

If b_ER = 1 Then                        ‘Есть ошибка?

Print “Error_CS_Mem!” : Waitkey ‘Да – вывести сообщение и ждать нажатия

Gosub Ini_EEP                   ‘Переинициализировать память

End If

‘———————

В системе, содержащей ЦАП, АЦП, цифровые синтезаторы, реле и т.п. производим  загрузку в ЦАП и

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

Gosub Self_Cal : Gosub Init_DAC : Gosub Reset_Relay ‘иниц. аналог. часть схемы

‘———————

Система  готова  к  работе,  все  устройства,  подключенные  к  микроконтроллеру,  ожидают  приема  или

считывания данных, и далее начинается рабочая программа, которая также может содержать операторы установки конфигурации (изменение) в соответствии с алгоритмом программы. В дальнейшем, также могут устанавливаться и изменяться параметры системы прерывания.

Источник: М.Л.Кулиш, СПРАВОЧНИК ПО ПРОГРАММИРОВАНИЮ BASCOM-8051, Краснодар 2001

По теме:

  • Комментарии