Новичок
Регистрация: 10.05.2009
Сообщений: 1
Репутация: 10
|
программа для анализа работы АЦП на avr Atmel. нужно организовать вычитание двух потенциометров! ADC6-ADC7! вычитание происходит все горит, когда один в макс. а другой в мин. показвает максимальное значение 10! а надо чтобы показвал от -FF ДО FF! ПОМОГИТЕ НАЙТИ ОШИБКУ ИЛЬ ВАШ ВАРИАНТ......... СПАСИБО ЗАРАНЕЕ
разрядность входных сигналов: 10 система счисления: 16 .include "m8535def.inc" ;Назначим новые имена для регистров .def count=r20 ;Счетчик, позиция .def takt=r21 .def tmp=r19 ;Регистр буферный .def znak=r29 ;Знак числа на вывод .org $0 ;Начальный адрес rjmp reset .org $0E rjmp in_ADC .cseg ;Начало сегмента кодов (сама программа) .org $200 ;Вектор прерывания от АЦП ;Устанавливаем указатель стека на конец RAM reset: ldi r16, low(RAMEND) ldi r17, high(RAMEND) out spl, r16 out sph, r17 ;Конфигурация входов выходов ldi r16, 0xFE ;0 бит порта А out DDRB,r16 ;на вход ldi r16, 0x00 ; все биты порта А out DDRA, r16 ;устанавливаем на ввод ldi r16, 0xFF out DDRC, r16 ;Порт D и порт С устанавливаем out DDRD, r16 ;на вывод ; out PORTA, r16 ;Подтягивающие резисторы out PORTB,r16 ldi takt, 1 ;Начальное значение такта ldi count,1 ;Начальное значение счетчика (позиции) clr r22 clr r23 clr r25 ;Готовим для вывода знака ;Инициализация АЦП ldi r16, 0x26 out ADMUX, r16 ;Выравнивание влево, канал 6 ldi r16, 0xEF ;Разрешение работы, циклическая работа, out ADCSRA, r16 ;разрешение прерывания, КД=128 sei ;Разрешение прерываний main: nop rjmp main ;Ожидание прерывания ;Подрограмма прерывания от АЦП in_ADC: in r27,SREG kanal1: cpi takt ,2 breq kanal2 ldi r16, 0x26 out ADMUX, r16 ;Выравнивание влево, канал 6 in r16, ADCL ;Младший байт в r16 in r17, ADCH ;Старший байт в r17 ;lsr r17 ;lsr r17 ;формируем число в r17 ;lsr r17 andi r17,0xFF inc takt rjmp super_prer kanal2: ldi r16, 0x27 out ADMUX, r16 ;Выравнивание влево, канал 7 in r22, ADCL ;Младший байт в r22 in r23, ADCH ;Старший байт в r23 ;lsr r23 ;lsr r23 ;формируем число в r23 ;lsr r23 andi takt, 1 ;На первый такт andi r23, 0xFF rcall raznost clr r16 rcall preobr_koda rcall indic rjmp super_prer super_prer: ldi r16, 0xEF ;Разрешение работы, циклическая работа, out ADCSRA, r16 ;разрешение прерывания, КД=128 out SREG,r27 reti raznost: sbc r17, r23 brlo minus ;разность чисел rjmp plus preobr_koda: subi r17, 0xFF brlo preobr_chislo inc r16 rjmp preobr_koda preobr_chislo: ldi r18, 0xFF add r17, r18 swap r16 add r16, r17 ret plus: ldi znak,0x00 ;код темноты(плюс) rjmp rezultat minus: ldi znak,0x40 ;код минуса neg r17 rjmp rezultat rezultat: ret indic: cpi count, 2 ;Если позиция 2, то breq cifir_2 ;на выдачу старшей цифры cpi count, 3 ;Если позиция 3, то breq cifir_3 ;на выдачу знака числа cifir_1: mov tmp, r16 ;Иначе выделяем младшую цифру andi tmp, 0x0F inc count ldi r26,0x01 rjmp konec_rasch ;Переходим на конец выделения цифры cifir_2: mov tmp, r16 ;Выделяем старшую цифру swap tmp andi tmp, 0x0F inc count ldi r26,0x02 rjmp konec_rasch ;Переходим на конец выделения цифры cifir_3: mov tmp,znak ldi count,1 ldi r26,0x04 out PORTD, r26 ;Выдача кода позиции out PORTC, tmp ret konec_rasch: ldi r31,$01 ldi r30,$00 ;чтение add r30, tmp clr tmp lpm mov tmp,r0 out PORTD, r26 ;Выдача кода позиции out PORTC, tmp ret ;Иначе сразу возврат из п/п прерывания .org $80 ;запись в PZU .db $3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F,$77,$7C,$3 9,$5E,$79,$71 |
||
Оценка
|
Обратная связь РадиоЛоцман Вверх |