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

[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Реклама
такой вопросик: вот посмортел я AVR200 функции умножения-деления, а в мегах аппаратное умножение... Как в них делить? Так же, или есть способ через умножитель?
Мои верные друзья - АМD и AVR
LM317 - атцтой, LM2576ADJ - форева!
LM317 - атцтой, LM2576ADJ - форева!
Есть способ, где используется аппаратное умножение. Наталкивался на него, кажется, в книге Ревича ("Практическое программирование МК на ассемблере"), но внимания не заострял. Попробуйте найти её и раздел там - "Арифметические операции"
- Реклама
Господа, еще возникли вопросы (всё та же мега48).
Можно ли инициировать прерывание по входу PCINT5? Желательно вообще, по изменению его состояния.
В даташите что-то сказано про регистр PCMSK0, там вроде включаются. Но в векторах, разумеется, этих перываний нет. Или я что-то не так понял?
Можно ли инициировать прерывание по входу PCINT5? Желательно вообще, по изменению его состояния.
В даташите что-то сказано про регистр PCMSK0, там вроде включаются. Но в векторах, разумеется, этих перываний нет. Или я что-то не так понял?
Бит 0 (PCIE0) регистра PCICR вкл/выкл прерывания PCINT0...7, биты PCMSK0 устанавливают маску. Вектор, общий для всех прерываний PCINT0...7 находится по адресу 0x003 - PCINT0. Прерывание возникает при изменении лог. уровня (не настраивается на фронт или уровень как INT0, INT1).
Вот еще момент, вызывающий сомнение:
Один вывод настроен на ВХОД, и имеет подтяжку снаружи к питанию. При инициализации режима мне нужно настроить его на ВЫХОД, включив высокий уровень.
Если сделать как обычно: DDR->1, затем PORT->1, не проскочит ли между этими командами "0" на порту, тем самым сформировав короткий импульс на выходе? Это было бы убийством...
Или правильней сделать PORT->1 (включится внутренняя подтяжка, не помешает), затем DDR->1?
Короче нужно из Z-состояния перевести в "1", ни в коем случае не придавив к земле.
Один вывод настроен на ВХОД, и имеет подтяжку снаружи к питанию. При инициализации режима мне нужно настроить его на ВЫХОД, включив высокий уровень.
Если сделать как обычно: DDR->1, затем PORT->1, не проскочит ли между этими командами "0" на порту, тем самым сформировав короткий импульс на выходе? Это было бы убийством...
Или правильней сделать PORT->1 (включится внутренняя подтяжка, не помешает), затем DDR->1?
Короче нужно из Z-состояния перевести в "1", ни в коем случае не придавив к земле.
Да, думаю так. Не 1-wire случайно?ploop писал(а):Или правильней сделать PORT->1 (включится внутренняя подтяжка, не помешает), затем DDR->1?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Нет, это RESET к другому контроллеру. В свете некоторых замечаний в даташите (где обычно они косяки пишут) было, правда не помню для какого именно МК, что короткий импульс на RESET способен залочить камень. Очень не хотелось бы...
Дык, если вам только сброс организовать, оставье порт на вход. А для ресета просто меняйте направление на выход (в порту пусть остаётся ноль).ploop писал(а):Нет, это RESET к другому контроллеру. В свете некоторых замечаний в даташите (где обычно они косяки пишут) было, правда не помню для какого именно МК, что короткий импульс на RESET способен залочить камень. Очень не хотелось бы...
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Мля, точно... чё мудрить то...
ЗЫ: передохнуть надо
ЗЫ: передохнуть надо
попробовал сделать деление на Си, потом поглядел дизассемблером. Не, никак умножитель не прикрутить, winavr вставляет здоровенную процедуру...
Мои верные друзья - АМD и AVR
LM317 - атцтой, LM2576ADJ - форева!
LM317 - атцтой, LM2576ADJ - форева!
Нашел ща ту книгу, про которую говорил.
Да, там есть пример использования аппаратного умножения для умножения многоразрядных чисел. А про деление - только хитрости, типа подгонки делителя под степень двойки (дальше деление делается обычным сдвигом). В принципе, подумав логически, и написав код не универсальный (как делает компилятор Си), а для конкретной ситуации, сама процедура очень сильно упрощается и оптимизируется по времени.
Да, там есть пример использования аппаратного умножения для умножения многоразрядных чисел. А про деление - только хитрости, типа подгонки делителя под степень двойки (дальше деление делается обычным сдвигом). В принципе, подумав логически, и написав код не универсальный (как делает компилятор Си), а для конкретной ситуации, сама процедура очень сильно упрощается и оптимизируется по времени.
это да, если делитель - константа. А если переменная... тогда - швах 
Мои верные друзья - АМD и AVR
LM317 - атцтой, LM2576ADJ - форева!
LM317 - атцтой, LM2576ADJ - форева!
Ну к примеру - посчитать среднее арифметическое нескольких измерений. Пусть десяти. И да, приплывём. Но если мы измерение проведём не 10, а 8 раз или 16 раз - в итоге выиграем (т.к. на эти числа будем делить). А суть-то не изменится, либо чуть больше, либо чуть меньше точность получим, но даже с большей точностью сэкономим кучу тактов и программного кода.
И таких примеров много можно придумать.
И таких примеров много можно придумать.
еще можно в BCD перевести - тогда делить на 10 просто 
Мои верные друзья - АМD и AVR
LM317 - атцтой, LM2576ADJ - форева!
LM317 - атцтой, LM2576ADJ - форева!
Привета.
Подскажите пож-ста, как правильно описывать/оформлять на асме таблицу прерываний (для атмеги16)?
Если можно - простенький примерчик и буквально 2 слова описания к нему, или ткните носом в и-нете...
Мне то нужно всего-ничего, прерывание от таймера да от юсарта, но как оно правильно описывается на асме - чет в инете только таблици-списки всех возможных прерываний или я плохо ищу...
пасиб.
Подскажите пож-ста, как правильно описывать/оформлять на асме таблицу прерываний (для атмеги16)?
Если можно - простенький примерчик и буквально 2 слова описания к нему, или ткните носом в и-нете...
Мне то нужно всего-ничего, прерывание от таймера да от юсарта, но как оно правильно описывается на асме - чет в инете только таблици-списки всех возможных прерываний или я плохо ищу...
пасиб.
мысли мысли штош вы вйотесь
над мойейу головойу
вы там мосга нинайдете
нед там мосга! йа тупойе (БОР)
над мойейу головойу
вы там мосга нинайдете
нед там мосга! йа тупойе (БОР)


