Листинг подпрограммы записи в регистр IR
zap_IR:ldi temp, $FFout DDRD,templdi temp, $00out PORTA, temp | out PORTD, Comandsbi PORTA,Ercall LCD_Delaycbi PORTA,Ercall LCD_Delayret |
Листинг подпрограммы записи в регистр DR
zap_DR:ldi temp, $FFout DDRD, templdi temp,0b00000001out PORTA, temprcall LCD_Delay | out PORTD, lcdsbi PORTA,Ercall LCD_Delaycbi PORTA,Ercall LCD_Delayret |
В подпрограммах замены указывается символ, который изменяется. Значение символа указывается непосредственно в блоке обработке нажатия кнопки.
В случае если изменяется один выводимый на ЖКИ знак, вызывается подпрограмма zamenа (единицы), в случае изменения десятков дополнительно вызывается подпрограмма zamena1.
Листинг подпрограммы замены единиц (zamenа) и десятков(zamena1):
zamena:ldi Comand, $84mm2: rcall LCD_Delay rcall gotovrcall LCD_Delayrcall zap_IR rcall LCD_Delay | rcall gotovrcall LCD_Delayrcall zap_DRret zamena1:ldi Comand,$85rjmp mm2 |
Как видно из листинга, необходимое время задержки реализуется подпрограммой задержки, использование которой является более оптимальной с точки зрения программного кода.
LCD_Delay: ldi x,$04 L_loop: dec x brneL_loopret |
Текст программы управления генератором линейно-нарастающего напряжения сверхнизкой частоты в полном объеме приведен в приложении А.
5. Результаты эмуляции в программы в пакете VMLAB
Ниже приведены результаты эмуляции в пакете VMLAB, которые представляют собой полученные значения генерируемых частот, сведенные в таблицу 5.1. В качестве примера приводятся окно осциллографа программы, и отображаемая при этом на ЖКИ частота для второго и шестого режимов.
Таблица 1 – Результаты эмуляции в пакете VMLAB
№ кнопки | Задаваемая программно частота, Гц | Полученная в ходе эмуляции частота, Гц |
0 | 2.0 | 2.0 |
1 | 4.0 | 4.0 |
2 | 6.0 | 5.9 |
3 | 8.0 | 8.0 |
4 | 10.0 | 10.0 |
5 | 12.0 | 12.0 |
6 | 14.0 | 14.1 |
7 | 16.0 | 16.0 |
8 | 18.0 | 18.0 |
9 | 20.0 | 20.0 |
10 | 22.0 | 22.0 |
11 | 24.0 | 24.0 |
12 | 26.0 | 26.0 |
13 | 28.0 | 28.0 |
14 | 30.0 | 30.0 |
15 | 32.0 | 32.0 |
Отображаемое на ЖКИ значение частоты соответствует генерируемой в данный момент частоте для всех 16ти режимов. Соответствие кнопок частоте и полученная при анализе частота генерации показаны в таблице 5.1.
6. Анализ временных соотношений и оценка погрешностей
Расчет константы N, которая записывается в регистр сравнения первого таймер-счетчика выполняется по следующим соотношениям:
,Где 0.25 мкс – время тактирования генератора при тактовой частоте f=4МГц;
Согласно техническому заданию расчет константы необходимо провести для шестнадцати режимов. Полученную константу N переведем в шестнадцатеричную систему. Соответственно ниже приведена таблица расчетов для 16ти частот:
Табл. 2 – Расчет коэффициента N в зависимости от частоты
F, МГц | , мкс | ||
2 | 1960 | 7800 | 1E78 |
4 | 976 | 3904 | F40 |
6 | 664 | 2656 | A60 |
8 | 488 | 1952 | 7A0 |
10 | 390 | 1500 | 618 |
12 | 324 | 1296 | 510 |
14 | 279 | 1116 | 45C |
16 | 244 | 976 | 3D0 |
18 | 214 | 906 | 358 |
20 | 195 | 780 | 30C |
22 | 175 | 700 | 2BC |
24 | 162 | 648 | 288 |
26 | 148 | 592 | 250 |
28 | 139 | 556 | 22C |
30 | 128 | 512 | 200 |
32 | 122 | 488 | 1E8 |
Тот факт, что деление приводит к наличию более чем 4х знаков за запятой, и значения необходимо округлять до целых, говорит о том, что при генерации возможно возникновение погрешностей. Однако согласно эмуляции в пакете VMLAB погрешности генерации частоты не превышают 1%.
Выводы
В ходе выполнения данного курсового проекта был разработан алгоритм, спроектирована принципиальная схема и написана программа управления генератора линейно-нарастающего напряжения с дискретно-изменяющейся частотой с помощью матрицы кнопок и плавно-изменяющейся амплитудой.
Отображение генерируемой частоты осуществлялось с помощью ЖКИ.
После выполнения поставленной задачи были сделаны такие существенные выводы:
- проектирование и техническое выполнение генераторов линейно-нарастающего напряжения на базе микроконтроллеров является более оптимальным со схемотехнической точки зрения, с точки зрения управления и компактности устройства, а также точности получаемых значений;
- погрешности получаемые при генерации весьма малы, что свидетельствует о точности расчета;
- спроектированное устройство целиком и полностью соответствует техническому заданию.
Данное устройство может получить применение в сфере телевидения для горизонтальной развёртки электронного луча в электронно-лучевой трубке, а также широко применяться в импульсной технике.
ПриложениеА
; ******************************************************
; BASIC .ASM template file for AVR
; ******************************************************
.include "D:\0B54~1\9E9E~1\VMLAB\include\m8515def.inc"
; Define here the variables
; программа генератор пилообразный напряжение
.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
; Define here Reset and interrupt vectors, if any
reset:
rjmp start
reti ; Addr $01
reti ; Addr $02
reti ; Addr $03
rjmp generation ; Addr $04
reti ; Addr $05
reti ; Addr $06 Use 'rjmp myVector'
reti ; Addr $07 to define a interrupt vector
reti ; Addr $08
reti ; Addr $09
reti ; Addr $0A
reti ; Addr $0B This is just an example
reti ; Addr $0C Not all MCUs have the same
reti ; Addr $0D number of interrupt vectors
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
outPORTC,temp
;================ настройка Т1 и прерываний ==========
ldi temp, $40
out TIMSK, temp
ldi temp, $09
out TCCR1B, temp
sei
;================ загрузкаконстант ===================
ldi const0,0
ldi const01,$01
ldi lev,$00
ldix, $00
;================ режим по умолчанию ==================
ldi temp, high($1E78)
out OCR1AH, temp
ldi temp, low($1E78)
out OCR1AL, temp
;================ инициализация ЖКИ ===================
ldi Comand,$0C ;1100 определение режима отображения
rcall gotov
rcall LCD_Delay
rcall zap_IR
ldi Comand,$06 ;110 выбор направления сдвига
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 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
rcall mm3
;================последовательный опрос клавиатуры =============
forever:
ldi reg,$7F
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
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
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
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
rjmpforever
;=================== подпрограмма генерации ======================
generation:
out PORTC, lev
inc lev
reti
;================== метки перехода на кнопки =====================
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
;================== работасЖКИ ==============
LCD_Delay: ldi x,$04
L_loop: dec x
brne L_loop
ret
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
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
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
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
mm3:
rcall LCD_Delay
rcall gotov
rcall LCD_Delay
rcall zap_DR
ret