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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Flash.#13
Держит паяльник хвостом
Сообщения: 965
Зарегистрирован: Сб апр 12, 2014 23:46:03
Откуда: Киев

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

Сообщение 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), и будет лучше?
Немного файлов по зажиганию: ФУОЗ 2.2 + программа правки таблиц 0.987, монтажка
Аватара пользователя
*скрыто*
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Пн дек 31, 2012 13:16:59

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

Сообщение *скрыто* »

Так ты же не используешь дифференциальный вход по этому должен быть пофигу этот переходной процесс, которого нет.
У меня все работает без задержек, так же переключаю 2 входа и забираю результат после сброса флага ADIF
может у тебя другая подпрограмма в прерывании портит регистры, в которые забираешь результат ?
Аватара пользователя
Flash.#13
Держит паяльник хвостом
Сообщения: 965
Зарегистрирован: Сб апр 12, 2014 23:46:03
Откуда: Киев

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

Сообщение 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...

Не опрашиваю флаги, использую вектор прерывания, АЦП сам вызывает подпрограмму и возвращается в точку кода.
Немного файлов по зажиганию: ФУОЗ 2.2 + программа правки таблиц 0.987, монтажка
Аватара пользователя
*скрыто*
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Пн дек 31, 2012 13:16:59

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

Сообщение *скрыто* »

Судя по даташиту, внутрений мультиплексор переключается не после обновления admux, а спустя 1 такт после установки бита ADSC . По этому нет никаких причин делать задержки.
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

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

Сообщение Pink-Pank »

Да, в даташите описано, что смена канала происходит непосредственно при старте преобразования. Это сделано для того, чтобы можно было менять каналы не дожидаясь конца преобразования. Единственный случай, когда требуется задержка - включение запитка Ацп от внутреннего ИОН. И то, только перед первым запуском и если данный ИОН не был включен ранее другой периферией (схемой BOD, например).
А так смотрите, может где-то у Вас большая емкость по входу повисла, либо подаете измеряемый сигнал через большое сопротивление.
Fucking static initialization order fiasco
Аватара пользователя
neoneon
Встал на лапы
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

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

Сообщение neoneon »

Напишем маленькую подпрограмму для задержки:

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

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

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

То есть записываем число в два регистра, оно в течении цикла инкрементируется. Это понятно. Но как так получается, что эту подпрограмму можно вызывать много раз и она будет работать? То есть команда subi записывает результат обратно в регистр, после первого вызова переменные delay1 и delay2 будут обнулены, верно?
Полный чайник.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение 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
Аватара пользователя
neoneon
Встал на лапы
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

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

Сообщение neoneon »

Хорошее замечание :) Но суть не меняется - вызываем Loop, а после первого вызова переменные delay уже обнулены :?
Полный чайник.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

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

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

   LDI XH,HIGH(5555)
   LDI XL,LOW(5555)
   RCALL LOOP
.
.
.
LOOP:
   SBIW XH:XL,1
   BRNE LOOP
   RET
Последний раз редактировалось akl Вс янв 04, 2015 18:39:00, всего редактировалось 1 раз.
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

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

Сообщение Pink-Pank »

Обнулены они были бы в том случае, если бы условие проверки было brne, а у Вас получится, что разряды будут равны 0xFF
Fucking static initialization order fiasco
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Да, верно. Условие brcc будет выполняться до 0xFFFF.
Аватара пользователя
neoneon
Встал на лапы
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

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

Сообщение neoneon »

Спасибо, разобрался :) Только не понял про brcc и 0xFF. Если поставить brсс, то когда subi сделает операцию (0-1), получит -1 (то есть FF), команда sbci выполнит операцию (0-1), тоже получит -1 (FF), установится флаг переноса С=1, то программа не перейдет по метке и выйдет из цикла. Если поставить brne, то когда в delay2 установится 00, т.е. сбросится полностью (а в delay1 еще будет FF), установится флаг нулевого результата Z=1, программа выйдет из цикла. Так? :?
Полный чайник.
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

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

Сообщение Pink-Pank »

Совершенно верно. При использовании brne будет необходимо проверять отдельно старшую часть и потом отдельно младшую. Иначе программа будет меньше циклов выполняться, чем надо. Обычно делают вложенным циклом проверки младшей части в цикл проверки старшей части.
Fucking static initialization order fiasco
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение 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
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

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

Сообщение Pink-Pank »

:shock: это как? Пойду проверять!
---------
Проверил. Действительно так. Век живи - век учись.. :)
Fucking static initialization order fiasco
Аватара пользователя
neoneon
Встал на лапы
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

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

Сообщение neoneon »

akl писал(а): Оказывается не так!

Судя по логическому выражению, флаг Z установится, когда в предыдущих (максимум 8 ) операциях в результате будет 0. Не подскажете, где эту картинку взяли? :)
Разница в 2мкс - это из-за того, что brcc доходит до -1, а brne до 0, верно?
Полный чайник.
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

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

Сообщение Pink-Pank »

Там имеются в виду не операции, а биты. Всего 8 бит. Когда они все (биты) результата равны нулю и если флаг Z от предыдущей операции равен 1 (результат был равен 0), то Z установится в 1. Иначе 0.
2 мкс - да, поэтому.
Взята картинка из документа "Instruction set" для AVR. Поищите через гугл.
Fucking static initialization order fiasco
Аватара пользователя
neoneon
Встал на лапы
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

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

Сообщение neoneon »

Akl, Pink-Pank выражаю благодарность за терпение и помощь, разобрался :)
Полный чайник.
Аватара пользователя
Kill17
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс май 30, 2010 20:27:33
Откуда: Санкт-Петербург
Контактная информация:

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

Сообщение Kill17 »

День добрый!

Столкнулся с проблемой. Есть слово(2байта), нужно побитно сдвинуть его влево-вправо на 2 бита.
С байтам проблем нету, а тут тупик какой-то.
Камень - atmega32
Asm - Avrstudio4
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение 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
Ответить

Вернуться в «AVR»