Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

691_Mikushin_A.V._Programmirovanie_mikroprotsessorov_

.pdf
Скачиваний:
48
Добавлен:
12.11.2022
Размер:
1.96 Mб
Скачать

0003 758A94

276

 

mov

TL0,

#LOW(-(F_ZQ/12)*10)

;Настроить таймер

0006 758C94

277

 

mov

TH0,

#HIGH(-(F_ZQ/12)*10)

;на период 10мс

 

278

 

 

 

 

 

 

0009 D28C

279

 

setb TR0

 

;Включить таймер 0

 

280

;-------------------------------------------------------

 

 

 

 

 

 

281

 

 

 

 

 

 

 

282

;---

Погасить светодиоды --------------------------------

 

000B C293

283

 

clr SV1

 

 

 

000D C294

284

 

clr SV2

 

 

 

 

285

 

 

 

 

 

 

000F 438E01

286

 

orl AUXR,#1

;Запретить выдачу частоты ALE на выход

 

287

 

 

 

 

;микроконтроллера

 

0012 75A882

288

 

mov IE,#10000010b

 

 

289

 

 

;|

 

|

 

 

290

 

 

;|

 

+--Разрешить прерывания от таймера 0

 

291

 

 

;+--------

 

Разрешить прерывания

 

292

;--------------------------------------------------------

 

 

 

 

 

 

293

 

 

 

 

 

 

0015 120000 F

294

 

call IndInit

;Инициализировать ЖКИ дисплей

0018 22

295

 

ret

 

 

 

 

 

296

 

 

 

 

 

 

 

297

 

end

 

 

 

 

A51 MACRO ASSEMBLER Модуль инициализации процессора

 

05/24/2004 14:00:11 PAGE

3

 

 

 

 

 

XREF SYMBOL TABLE LISTING

 

 

 

 

 

 

---- ------ ----- -------

 

 

 

 

 

 

N A M E

T Y P E

V A L U E

ATTRIBUTES / REFERENCES

 

AC . . . . . . . .

B ADDR

00D0H.6 A

204#

 

ACC. . . . . . . .

D ADDR

00E0H

A

60#

 

ADRKLAV. . . . . .

D ADDR

00A0H

A

225#

 

EA . . . . . . . .

B ADDR

00A8H.7 A

162#

 

ES . . . . . . . .

B ADDR

00A8H.4 A

159#

 

IE . . . . . . . .

D ADDR

00A8H

A

56# 288

 

INDINIT. . . . . .

C ADDR

-----

 

EXT

252# 294

 

INIT . . . . . . .

C ADDR

0000H

R

SEG=_CODE 258 268#

 

INT0 . . . . . . .

B ADDR

00B0H.2 A

178#

 

INT1 . . . . . . .

B ADDR

00B0H.3 A

179#

 

IP . . . . . . . .

D ADDR

00B8H

A

58#

 

P0 . . . . . . . .

D ADDR

0080H

A

30#

 

P1 . . . . . . . .

D ADDR

0090H

A

52#

 

P2 . . . . . . . .

D ADDR

00A0H

A

55# 225

 

P3 . . . . . . . .

D ADDR

00B0H

A

57#

 

PCON . . . . . . .

D ADDR

0087H

A

36#

 

PSW. . . . . . . .

D ADDR

00D0H

A

59#

 

PUTCHAR. . . . . .

C ADDR

-----

 

EXT

252#

 

SBUF . . . . . . .

D ADDR

0099H

A

54#

 

SCON . . . . . . .

D ADDR

0098H

A

53#

 

SP . . . . . . . .

D ADDR

0081H

A

31#

 

T0 . . . . . . . .

B ADDR

00B0H.4 A

180#

 

T1 . . . . . . . .

B ADDR

00B0H.5 A

181#

 

TCON . . . . . . .

D ADDR

0088H

A

37#

 

TMOD . . . . . . .

D ADDR

0089H

A

38# 270

 

81

_CODE. . . . . . . C SEG

0019H

REL=UNIT 256# 260

REGISTER BANK(S) USED: 0

ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S)

При трансляции исходного текста программы, написанной на языке программирования высокого уровня, таком как C или PLM, программа-транслятор может быть настроена так, что она будет создавать файл с текстом исходного модуля, написанного на ассемблере или помещать операторы языка программирования ассемблер в листинг программного модуля. Таким образом, появляется возможность писать, и отлаживать программу на языке высокого уровня, а затем переводить её на язык программирования ассемблер и окончательно оптимизировать её вручную. В листинге 4 приведено содержимое файла листинга, создаваемого при трансляции исходного текста программы, написанного на языке C-51, с ассемблерным кодом.

Листинг 4. Содержимое файла листинга.

C51

COMPILER V7.20 MAIN

08/06/2006 23:28:20 PAGE

1

 

 

C51

COMPILER V7.20, COMPILATION OF MODULE MAIN

 

OBJECT MODULE PLACED IN .\obj\main.obj

COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND CODE PRINT(.-\lst\main.lst) PAGEWIDTH(90) OBJECT(.\obj\main.obj)

line level source

1/*========================= main.c ===========================

2Программа лабораторной работы №5

3

 

 

4

Проект

ОБУЧАЮЩИЕ ПРОГРАММЫ

5

Программист

::::::::..

6

Версия

1.00

7

Написана

::::::.

8

 

 

9

Последнее

 

10

изменение

::::.

11программы

12============================================================*/

14#include "ADuC812.h" //Подключить определения всех внутренних

15

// регистров

ADuC812

16

#define ParPort 0x8 //Определить константу переключения на 8 страницу

 

памяти

 

17

 

 

18

#define SvDiod *(volatile unsigned char xdata *)7 /*Переменная косвенной

19

адресации 7 ячейки внешней памяти (светодиодов)*/

20

 

 

21main()

22{DPP=ParPort; //Подключиться к параллельному порту

23 1

SvDiod=1;

//Зажечь светодиод номер 0

82

24

1

 

 

 

 

25

1

while(1)

//Обеспечить зацикливание микроконтроллера

26

1

{

 

 

/*(чтобы не было программного сброса микросхемы */

27

2

}

 

 

/*языком программирования) */

28

1

}

 

 

 

29

 

 

 

 

 

30

 

 

 

 

 

C51 COMPILER V7.20

MAIN

08/06/2006 23:28:20 PAGE 2

ASSEMBLY LISTING OF GENERATED OBJECT CODE

 

; FUNCTION main (BEGIN)

 

 

 

 

 

; SOURCE LINE # 21

 

 

 

 

 

; SOURCE LINE # 22

0000

758408

 

 

MOV

DPP,#08H

 

 

 

 

 

; SOURCE LINE # 23

0003

900007

 

 

MOV

DPTR,#07H

0006

7401

 

 

MOV

A,#01H

0008

F0

 

 

MOVX

@DPTR,A

0009

?C0001:

 

 

 

 

 

 

 

; SOURCE LINE # 25

 

 

 

 

 

; SOURCE LINE # 26

 

 

 

 

 

; SOURCE LINE # 27

0009

80FE

 

 

SJMP

?C0001

 

; FUNCTION main (END)

MODULE INFORMATION:

 

STATIC OVERLAYABLE

CODE SIZE

 

=

11

----

CONSTANT SIZE

=

----

----

XDATA SIZE

 

=

----

----

PDATA SIZE

 

=

----

----

DATA SIZE

 

=

----

----

IDATA SIZE

 

=

----

----

BIT SIZE

 

=

----

----

END OF MODULE INFORMATION.

C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)

Связывание объектных модулей и получение загрузочного файла.

После того, как оттранслированы без ошибок все программные модули, и тем самым получены файлы объектных модулей, производится трансляция всего программного проекта (связывание объектных модулей). При этом на диске формируются абсолютный и загрузочный файлы программного проекта. Для контроля ошибок связывания формируется файл листинга редактора связей с расширением ‘.m51’.

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

83

Трансляция программных проектов.

Иногда возникает необходимость произвести одновременно трансляцию всех программных модулей, входящих в проект и произвести связывание полученных объектных модулей в абсолютный файл. Это можно производить вручную, вызывая программы компилятора c51.exe и asm51.exe, редактора связей и преобразователя кодов oh.exe. Однако при создании программы трансляцию программного проекта приходится производить очень часто, поэтому такой способ получения загрузочного модуля достаточно трудоемок.

Этот процесс можно упростить при использовании специальных командных файлов, так называемых bat файлов. В этом файле можно описать последовательность действий, которую следует выполнять операционной системе при трансляции программного проекта. Однако и этот путь тоже остается трудоемким. При создании командного файла приходится устанавливать ключи вызываемых программ, описывать полные пути транслируемых, создаваемых и подключаемых файлов, что достаточно утомительно и требует высокой квалификации программиста. Намного удобнее при трансляции программных проектов пользоваться интегрированными средами программирования.

Применение интегрированной среды программирования keil-C для трансляции программного проекта.

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

После загрузки исходного текста программного модуля достаточно нажать на кнопку трансляции программного модуля, как это показано на рисунке 21.

кнопка трансляции файла.

Рисунок 21. Трансляция программного модуля при помощи кнопки трансляции файла

Ещё один способ трансляции программного модуля – воспользоваться главным меню, как это показано на рисунке 22.

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

84

стового редактора будет выделена строка программы, где была обнаружена данная ошибка.

Рисунок 22. Трансляция программного модуля при помощи главного меню

Трансляция программного модуля и получение загрузочного файла в интегрированной среде программирования производится нажатием кнопки ‘Build target’, как это показано на рисунке 23. Ещё один способ трансляции программного проекта в интегрированной среде программирования, это воспользоваться главным меню, как это показано на рисунке 24.

Кнопка трансляции последнего изменённого файла и создания загрузочного модуля

Рисунок 23. Трансляция программного проекта при помощи кнопки ‘Build target’

Если же необходимо оттранслировать все программные модули вне зависимости имеются объектные модули или нет, и получить загрузочный файл, то нажимается кнопка ‘Rebuild all target files’ или выбирается соответствующее меню. Такая необходимость возникает, если программа ведет себя, мягко говоря, странно. Это может быть связано с тем, что редактор связей использует устаревшие объектные модули, а интегрированная среда программирования считает их новыми.

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

85

Рисунок 24. Трансляция программного модуля при помощи главного меню

2.5. Отладка программ во встроенном отладчике программ

Способы отладки программ.

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

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

Для отладки программ обычно применяют три способа:

1.Пошаговая отладка программ с заходом в подпрограммы;

2.Пошаговая отладка программ с выполнением подпрограммы как одного оператора;

3.Выполнение программы до точки останова.

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

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

Использование встроенного отладчика программ.

Вызов встроенного отладчика удобнее всего осуществить, нажав на кнопку отладчика на панели инструментов ‘file’ как показано на рисунке 25. Как и в предыдущих лабораторных работах для вызова отладчика можно воспользо-

86

ваться главным меню интегрированной среды программирования или воспользоваться быстрой кнопкой ‘Ctrl+F5’.

Кнопка вызова встроенного отладчика

Рисунок 25. Вызов встроенного отладчика с использованием кнопки на панели “file”

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

Окно просмотра памяти контроллера можно настроить на просмотр памяти программ или памяти данных, введя в диалоговое окно “адрес” ключ, двоеточие и адрес начальной ячейки памяти. Например:

d:0 – просмотреть память данных начиная с нулевой ячейки; c:0 – просмотреть память программ начиная с нулевой ячейки;

x:0 – просмотреть внешнюю память данных начиная с нулевой ячейки.

Рисунок 26. Внешний вид интегрированной среды программирования в режиме отладки программ

87

При использовании встроенного отладчика программ для контроля переменных можно воспользоваться окном Watch. В большинстве случаев это намного выгоднее, чем использовать просмотр памяти данных. Переменные в этом окне отображаются в том формате, в котором они были объявлены в программе. Для добавления переменной в окно Watch достаточно щёлкнуть правой кнопкой мыши по переменной в окне отладчика программ, как это показано на рисунке 27.

Рисунок 27. Всплывающее меню для добавления переменной в окно просмотра Watch

Окно просмотра переменных содержит две закладки Watch #1 и Watch #2. Это позволяет группировать переменные, по какому либо признаку, например по отлаживаемым подпрограммам. При добавлении переменной Вы выбираете номер окна просмотра переменных.

Кроме просмотра глобальных переменных, которые существуют на протяжении всей программы, окно просмотра переменных содержит закладку locals. Эта закладка позволяет отслеживать локальные переменные, которые существуют только внутри подпрограммы. Вводить имена локальных переменных в эту закладку не нужно. Они появляются в этой закладке автоматически, как только Вы попадаете в подпрограмму, в которой используются локальные переменные.

При отладке программ на языке программирования ассемблер очень важно контролировать содержимое внутренних регистров микроконтроллера. Это позволяет сделать закладка ‘Regs’ в окне менеджера проектов, показанная на

88

рисунке 26. В этом окне можно проконтролировать содержимое регистров текущего банка, указателя стека и программного счётчика, содержимое аккумуляторов A и B, а также состояние рабочих флагов микроконтроллера в регистре

PSW.

Один оператор программы может быть выполнен нажатием кнопки F11. Если вызов подпрограммы рассматривается как один оператор, то пошаговая отладка программы осуществляется нажатием кнопки F10.

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

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

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

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

Может возникнуть ситуация, что программа не передаёт управление ни одному из операторов, на которых установлены точки останова. В этом случае для прекращения выполнения программы следует воспользоваться кнопкой или нажать на кнопку ‘Esc’ на клавиатуре.

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

Теперь, после того как мы рассмотрели особенности работы с интегрированной средой программирования keil-c, давайте рассмотрим как можно при помощи языка программирования C управлять устройствами, подключенными к портам микроконтроллера.

89

3.Особенности ввода и вывода информации

вмикроконтроллерных системах

3.1.Вывод информации через параллельные порты

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

Квазидвунаправленный параллельный порт микроконтроллеров семейства MCS-51 позволяет подключать светодиоды несколькими способами. Каждый из портов содержит восьмиразрядный регистр, имеющий байтовую и битовую адресацию для установки (запись '1') или сброса (запись '0') разрядов этого регистра с помощью программного обеспечения. Выходы этих регистров соединены с внешними выводами микросхемы через умощняющий транзисторный ключ. Упрощенная схема одного разряда порта показана на рисунке 28.

Рисунок 28. Упрощенная схема одного бита параллельного порта микроконтроллеров семейства MCS-51

Так как в схеме, приведенной на рисунке 28, вместо транзистора в верхнем плече выходного каскада применён генератор тока, то появляется возможность подключать светодиод непосредственно к выводу порта, как это показано на рисунке 29. Таким образом подключен светодиод VD1 к порту P0.6. В приведённой схеме резистор R1 ограничивает ток светодиода VD1. Номинал резистора R1 может быть рассчитан по закону Ома. Для этого нужно знать ток светодиода и падение напряжения на резисторе R1.

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

Полученная формула будет выглядеть следующим образом:

90