Автор Тема: программа под авр  (Прочитано 1819 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ALEX666

  • Коллежский регистратор
  • *
  • Сообщений: 2
  • Репутация: 0
программа под авр
« : јРав 29, 2009, 06:11:56 pm »
Организовать цифровой вольтметр на семисегментном индикаторе. Вход РА0, выходы порт С, порт D. Пределы измерения от –FF до +FF.тут я использую один потенциометр!
   .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   
Написал вот эту прогу! Теперь препод дает новое задание! Прошу помогите пожалуйста!
препод просит чтобы я сделал программу также для цифровой индикации аналоговых сигналов со следующим заданием:
«Теперь вместо одного вольтметра мне нужно использовать и второй, и вывод значений на индикатор это разница между двумя вольтметрами. Т.е мы используем второй потенциометр и теперь выходной сигнал у нас это: ADC6-ADC7(потенциометр1- потенциометр 2). Вывод значений в  16чном коде». Я не знаю как писать мозг взрывается! Помогите пожалуйста с программой! И прошу если не сложно алгоритм написать!
БЛАГОДАРЮ ЗАРАНЕЕ!