roboforum.ru

Технический форум по робототехнике.

МикроКонтроллер AVR начинающим - общие вопросы

Re: МикроКонтроллер AVR начинающим - общие вопросы

elmot » 15 май 2012, 12:41

dccharacter писал(а):Я кстати смотрю на витрины и на репозитории и с неудовольствием отмечаю, что LPC-шки попопулярнее будут. Хотя те, кто сравнивал LPC и STM говорят, что ЛПС-шки - это ад и там черт ногу сломит...

Значит будем сидеть на непопулярных стмах, гнуть пальцы на lpc и хихикать над фьюзострадальцами :friends:
Холивар-холивар, ня-ня-ня-ня-ня!
Ща мне еще малинка приедет - я тут над всэми ржать в голос буду. :P

Re: МикроКонтроллер AVR начинающим - общие вопросы

Duhas » 15 май 2012, 12:54

когда начинал - не убил не одного.. покоцал чем-то потом.. тоже порты вроде..

когда продолжал - вроде один так залочил.. я просто не пложу обычно кучу проектиков.. и вообще ко многому теряю интерес когда понимаю как можно это сделать.. увы это часто бывает до начала написания проги.. или до полного написания..

Re: МикроКонтроллер AVR начинающим - общие вопросы

dccharacter » 15 май 2012, 13:01

Duhas писал(а):когда начинал - не убил не одного.. покоцал чем-то потом.. тоже порты вроде..

когда продолжал - вроде один так залочил.. я просто не пложу обычно кучу проектиков.. и вообще ко многому теряю интерес когда понимаю как можно это сделать.. увы это часто бывает до начала написания проги.. или до полного написания..

та же фигня :-(((

Re: МикроКонтроллер AVR начинающим - общие вопросы

legion » 27 май 2012, 11:01

Ассемблер.
Задача - преобразовать двухбайтное двоичное число в десятичное для последующего вывода на блок семисегментных индикаторов. Ткните носом, пожалуйста, как оно по уму делается? Максимум, до чего я додумался, это пройтись по битам числа, раскладывая веса битов по нескольким регистрам, каждый из которых будет представлять собой один разряд десятичного числа, а затем выполнить переносы, если число в регистре больше 9. Но это как-то долго и ресурсоемко.

Re: МикроКонтроллер AVR начинающим - общие вопросы

Victorovych » 27 май 2012, 14:15

я обычно так и делал, если придумаешь что-то менее ресурсоемкое - напиши

Re: МикроКонтроллер AVR начинающим - общие вопросы

Dmitry__ » 27 май 2012, 14:40

legion писал(а):Задача - преобразовать двухбайтное двоичное число в десятичное для последующего вывода на блок семисегментных индикаторов.

Десятичная коррекция делается сдвигом регистра влево и команда "десятичная коррекция"
И так n-раз (n-ширина корректируемого слова)
В интел51 это "daa". msp430 - "dadd"
искать и курить: BIN2BCD
вот для мсп430:
Код: Выделить всёРазвернуть
;------------------------------------------------------------------------------
BIN2BCD;     Subroutine for converting 16 bit binary to BCD
;              Input: R12 is 16 bit binary
;            Working: R15 is used and not saved
;             Output: R14|R13 5 digit BCD
;------------------------------------------------------------------------------
             mov #16,R15
             clr R14
             clr R13
L$1          rla R12
             dadd R13,R13
             dadd R14,R14
             dec R15
             jnz L$1
             ret
                                             ;

В микроконтроллерах, где отсутствует эта команда, ее делают программно

Добавлено спустя 2 минуты 10 секунд:
ой :shock: , в мсп430 круче сделано, там сложение с десятичной коррекцией :oops:

Вот нашел подробное описание:
http://chipmk.ru/index.php?option=com_c ... &Itemid=61

Re: МикроКонтроллер AVR начинающим - общие вопросы

legion » 27 май 2012, 17:11

Дмитрий, спасибо огромное, по ссылке отличная статья! Собрался уже ваять код, а гугл вдруг невзначай вывел на такой документ: Application notes AVR204: BCD Arithmetics.

UPD: Еще один вариант. По сравнению с подпрограммой из апноута требует меньше программной памяти и регистров, заявленная скорость выполнения в 3+ раз выше.
UPD2: Во втором варианте результат в неупакованном виде. Для упакованного вот. В два раза меньше регистров и еще быстрее, но кода больше на целых три слова.

Re: МикроКонтроллер AVR начинающим - общие вопросы

legion » 28 май 2012, 08:19

UPD3: Хитрая подпрограмма для преобразования 1 двоичного байта в трехзначный неупакованный BCD формат. 15 слов, 18 тактов, 3 старших регистра, смотреть внизу страницы.

Re: МикроКонтроллер AVR начинающим - общие вопросы

Michael_K » 28 май 2012, 12:04

Вы бы написали, для какого конкретно проца вы хотите эту шнягу (AVR-ки тоже разные бывают) и по каким параметрам оптимизировать - время выполнения или размер флешки.
Ну и самый-то возможно актуальный вопрос - нафига упираться и оптимизировать вывод на индикатор, если человек в любом случае не воспримет эти циферки чаще, чем несколько раз в секунду? :)

Re: МикроКонтроллер AVR начинающим - общие вопросы

legion » 28 май 2012, 13:04

Я алгоритм искал. А так - базово-ширпотребная мега48. Оптимизировать сейчас не собираюсь, выложил то, что нашлось по запросу AVR BCD, чтобы раскрыть вопрос для тех, кто будет искать ответ в будущем.

Ну и, а вдруг мк будет загружен по самое не могу, а тут еще и выводить на индикатор надо? :)

Re: МикроКонтроллер AVR начинающим - общие вопросы

Michael_K » 28 май 2012, 13:23

legion писал(а):Я алгоритм искал.

Вы искали алгоритм, а сравниваете реализации. В AT90S (из аппноута) умножения нет, например, а в последнем примере оно используется.

Re: МикроКонтроллер AVR начинающим - общие вопросы

legion » 28 май 2012, 17:48

Я их не то чтобы сравниваю, я их описываю. Хмм, а где сказано, что апноут для AT90S?

Re: МикроКонтроллер AVR начинающим - общие вопросы

legion » 27 июн 2012, 22:11

Да чтож такое. Пытаюсь использовать Input Capture на меге16а, а оно беспрерывно генерит Input Capture прерывания, хотя не должно. Уже вроде все что можно попробовал. На ICP1 включил внутреннюю подтяжку, оставлял пин без провода, снаружи к плюсу подтягивал. Noise canceler включил, выключил на всякий пожарный компаратор и даже AIN1 к плюсу подтянул, менял фронт срабатывания. Ну никак.
В гугле нашел несколько случаев такой проблемы, но без решений. Бывало у кого-нибудь так?

UPD: Выяснил, что начинает спамить прерыванием после первого переполнения счетчика. Что это значит пока не понял.
В ходе выяснения обнаружил баг студии. В режиме WGM = 12 в студии таймер не считает, если OCR1A = 0, т.к. срабатывает флаг прерывания по сравнению на первом же счете. Сразу показалось, что это не правильно, так оно и вышло. В МК в этом режиме таймер как минимум не обращает внимания на флаг по сравнению. Непонятно пока до куда считает. По даташиту вроде должен обнуляться при Input Capture Flag.

UPD1: Так... не может же оно обнуляться на первом же такте после переполнения из-за того, что ICR1 = 0? И ставить флаг ICF1. Это же нелогично? :shock:
До первого переполнения вроде никак на уровень на ноге ICP1 не реагирует.

Код инициализации и прерывания:
OUTI - макрос, пишет константу в I/O через регистр R17 (OSRG).
Код: Выделить всёРазвернуть
      OUTI   DDRB,   1<<PB0
      
      OUTI   ACSR,   1<<ACD

      OUTI   PORTD,   1<<PD6

      OUTI   TCCR1B,   1<<WGM12|1<<WGM13|1<<CS10|1<<CS12
      IN      OSRG,   TIMSK
      ORI      OSRG,   1<<TICIE1
      OUT      TIMSK,   OSRG


Код: Выделить всёРазвернуть
TIMER1_CAPT:      CLI
         PUSH   OSRG   

         SBI      PORTB,   0            ; моргаем
         SBIC   PINB,   0
         CBI      PORTB,   0

         OUTI   UDR,   111

         POP      OSRG
         SEI
         RETI

Re: МикроКонтроллер AVR начинающим - общие вопросы

avr123.nm.ru » 28 июн 2012, 09:31

В PROTEUS попробуйте и уточните по какому событию у вас прерывание настроено.

Re: МикроКонтроллер AVR начинающим - общие вопросы

legion » 28 июн 2012, 10:26

С протеусом не работал, чувствую, если сейчас начну, то еще и баги протеуса пособираю. :crazy: При симуляции в студии код работает отлично, прерывание срабатывает только при надлежащем изменении PD6.

Прерывание по фронту/спаду (пробовал и так и эдак) сигнала на ноге Input Capture (PD6). В даташите говорится, что вроде еще по компаратору это прерывание работает, пробовал его выключать, не помогло. Нога PD6 притянута к + внутренней подтяжкой и снаружи через резистор. Может, внутренняя подтяжка мешает? Не помню, пробовал ли без нее.


Rambler\'s Top100 Mail.ru counter