Программно управляемый генератор линейно нарастающего напряжения сверхнизкой частоты на микроконтроллере

ldi address, 25

rcall display_ampl; индикация амплитуды по умолчанию

main:; опрос кнопок

ldi temp, 0b11000000

out GIMSK, temp

sbis PIND, 4

rjmp mm1

sbis PIND, 5

rjmp mm2

sbis PIND, 6

rjmp mm3

sbis PIND, 7

rjmp mm4

gener:; генерация пилы

out GIMSK, Const0

out PORTC, amplitude

cpse amplitude, max_ampl

rjmp gen1

rjmp gen2

gen1:

inc amplitude

rcall delay

rjmp gener

gen2: ldi amplitude, 0

rjmp main

; выбор значения частоты

mm1: ldi freq, 156

rjmp gener

mm2: ldi freq, 206

rjmp gener

mm3: ldi freq, 222

rjmp gener

mm4: ldi freq, 231

rjmp gener

; подпрограмма временной задержки

delay:

out TCNT0, freq

ldi temp, 0b00001011

out TCCR0, temp

sleep

out TCCR0, Const0

ret

display_ampl:; подпрограмма индикации амплитуды

rcall bf_check

ldi comm, 1; вызов команды

rcall command; очистки экрана

; вывод целой части значения амплитуды

rcall read_EEPROM

rcall bf_check

rcall data

; вывод десятичной точки

ldi symbol,$2E

rcall bf_check

rcall data

; вывод десятичной части значения амплитуды

ldi temp, 46

add address, temp

rcall read_EEPROM

rcall bf_check

rcall data

; вывод сотой части значения амплитуды

ldi temp, 46

add address, temp

rcall read_EEPROM

rcall bf_check

rcall data

ldi temp, 92

sub address, temp

; вывод пробела и буквы V

rcall bf_check

ldi symbol, $20

rcall data

ldi symbol,$56

rcall bf_check

rcall data

ret

command:; подпрограмма записи команды в ЖКИ

out DDRA, ConstFF

out PORTB, Const0

nop

nop

sbi PORTB, 2

nop

nop

nop

out PORTA, comm

cbi PORTB, 2

ret

data:; подпрограмма записи кода символа в ЖКИ

out DDRA, ConstFF

ldi temp, 1

out PORTB, temp

nop

nop

sbi PORTB, 2

nop

nop

out PORTA, symbol

nop

nop

nop

cbi PORTB, 2

ret

bf_check:; подпрограмма проверки флага занятости

out DDRA, Const0

out PORTA, ConstFF

bf:

ldi temp, 2

out PORTB, temp

nop

nop

nop

nop

sbi PORTB, 2

nop

nop

in temp, PINA

cbi PORTB, 2

sbrc temp, 7

rjmp bf

ret

read_EEPROM:; подпрограмма чтения кода символа из EEPROM

out EEARH, Const0

out EEARL, address

ldi temp, 1

out EECR, temp

in symbol, EEDR

ret

minus:; уменьшение амплитуды

ldi temp, 25

cpse max_ampl, temp

rjmp min1

rjmp min2

min1:

sub max_ampl, Const5

dec address

rcall display_ampl

; здесь надо подкрутить частоту

min2:

reti

plus:; увеличение амплитуды

cpse max_ampl, ConstFF

rjmp pl1

rjmp pl2

pl1:

add max_ampl, Const5

inc address

rcall display_ampl

; здесь надо подкрутить частоту

pl2:

reti

eseg

db $30, $30, $30, $30, $30, $31, $31

db $31, $31, $31, $31, $31, $31, $31, $31, $32, $32, $32, $32, $32

db $32, $32, $32, $32, $32, $33, $33, $33, $33, $33, $33, $33, $33

db $33, $33, $34, $34, $34, $34, $34, $34, $34, $34, $34, $34, $35

db $35, $36, $37, $38, $39, $30, $31

db $32, $33, $34, $35, $36, $37, $38, $39, $30, $31, $32, $33, $34

db $35, $36, $37, $38, $39, $30, $31, $32, $33, $34, $35, $36, $37

db $38, $39, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $30

db $39, $39, $38, $38, $38, $38, $38

db $37, $37, $37, $37, $37, $36, $36, $36, $36, $36, $35, $35, $35

db $35, $35, $34, $34, $34, $34, $34, $33, $33, $33, $33, $33, $32

db $32, $32, $32, $32, $31, $31, $31, $31, $31, $30, $30, $30, $30

db $00 $00 $00 $00 $00 $00 $00 $00 $00 $00

db $00 $00 $00 $00 $00 $00 $00 $00 $00 $00

db $00 $00 $00 $00 $00 $00 $00 $00 $00 $00

db $00 $00 $00 $00 $00 $00 $00 $00 $00 $00

db $00 $00 $00 $00 $00 $00 $00 $00 $00 $00

db $00 $00 $00 $00 $00 $00 $00 $00 $00 $00

db $00 $00 $00 $00 $00 $00 $00 $00 $00 $00

db $00 $00 $00 $00 $00 $00 $00 $00 $00 $00

db $00 $00 $00 $00 $00 $00 $00 $00 $00 $00

db $00 $00 $00 $00 $00 $00 $00 $00 $00 $00

В начале программы с помощью директив.def регистрам общего назначения присваиваются определенные, осмысленные имена, с целью облегчения чтения кода в дальнейшем. Затем, после метки reset идет блок описания подпрограмм обработки прерываний. В нашем случае таких подпрограмм 2 – подпрограммы уменьшения и увеличения амплитуды (minus и plus). После метки start начинается основная программа. Первые 4 команды после нее инициализируют стек (записывают в старший и младший байты указателя стека SPH и SPL адреса границы оперативной памяти, тем самым под область стека отводится все адресное пространство ОЗУ). Затем с помощью команд ldi в используемые РОНы загружаются требуемые значения. После присвоения значений РОНам (константам) с помощью команд out в регистры ввода-вывода записываются значения настройки портов. Командами

out DDRA, ConstFF и out DDRC, ConstFF порты A и С настраиваются на выход, командой out PORTD, ConstFF к порту D подключаются подтягивающие резисторы. Далее, командой sei разрешаются прерывания на общем уровне. Далее, командами ldi temp, 2 и out TIMSK, temp

в регистре TIMSK устанавливается в 2-й бит, разрешающий прерывания по сравнению от первого таймер-счетчика. Следующими двумя командами в регистр MCUCR записывается значение 0b00101010. Установка пятого бита регистра разрешает использование режима пониженного энергопотребления, а значение 4-го бита, равное 0, задает тип режима – Idle Mode. 3-й и 1-й биты, установленные в 1, задают внешнее прерывание по переднему фронту сигнала (по отпусканию кнопки). Далее, запись значения 0b11000000 в регистр GIMSK разрешает внешние прерывания INT0 и INT1.

В блоке инициализации ЖКИ с помощью команд rcall вызываются подпрограммы опроса флага занятости, записи команд в ЖКИ и индикации амплитуды по умолчанию.

В блоке опроса кнопок используются команды sbis, пропускающие следующую за ними команду, если опрашиваемый бит порта установлен в 1 (кнопка не нажата). В противном случае происходит переход по соответствующей метке, где командами ldi в константу freq загружаются требуемое значение. В блоке генерации командами out в порт С, подключенный ко входу ЦАП, загружаются значения амплитуды и нулевые значения, задающие 2 полупериода импульса.

5. Результаты эмуляции программы в пакете VMLAB

Рисунок – Меандр с частотой 5 Гц

Рисунок Меандр с частотой 10 Гц

Рисунок – Меандр с частотой 15 Гц

Рисунок – Меандр с частотой 20 Гц

6. Анализ временных соотношений и оценка погрешностей

С помощью результатов, полученных при эмуляции программы в среде VMLAB, можно оценить частоту полученных сигналов. В первом режиме период меандра оказывается равным 200 мс, как следствие его частота равна 5 Гц и не отличается от заданной в ТЗ. Во втором режиме период меандра равен 100 мс, а частота сигнала – 10 Гц, которая также не отличается от заданной. В третьем режиме период меандра равен 68.0 мс, а его частота равна f = 1000/68.0 = 14.7 Гц. Она отличается от заданной частоты 15 Гц на 0.03 Гц, и в данном случае относительная погрешность частоты сформированного сигнала равна:

Страница:  1  2  3  4 


Другие рефераты на тему «Коммуникации, связь и радиоэлектроника»:

Поиск рефератов

Последние рефераты раздела

Copyright © 2010-2024 - www.refsru.com - рефераты, курсовые и дипломные работы