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

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Нифига себе :shock: :)))
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Ух ты, надо попробовать...
Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Блин, РАБОТАЕТ! Это же еще проще...
Мучитель микросхем
Аватара пользователя
Сообщения: 492
Зарегистрирован: Вс янв 11, 2009 09:29:08
Откуда: Ярославль

Сообщение nictrace »

такой вопросик: вот посмортел я AVR200 функции умножения-деления, а в мегах аппаратное умножение... Как в них делить? Так же, или есть способ через умножитель?
Мои верные друзья - АМD и AVR
LM317 - атцтой, LM2576ADJ - форева! :)
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Есть способ, где используется аппаратное умножение. Наталкивался на него, кажется, в книге Ревича ("Практическое программирование МК на ассемблере"), но внимания не заострял. Попробуйте найти её и раздел там - "Арифметические операции"
Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Господа, еще возникли вопросы (всё та же мега48).
Можно ли инициировать прерывание по входу PCINT5? Желательно вообще, по изменению его состояния.
В даташите что-то сказано про регистр PCMSK0, там вроде включаются. Но в векторах, разумеется, этих перываний нет. Или я что-то не так понял?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Бит 0 (PCIE0) регистра PCICR вкл/выкл прерывания PCINT0...7, биты PCMSK0 устанавливают маску. Вектор, общий для всех прерываний PCINT0...7 находится по адресу 0x003 - PCINT0. Прерывание возникает при изменении лог. уровня (не настраивается на фронт или уровень как INT0, INT1).
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Ясно, спасибо. Это то, что нужно.
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Вот еще момент, вызывающий сомнение:
Один вывод настроен на ВХОД, и имеет подтяжку снаружи к питанию. При инициализации режима мне нужно настроить его на ВЫХОД, включив высокий уровень.
Если сделать как обычно: DDR->1, затем PORT->1, не проскочит ли между этими командами "0" на порту, тем самым сформировав короткий импульс на выходе? Это было бы убийством...

Или правильней сделать PORT->1 (включится внутренняя подтяжка, не помешает), затем DDR->1?

Короче нужно из Z-состояния перевести в "1", ни в коем случае не придавив к земле.
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

ploop писал(а):Или правильней сделать PORT->1 (включится внутренняя подтяжка, не помешает), затем DDR->1?
Да, думаю так. Не 1-wire случайно? :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Нет, это RESET к другому контроллеру. В свете некоторых замечаний в даташите (где обычно они косяки пишут) было, правда не помню для какого именно МК, что короткий импульс на RESET способен залочить камень. Очень не хотелось бы...
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

ploop писал(а):Нет, это RESET к другому контроллеру. В свете некоторых замечаний в даташите (где обычно они косяки пишут) было, правда не помню для какого именно МК, что короткий импульс на RESET способен залочить камень. Очень не хотелось бы...
Дык, если вам только сброс организовать, оставье порт на вход. А для ресета просто меняйте направление на выход (в порту пусть остаётся ноль). :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Мля, точно... чё мудрить то...


ЗЫ: передохнуть надо :)
Мучитель микросхем
Аватара пользователя
Сообщения: 492
Зарегистрирован: Вс янв 11, 2009 09:29:08
Откуда: Ярославль

Сообщение nictrace »

попробовал сделать деление на Си, потом поглядел дизассемблером. Не, никак умножитель не прикрутить, winavr вставляет здоровенную процедуру...
Мои верные друзья - АМD и AVR
LM317 - атцтой, LM2576ADJ - форева! :)
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Нашел ща ту книгу, про которую говорил.
Да, там есть пример использования аппаратного умножения для умножения многоразрядных чисел. А про деление - только хитрости, типа подгонки делителя под степень двойки (дальше деление делается обычным сдвигом). В принципе, подумав логически, и написав код не универсальный (как делает компилятор Си), а для конкретной ситуации, сама процедура очень сильно упрощается и оптимизируется по времени.
Мучитель микросхем
Аватара пользователя
Сообщения: 492
Зарегистрирован: Вс янв 11, 2009 09:29:08
Откуда: Ярославль

Сообщение nictrace »

это да, если делитель - константа. А если переменная... тогда - швах :(
Мои верные друзья - АМD и AVR
LM317 - атцтой, LM2576ADJ - форева! :)
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Ну к примеру - посчитать среднее арифметическое нескольких измерений. Пусть десяти. И да, приплывём. Но если мы измерение проведём не 10, а 8 раз или 16 раз - в итоге выиграем (т.к. на эти числа будем делить). А суть-то не изменится, либо чуть больше, либо чуть меньше точность получим, но даже с большей точностью сэкономим кучу тактов и программного кода.

И таких примеров много можно придумать.
Мучитель микросхем
Аватара пользователя
Сообщения: 492
Зарегистрирован: Вс янв 11, 2009 09:29:08
Откуда: Ярославль

Сообщение nictrace »

еще можно в BCD перевести - тогда делить на 10 просто :)
Мои верные друзья - АМD и AVR
LM317 - атцтой, LM2576ADJ - форева! :)
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 458
Зарегистрирован: Пн дек 13, 2010 13:01:59
Откуда: Украина

Сообщение DJ_Kiridza »

Привета.
Подскажите пож-ста, как правильно описывать/оформлять на асме таблицу прерываний (для атмеги16)?
Если можно - простенький примерчик и буквально 2 слова описания к нему, или ткните носом в и-нете...
Мне то нужно всего-ничего, прерывание от таймера да от юсарта, но как оно правильно описывается на асме - чет в инете только таблици-списки всех возможных прерываний или я плохо ищу...
пасиб.
мысли мысли штош вы вйотесь
над мойейу головойу
вы там мосга нинайдете
нед там мосга! йа тупойе (БОР)
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

А с даташита скопировать не судьба?
Ответить

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