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

Тема в разделе "Другие", создана пользователем slimz, 31 мар 2009.

Статус темы:
Закрыта.
  1. slimz

    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]
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей