программирование ацп в Assemblere

  • Автор темы slimz
  • Дата начала
Статус
Закрыто для дальнейших ответов.
S

slimz

Написал вот эту прогу! Теперь препод дает новое задание! Прошу помогите пожалуйста!
препод просит чтобы я сделал программу также для цифровой индикации аналоговых сигналов со следующим заданием:
«Теперь вместо одного вольтметра мне нужно использовать и второй, и вывод значений на индикатор это разница между двумя вольтметрами. Т.е мы используем второй потенциометр и теперь выходной сигнал у нас это: ADC6-ADC7(потенциометр1- потенциометр 2). Вывод значений в 16чном коде». Я не знаю как писать мозг взрывается! Помогите пожалуйста с программой! И прошу если не сложно алгоритм написать!
БЛАГОДАРЮ ЗАРАНЕЕ!



Online

Сообщений: 2


программа под авр
« : Марта 29, 2009, 06:11:56 pm » Цитировать Изменить Удалить

Организовать цифровой вольтметр на семисегментном индикаторе. Вход РА0, выходы порт С, порт D. Пределы измерения от –FF до +FF.тут я использую один потенциометр!
[codebox]
.include "m8535def.inc"
Назначим новые имена для регистров
.def count=r20 Счетчик, позиция
.def tmp=r19 Регистр буферный
.def kod=r18 Регистр кода символа
.cseg Начало сегмента кодов (сама программа)
.org 0 Начальный адрес
rjmp reset
.org 0x0E
rjmp in_ADC Вектор прерывания от АЦП
Устанавливаем указатель стека на конец RAM
reset: ldi r16, low(RAMEND)
ldi r17, high(RAMEND)
out spl, r16
out sph, r17
Конфигурация входов выходов
ldi r16, 0xFE Первый бит порта А
out DDRA, r16 устанавливаем на ввод
ldi r16, 0xFF
out DDRC, r16 Порт D и порт С устанавливаем
out DDRD, r16 на вывод
out PORTA, r16 Подтягивающие резисторы
clr r31
ldi r30, 0x60
ldi r16, 0x3F 0
st z++, r16
ldi r16, 0x06 1
st z++, r16
ldi r16, 0x5B 2
st z++, r16
ldi r16, 0x4F 3
st z++, r16
ldi r16, 0x66 4
st z++, r16
ldi r16, 0x6D 5
st z++, r16
ldi r16, 0x7D 6
st z++, r16
ldi r16, 0x07 7
st z++, r16
ldi r16, 0x7F 8
st z++, r16
ldi r16, 0x6F 9
st z++, r16
ldi r16, 0x77 A
st z++, r16
ldi r16, 0x7C B
st z++, r16
ldi r16, 0x39 C
st z++, r16
ldi r16, 0x5E D
st z++, r16
ldi r16, 0x79 E
st z++, r16
ldi r16, 0x71 F
st z, r16
ldi count,1 Начальное значение счетчика (позиции)
clr r25 Готовим для вывода знака
ldi r26, 0x40 Для инвертирования бита
ser r27 Для инвертирования числа
Инициализация АЦП
ldi r16, 0x20
out ADMUX, r16 Выравнивание влево, канал 0
ldi r16, 0xEF Разрешение работы, циклическая работа,
out ADCSRA, r16 разрешение прерывания, КД=128
sei Разрешение прерываний
main: rjmp main Ожидание прерывания
Подрограмма прерывания от АЦП
in_ADC: in r16, ADCL Младший байт в r16
in r17, ADCH Старший байт в r17
rol r16 Сдвигом старший бит отправляем во флаг С
bst r17, 7 Выделяем старший бит всего числа
rol r17 Формируем число в r17
brts plus Если старший бит 0,
eor r17, r27 то инвертируем число
plus: cpi count, 2 Если позиция 2, то
breq c_2 на выдачу старшей цифры
cpi count, 4 Если позиция 3, то
breq c_4 на выдачу знака числа
mov tmp, r17 Иначе выделяем младшую цифру
andi tmp, 0x0F
rjmp end_rasch Переходим на конец выделения цифры
c_2: mov tmp, r17 Выделяем старшую цифру
swap tmp
andi tmp, 0x0F
rjmp end_rasch Переходим на конец выделения цифры
c_4: bld r25, 6 Возвращаем старший бит всего числа
eor r25,r26 Инвертируем этот бит
out PORTC, r25 И выдаем на порт С
rjmp poz Переходим на выдачу кода позиции
end_rasch: rcall digit Вызов п/п преобразования числа в символ
poz: out PORTD, count Выдача кода позиции
lsl count Переход на следующую позицию
cpi count, 0x08 Если зажгли последнюю позицию (3),
breq zero то восстанавливаем начальную позицию
reti Иначе сразу возврат из п/п прерывания
zero: ldi count, 1 Восстановление начальной позиции
reti Возврат из п/п прерывания
Подпрограмма преобразования числа в символ
digit: ldi r30, 0x60
add r30, tmp
ld kod, z
out PORTC, kod
Ret[/codebox]
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!