Страница 244 из 399

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Пн дек 29, 2014 17:14:44
Flash.#13
От части решилась проблема, как всегда гугл и программатор в помощь... :cry: На одном с сайтов написанно:
...При переключении на дифференциальный канал первое преобразование будет характеризоваться плохой точностью из-за переходного процесса в схеме автоматической регулировки смещения. Следовательно, первый результат такого преобразования рекомендуется игнорировать.
От себя добавлю, что нужно добавить еще и временную задержку, после первого "неточного" замера, и задержка эта, не менее 20 циклов генератора-делителя АЦП... Жуть...

Получилось где-то вот так:

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

...
ldi R16, 0b01000000	;AD_Converter ADMUX byte, АЦП ножка 0
out ADMUX, R16
sbi ADCSRA,6		;старт "ложного" замера АЦП
rcall delay40mks                  ;задержка, уже была раньше для ЖК, ну и юзаю ту же самую подпрограмму
rcall delay40mks
rcall delay40mks
rcall delay40mks                  ; всего задержек на 20 циклов генератора АЦП
sbi ADCSRA,6		;старт "нормального" замера АЦП
...
ldi R16, 0b01000001	;AD_Converter ADMUX byte,  АЦП ножка 1
out ADMUX, R16
sbi ADCSRA,6		;старт "ложного" замера АЦП
rcall delay40mks
rcall delay40mks
rcall delay40mks
rcall delay40mks
sbi ADCSRA,6		;старт "нормального" замера АЦП
...
У меня АЦП работает на 125кГц, получается 8мкс, и пока не пройдет примерно 20 тактов генератора, около 160мкс, корректные данные не замерятся. Может что то допаять на входе АЦП(ATMega8), и будет лучше?

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вт дек 30, 2014 20:13:24
*скрыто*
Так ты же не используешь дифференциальный вход по этому должен быть пофигу этот переходной процесс, которого нет.
У меня все работает без задержек, так же переключаю 2 входа и забираю результат после сброса флага ADIF
может у тебя другая подпрограмма в прерывании портит регистры, в которые забираешь результат ?

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вт дек 30, 2014 23:24:08
Flash.#13
Может и не использую, но он не пофигу... Процесс идет вот так:
Старт:

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

.org 0				;начало кода
rjmp start
.org 9 				;вектор прер. timer0
rjmp timer			;подпрограмма таймера 4Гц
.org 14				;вектор прер. АЦП
rjmp adc_complete	;подпрограмма АЦП (срабатывает редко)
затем инициализация АЦП:

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

ldi R16, 0b01000000	;AD_Converter ADMUX byte
out ADMUX, R16
ldi R16, 0b10001011	;AD_Converter ADCSRA byte, 125kHz
out ADCSRA, R16			
sei 				;вкл. прерывания в ЦП
Срабатывает условие старта замера в главной программе

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

sbi ADCSRA,6		;старт замера АЦП
При этом прога идет по прерыванию АЦП adc_complete

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

;====АЦП замер сделан====
adc_complete:
in R9, ADCL	
in R8, ADCH
reti
Если не переключаю порт АЦП при замерах, то мерить можно без задержек. Четко и гладко. Но если идет переключение входа АЦП в коде, то первый замер будет со сбоем даже через 1.5 секунды :shock: Единственное чего нашел, это сделать пустой первый замер, и задержку в 20 тактов генератора АЦП. Тогда все нормально. Может у меня контроллер паленый или паяльником его перегрел, но с задержкой все нормально. Правда еще не проверяд переключение на 3-4 ножки))
*скрыто* писал(а):...забираю результат после сброса флага ADIF...
Не опрашиваю флаги, использую вектор прерывания, АЦП сам вызывает подпрограмму и возвращается в точку кода.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Ср дек 31, 2014 23:45:40
*скрыто*
Судя по даташиту, внутрений мультиплексор переключается не после обновления admux, а спустя 1 такт после установки бита ADSC . По этому нет никаких причин делать задержки.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Чт янв 01, 2015 14:57:07
Pink-Pank
Да, в даташите описано, что смена канала происходит непосредственно при старте преобразования. Это сделано для того, чтобы можно было менять каналы не дожидаясь конца преобразования. Единственный случай, когда требуется задержка - включение запитка Ацп от внутреннего ИОН. И то, только перед первым запуском и если данный ИОН не был включен ранее другой периферией (схемой BOD, например).
А так смотрите, может где-то у Вас большая емкость по входу повисла, либо подаете измеряемый сигнал через большое сопротивление.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вс янв 04, 2015 17:10:44
neoneon
Напишем маленькую подпрограмму для задержки:

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

DELAY:
ldi delay1,0x80      ; записываем нужное число в переменные, младший разряд
ldi delay2,0x1A      ; старший разряд

subi delay1,1         ; создаем цикл уменьшения этого числа на 1
sbci delay2,0         ; вычитаем 1 из старшего разряда, если был перенос
brcc DELAY            ; переход, если не было переноса
ret
То есть записываем число в два регистра, оно в течении цикла инкрементируется. Это понятно. Но как так получается, что эту подпрограмму можно вызывать много раз и она будет работать? То есть команда subi записывает результат обратно в регистр, после первого вызова переменные delay1 и delay2 будут обнулены, верно?

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вс янв 04, 2015 17:17:05
akl
neoneon писал(а):Напишем маленькую подпрограмму для задержки:
То есть записываем число в два регистра, оно в течении цикла инкрементируется. Это понятно. Но как так получается, что эту подпрограмму можно вызывать много раз и она будет работать? То есть команда subi записывает результат обратно в регистр, после первого вызова переменные delay1 и delay2 будут обнулены, верно?
Не думаю, что программа будет корректно работать. Обычно делают так

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

DELAY:
ldi delay1,0x80      ; записываем нужное число в переменные, младший разряд
ldi delay2,0x1A      ; старший разряд
LOOP:
subi delay1,1         ; создаем цикл уменьшения этого числа на 1
sbci delay2,0         ; вычитаем 1 из старшего разряда, если был перенос
brcc LOOP            ; переход, если не было переноса
;brcc DELAY            ; переход, если не было переноса
ret

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вс янв 04, 2015 18:09:05
neoneon
Хорошее замечание :) Но суть не меняется - вызываем Loop, а после первого вызова переменные delay уже обнулены :?

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вс янв 04, 2015 18:31:47
akl
Да обнулены. В этом и суть программной задержки. При следующем входе в пп DELAY эти переменные сначала будут установлены, а затем LOOP опять обнулены. Можно ведь делать переменную задержку. Установить сначала переменные, а затем войти в пп LOOP.
Например

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

   LDI XH,HIGH(5555)
   LDI XL,LOW(5555)
   RCALL LOOP
.
.
.
LOOP:
   SBIW XH:XL,1
   BRNE LOOP
   RET

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вс янв 04, 2015 18:32:20
Pink-Pank
Обнулены они были бы в том случае, если бы условие проверки было brne, а у Вас получится, что разряды будут равны 0xFF

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Пн янв 05, 2015 06:23:45
akl
Да, верно. Условие brcc будет выполняться до 0xFFFF.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Пн янв 05, 2015 19:24:13
neoneon
Спасибо, разобрался :) Только не понял про brcc и 0xFF. Если поставить brсс, то когда subi сделает операцию (0-1), получит -1 (то есть FF), команда sbci выполнит операцию (0-1), тоже получит -1 (FF), установится флаг переноса С=1, то программа не перейдет по метке и выйдет из цикла. Если поставить brne, то когда в delay2 установится 00, т.е. сбросится полностью (а в delay1 еще будет FF), установится флаг нулевого результата Z=1, программа выйдет из цикла. Так? :?

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Пн янв 05, 2015 19:53:49
Pink-Pank
Совершенно верно. При использовании brne будет необходимо проверять отдельно старшую часть и потом отдельно младшую. Иначе программа будет меньше циклов выполняться, чем надо. Обычно делают вложенным циклом проверки младшей части в цикл проверки старшей части.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вт янв 06, 2015 07:46:14
akl
neoneon писал(а):Если поставить brne, то когда в delay2 установится 0x00, т.е. сбросится полностью (а в delay1 еще будет FF), установится флаг нулевого результата Z=1, программа выйдет из цикла. Так?
Оказывается не так! После обнуления delay2 0x00, когда delay1 0xFF флаг Z не устанавливается. Проверял в студии кодом ниже. В железе поведение аналогично; длительность интервала 1, формируемого brcc составила 3006 мкс,а длительность интервала 0, формируемого brne 3004 мкс.
Спойлер

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

	.INCLUDE "tn2313def.inc"
	.equ	Fo=1000000
	.def	delay1=R16	; младший регистр
	.def	delay2=R17	; старший регистр
	.CSEG
	.ORG	$00
START:
	LDI	R16,LOW(RAMEND)
	OUT	SPL,R16
	SBI	DDRD,2	;
TEST_BRNE:
	LDI	delay1,$EE
	LDI	delay2,$02
LOOP_BRNE:
	SUBI	delay1,1
	SBCI	delay2,0
	BRNE	LOOP_BRNE
	SBI	PORTD,2
TEST_BRCC:
	LDI	delay1,$EE
	LDI	delay2,$02
LOOP_BRCC:
	SUBI	delay1,1
	SBCI	delay2,0
	BRCC	LOOP_BRCC
	CBI	PORTD,2
	RJMP	TEST_BRNE
СпойлерИзображение
СпойлерИзображение
SBCI_BRNE.GIF

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вт янв 06, 2015 10:16:48
Pink-Pank
:shock: это как? Пойду проверять!
---------
Проверил. Действительно так. Век живи - век учись.. :)

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вт янв 06, 2015 15:58:30
neoneon
akl писал(а): Оказывается не так!
Судя по логическому выражению, флаг Z установится, когда в предыдущих (максимум 8 ) операциях в результате будет 0. Не подскажете, где эту картинку взяли? :)
Разница в 2мкс - это из-за того, что brcc доходит до -1, а brne до 0, верно?

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вт янв 06, 2015 16:21:24
Pink-Pank
Там имеются в виду не операции, а биты. Всего 8 бит. Когда они все (биты) результата равны нулю и если флаг Z от предыдущей операции равен 1 (результат был равен 0), то Z установится в 1. Иначе 0.
2 мкс - да, поэтому.
Взята картинка из документа "Instruction set" для AVR. Поищите через гугл.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вт янв 06, 2015 16:56:52
neoneon
Akl, Pink-Pank выражаю благодарность за терпение и помощь, разобрался :)

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вт янв 06, 2015 17:10:54
Kill17
День добрый!

Столкнулся с проблемой. Есть слово(2байта), нужно побитно сдвинуть его влево-вправо на 2 бита.
С байтам проблем нету, а тут тупик какой-то.
Камень - atmega32
Asm - Avrstudio4

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вт янв 06, 2015 18:06:47
zero648
Kill17 писал(а):Столкнулся с проблемой. Есть слово(2байта), нужно побитно сдвинуть его влево-вправо на 2 бита.
Asm - Avrstudio4
Сдвиг слова r17:r16 вправо на два бита:

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

            clc
            ror     r17
            ror     r16
            clc
            ror     r17
            ror     r16
Сдвиг слова r17:r16 влево на два бита:

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

            clc
            rol     r16
            rol     r17
            clc
            rol     r16
            rol     r17