Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовой_мой.doc
Скачиваний:
10
Добавлен:
11.05.2015
Размер:
690.69 Кб
Скачать

Приложения

Приложение А

Листинг программы:

0001 0000 RAM EQU $0000

0002 1000 REG EQU $1000

0003 e000 ROM EQU $E000

0004 1000 TCNT EQU REG+$OE

0005 *----timer

0006 1023 TFLG1 EQU REG+$23

0007 1022 TMSK1 EQU REG+$22

0008 1025 TFLG2 EQU REG+$25

0009 1024 TMSK2 EQU REG+$24

0010 1026 PACTL EQU REG+$26

0011 *----ports

0012 1004 portb EQU $1004 *регистр данных порта B

0013 1003 portc EQU $1003 *регистр данных порта C

0014 1008 portd EQU $1008 *регистр данных порта D

0015 1002 pioc EQU $1002 *регистр управления портов B и C

0016 1007 ddrc EQU $1007 *регистр определения напр.выв.п.С

0017 1009 ddrd EQU $1009 *регистр определения напр.выв.п.D

0018 *----Маски

0019 0001 minus EQU $01 *м. для выделения бита Уменьшение мощности с порта С[0]

0020 0002 plus EQU $02 *м. для выделения бита Увеличение мощности с порта С[1]

0021 0040 rtif EQU $40 *м. для снятия маски прерывания rtif в рег.tflg2

0022 0010 hnds EQU $10 *м. для установки бита HNDS в регистре PIOС (порт B -нестробированный вывод, порт С - двунаправленный обмен)

0023 *----RAM

0024 001f ORG RAM+$1F

0025 001f STACK RMB 1

0026 0020 08 cnttime FCB $08

0027 0021 01 flag FCB $01

0028 0022 00 power FCB 0

0029 0023 00 razgon FCB 0

0030 0024 00 pwm_skv FCB 0

0031 *----interrupt

0032 fff0 ORG ROM+$1FF0

0033 fff0 e0 a8 VRTI FDB OBRRTI

0034 fff2 e0 bb VIRQ FDB OBRIRQ

0035 fffe ORG ROM+$1FFE

0036 fffe e0 00 VRST FDB START

0037 *----ROM

0038 e000 ORG ROM

0039 e000 8e 00 1f START: LDS #STACK *Занесение в рег.SP нач адреса стека

0040 e003 86 00 LDAA #$00

0041 e005 b7 10 26 STAA PACTL *период работы схемы 4,10 мс (Е=2 МГц)

0042 e008 86 00 LDAA #00

0043 e00a b7 10 24 STAA TMSK2 *запрет прерывания реального времени

0044

0045 e00d b6 10 02 LDAA pioc

0046 e010 8a 10 ORAA #hnds

0047 e012 b7 10 02 STAA pioc

0048

0049 e015 86 00 LDAA #$00 *ИНИЦИАЛИЗАЦИЯ ВСЕГО

0050 e017 b7 10 07 STAA ddrc *ПОРТА С НА ВВОД

0051

0052 e01a 86 ff LDAA #$ff *

0053 e01c b7 10 09 STAA ddrd *все выводы порта D - вывод данных

0054

0055 e01f 86 00 LDAA #0

0056 e021 b7 10 04 STAA portb *семисегментный индикатор показывает 0

0057 e024 b7 10 08 STAA portd *мощность=0,

0058

0059 *----основная программа

0060

0061 e027 96 22 ost: LDAA power *

0062 e029 97 23 STAA razgon *

0063

0064 e02b 86 08 incr: LDAA #$08

0065 e02d 97 20 STAA cnttime *счётчик циклов = 8

0066 e02f 86 00 LDAA #$00 *

0067 e031 b7 10 24 STAA TMSK2 *запрет прерывания реального времени

0068

0069 e034 b6 10 03 LDAA portc *считываем порт С

0070 e037 94 02 ANDA plus *выделение бита, соответствующего кнопке "Ув. мощн."

0071 e039 26 09 BNE decr *кнопка не нажата, проверяем кнопку "Ум. мощн."

0072 e03b 96 22 LDAA power *иначе

0073 e03d 81 08 CMPA #8 *проверяем на выход за пределы возможного ур-ня мощн. (>8)

0074 e03f 27 03 BEQ decr *если 8 ур-нь - переходим к проверке кнопки Ум. мощн.

0075 e041 7c 00 22 INC power *если был <8, то увеличиваем переменную мощности

0076

0077 e044 b6 10 03 decr: LDAA portc

0078 e047 94 01 ANDA minus *выделение бита, соответствующего кнопке "Ум. мощн."

0079 e049 26 09 BNE indi *кнопка не нажата, выводим текущую мощность на индикатор

0080 e04b 96 22 LDAA power *иначе

0081 e04d 81 00 CMPA #0 *проверяем на выход за пределы возможного ур-ня мощн. (<0)

0082 e04f 27 03 BEQ indi *если 0 ур-нь, показываем на индикаторе

0083 e051 7a 00 22 DEC power *иначе уменьшаем переменную мощности

0084

0085 e054 96 22 indi: LDAA power *

0086 e056 b7 10 08 STAA portd *Вывод переменной мощности на индикатор

0087

0088 e059 bd e0 85 JSR pow *переход к подпрограмме формир. вектора мощн.

0089

0090 e05c 7d 00 21 TST flag *порверяем флаг работы

0091 e05f 27 c6 BEQ ost *если он равен 0, запрещаем прерывания реального времени

0092

0093 e061 7d 00 23 TST razgon *проверяем значение мощности до прерывания

0094 e064 27 12 BEQ razr *если равна нулю - переходим к установлению текущего ур-ня мощн.

0095 e066 7f 00 24 CLR pwm_skv *если не равна - очищаем вектор мощности

0096 e069 7d 00 23 razg: TST razgon

0097 e06c 27 0a BEQ razr

0098 e06e 86 40 LDAA #rtif *

0099 e070 b7 10 24 STAA TMSK2 *разрешение прерывания реального времени

0100 e073 bd e0 96 JSR plavn *переходим к подпрограмме плавного разгона

0101 e076 20 f1 BRA razg *возвращаемся к проверке значения мощности

0102

0103 e078 86 40 razr: LDAA #rtif *

0104 e07a b7 10 24 STAA TMSK2 *разрешение прерывания реального времени

0105 e07d 7d 00 20 prov: TST cnttime *

0106 e080 27 a9 BEQ incr *цикл закончился - переход к осн. прог.

0107 e082 7e e0 7d JMP prov *цикл не закончился - переход в начало цикла

0108

0109 *----Подпрограмма формирования вектора мощности

0110

0111 e085 7f 00 24 pow: CLR pwm_skv *очищаем Вектор

0112 e088 96 22 LDAA power *загружаем в регистр А переменную мощности

0113 e08a 27 09 BEQ zero *если она равна нулю - выход. Вектор = 0

0114 e08c 78 00 24 vector: LSL pwm_skv *иначе вектор сдвигаем влево

0115 e08f 7c 00 24 INC pwm_skv *увеличиваем на 1

0116 e092 4a DECA *количество итераций = переменной мощности

0117 e093 26 f7 BNE vector *если счётчик цикла не равен 0, повторяем цикл

0118 e095 39 zero: RTS *иначе выход из подпрограммы

0119

0120 *----Подпрограмма плавного разгона

0121

0122 e096 78 00 24 plavn: LSL pwm_skv *формируем вектор мощности

0123 e099 7c 00 24 INC pwm_skv *постепенно увеличивая его до требуемого ур-ня

0124 e09c 7a 00 23 DEC razgon *уменьшаем переменную разгона

0125 e09f 7d 00 20 prov2: TST cnttime *

0126 e0a2 27 03 BEQ exit0 *цикл закончился - переход к осн. прог.

0127 e0a4 7e e0 9f JMP prov2 *цикл не закончился - переход в начало цикла

0128 e0a7 39 exit0: RTS

0129

0130 *----Подпрограмма обработки прерывания RTIF

0131

0132 e0a8 86 01 OBRRTI: LDAA #%00000001

0133 e0aa 94 24 ANDA pwm_skv *выделяем младший бит Вектора

0134 e0ac b7 10 08 STAA portd *загружаем его в порт D[0]

0135 e0af 76 00 24 ROR pwm_skv *циклически сдвигаем вектор вправо

0136 e0b2 7a 00 20 DEC cnttime *уменьшаем счётчик циклов

0137

0138 e0b5 86 40 LDAA #rtif *

0139 e0b7 b7 10 25 STAA TFLG2 *сброс флага RTIF

0140

0141 e0ba 3b RTI

0142

0143 *----Подпорграмма обработки прерывания IRQ#

0144

0145 e0bb 7d 00 21 OBRIRQ: TST flag *проверяем флаг работы двигателя

0146 e0be 26 0b BNE zapret *если он не равен нулю (равен 1), останавливаем двигатель

0147 e0c0 86 01 LDAA #1 *иначе

0148 e0c2 97 21 STAA flag *устанавливаем флаг в 1

0149 e0c4 86 40 LDAA #rtif *

0150 e0c6 b7 10 24 STAA TMSK2 *разрешаем прерывание реального времени

0151 e0c9 20 0f BRA exit *выходим из прерывания

0152 e0cb 7f 00 21 zapret: CLR flag *сбрасываем флаг в 0

0153 e0ce 86 00 LDAA #$00 *и

0154 e0d0 b7 10 24 STAA TMSK2 *запрещаем прерывание реального времени

0155 e0d3 b7 10 08 STAA portd *мощность=0

0156 e0d6 96 22 LDAA power *сохраняем текущий ур-нь мощности

0157 e0d8 97 23 STAA razgon *для плавного разгона

0158 e0da 3b exit: RTI *выходим из прерывания

33