AVR Assembler Source Blog

Ремонт частотных преобразователей AVR Assembler Source Blog: ADC

Thursday, October 3, 2013

ADC


                              ;Выполнить преобразование аналоговых сигналов, поступающих на входы 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                   ;завершить прерывание

No comments:

Post a Comment