Разработка алгоритма и программы функционирования устройства

 

Алгоритм главной программы включает в себя следующие блоки:

-инициализация МК. В данном блоке осуществляется инициализация стека, настройка портов(на ввод/вывод данных), конфигурирование первого таймер-счетчика, настройка/разрешение прерываний, загрузка констант. Ниже приведен листинг инициализации МК:

 

.include "D:\0B54~1\9E9E~1\VMLAB\include\m8515def.inc"   .def temp = r16 .def adr = r17 .def reg = r18 .def const0 = r19 .def const01 = r20 .def time = r21 .def lev =r22 .def Comand =r23 .def lcd =r24 .def x =r25 .equ   E                        = 2 .equ   RW                   = 1 .equ   RS                     = 0   reset: rjmp start reti; Addr $01 reti; Addr $02 reti; Addr $03 rjmp generation reti; Addr $05 reti; Addr $06 reti; Addr $07 reti; Addr $08 reti; Addr $09 reti; Addr $0A reti; Addr $0B reti; Addr $0C reti; Addr $0D reti; Addr $0E reti; Addr $0F reti; Addr $10 ; Program starts here after Reset   start: ldi temp,$02 out SPH,temp ldi temp,$5F out SPL,temp ;====== настройка портов =========== ldi temp,$F0 out DDRD,temp ldi temp,$FF out PORTD,temp out DDRC,temp out PORTC,temp ;===== настройка Т1 и прерываний ==== ldi temp, $40 out TIMSK, temp ldi temp, $09 out TCCR1B, temp sei ;======== загрузка констант ======== ldi const0,0 ldi const01,$01 ldi lev,$00 ldi x, $00 ;===== режим по умолчанию ======== ldi temp, high($1E78) out OCR1AH, temp ldi temp, low($1E78) out OCR1AL, temp ldi adr,0

 

-инициализация ЖКИ. В данном блоке реализуется инициализацию ЖКИ: определение направления отображения, выбор направления сдвига и настройка развертки в одну строку. Настройка каждого из параметров происходит по следующему алгоритму:

 

Рис. 4.1 — Алгоритм последовательности конфигурации ЖКИ

 

Листинг инициализации ЖКИ

 ldi Comand,$0C;определение режима отображения rcall gotov rcall LCD_Delay rcall zap_IR ldi Comand,$06; выбор направления сдвига rcall LCD_Delay rcall gotov  rcall LCD_Delay rcall zap_IR ldi Comand,$38;развертка в одну строку rcall LCD_Delay rcall gotov rcall LCD_Delay rcall zap_IR        

 


-установка режима по умолчанию. Данный блок алгоритма включает в себя установку частоты по умолчанию, а также установку индикации по умолчанию. Листинг установки режима и индикации по умолчанию:

 

 ldi temp, high($1E78) out OCR1AH, temp ldi temp, low($1E78) out OCR1AL, temp ;=====Вывод надписи============== ldi lcd,$46;F rcall mm3 ldi lcd,$20 rcall mm3 ldi lcd,$3D;= rcall mm3  ldi lcd,$20 rcall mm3 ldi lcd,$20 rcall mm3 ldi lcd,$32;2 rcall mm3 ldi lcd,$20 rcall mm3 ldi lcd,$48;H rcall mm3 ldi lcd,$7A;z

 

После инициализации МК, ЖКИ и установки режима по умолчанию следует реализовать динамический опрос клавиатуры, который представляет собой следующую последовательность действий: группы кнопок условно разбиты на "линейки" и "колонки". Сначала программно на выходах PВ0-PВ3 выставляются единицы, а на P40 - ноль. При этом включена первая колонка, и осуществляется проверка нажатия кнопок именно этой колонки. Затем первая колонка отключается, и подключается следующая, и т.д.

Алгоритм опроса клавиатуры, который является частью главной программы, указан в чертеже РТ 468.524.008 П3, а ниже можно ознакомиться с листингом динамического опроса клавиатуры:

 

forever: ldi reg,$7F;маска 01111111 out PORTD,reg nop nop sbis PIND,0;проверка нажатия кнопки rjmp r3;переход к метке нажатия кнопки sbis PIND,1 rjmp r7 sbis PIND,2 rjmp r11 sbis PIND,3 rjmp r15 ldi reg,$BF;маска 10111111 out PORTD,reg nop nop sbis PIND,0 rjmp r2 sbis PIND,1 rjmp r6 sbis PIND,2 rjmp r10 sbis PIND,3 rjmp r14 ldi reg,$DF;маска 11011111 out PORTD,reg nop nop sbis PIND,0 rjmp r1 sbis PIND,1 rjmp r5 sbis PIND,2 rjmp r9 sbis PIND,3 rjmp r13 ldi reg,$EF;маска 11101111 out PORTD,reg nop nop sbis PIND,0 rjmp r0 sbis PIND,1 rjmp r4 sbis PIND,2 rjmp r8 sbis PIND,3 rjmp r12 rjmp forever

 

Как видно из блок-схемы алгоритма работы программы, в случае нажатия какой-либо кнопки, программа переходит на метку той кнопки, которая оказалась нажатой. Здесь с помощью первого таймер-счетчика устанавливается порог счета, который определяет частоту данного режима, а также вызывается подпрограмма замены символа, который отображает частоту данного режима. После чего программа возвращается обратно на метку forever, где снова начинается динамический опрос клавиатуры. Ниже приведен листинг блока обработки нажатий кнопок:

 

r0: ldi temp, high($1E78);2Гц out OCR1AH, temp ldi temp, low($1E78) out OCR1AL, temp ldi lcd, $32 rcall zamena1 rjmp forever r1: ldi temp, high($F40);4Гц out OCR1AH, temp ldi temp, low($F40) out OCR1AL, temp ldi lcd, $34 rcall zamena1 rjmp forever r2: ldi temp, high($A60);6 Гц out OCR1AH, temp ldi temp, low($A60) out OCR1AL, temp ldi lcd, $36 rcall zamena1 rjmp forever r3: ldi temp, high($7A0);8Гц out OCR1AH, temp ldi temp, low($7A0) out OCR1AL, temp ldi lcd, $38 rcall zamena1 rjmp forever r4: ldi temp, high($618);10Гц out OCR1AH, temp ldi temp, low($618) out OCR1AL, temp ldi lcd,$31 rcall zamena ldi lcd,$30 rcall zamena1 rjmp forever r5: ldi temp, high($510);12Гц out OCR1AH, temp ldi temp, low($510) out OCR1AL, temp ldi lcd,$31 rcall zamena ldi lcd,$32 rcall zamena1 rjmp forever r6: ldi temp, high($45C);14Гц out OCR1AH, temp ldi temp, low($45C) out OCR1AL, temp ldi lcd,$31 rcall zamena ldi lcd,$34 rcall zamena1 rjmp forever r7: ldi temp, high($3D0);16Гц out OCR1AH, temp ldi temp, low($3D0) out OCR1AL, temp ldi lcd,$31 rcall zamena ldi lcd,$36 rcall zamena1 rjmp forever r8: ldi temp, high($358);18Гц out OCR1AH, temp ldi temp, low($358) out OCR1AL, temp ldi lcd,$31 rcall zamena  ldi lcd,$38 rcall zamena1 rjmp forever r9: ldi temp, high($30C);20Гц out OCR1AH, temp ldi temp, low($30C) out OCR1AL, temp ldi lcd,$32 rcall zamena ldi lcd,$30 rcall zamena1 rjmp forever r10: ldi temp, high($2C6);22Гц out OCR1AH, temp ldi temp, low($2C6) out OCR1AL, temp ldi lcd,$32 rcall zamena ldi lcd,$32 rcall zamena1 rjmp forever r11: ldi temp, high($28B);24Гц out OCR1AH, temp ldi temp, low($28B) out OCR1AL, temp ldi lcd,$32 rcall zamena ldi lcd,$34 rcall zamena1 rjmp forever r12: ldi temp, high($259);26Гц out OCR1AH, temp ldi temp, low($259) out OCR1AL, temp ldi lcd,$32 rcall zamena ldi lcd,$36 rcall zamena1 rjmp forever r13: ldi temp, high($22E);28Гц out OCR1AH, temp ldi temp, low($22E) out OCR1AL, temp ldi lcd,$32 rcall zamena ldi lcd,$38 rcall zamena1 rjmp forever r14: ldi temp, high($208);30Гц out OCR1AH, temp ldi temp, low($208) out OCR1AL, temp ldi lcd,$33 rcall zamena ldi lcd,$30 rcall zamena1 rjmp forever r15: ldi temp, high($1E8);32Гц out OCR1AH, temp ldi temp, low($1E8) out OCR1AL, temp ldi lcd,$33 rcall zamena ldi lcd,$32 rcall zamena1 rjmp forever

 

Был полностью описан алгоритм основной программы. Далее будет приведен алгоритм подпрограммы генерации и приведен ее листинг.

Подпрограмма генерации вызывается по прерыванию от первого таймер-счетчика при нажатии кнопки. Прерывания предварительно разрешены в инициализации микроконтроллера:

 

 ldi temp, $40;настройка прерываний от Т1 out TIMSK, temp sei; разрешение общих прерываний

Генерация пилообразных импульсов была организована следующим образом: создана переменная, в которую изначально записано значение 0 и командой inc происходит увеличение значения переменной на 1, пока оно не достигнет 255. Далее сброс значения константы в ноль, и возобновление счета до порога. Блок-схема алгоритма подпрограммы генерации приведена на рис. 4.3.

 

Листинг подпрограммы генерации

generation: out PORTC, lev inc lev reti

 

Как видно подпрограмма, соответствующая такому алгоритму генерации линейно-нарастающего напряжения, является оптимальной с точки зрения кода и выполняется за минимальное количество тактов.

Весьма важным блоком программы является работа с ЖКИ.

При установке режима по умолчанию на ЖКИ выводится следующее:

«F = 2 Hz». Далее при нажатии на кнопки изменяются лишь 4й и 5й символы, отображающие значение частоты, что происходит при помощи подпрограмм zamena и zamena1 соответственно. Для отображения на ЖКИ одного символа необходимо в переменную lcd записать значение символа, который необходимо отобразить, а далее проверить ЖКИ на готовность к общению и произвести запись в регистр DR. На рис. 4.4 приведен алгоритм вывода надписи на ЖКИ.

Рассмотрим алгоритм, который реализован в подпрограммах готовности и записи в регистры IR и DR. Для этого на рис. 4.5 приведена а блок-схема алгоритма подпрограммы готовности, на рис.4.6а подпрограмма записи в регистр DR, на рис. 4.6б подпрограмма записи в регистр IR.

Для осуществления работы с ЖКИ в каждой конкретной подпрограмме формируются необходимые в данном случае временные диаграммы:для случая записи в регистр IR и DR.

 

Рис. 4.5 – Блок-схема алгоритма проверки ЖКИ на готовность

 

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

gotov: ldi temp, $00 out DDRB,temp ldi temp, $FF out PORTB,temp out DDRA, temp mm1: ldi temp,0b00000010 out PORTA, temp rcall LCD_Delay  sbi PORTA, E rcall LCD_Delay in temp, PIND rcall LCD_Delay cbi PORTA,E rcall LCD_Delay cbi PORTA,RW sbrs temp,7 ret rjmp mm1

 

а). б).

Рис. 4.6 – Блок-схема алгоритма подпрограмм записи в регистр IR(a) и записи в регистр DR(б)

 

Листинг подпрограммы записи в регистр IR

zap_IR: ldi temp, $FF out DDRD,temp ldi temp, $00 out PORTA, temp  out PORTD, Comand sbi PORTA,E rcall LCD_Delay cbi PORTA,E rcall LCD_Delay ret

 


Листинг подпрограммы записи в регистр DR

zap_DR: ldi temp, $FF out DDRD, temp ldi temp,0b00000001 out PORTA, temp rcall LCD_Delay  out PORTD, lcd sbi PORTA,E rcall LCD_Delay cbi PORTA,E rcall LCD_Delay ret

 

В подпрограммах замены указывается символ, который изменяется. Значение символа указывается непосредственно в блоке обработке нажатия кнопки.

В случае если изменяется один выводимый на ЖКИ знак, вызывается подпрограмма zamenа (единицы), в случае изменения десятков дополнительно вызывается подпрограмма zamena1.

Листинг подпрограммы замены единиц (zamenа) и десятков(zamena1):

 

zamena: ldi Comand, $84 mm2: rcall LCD_Delay     rcall gotov rcall LCD_Delay rcall zap_IR         rcall LCD_Delay  rcall gotov rcall LCD_Delay rcall zap_DR ret           zamena1: ldi Comand,$85 rjmp mm2

 

Как видно из листинга, необходимое время задержки реализуется подпрограммой задержки, использование которой является более оптимальной с точки зрения программного кода.

 

LCD_Delay:   ldi x,$04               L_loop: dec x                                       brne L_loop  ret

 


Текст программы управления генератором линейно-нарастающего напряжения сверхнизкой частоты в полном объеме приведен в приложении А.

 






Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: