- •Содержание
- •Введение
- •1.1 Функциональная спецификация системы
- •1.2 Описание интерфейса между системой и пользователем
- •2 Предварительное проектирование системы
- •2.1 Разбиение системы на модули
- •2.2 Соотношение между аппаратными и программными средствами
- •2.3 Построение структурной схемы аппаратной части системы
- •3 Проектирование аппаратных средств системы
- •4 Проектирование программного обеспечения
- •Заключение
- •Список использованных источников
- •Приложения
Приложения
Приложение А
Листинг программы:
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 *выходим из прерывания