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

Обсуждаем контроллеры компании Atmel.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

А так
Спойлер

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

.ESEG
CalibrE:
.DB 0b00000011, 0b01100100
.DB 0b00000011, 0b01111100
E_END:

.DSEG
CLR ZH
CLR YH
   LDI   ZL,LOW(CalibrE)
   LDI   YL,LOW(CalibrE+$40)
OUT   EECR,ZH
_E:
   RCALL   EEREAD
   ST   Y+,temp1
   INC   ZL
   CPI   ZL,LOW(E_END)
   BRNE   _E

RJMP  PC+0

EERead:   
;SBIC    EECR,EEPE   
;RJMP   EERead
OUT    EEARL, temp
SBI    EECR,EERE
IN    temp1, EEDR
ret

;.ESEG
;CalibrE:
;.DB 0b00000011, 0b01100100
;.DB 0b00000011, 0b01111100
SatinS
Открыл глаза
Сообщения: 53
Зарегистрирован: Пн ноя 09, 2009 20:14:52

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

Сообщение SatinS »

А так пишет "error: Code in DSEG", а если поставить после него .cseg не пашет :?
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Ну да, конечно .CSEG

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

CLR ZH
CLR YH
   LDI   ZL,LOW(CalibrE)
   LDI   YL,LOW(CalibrE+$60)   ; нужно установить адрес в области RAM
OUT   EECR,ZH
_E:
   RCALL   EEREAD
   ST   Y+,r18
   INC   ZL
   CPI   ZL,LOW(E_END)
   BRNE   _E

RJMP  PC+0

EERead:   
;SBIC    EECR,EEPE   
;RJMP   EERead
OUT    EEARL, ZL   ; откуда здесь temp Нужно поставить адрес ячейки.
SBI    EECR,EERE
IN    R18, EEDR
ret

SatinS
Открыл глаза
Сообщения: 53
Зарегистрирован: Пн ноя 09, 2009 20:14:52

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

Сообщение SatinS »

akl работает! :shock: спасибо!
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15550
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

счетчик байт массива
буфер обмена
начальный адрес источника (регистр адреса еепром)
начальный адрес массива (указатель z/x/y -на выбор)
--------
читаем еепромку в буфер
пишем в озу из буфера
адрес источника = адрес источника +1 (или -1)
адрес массива = адрес массива +1 (или -1)
счетчик = счетчик-1
ежли счетчик не равен 0 продолжим сызнова
---------
ну иль чего из вариаций... :dont_know:

указатели весьма в дефиците - использовать два сразу для простого примитива - как-то ЖАБО ЗЭЛЭНЭ
8)
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Удалил.
Последний раз редактировалось akl Чт ноя 13, 2014 09:11:45, всего редактировалось 1 раз.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15550
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

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

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

Сообщение akl »

Виноват. :facepalm: Чёт зашкалило.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15550
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Ээххх... :roll:
Ежли б народ чууток больше внимания общим алгоритмам уделял, без привязки к конкретному ядру и системе команд - такой алгоритм можно было б под любое семейство МК прикошачить! 8)
А уж далее - "полировка" под конкретную систему команд и ресурсы конкретного МК. :write:
Аватара пользователя
xkp
Опытный кот
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров
Контактная информация:

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

Сообщение xkp »

Дорогие котобратья и котосестры, подскажите пожалуйста как лучше выполнить поставленную задачу?
Микроконтроллер Atmega8, в устройсте есть графический LCD индикатор 128*64 и шина i2c, все висит на вышеупомянутом МК, так же есть несколько цифровых входов. Есть еще другой сигнал, точнее импульсы, которые нужно измерить с минимальной потерей времени. Измерить нужно время между импульсами, но не в коем случае не количество импульсов в секунду(например), так как этот способ вызовет задержку в эту самую секунду, для устройства это критично. В программе для этого инициализировано прерывание INT0 по нарастанию сигнала. Частота импульсов может варироваться от 1 до 350 Гц. Думаю создать какой-нито счетчик, а в прерывании INT0 смотреть показания счетчика и обнулять его.
Вопросы:
Как организовать счетчик для такой задачи что бы точность измерений составляла 1 Гц (особенно важно на бОльших частотах)? И вообще возможно ли это? Если да то как и сколько байт памяти будет занимать максимально возможный результат? Думаю 3 байта...
Не скажется ли это на работе всего устройства? В частности не будет ли сбиваться LCD индикатор и шина i2c?
Может есть другие пути решения такого рода проблем?
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

нижний предел в 1Гц - от задержки измерения в 1 сек в худшем случае НИКУДА не уйти.
Подключай свой сигнал на вывод INT0 или INT1 настраивай прерывание на работу по фронту.
Первый фронт - запускаешь таймер, на второй - считываешь значение. Если во время между прерываниями ловишь переполнение таймера - частота ниже нижнего предела измерения, надо сбросить режим измерения на начало и ждать следующего прерывания чтобы стартовать таймер. Таймер делителями настроить так чтобы переполнялся больше чем за 1 сек - иначе на предел в 1гц не обеспечить. И по всей видимости это должен быть 16-битный таймер.
Потом тебе надо будет реализовать функцию 1/X и т.д. использовать немного арифметики чтобы согласовать скорость счета таймера с милисекундами и после деления получить герцы.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25154
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Сообщение КРАМ »

xkp писал(а):Измерить нужно время между импульсами, но не в коем случае не количество импульсов в секунду(например), так как этот способ вызовет задержку в эту самую секунду, для устройства это критично. В программе для этого инициализировано прерывание INT0 по нарастанию сигнала. Частота импульсов может варироваться от 1 до 350 Гц. Думаю создать какой-нито счетчик, а в прерывании INT0 смотреть показания счетчика и обнулять его.

Для этой цели есть модуль Capture в МК.
Этот модуль по входному событию на пине (входе модуля) производит АППАРАТНУЮ запись (захват) значения некоего таймера, который работает с этим модулем.
Одновременно происходит прерывание от этого модуля, где и считывается из буфера Capture то значение счетчика которое было захвачено.
Делается так же буфер на два значения измерений, где из текущего захвата вычитается предыдущее значение.
Для обеспечения заданной точности по любому потребуется усреднять (фильтровать) измерения, поэтому нужен так же кольцевой буфер на несколько измерений, которые каждый цикл захвата усредняются.
Задержка НЕИЗБЕЖНА. Это ФИЗИКА и МАТЕМАТИКА. Это ПРИРОДА...
:)
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15550
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Прицепи внешний МК для предварительной обработки данных. Дальнейший обмен с базовым по варианту аппаратного или программного I2C/SPI.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25154
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Сообщение КРАМ »

BOB51 писал(а):Прицепи внешний МК

:facepalm: Зачем?
Вывод на символьный дисплей - столь медленный процесс, что его СПОКОЙНО можно сделать фоновым и не мешающим основному, либо вообще оставить в суперлупе...
Аватара пользователя
xkp
Опытный кот
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров
Контактная информация:

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

Сообщение xkp »

Alexeyslav, измерять нужно не частоту а время между импульсами. Сигнал уже висит на INT0. С переполнением можно проще разобраться: там где опрос счетчика значение $FF принимать как 0.

КРАМ, а можно поподробнее? С усреднением проблем нет. У меня для этого есть отдельная подпрограмма: беру предыдущее значение и умножаю на 9, прибавляю сюда текущее значение и делю на 10, так же учитывается и остаток, который пстепенно копится и тоже попадает под усреднение. Раньше остаток я игнорировал - были потери, потом доработал подпрограмму усреднения и потери исчезли.

BOB51, Внешний МК? тоже вариант, повесить tiny13, например. Такой вариант я тоже рассматриваю. Но сначала надо мне научится считать время между импульсами, а уже потом думать в какой МК влезет программа.

КРАМ, дисплей не символьный а графический.

Да еще в устройстве помимо того что уже есть скорее всего будет индикация на семисегментных светодиодных индикаторах, по нехватке выводов скорее всего схема будет статическо-динамической. Помимо индикации в программе еще будет куча расчетов и запись/чтение EEprom (энергонезависиой памяти). Так что время то может и не хватить на все задумки... Может и придется вешать внешний МК. Но это решим потом. Хотелось бы значало все таки посчитать это время на макетке...
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15550
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Как метод замера интервала...
Возможен вариант маркер-окошек - замер равными кусочками и фильтрация по вектору из полученного количества измеренных кусочков (если нужна быстрота и не слишком высокая точность измерений).
Т.е. получил активный сигнал на линии и запустил таймерок... отсчитал "кусманчик" проверил линию - если сигнал сохранился прибавил в указателе единичку и считаю снова. как сигнал не обнаружился - прекратил счет и прыгнул по вектору из указателя. Замер с точностью половинки длительности "кусочка". (я таким манером сортировал листики в счетчике копий на копире А3/А4/A4R все что не попало в заданный диапазон =брак) :dont_know:
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

xkp писал(а):сначала надо мне научится считать время между импульсами, а уже потом думать в какой МК влезет программа.
... Может и придется вешать внешний МК. Но это решим потом. Хотелось бы значало все таки посчитать это время на макетке...
По мне, решается одним таймером Т1, у которого разрешены прерывания CAPT_T1 и OVER_T1.
Выражение для определения периода Tx=nox/Fo/N, где nox-число тактов частоты Fo за время измерения периода (N=1), N-целое число измеряемых периодов. Чтобы получить удобочитаемые значения лучше ввести в выражение множитель. При множителе 1'000'000, например, результат будет в микросекундах. По такому принципу работает схема отсюда.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25154
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Сообщение КРАМ »

xkp писал(а):КРАМ, а можно поподробнее?

Можно.
Открываете даташит на Мегу 8:
Изображение
И обнаруживаете искомое.

xkp писал(а):КРАМ, дисплей не символьный а графический.

Это не важно. Полный цикл регенерации такого дисплея при статических изображениях типа вывода числовых величин достаточно проводить с частотой не выше 2...4 Гц.

ЗЫ. То что Вы предлагаете в качестве фильтра называется БИХ. БИХ при неправильном расчете может возбуждаться. КИХ на основе кольцевого буфера ест чуть больше памяти, но всегда абсолютно устойчив.
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

измерять нужно не частоту а время между импульсами.

Вопрос на засыпку: какой интервал между импульсами у частоты 1Гц?
Если измерять время между фронтами то можно налажать - не всегда имеется на входе чистый меандр.
Аватара пользователя
xkp
Опытный кот
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров
Контактная информация:

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

Сообщение xkp »

форма сигнала - прямоугольник (либо 0, либо 1), ни каких меандров, ну сейчас опять начнете собирать что время нарастания и затухания сигнала и т.п., это не критично. И ваш вопрос про интервал на частоте 1 Гц немного не корректен. Оно и ежу... эм, коту понятно что на 1 Гц время составит 1 сек. А вот на 300 Гц время измерения в 1 секунду это очень много, поэтому и написано что измерять нужно время между импульсами
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Ответить

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