Страница 1 из 1

Atmega 128 АЦП

Добавлено: Ср сен 19, 2012 13:13:23
gibiri
Хочу выдавать на порт А мк числа от 0 до ~255 С помощью АЦП.
Но почему то когда CH1 доходит до 12%, изменения перестают происходить.

Изображение




Код: Выделить всё

.include "m128def.inc"

	LDI R16,0xFF
	OUT DDRA,R16

	LDI R16,(1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)

	OUT ADCSRA,R16


	LDI R16,(1<<ADLAR) | (0<<REFS0)

	OUT ADMUX,R16

LOOP:
	IN R16,ADCH	

	OUT PORTA, R16
	

	RJMP LOOP
Заранее спасибо

Re: Atmega 128 АЦП

Добавлено: Ср сен 19, 2012 13:45:30
Engineer_Keen
1) Аналоговую часть МК нужно питать через AVCC
2) Просто так подряд читать ADCH бесполезно, преобразование длится минимум 13 тактов с учетом прескалера, так что либо по прерыванию, либо в цикле по ожиданию "1" в бите ADIF регистра ADCSRA
3) Free Running Mode не работает корректно - глюк протеуса. Костыль - после чтения ADCH нужно воткнуть SBI ADCRSA,ADSC.

Re: Atmega 128 АЦП

Добавлено: Ср сен 19, 2012 14:11:00
gibiri
Так я правельно понял:
1)подать +5 в на AVCC.
2) в цикли сделать паузу в работе ацп
3)все ровно нормально работать не будет
P.S. как сделать "Костыль - после чтения ADCH нужно воткнуть SBI"

Re: Atmega 128 АЦП

Добавлено: Ср сен 19, 2012 14:24:30
Engineer_Keen
1) да
2) паузу в работе АЦП сделать нельзя (разве что прескалер сбросить) и не нужно, нужно подождать окончания преобразования:

Код: Выделить всё

...
LOOP: SBIS ADCSRA,ADIF
RJMP LOOP
IN R16,ADCH
...
3) как сделать я написал букву в букву:

Код: Выделить всё

...
IN R16,ADCH
SBI ADCSRA,ADSC
...

Re: Atmega 128 АЦП

Добавлено: Ср сен 19, 2012 16:29:09
gibiri
Теперь работает, спасибо.