Инициализация микроконтроллера макета. Прежде чем переходить к созданию простейших пользовательских программ, необходимо описать используемые в дальнейшем переменные и настроить МК на работу с
Прежде чем переходить к созданию простейших пользовательских программ, необходимо описать используемые в дальнейшем переменные и настроить МК на работу с выбранным макетом. С этой целью мы напишем и подробно рассмотрим листинг исходной программы init.asm, в состав которой будут включаться все остальные программы пользователя.
;******************************************************;*листинг исходной программы;****************************************************** LIST P=16C84, R=HEX ;директива, определяющая тип ;процессора и систему счисления ;по умолчанию ;******************************************************;*описание используемых переменных и назначения адресов ;*ячеек для хранения переменных пользователя;****************************************************** ; INTCON EQU 0x0B; OPTION EQU 0x81; TMR0 EQU 0x01; INTF EQU 1; T0IF EQU 5 PCL EQU 0x02 STATUS EQU 0x03 RP0 EQU 5 PORTA EQU 0x05 PORTB EQU 0x06 TRISA EQU 0x05 TRISB EQU 0x06 W EQU 0 F EQU 1 TEMPA EQU 0x0C TEMPB EQU 0x0D COUNT1 EQU 0x0E COUNT2 EQU 0x0F COUNT3 EQU 0x10;******************************************************;*определение меток замены текста;****************************************************** #DEFINE Z STATUS,2 ;бит нулевого результата #DEFINE BA1 PORTA,0 ;динамик BA1 #DEFINE VD2 PORTA,1 ;светодиод VD2 #DEFINE SA1 PORTA,2 ;тумблер SA1 #DEFINE SA2 PORTA,3 ;тумблер SA2 #DEFINE SB1 PORTA,4 ;кнопка SB1 #DEFINE SB2 PORTB,0 ;кнопка SB2 #DEFINE HL1_A PORTB,1 ;индикатор-сегмент A #DEFINE HL1_B PORTB,2 ;индикатор-сегмент B #DEFINE HL1_C PORTB,3 ;индикатор-сегмент C #DEFINE HL1_D PORTB,4 ;индикатор-сегмент D #DEFINE HL1_E PORTB,5 ;индикатор-сегмент D #DEFINE HL1_F PORTB,6 ;индикатор-сегмент E #DEFINE HL1_G PORTB,7 ;индикатор-сегмент F;******************************************************;*исполняемая программа;****************************************************** ORG 0x000 ;установка начального адреса по ;сбросу GOTO BEGIN ;переход на начало программы ORG 0x005 ;установка начального адреса ;размещения программыBEGIN CALL INIT_PORTS ;вызов подпрограммы ;инициализации портов МК;*****************************************************;*программа пользователя;;*****************************************************;INIT_PORTS ;подпрограмма инициализации ;портов MOVLW 0xFF ;установка линий портов MOVWF PORTA ;A и B в единичное MOVWF PORTB ;состояние BSF STATUS,RP0 ;переход на банк 1 MOVLW 0x1C ;настройка линий RA0 и MOVWF TRISA ;RA1 порта A на вывод – ;остальных – на ввод MOVLW 0x01 ;настройка линии RB0 MOVWF TRISB ;порта B на ввод - ;остальных – на вывод BCF STATUS,RP0 ;возврат в банк 0 RETURN ;возврат из подпрограммы; END ;конец программыЛистинг 12.1. Программа init.asm
Рассмотрим работу этой программы. Вначале она указывает ассемблеру тип используемого МК и систему счисления по умолчанию. Идущие далее ассемблерные директивы EQU определяют ассемблерные константы, используемые в этой и последующих программах. Они позволяют использовать в тексте программы более удобные мнемонические метки, привязанные к структуре конкретного МК, вместо корректных, но более сложных ассемблерных выражений. Указатели TEMPA, TEMPB, COUNT1 и COUNT2 назначают адреса ячеек памяти для хранения промежуточных данных (текущих состояний, переменных циклов и т.п.).
Ассемблерные директивы #define задают строку, замещающую соответствующую метку, каждый раз, когда та будет встречаться в исходном тексте. В нашем случае эти директивы позволяют использовать символические имена, привязанные к схеме макета, вместо физических адресов соответствующих разрядов портов и регистров. При этом необходимо иметь в виду, что символы, которые определены директивой #DEFINE, не могут быть просмотрены симулятором. Поэтому для просмотра необходимо использовать физические адреса портов и регистров.
Директива ORG 0x00 устанавливает стартовый адрес программного кода равным 0, т.е. соответствующим начальному состоянию счетчика команд МК после сброса. Команда GOTO BEGIN вместе с ассемблерной директивой ORG 0x005 и меткой BEGIN обеспечивают переход на адрес памяти программ 0x005, начиная с которого и размещается основная часть программы. Это необходимо для того, чтобы обойти адрес 0x004, используемый в качестве вектора прерывания, и тем самым зарезервировать его для возможных будущих применений.
Затем с помощью команды CALL INIT_PORTS производится вызов подпрограммы инициализации портов. Вначале подпрограмма инициализации устанавливает в высокое (единичное) состояние выходные триггеры данных. Эта операция рекомендуется разработчиком МК для того, чтобы исключить неопределенность в состояниях регистров портов. Затем командой BSF STATUS,RP0 производится переключение на банк 1 памяти данных, где расположены регистры управления направлением передачи информации TRISA и TRISB. С помощью команд MOVLW 0x1C и MOVWF TRISA линии RA0 и RA1 порта A настраиваются на вывод, а остальные – на ввод. Команды MOVLW 0x01 и MOVWF TRISB настраивают линию RB0 порта B на ввод, а остальные – на вывод. С помощью команды BCF STATUS,RP0 производится возврат в банк 0, где располагаются необходимые для работы программы регистры и порты.
Поскольку в процессе работы с макетом перенастройка портов не производится, и введенных переменных достаточно для работы всех рассматриваемых учебных задач, они будут далее рассматриваться включенными по умолчанию в состав исходной программы init.asm. При написании учебных задач будет по возможности использоваться метод структурного программирования, при котором прикладная программа строится из некоторого набора программных модулей, каждый из которых реализует определенную процедуру обработки данных. При этом каждый из программных модулей имеет только одну точку входа и одну точку выхода. Введенные однажды программные модули могут использоваться под своим именем в других прикладных программах.
Дата добавления: 2015-02-10; просмотров: 766;