Рябов В.Т. - Устройство и программирование однокристальных микроконтроллеров (1041592), страница 20
Текст из файла (страница 20)
Действие, связанное с этой кнопкой выполняется всякий раз, как только будет обнаружено ее нажатие. Ноль в цикле опроса вне зависимости от прошлого состояния – вот событие, фиксируемое такой кнопкой.В управляющей программе, прежде всего, пропишем квант опроса кнопок в зоне векторов квантов с единичным приоритетом. Старший нулевой приоритет был отдан квантуSTEP, квант KLAV опишем в зоне векторов квантов по следующему адресу 14Ch.ORG 14ChLJMP KLAV; безусловный переход к кванту KLAV.Поскольку прошлые состояния кнопок фиксируются в отдельных битах ячейки 28h, авозможности битового процессора ограничены (нет команд присвоения значения одногобита другому), рассмотрим, как удобнее обнаружить нажатие кнопок однократной фиксации К3 и К4. В таблице 5.7 приведена реакция на различные сочетания прошлого состояниякнопки и ее состояния на момент опроса.64Таблица 5.7.Сочетание состояний кнопки00 – была нажата и нажата01 – была нажата, отпущена10 – не была нажата, нажата11 – не была нажата, не нажатаДействиеНичего не делать, прошлое состояние не менятьНичего не делать, прошлое состояние инвертироватьВызвать подпрограмму реакции на нажатие, прошлое состояние инвертироватьНичего не делатьНиже приведен текст опроса кнопок пульта управления.
Для того, чтобы считыватьсостояние выводов порта Р1, а не состояние защелок этих выводов, необходимо в защелкистаршей тетрады порта предварительно записать единицы. Это выполняется первым оператором «ИЛИ». Далее анализируется состояние кнопки однократного нажатия «Вкл-Выкл»(Р1.7).При условии: в прошлом опросе была единица, а теперь – ноль, запускается подпрограмма включения выключения PUSK_STOP.
В ней просто инвертируется статус квантаSTEP и квант подключается к диспетчеру, если был исключен или исключается, если былподключен. При выключении не только снимается с диспетчирования сам процесс, но и отключается напряжение с фазных катушек ШД. При этом процесс чтения состояния кнопокне нарушается, поскольку единичные биты старшей тетрады порта Р1 восстанавливаютсявсякий раз при обращении к процессу чтения.;-------------------------------------------------KLAV---------------------------------------------------------KLAV:ORL P1, #0F0h; запись единиц в старшую тетраду порта Р1;-------------------------------------------Опрос кнопки К1------------------------------------------------P1_7:JB P1.7, N_P1_7 ; если К4 не нажата, переход к метке N_P1_7; иначе продолжаемJNB 28h.7h, P1_6 ; если была нажата (сочетание 00), опрос К3LCALL PUSK_STOP ; иначе (сочетание 10), запуск «PUSK_STOP»INV7:CPL 28h.7h; инверсия прошлого состояния кнопки К4SJMP P1_6; безусловный переход к метке P1_6 (опрос К3)N_P1_7:JB 28h.7h,P1_6; если не была нажата (сочетание 11) опрос К3SJMP INV7; иначе (сочетание 01) инверсия прошлого; состояния кнопки К4;-------------------------------------------Опрос кнопки К2------------------------------------------------P1_6:JB P1.6,N_P1_6; если К3 не нажата, переход к метке N_P1_6JNB 28h.6h,P1_5 ; если была нажата (сочетание 00), опрос К2LCALL REVERS; иначе (сочетание 10), запуск «REVERS»INV6:CPL 28h.6h; инверсия прошлого состояния кнопки К3SJMP P1_5; безусловный переход к метке P1_5 (опрос К2)N_P1_6:JB 28h.6h,P1_5; если не была нажата (сочетание 11) опрос К2SJMP INV6; иначе (сочетание 01) инверсия прошлого состояния К3;-------------------------------------------Опрос кнопки К3------------------------------------------------P1_5:JB P1.5,P1_4; если К2 не нажата переход к анализу К1LCALL FASTER; иначе, запуск подпрограммы FASTER;-------------------------------------------Опрос кнопки К4------------------------------------------------P1_4:JB P1.4,EKL; если К1 не нажата – выход из кванта опроса кнопокLCALL SLOWLY; иначе, запуск подпрограммы SLOWLYEKL:RET; возврат из подпрограммы KLAV;---------------------------Подпрограммы реакции на нажатие кнопок-----------------------------;--------------------Реакция на нажатие К4 «Вкл-Выкл»---------------------------------------------PUSK_STOP: CPL 20h.0h;инверсия статуса кванта STEPMOV P1,#0F0h; обнулили младшую тетраду Р1 (сняли питание с ШД)65JNB 20h.0h,ENDPS ; если статус – ноль, выход из подпрограммыMOV P1,R3; иначе записать в Р1 хранимое в R3 состояние фаз ШДENDPS:RET; выход из подпрограммы PUSK_STOP;--------------------Реакция на нажатие К3 «Реверс»--------------------------------------------------REVERS:XRL 02,#0Fh;инверсия битов младшей тетрады переменной MASKARET;выход из подпрограммы REVERS;--------------------Реакция на нажатие К2 «Медленнее»--------------------------------------------SLOWLY:INC R1;инкремент R1 (задержки кванта STEP)RET;выход из подпрограммы SLOWLY;--------------------Реакция на нажатие К1 «Быстрее»------------------------------------------------FASTER:DEC R1;декремент R1 (задержки кванта STEP)RET;выход из подпрограммы FASTERВ подпрограммах SLOWLY и FASTER скорость регулируется очень неравномерно.При малых задержках добавление или вычитание единицы влияет очень существенно (на20% при задержке в 5 тиков), при больших влияние мало (всего 0,5% при задержке в 100тиков).
Как повысить плавность регулировки скорости?На последнем этапе разработки программного обеспечения следует преобразоватьтекст программы на ассемблере в загрузочный модуль и загрузить его в микроконтроллер.Это можно сделать, последовательно используя свободно распространяемый ассемблерA8051.EXE и линковщик XLINK.EXE под MS DOS. Работать с этими программами на персональном компьютере придется из командной строки в окне MS DOS, что не очень удобно пользователям, привыкшим к экранному интерфейсу Windows.
С сайта фирмы Фитон(www.phyton.ru) можно скачать свободно распространяемый комплект программногообеспечения CodeMaster-52. Программный интерфейс пакета унифицирован и обеспечивает все этапы разработки программного обеспечения - от написания исходного текстапрограммы до ее компиляции и отладки.Полный прокомментированный текст программного обеспечения контроллера, выполняемого под управлением рассмотренного в разделе 5.2 диспетчера процессов приведен в ПРИЛОЖЕНИИ 2.В заключении хочется отметить, что диспетчер процессов и программа управленияшаговым двигателем отлажены с использованием аппаратно-программного эмулятораконтроллеров семейства MCS-51 фирмы Фитон и размещена на сервере кафедры МТ11 полокальному адресу: //192.168.0.1/student/5kurs/SAU/lab_rab.Текст диспетчера процессов и консультации по его практическому использованиюможно получить, обратившись по адресу V_Ryabov@mail.ru.Контрольные вопросы.1.
Написание и отладка программного обеспечения специальных и специализированных микроконтроллеров.2. Устройство шагового двигателя и управление им.3. Защита от ЭДС самоиндукции фазных катушек ШД.4. Функции оптронных развязок в ключевых ячейках контроллера (рис.5.3).5. Расчет и выбор резисторов R1, R2 и R3 в ключевых ячейках контроллера(рис.5.3).6. Квант шага ШД.7.
Аппаратное и программное подключение клавиатуры.8. Как сделать регулировку скорости плавне.66ПРИЛОЖЕНИЕ 1Система команд микроконтроллеров семействаMCS-51.Таблица П1.1 ГРУППА КОМАНД ПЕРЕДАЧИ ДАННЫХНазвание командыМнемокодПересылка в аккумулятор изрегистра (n=0-7)Пересылка в аккумулятор прямо адресуемого байтаПересылка в аккумулятор байтаиз РПД (i=0,1)Загрузка в аккумулятор константыПересылка в регистр из аккумулятораПересылка в регистр прямо адресуемого байтаЗагрузка в регистр константыПересылка по прямому адресуаккумулятораПересылка по прямому адресурегистраПересыпка прямо адресуемогобайта по прямому адресуПересылка байта из РПД попрямому адресуПересылка по прямому адресуконстантыПересылка в РПД из аккумулятораПересылка в РПД прямо адресуемого байтаПересылка в РПД константыЗагрузка указателя данныхMOV A, RnMOV A, adКод опе- Цик Бай Операциялов товрации11101rr11(A)←(Rn)2(A)←(ad)MOV A, @R11110010 111110011i 11(A)←((R1))MOV A, #d011010012(A)←#dMOV Rn, A1111irrr11(Rn)←(A)MOV Rn, ad1010rrr22(Rn)←(ad)MOV Rn, #dMOV ad, A01111rrr1111010110001rrr2112(Rn)←#d(ad)←(A)22(ad)←(Rn)1000010 211000011i 23(add)←(ads)2(ad)←((Ri))3(ad)←#dMOV @Ri, A0111010 211111011i 11((Ri))←(A)MOV @Ri, ad0110011i 22((Ri))←(ad)0111011i 11001001 211001001i 221((Ri))←#d(DPTR)←#d1611000001i 21(А)←((А)+(DРТR))(A)←((A)+(PC))1110001i 21(A)←((Ri))1110000 201111001i 21(A)←((DPTR))1((Ri))←(A)21((DPTR))←(A)22(SP)←(SP)+1,((SP))←(ad)MOV ad, RnMOV add, adsMOV ad, @PiMOV ad, #dMOV @Ri, #dMOV DPTR,#d16Пересылка в аккумулятор байта MOVCиз ППА,@А+DPTRПересылка в аккумулятор байта MOVCиз ППA,@A+PCПересылка в аккумулятор байта MOVX А,@Riиз ВПДПересылка в аккумулятор байта MOVXиз расширенной ВПДA,@DPTRПересылка в ВПД из аккумуля- MOVX @Ri, AтораПересылка в расширеннуюMOVXВПД из аккумулятора@DPTR,AЗагрузка в стекPUSH ad111100001100000067Извлечение из стекаPOP adОбмен аккумулятора с регистромОбмен аккумулятора с прямоадресуемым байтомОбмен аккумулятора с байтомиз РПДОбмен младшей тетрады аккумулятора с младшей тетрадойбайта из РПДXCH A, RnПродолжение таблицы П1.1.1101000 22(ad)←((SP)),0(SP)←(SP)-111001rrr 11(A)↔(Rn)XCH A, ad2(A)↔(ad)XCH A, @Ri1100010 111100011i 11(A)↔((Ri))XCHO A, @Ri1101011i 11(A0–A3)↔(Ri)0-3Таблица П1.2.