Перейти к содержанию

Ацп На Atmega16


Juric

Рекомендуемые сообщения

Здравствуйте коллеги. Прошу вашей помощи.

Не могу заставить работать простую программу, смысл которой заключается в том, чтобы выводить в порт d значение преобразования АЦП.

Код программы приведён ниже:

	.Include "m16def.inc"	; Подключить файл описаний, имён регистров портов ввода/вывода
 	  		; Задание  символических  имён  регистрам
.def temp=r18		;

; Определение  символических  имён  для  констант
.equ ADC_BUF=$72 	; Адрес  буфера  АЦП  в  ОЗУ
; Установка  векторов  прерывания
.org 0			; Адрес  начала  программы
rjmp start		;
.org ADCCaddr		; Адрес  вектора  прерывания  по  завершению  преобразования  АЦП
rjmp adc		;

; Инициализация
start: 	ldi temp, LOW(RAMEND)    ; Инициализация  указателя  стека
out spl, temp 		    ; (для  МК, имеющих  стек, обязательно
ldi temp, HIGH(RAMEND)   ; выполняется  в  начале  программы)
out sph, temp		    ;
rcall port_init	 	    ; Вызов  подпрограммы  инициализация  портов

;======  Запуск АЦП             ==============================================================
adcstart:
rcall adc_init		; Вызов  подпрограммы  инициализация  и  запуска  АЦП
sei		 	; Установка  бита  общего  разрешения  прерываний
Loop:	rjmp loop		; Бесконечный  цикл - программа  ничего  не  делает


;=======  Инициализация портов       ========================================================
port_init:
	ldi temp, $00		; 
out ddra, temp		; Установка  порта  A  на  ввод
ldi temp, $ff		;
out ddrd, temp		; Установка  порта  D  на  вывод
out portd, temp		; Выключение  светодиодов  СД7… СД0  (порта  D)
ret			; Возврат  из  подпрограммы


;=======  Инициализация работы АЦП    ========================================================
adc_init:
	ldi temp, $BF    	; ADEN = 1 - разрешение работы АЦП; ADIE= 1 - разрешение
out adcsr, temp	    	; прерывания от АЦП  (Fadc = Fclk/128= 93кГц - кварц 12 МГц)
			; ADATE = 1 - работа опредиляется 
			; ADTS = 0 - Режим непрерывного преобразования
ldi temp, $20	    	; ADLAR = 1 -выравнивание результата преобразования в лево
out admux, temp   	; Установка  коммутатора  АЦП  на  0-й канал
sbi adcsr, adsc	    	; Запуск  АЦП, установка  разряда  adsc = 1, регистра  adcsr
ret			; Возврат  из  подпрограммы


;=======   Обработка прерывания АЦП   ============================================================
adc:	cbi adcsr, adie	    	; Запретить  прерывание  от  АЦП
ldi zh, high(adc_buf) 	; Записать  в  регистр  косвенной  адресации, адрес  начала  
ldi zl, low(adc_buf)    ; буфера  записи  преобразованного  АЦП  сигнала 
in temp, adcl	    	; Запись в рег. temp мл. байта преобразованного АЦП сигнала
st z+, temp		; Запись  в  буфер АЦП (по  адр. ОЗУ - 0х72, с постинкремен- 
			; том) младшего  байта  преобразованного  АЦП  сигнала
in temp, adch	    	; Запись  в рег. temp ст. байта преобразованного АЦП сигнала
st z, temp		; Запись  в  буфер  АЦП (по адр. ОЗУ - 0х73) ст. байта  преоб-
			; разованного  АЦП  сигнала
ldi zh, high(adc_buf) 	; Записать  в  регистр  косвенной  адресации, адрес  начала 		
ldi zl, low(adc_buf)    ; буфера  АЦП
ld r22, z+		; Считать  с  буфера АЦП двоичный  код  результата преобра- 
ld r23, z		; зовани  АЦП  (r22 - low; r23 - high)


out portd, r22		; Вывод в PD старшнго байта, преобразованного АЦП сигнала

rjmp adcstart	; Переход на подпр. инициализации и нового запуска АЦП 	

В место того, чтоб выводить результат АЦП. На всех ножках порта D +5В. :angry:

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Для начало, что бросилось в глаза:

rjmp adcstart из прерывание надо уходить reti

out portd, r22 попробуйте из младшего в старшем бит шесть не значащих

Остальное не вникал

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

за материальный, либо моральный ущерб причиненный данным сообщением напрямую или косвенно.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Спасибо за замечания.

Reti положительного результата не дал.

По поводу младшего и старшего бита. Я сделал выравнивание результата преобразования влево (ADLAR = 1 регистра ADMUX). И теперь младшие 6 разрядов регистра ADCL незначащие.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Спасибо за замечания.

Reti положительного результата не дал.

По поводу младшего и старшего бита. Я сделал выравнивание результата преобразования влево (ADLAR = 1 регистра ADMUX). И теперь младшие 6 разрядов регистра ADCL незначащие.

Скинте файликом, а то копи-паст в редакторе такую ахенею пишет.

cbi adcsr, adie уберите строчку

Изменено пользователем rtfcnf

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

за материальный, либо моральный ущерб причиненный данным сообщением напрямую или косвенно.

Ссылка на комментарий
Поделиться на другие сайты

А вот такой момент...

Зачем вы в регистре ADCSRA указываете, чтоб он работал в режиме непрерывного прерывания, и затем же все равно описываете обработчик прерывания АЦП,,

укажите в регистре ADCSRA чтобы он работал в одиночном режиме ,, и по окончанию уходил на обработчик

И вообще, вы проверяли где-нибудь, в той же АВР сутдио, посмотрите, он у вас на этом цикле и зависнуть должен и преобразовывать себе потихоньку, а в прерывание не уходить, т.к. не указан Бит

Изменено пользователем rekrut683
Ссылка на комментарий
Поделиться на другие сайты

rtfcnf Код листинга программы в файле ADC.txt

Программу тестировал и в AVR studio, и в протеусе, и в контроллер зашивал. Результат один.

При тестировании в АВРе программа всё инициализирует, доходит до бесконечного цикла, и всё. Бесконечный цикл становиться реально бесконечным. Подпрограмма обработки прерывания от АЦП не обрабатываеться :angry: Флаг ADIF остаётся =0. А этот флаг, должен автоматически аппаратно переводиться в 1 по завершению преобразования.

Я ручками в симмуляторе устанавливал ADIF=1 и всё работало как нужно.

Может я непавильно настраиваю ADCSR?

ADC.txt

Ссылка на комментарий
Поделиться на другие сайты

а объясните зачем вы делаете операции с регистрами с памятью, перед ем как вывести в порт,,,

вам что, нужно росто выводить знаение АЦП в порт?

Ссылка на комментарий
Поделиться на другие сайты

rtfcnf Код листинга программы в файле ADC.txt

Программу тестировал и в AVR studio, и в протеусе, и в контроллер зашивал. Результат один.

При тестировании в АВРе программа всё инициализирует, доходит до бесконечного цикла, и всё. Бесконечный цикл становиться реально бесконечным. Подпрограмма обработки прерывания от АЦП не обрабатываеться :angry: Флаг ADIF остаётся =0. А этот флаг, должен автоматически аппаратно переводиться в 1 по завершению преобразования.

Я ручками в симмуляторе устанавливал ADIF=1 и всё работало как нужно.

Может я непавильно настраиваю ADCSR?

Я не знаю что там у Вас протеус симулирует (я вообще его не разу не видел, но как только мне синтексис редактор подкрасил увидел три ошибки. Через часика полтора буду дома там напишу, что у Вас не так.

а объясните зачем вы делаете операции с регистрами с памятью, перед ем как вывести в порт,,,

вам что, нужно росто выводить знаение АЦП в порт?

Человек пишет на перспективу.

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

за материальный, либо моральный ущерб причиненный данным сообщением напрямую или косвенно.

Ссылка на комментарий
Поделиться на другие сайты

вам что, нужно росто выводить знаение АЦП в порт?

Да. Просто нужно оцифровать аналоговый сигнал, занести его в регистр памяти, а затем вывести в порт.

Это учебная программа. Когда я учился в универе, всё получалось, а сейчас ладу не дам. К стати за основу дыла взята лабораторная работа.

Учтите пожалуйста мои поверхностные знания и давайте более развёрнутые пояснения и вопросы.

а объясните зачем вы делаете операции с регистрами с памятью, перед ем как вывести в порт,,,

С какими конкретно регистрами? какие именно операции?

В принципе обработка прерывания правильная. Когда я в ручную перевожу глаг ADIF в 1 рограмма уходит на обработку прерывания от АЦП и значения регистров ADCH и ADCL (результат преобразования) выводиться в порт. Я немогу понять, почему прерывание не срабатывает и программа обработки прерываний не обрабатывается по завершению работы АЦП.

вам что, нужно просто выводить значение АЦП в порт?

Да. Просто нужно оцифровать аналоговый сигнал, занести его в регистр памяти, а затем вывести в порт.

Это учебная программа. Когда я учился в универе, всё получалось, а сейчас ладу не дам. К стати за основу была взята лабораторная работа.

Учтите пожалуйста мои поверхностные знания и давайте более развёрнутые пояснения и вопросы.

а объясните зачем вы делаете операции с регистрами с памятью, перед ем как вывести в порт,,,

С какими конкретно регистрами? какие именно операции?

В принципе обработка прерывания правильная. Когда я в ручную перевожу флаг ADIF в 1 программа уходит на обработку прерывания от АЦП и значения регистров ADCH и ADCL (результат преобразования) выводиться в порт. Я не могу понять, почему прерывание не срабатывает и программа обработки прерываний не обрабатывается по завершению работы АЦП.

Ссылка на комментарий
Поделиться на другие сайты

Попробуйте, поправил в двух местах насчет трех погорячился :D . Высылаю проект из AVR Studio. Если не заработает посмотрю мануал всеже :D

Proba1.rar

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

за материальный, либо моральный ущерб причиненный данным сообщением напрямую или косвенно.

Ссылка на комментарий
Поделиться на другие сайты

rtfcnf К сожалению не заработало:(

С тем, что прерывание не обрабатывается я ошибся. В теле обработки прерывания ввёл мигание порта и он замигал. Значит всё таки не правильно беру результат преобразования АЦП. :(

Ссылка на комментарий
Поделиться на другие сайты

rtfcnf К сожалению не заработало:(

С тем, что прерывание не обрабатывается я ошибся. В теле обработки прерывания ввёл мигание порта и он замигал. Значит всё таки не правильно беру результат преобразования АЦП. :(

В логике программы не Вижу больше проблем, поэтому давайте займемся Вашим железом.

	ldi temp, 0b00100000   	
;					 |__________ ADLAR = 1 -выравнивание результата преобразования в лево
out admux, temp   	; Установка  коммутатора  АЦП  на  0-й канал

У Вас сконфигурирован нулевой канал, с Выравниванием в лево и внешний ИОН.

К ножке AREF у Вас источник питания какой нибудь подключен ?

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

за материальный, либо моральный ущерб причиненный данным сообщением напрямую или косвенно.

Ссылка на комментарий
Поделиться на другие сайты

Всё, разобрался. :D

Спасибо rtfcnf

Проблема оказалась в не правильном выборе источника опорного напряжения. Внешнего ИОН нет. В качестве ИОН взял напряжение питания и программа заработала как положено.

Всем спасибо за помощь.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...