В.Т. Рябов - Разработка и отладка программного обеспечения микропроцессорной системы управления, страница 9
Описание файла
PDF-файл из архива "В.Т. Рябов - Разработка и отладка программного обеспечения микропроцессорной системы управления", который расположен в категории "". Всё это находится в предмете "системы автоматического управления (сау) (мт-11)" из 7 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "системы автоматического управления (сау)" в общих файлах.
Просмотр PDF-файла онлайн
Текст 9 страницы из PDF
Чтобы квант стал нормально работать,нужно заранее подготовить его переменные MASKA, FASA, задержка и установить статус кванта. Это сделаем в подпрограмме начальной настройки пользователя START и активизируем ее вектор162h.ORG 162h;-------name user-start program--LJMP STARTДалее приведен текст кванта START. Набирается он в зоне -USER PROGRAMMпрограммы диспетчера. В стартовой подпрограмме мы должны определить и задать начальные значения всем переменным, которые нам понадобятся в квантах STEP и KLAV.При написании программы на ассемблере есть возможность использовать символические переменные и макоопределения, что улучшает читабельность программы.
С другойстороны, использование символических переменных не дает возможности применить неявную адресацию через регистры контроллера, что приводит к увеличению длины программного кода и снижению быстродействия. Читабельность программы можно улучшить подробным комментированием. В комментариях к кванту объявим все используемые переменные.Используемые переменные, требующие инициализации, приведены в таблице 6Таблица 6.АдресПеременные пользователяАдресСистемная переменная диспетчераR1Задержка кванта STEP20h.0hСтатус кванта STEPR2MASKA – маска для коммутации фаз 20h.1hСтатус кванта KLAVR3FAZA - фазы двигателя22h.0-7h Разрядности тиков задержкиквантов28hПрошлые состояния клавиш- 31 -;----------------------USER PROGRAMM---------------------------;-----------------------user start programm-------------------------START: MOVR3,#0Ch;00001100 в ФАЗУMOVR2,#0Ah;00001010 в МАСКУMOVP1,R3;фазу в портCLR20h.0h;снять статус кванта STEPMOVR1,#20h;задержка кванта STEP 32 - тикаMOV08h,R1;переписать ее в регистр задержек кванта STEPSETB 20h.1h;установить статус кванта KLAVMOV09h,#80h;записать 128 в регистр задержек кванта KLAVMOV28h,#0FFh;клавиши не нажималисьMOV22h,#00;все задержки в коротких тикахRET;возврат из ППТекст кванта START реализует описанную выше идею с исключающим ИЛИ, но выглядит посложнее.;-----------------------Step_SM--------------------------STEP:CLRA;очистить аккумуляторORLA,P1;фазу в аккумуляторXRLA,R2;исключающее ИЛИ фазы и маскиMOVP1,A;результат в портXRL02h,#0Fh;исключающее ИЛИ маски и 0FhMOV08h,R1;установить задержку кванту из R1MOVR3,A;новую фазу в R3RET; возврат из ППДокажите, что этот квант ни как не искажает содержимое старшей тетрады порта Р1.9.2.
Программа опроса кнопок и управления шаговым двигателемКнопки через однонаправленный буфер BF подключены к старшей тетраде порта Р1(рис.7). Если кнопка не нажата, на бит буфера через пары резисторов R1-R5…R4-R8 поступает напряжение +5В и единица на соответствующий бит порта. При нажатии на кнопку, на соответствующей линии будет фиксироваться нуль.Распределим фукции кнопок.Кнопка К4 «Вкл-Выкл», подключенная к порту Р1.7, будет у нас включать и выключатьдвигатель. Если двигатель выключен, нажатие на нее должно приводить к включению, есливключен и вращается – к выключению.Кнопка К3 «Реверс» должна реверсировать вращение шагового двигателя. При нажатиина нее шаговый двигатель должен остановиться и начать крутиться в другую сторону с той жескоростью, что и до реверса.Кнопка К2 «Быстрее» должна при нажатии на нее приводить к уменьшению задержкимежду шагами шагового двигателя и ускорению его вращения.Кнопка К1 «Медленее» должна при нажатии на нее приводить к увеличению задержкимежду шагами шагового двигателя и замедлению его вращения.Не заметили принципиальной разницы между кнопками? Первые две должны реагироватьна каждое нажатие и обнаруживать спад сигнала на соответствующей линии: прошлый опросбыла единица, а теперь ноль, вот событие, которое должна фиксировать такая кнопка.
Этокнопка однократного нажатия.Кнопки К1 и К2 – кнопки с автоповтором. Действие, связанное с этой кнопкой выполняется всякий раз, как только будет обнаружено ее нажатие. Ноль в цикле опроса вне зависимости от прошлого состояния – вот событие, фиксируемое такой кнопкой.В управляющей программе, прежде всего, пропишем процесс опроса кнопок в зоне векторов квантов с единичным приоритетом. Старший нулевой приоритет пусть занял квант STEP.- 32 -ORG 14Ch;-------name thread1----------LJMP KLAVДля того, чтобы считывать состояние выводов порта Р1, а не состояние защелок этих выводов, необходимо в защелки старшей тетрады порта предварительно записать единицы. Этовыполняется первым оператором «ИЛИ».
Далее анализируется состояние кнопки однократного нажатия «ВКЛ-ВЫКЛ» (р1.7). При условии: в прошлом опросе была единица, а теперь –ноль, запускается подпрограмма включения выключения PUSK_STOP.В ней просто инвертируется статус кванта STEP и квант включается, если был выключенили выключается, если был включен. При выключении не только снимается с диспетчирования сам процесс, но и отключается напряжение с фазных катушек ШД. При этом процесс чтения состояния кнопок не нарушается, поскольку единичные биты старшей тетрады порта Р1восстанавливаются всякий раз при обращении к процессу чтения.;------------------------KLAV-------------------------KLAV:ORLP1,#0F0h;-------------------------p1.7----------------P1_7:JBP1.7,N_P1_7JNB28h.7h,P1_6LCALL PUSK_STOPINV7:CPL28h.7hSJMP P1_6N_P1_7:JB28h.7h,P1_6SJMP INV7;------------------------p1.6------------------P1_6:JBP1.6,N_P1_6JNB28h.6h,P1_5LCALL REVERSINV6:CPL28h.6hSJMP P1_5N_P1_6:JB28h.6h,P1_5SJMP INV6;------------------------p1.5------------------P1_5:JBP1.5,P1_4LCALL FASTER;------------------------p1.4------------------P1_4:JBP1.4,EKLLCALL SLOWLYEKL:RET;----------------------------------------------PUSK_STOP:CPL20h.0hMOVP1,#0F0hJNB20h.0h,ENDPSMOVP1,R3ENDPS:RET;----------------------------------------------REVERS:XRL02,#0FhRET;----------------------------------------------SLOWLY:INCR1RET;---------------------------------------------FASTER:DECR1RET;---------------------------------------------END;Конец всей программы.- 33 -10.
Задание на лабораторную работу №2"ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ УПРАВЛЕНИЯ ШАГОВЫМДВИГАТЕЛЕМ.1. Изучить методы разработки и отладки программного обеспечения (ПО) для локальных микроконтроллеров на однокристальных микроЭВМ.2. Изучить устройство, работу и программирование шагового двигателя. Сколькозубьев на статоре и роторе шагового двигателя ДШИ 200, делающего 200 шагов наоборот?3.
Составить и оттранслировать программу управления ШД с помощью клавиатуры.4. Откомментировать квант опроса клавиатуры.Первые четыре пункта следует выполнить в качестве домашнего задания.5. Ускорение и замедление двигателя слишком мало заметно на малых скоростяхвращения, как это исправить?6. Сохранить и распечатать текст программного обеспечения.7. Сохранитьираспечататьдиассемблированныйаппаратного эмулятора.- 34 -кодпамятипрограммно-ПРИЛОЖЕНИЕП1. Система команд микроконтроллеров семействаMCS-51.Таблица 1.
ГРУППА КОМАНД ПЕРЕДАЧИ ДАННЫХНазвание командыМнемокодЦиклы1Байты1ОперацияMOV A, RnКод операции11101rrПересылка в аккумулятор из регистра(n=0-7)Пересылка в аккумулятор прямо адресуемого байтаПересылка в аккумулятор байта изРПД (i=0,1)Загрузка в аккумулятор константыПересылка в регистр из аккумулятораПересылка в регистр прямо адресуемого байтаЗагрузка в регистр константыПересылка по прямому адресу аккумулятораПересылка по прямому адресу регистраПересыпка прямо адресуемого байтапо прямому адресуПересылка байта из РПД по прямомуадресуПересылка по прямому адресу константыПересылка в РПД из аккумулятораПересылка в РПД прямо адресуемогобайтаПересылка в РПД константыЗагрузка указателя данныхПересылка в аккумулятор байта изПППересылка в аккумулятор байта изПППересылка в аккумулятор байта изВПДПересылка в аккумулятор байта израсширенной ВПДПересылка в ВПД из аккумулятораПересылка в расширенную ВПД изаккумулятораЗагрузка в стекMOV A, ad1110010112(A)←(ad)MOV A, @R11110011i11(A)←((R1))MOV A, #dMOV Rn, AMOV Rn, ad01101001111irrr1010rrr112212(A)←#d(Rn)←(A)(Rn)←(ad)MOV Rn, #dMOV ad, A01111rrr111101012112(Rn)←#d(ad)←(A)MOV ad, Rn10001rrr22(ad)←(Rn)MOV add, ads1000010123(add)←(ads)MOV ad, @Pi1000011i22(ad)←((Ri))MOV ad, #d0111010123(ad)←#dMOV @Ri, AMOV @Ri, ad1111011i0110011i1212((Ri))←(A)((Ri))←(ad)MOV @Ri, #dMOV DPTR, #d16MOVCА,@А+DPTRMOVC A,@A+PC0111011i100100111001001i122211((Ri))←#d(DPTR)←#d16(А)← ((А)+(DРТR))1000001i21(A)←((A)+(PC))MOVX А,@Ri1110001i21(A)←((Ri))MOVX A,@DPTR1110000021(A)←((DPTR))MOVX @Ri, AMOVX @DPTR,A1111001i111100002211((Ri))←(A)((DPTR))←(A)PUSH ad1100000022Извлечение из стекаPOP ad1101000022Обмен аккумулятора с регистромОбмен аккумулятора с прямо адресуемым байтомОбмен аккумулятора с байтом из РПДОбмен младшей тетрады аккумулятора с младшей тетрадой байта из РПДXCH A, RnXCH A, ad11001rrr110001011112(SP)←(SP)+1,((SP))←(ad)(ad)←((SP)),(SP)←(SP)-1(A)↔(Rn)(A)↔(ad)XCH A, @RiXCHO A, @Ri1100011i1101011i1111(A)↔((Ri))(A0–A3)↔(Ri)0-3- 35 -(A)←(Rn)Таблица 2.
ГРУППА КОМАНД ПЕРЕДАЧИ УПРАВЛЕНИЯHaзвание командыДлинный переход и полном объёмеАбсолютныйпереходвнутристраницы в 2 КбКороткий относительный переходвнутри страницы в 256 БайтКосвенный относительный переходПереход, если аккумулятор равеннулюПереход, если аккумулятор не равен нулюПереход, если перенос равен единицеПереход, если перенос равен нулюМнемокодLJMP ad16КОП00000010Ц2Б3Операция(PC)←ad16AJMP ad1122SJMP relА10А9А8 000011000000022JМР @А+DPTR0111001121(РС)←(РС)+2,(PC)←(PC)+rel(РС)←(РС)+2,(PC)←(PC)+rel(РС)←(А)+(DPTR)JZ rel0110000022JNZ rel0111000022JC rel0100000022JNC rel0101000022Переход, если бит равен единицеJB bit, rel0010000023Переход, если бит равен нулюJNB bit, rel0011000023Переход, если бит установлен, споследующим сбросом бита.Декремент регистра и переход, если не нульJВС bit, rel0001000023DJNZ Rn, rel11011rrr22Декремент прямо адресуемогобайта и переход, если не нульDJNZ ad, rel1101010123Сравнение аккумулятора с прямоадресуемым байтом и переход, если не равноСравнение аккумулятора с константойСравнение регистра с константойи проход, если не равноСравнение байта РПД с константой и переход, если не равноCJNE A, ad, rel1011010123CJNE A, #d, rel1011010023СJNE Rn, #d, relA10A9A8100101011011i2223Длинный вызов подпрограммыLCALL ad160001001023Абсолютный вызов подпрограммыв пределах страницы в 2 КбACALL ad110001001022Возврат из подпрограммыRET0010001021Возврат из подпрограммы обработки прерыванияRETI0011001021Холостая командаNOP0000000011CJNE @Ri, #d,rel- 36 -(РС)←(РС)+2,при (А)=0:(PC) ←(PC)+rel(РС)←(РС)+2, при (А)≠0:(PC)←(PC)+rel(РС)←(РС)+2, при (С)=1:(РС)←(РС)+rel(PC)←(PC)+2, пpи (С)=0:(PC)←(PC)+rel(PC)←(PC)+3, пpи (b)=1:(PC)←(PC)+rel(PC)←(PC)+3, пpи (b)=0:(PC)←(PC)+rel(РС)←(РС)+3,при(b)=1:(b)←0, (PC)←(PC)+rel.(PC)←(PC)+2, (Rn)←(Rn>1,пpи(Rn)≠0:(PC)←(PC)+rel(PC)←(PC)+2, (ad)←(ad)1,при(ad)≠0:(PC)←(PC)+rel(PC)←(РС)+3,при(A)≠(ad): РС)←(РС)+rel(PC)←(PC)+3,пpи (A)≠#d:(PC)←(PC)+rel(PC)←(PC)+3, npи (Rn)≠d:(PC)←(PC)+rel(PC)←(PC)+3,при((Ri))≠#d:(PC)←(PC)+rel(РC)←(РС)+З, (SP)+(SP)+l,((SP))←(PC0-7),(SP)←(SP)+1, ((SP))←(PC815), ((SP))=(PC0/15)(PC)←ad11, (SP)←(SP)+1,((SP))←(PC0-7),(SP)←(SP)+1, ((SP))←(PC811)(PC8-15)←((SP)),(SP)←(SP)-1,(PC8-15)←((SP)),(SP)-(SP)-1(PC8-15)←((SP)),(SP)←(SP)-1,(PC0-7)←((SP)), (SP)←(SP)1(PC)←(PC)+1Таблица 3.