;Выполнить преобразование аналоговых сигналов, поступающих на входы PA0, PA1, PA2, PA3 в цифровой код; преобразовать выходные коды АЦП в восьмибитный формат, пренебрегая значениями младших разрядов; записать полученные коды в ОЗУ по адресам $060, $061, $062, $062 .NOLIST ;не включать последующие команды в листинг .INCLUDE "m32def.inc" ;включить в код файл описаний команд и регистров конкретного контроллера .LIST ;включить последующие команды в листинг .DEF temp=r16 ;определить переменную temp как регистр r16 .CSEG ;указываем, что далее будем работать с памятью программ FLASH .ORG $000 ;установка положения в начальный $000 адрес памяти rjmp init ;условный переход на метку init: (прерывание по reset) .ORG $00e ;установка положения в начальный $00e адрес памяти rjmp adc ;переход на метку adc (прерывание по завершению преобразования АЦП) .ORG $011 ;установка положения в $00a адрес памяти init: ;инициализация используемых аппаратных средств, назначение портов на вход и выход ldi temp, LOW(RAMEND) ;обязательная процедура инициализации стека, значение переменной RAMEND указано во включаемом файле .inc, различное значение для каждого контроллера out SPL, temp ldi temp, HIGH(RAMEND) out SPH, temp clr temp ;очистить temp out DDRA, temp ;определить все биты порта А на ввод ser temp ;установить регистр (присвоить $FF, clr наоборот) out PORTA, temp ;установить высокий уровень сигнала по умолчанию на всех битах порта А ldi temp, 0b10000100 ;инициализация АЦП out ADCSR, temp start: clr XH ;очистка старшего байта спец. регистра косв. адресации ldi XL, $60 ;занести начальный адрес данных в регистр X out ADMUX, XH ;определить номера бита 0 порта А в мультиплексоре sbi ADCSR, ADSC ;запустить преобразование в АЦП sbi ADCSR, ADIE ;разрешить прерывание АЦП sei ;общее разрешение прерываний main: ;общий бессодержательный бесконечный цикл, может быть заменен любой программой nop ;пустая инструкция (задержка) rjmp main ;переход по метке main: adc: ;программа обработки прерывания АЦП in r20, ADCL ;занести младший байт кода в r20 in r21, ADCH ;занести старший байт кода в r21 lsr r21 ; ror r20 ; lsr r21 ; ror r20 ;двухкратный сдвиг вправо с переносом из старшего байта в младший для преобразования в 8-битовый формат st X+ ;сохранить в ОЗУ по адресу X с постинкрементом cpi XL, $64 ;сравнить младший бит адреса с конечным адресом breq end ;перейти к завершению цикла после PA3 mov temp, XL cbr temp, $F8 ;сбросить биты $FF-$F8 в регистре temp out ADMUX, temp ;занести в мультиплексор номер текущего канала sbi ADCSR, ADSC ;запустить преобразование в АЦП reti ;завершить прерывание end: cbi ADCSR, ADIE ;запретить прерывание АЦП reti ;завершить прерывание
Thursday, October 3, 2013
ADC
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment