Страница 244 из 399
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн дек 29, 2014 17:14:44
Flash.#13
От части решилась проблема, как всегда гугл и программатор в помощь...
На одном с сайтов написанно:
...При переключении на дифференциальный канал первое преобразование будет характеризоваться плохой точностью из-за переходного процесса в схеме автоматической регулировки смещения. Следовательно, первый результат такого преобразования рекомендуется игнорировать.
От себя добавлю, что нужно добавить еще и временную задержку, после первого "неточного" замера, и задержка эта, не менее 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 ;вкл. прерывания в ЦП
Срабатывает условие старта замера в главной программе
При этом прога идет по прерыванию АЦП
adc_complete
Код: Выделить всё
;====АЦП замер сделан====
adc_complete:
in R9, ADCL
in R8, ADCH
reti
Если не переключаю порт АЦП при замерах, то мерить можно без задержек. Четко и гладко. Но если идет переключение входа АЦП в коде, то первый замер будет со сбоем даже через 1.5 секунды

Единственное чего нашел, это сделать пустой первый замер, и задержку в 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

это как? Пойду проверять!
---------
Проверил. Действительно так. Век живи - век учись..

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 вправо на два бита:
Сдвиг слова r17:r16 влево на два бита: