Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Тема закрыта

ЧаВо по микроконтроллерам: общие вопросы

Пт май 09, 2008 21:42:25

1. Вопрос:
Ассемблеров много. Так, бывает макроассемблер, например. Что за ассемблер используется для программирования микроконтроллеров?
Ответ:
Ассемблер - эт вообще понятие очень широкое. Под каждый процессор - свой ассемблер. В АВР-ках используется ассемблер для АВР (как ни парадоксально это звучит).

2. Вопрос:
Существуют ли СИ-шные компиляторы для МК PIC & AVR?
Ответ:
Да, и довольно много. К примеру Imagecraft C Compiler, WinAVR, CodeVision AVR и др.

3. Вопрос:
Есть ли какой-нить компилятор, который поддерживал бы условную копиляцию?
Например, иесть МК 2313 и Mega8, во 2-ом есть команда movw, а в 1-ом нужно её разбить на 2-е mov. Так вот, хотелось бы не править каждый раз код под конкретное семейство или писать, экономя такты, а чтобы компилятор выбирал один из вариантов сам.
Ответ:
Такие программы называются кросс-трансляторами. (Компилятор и интерпретатор - разновидности трансляторов).
Для примера есть пакеты avr-binutils и avr-gcc (это обычно под Линукс, есть и под Windows, называется WinAVR). Умеют все что захочешь - условную компиляцию, С-подобный препроцессор, ассемблер, дисассемблер, конвертор форматов и еще кучу всяких вещей. Бесплатно, доступно.

4. Вопрос:
Скажите, пожалуйста, что содержит в себе *.hex файл (точнее интересует его синтаксис), и как можно его преобразовать обратно в source (исходной код)?
Ответ:
HEX - это шестнадцатеричный код. Существует для удобства записи двоичных чисел. 1 цифра шестнадцетиричного кода - полубайт, 2 цифры - байт:
Код:
Десятичная              Двоичная Шестнадцатиричная
0                   0000       0
1                   0001       1
2                   0010       2
3                   0011       3
4                   0100       4
5                   0101       5
6                   0110       6
7                   0111       7
8                   1000       8
9                   1001       9
10                  1010       A
11                  1011       B
12                  1100       C
13                  1101       D
14                  1110       E
15                  1111       F

Формат файла организован в виде набора записей, содержащих сведения о типе, количестве данных, адресе их загрузки в память и дополнительные сведения.
В общем, если доступен ХЕКС- файл, и известна система команд, можно программу дизассемблировать, даже вручную. Но большинство программных средств содержат дебаггеры, или дизассемблеры, делающие это программно - на компьютере. Но не факт, что Вы разберётесь в коде программы: там не будет комментариев.

5. Вопрос:
Каков шанс, что я могу спалить микроконтроллер при прошивке? Программно можно его убить?
Ответ:
Убить нельзя. Можно его ввести в состояние, когда он не захочет шиться по SPI (последовательному интерфейсу).

6. Вопрос:Я пытаюсь с помощью программатора Avreal прошить новую только купленную ATMega32. Но почему-то не получается. Что делать?
Ответ:
Вероятнее всего, Вы что-то напутали в программе (на стороне ПК) или в подключении программатора. Возможно также, что есть проблемы с источником тактирования МК. Например, Вы хотите использовать кварц. А изначально МК настроен на работу от внутреннего RC-генератора, надо это учитывать.

7. Вопрос:
Необходимо скачать прошивку из контроллера и залить в другой такой же. Например tiny12l. Подскажите, как это сделать?
Ответ:
Выдергиваем прошивку. Есть варианты:
1. ISP режим работает - тогда берем программатор и ищем кнопку "Слить программу в файл".
2. ISP отключен - пользуем параллельный программатор (к сожалению, с tiny12l такой фокус не пройдет), далее - аналогично.
3. Включены лок биты (оба) - пока способов обхода защиты не существует.
AVRStudio это (считывание прошивки) умеет, AVReal вроде как умеет, AVRdude и PonyProg точно умеют. Под линукс есть еще программка uisp.
Не забудьте - надо еще и фузы клонировать, это уже вручную можно сделать почти любой программой.

8. Вопрос:
Как видно, что включена защита МК(АВР) от считывания?
Ответ:
Если прошивка "залочена", при считывании вместо нее будет набор увеличивающихся значений: 0х0101, 0х0202, 0х0303 и т.д. в шестнадцатеричной системе. Ну или что-то очень похожее (в разных МК по-разному), во всяком случае будет понятно, что это не прошивка.

9. Вопрос:
Я написал программу для МК AVR, а она не работает.
Ответ:
1.Возможно, у вас не инициализирован стек.
После метки начала основной программы, пишем что-то вроде:
out SPL, Low(Ramend*2)
out SPH,High(Ramend*2)
Что такое стек? Смотрим нашу Обучалку.
2.Частой ошибкой является несохранение регистра состояния в стеке, при вхождении в прерывание.
Регистр состояний - SREG, сохраните его!

10. Вопрос:
Собрал сам платку с атмегой16, прицепил кварц на 16MHz и 2 конденсатора по 22pF. Запрограммировал тестовой прошивочкой (на эмуляторе писал - на нём же и работала). Подключил это дело к MAX232 и к COM2. Запускаю и не работает!
Как отловить причину? Работает ли кварц? И вообще, где реакция!?
Ответ:
Возможно, вы при прошивке не прописали фьюзы для работы от внешнего кварца. Фьюзы, они же - фузы, они же fuses.

11. Вопрос:
Как задействовать сторожевой таймер для сброса контроллера (АВР)?
Ответ:
Примерно это выглядит так:
Код:
;----------
cli
ldi tmp,(1<<WDCE)|(1<<WDE)
out WDTCR,tmp
ldi tmp,(1<<WDE)
out WDTCR,tmp
loop:
rjmp loop
;----------


12. Вопрос:
Как правильно запустить внутренний генератор тактовой частоты?
Ответ:
Чтобы правильно запустить внутренний RC - надо правильно прошить фузы. Какие - смотрим в даташит.
Частота генерации может быть не очень стабильной и зависеть, например, от температуры. Отчасти этого эффекта можно избежать при помощи процедуры калибровки (описана в одном из аппноутов на сайте http://www.atmel.com), однако в большинстве обычных случаев это не требуется.

13. Вопрос:
Что такое динамическая индикация и как она применима к семигегментному индикатору?
Ответ:
Это способ управления индикатором, при котором индикатор не горит постоянно, а загорается только в короткие, строго определенные промежутки времени. Из-за инерционности человеческого зрения свечение индикатора кажется постоянным. Побробнее об этом можно посмотреть в Обучалке: Динамическая индикация

14. Вопрос:
Делаю устройство, на индикатор выводится 3 цифры. Опрашиваю кнопку в цикле и увеличиваю на 1 значение при нажатии, на индикаторе при выводе цифр немного подсвечиваются некоторые сегменты. То есть цифры не четкие, как избежать такого эффекта?
Ответ:
Нужно делать паузы между выводом разрядов. То есть:
1. Подали напряжение на разряд (общий)
2. подождали
3. подали сигнал
4. подождали
5. сняли сигнал
6. сняли напряжение с разряда
7. goto п.1

15. Вопрос:
Подскажите как правильно прикрутить кнопки к микроконтроллеру? Желательно со схемой.
Ответ:
Считаем сколько у нас кнопочек и делаем матрицу.
Например, если кнопочек 10 - то матрица будет 3х4, если 15 - то 4х4 и т.д. Подключаем столбцы и строки к свободным выводам контроллера.
Столбцы подтягиваем к общему (питанию) резисторами 1 кОм
Дальше - все просто. На строчки поочередно подаем "1", и читаем столбцы. Если находим что в каком - то столюце единичка - значит кнопочка нажата. Вычисляем ее адрес, и начинаем обрабатывать нажатие. Побробнее об этом можно посмотреть в Обучалке: Динамический опрос клавиатуры

16. Вопрос:
В большинстве схем применяются семисегментные индикаторы с общими катодами. Прошивки написаны тоже под них. Что делать, если у меня семисегментные индикаторы с общими анодами?
Ответ:
Вообще говоря, нужно просто инвертировать данные, подаваемые в порты, перед их выводом. Например, так:
Код:
ldi Temp,0xff
eor Temp1,Temp
out PortB,Temp1


17. Вопрос:
Если подключить к портам AT90C2313 (тини2313) клавиатуру на 12 кнопок, плюс еще индикатор,
а у нее 15 свободных ног, порт b+d, то для управления чего либо контактов не останется?
Ответ:
Существуют варианты расширения портов. Например, можно поставить 7-сегментный дешифратор, например, К514ИД2 (ИД1). Выиграем 4 канала.
Можно поставить также дешифраторы на общие выводы индикаторов - еще плюс два канала.
Если надо управлять большим количеством внешних девайсов - ставим регистр с последовательной загрузкой, и загружаем его двумя ногами контроллера. Это почти что интерфейс SPI.

18. Вопрос:
Происходит самопроизвольная перезагрузка. Т.е. загрузился микроконтроллер и работает. Я начинаю нагружать его внешними событиями и вызовами, и внезапно он делает перезагрузку.
Что бы это значило?
Ответ:
Перезагрузки случаются из-за плохого питания. А именно - из-за импульсных помех по питанию в момент переключения чего-нибудь. Чего-нибудь может находиться как внутри контроллера, так и снаружи. Полюбому с этим надо бороться: LC-фильтрами и просто керамическими конденсаторами по 0,1..0,47 мкФ между + и - везде, где только это возможно. Вообще, каждая микросхема должна иметь между выводами питания свой керамический кондесатор.

19. Вопрос:
Можно ли с помощью микроконтроллеров измерять частоту и напряжение?
Ответ:
Да, можно. Обычно для измерения частоты используют встроенные таймеры и прерывания. Для измерения напряжения - встроенный АЦП и внешний делитель напряжения.
Например, есть МК ATmega16. Задача в том, чтобы измерить напряжение на батарее питания самго МК, с реализацией на С. Как это задать?
Пример:
Код:
#define ADC_VREF_TYPE 0xC0 // внутренний ИОН 2.56В

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

// ADC initialization
// ADC Clock frequency: 115,200 kHz
// ADC Voltage Reference: Int., cap. on AREF
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x86;

Да, читаем вот так: adc_data = read_adc(0); // где 0 - номер канала.

20. Вопрос:
Можно ли при помощи микроконтроллера измерять ток? И как?
Ответ:
Да, можно. В качестве датчика тока зачастую применется низкоомный резистор. При протекании большого тока на нем (согласно закону Ома) создается падение напряжения, прямопропорциональное току. То есть, измеряя это напряжение, можно узнать какой ток протекает через резистор.
Для измерения напряжение подойдет любой МК, со встроенным ADC.

21. Вопрос:
Я использую в своей схеме АЦП. Оно работает, но с какими-то перебоями. В чем дело?
Ответ:
Возможно у вас слишком большие помехи по питанию. Наипростейший способ - на вывод АСС подключается дросель на 10мкГн на плюс и конденсатор. 0.1 мкФ на минус. Если это не поможет, то надо применять более сильные меры по устранению помех.

22. Вопрос:
Что за глюки при работе с регистром ADCL? Если вывожу через tmp(временную переменную) на UART регистр ADCH то всё ОК - выводит то, что измерил ADC. Если вывожу ADCL то выводит 0x00 при любом уровне на входе ADC?
Ответ:
Следует помнить, что доступ к 16-битовым значениям из регистровых пар всегда должен делаться, во-первых, к обоим, во-вторых, первым читать младший, а записывать - старший.

23. Вопрос:
Посмотрел тут схемы на сайте: во всех схемах, где светодиоды к МК подключены, используется подключение, когда катодами диоды подсоединены к земле. Соответственно, ток тянется из МК.
Я обычно пользую схему, когда катоды подключены к портам МК, а аноды на питании, при таком подключении ток из МК не тянется, а наоборот в него идет (ну управление диодов обратное - при "0" горит, при "1" выключен, так это не суть важно). Вроде как учили, что так через МК можно больший ток пропускать. Это верно?
Ответ:
Да, верно. Общий провод в кристалле должен быть более массивный, чем плюсовой. Соответственно - через него пойдет больший ток. Для классических MCS51-ых микроконтроллеров это вообще единственно возможный вариант управления светодиодами.
МК других семейств и современных (не классических) MCS51 - втекающий и вытекающий токи примерно равны, так что разницы в подключении светодиодов нет никакой.
Хотя по любому, ток зависит в первую очередь от мощности драйвера на выводе микросхемы. И превышать номинальный ток не стоит хотя бы по соображениям надежности.

24. Вопрос:
Есть микроконтроллер AT90S2313 (или любой другой 8-разрядный), к одному из портов его подключен саетодиод. Можно как-то програмно регулировать яркость свечения этого светодиода, например, чтобы в один момент времени он горел на 100%, в другой на 50%, в третий на 30%?
Ответ:
Наиболее простым и очевидным способом является применение ШИМ (PWM). На вывод со светодиодом подключаете ШИМ, меняете скважность и получаете разную яркость свечения светодиода.
Про ШИМ достаточно подробно написано в даташите на микроконтроллер, в нем есть т.н. аппаратный шим, на реализацию которого не тратятся программные ресурсы и жестко привязянный к определенной ноге, но никто не запрещает написать для светодиода ШИМ программный.

25. Вопрос:
Как организовать прием блока данных из компа на UARТ?
Ответ:
Это зависит, в основном, от программы МК.
Если МК должен что-то постоянно делать, лишь отвлекаясь на получение данных - прерывания или постоянная проверка USARTa на получение байта и переход в подпрограмму получения n-1 байт при получении первого байта (если все проходит по временным задержкам выполнения основной программы).
Если же МК должен выполнять что-то только при получении пакета данных, то можно просто зациклить основное тело программы на получение байта (с переходом в подпрограмму получения n-1 байт), не используя при этом прерывания.

26. Вопрос:
В общем, пора перезжать на новое железо. Тини2313 мне уже мало Внимание, вопрос: на что?
Ответ:
В зависимости от задачи стоящей перед вами. Обычно следующим этапом стает освоение ATmega8, дальше ATmega16/32

Пт май 09, 2008 22:11:02

Собственно, всем МЯУ!, товарищи! :)
Хозяева у меня - редкостные бездельники, так что пришлось все как всегда самому делать... Ладно, жаловаться не буду, все равно им пофигу :cry:
Так вот, вашими стараниями на Форуме скопилось немало тем, состояших буквально из пары-тройки постов, иногда, как это ни удивительно, содержащих полезную информацию. Обычно эти темы открываются кем-нибудь из вновь прибывших, а потом так и висят без дела в хвосте раздела.. Мяу, аж стихами заговорил. :)) Поэтому Я решил потратить свое драгоценное время и, минут на 20 забыв про еду и сон, выцарапал из таких тем все полезное.. Самая большая кучка из нацарапанного представлена выше. Называться все это будет - ЧаВо. Пока что - по общим вопросам МК, будут и другие, посмотрим, что из этого получится. Все это - вопросы, которые вы сами задавали и ответы, которые вы сами на них давали, поэтому пока у вас есть шанс высказаться в этой теме с исправлениями, предложениями и замечаниями.
Только, МЯУ! вас всех, конструктивно, пожалуйста! По окончании потока.. кх-м.. замечаний и дополнений, тема будет закрыта.
Вот так :)
ЗЫ
Справедливости ради, должен отметить, что посильный вклад в это мероприятие - небольшой, конечно, но все же - внесли товарищи Aheir и Reboot_s, за что им, разумеется спасибо. :lol:

Чт июл 17, 2008 19:27:47

1. Вопрос:
Имеется в наличии новый МК. Подключил его в пралаллельный программатор, и оказалось, что он залочен (почему - непонятно).
По даташиту все локбиты с АВРов снимаются командой полного стирание чипа. Но вот незадача, чип отказался стираться и своё состояние сохранил.
Другие микроконтроллеры с прошитыми лок-битами после полного стирания защиту снимают. Получается МК неработоспособен?
Ответ:
Вероятнее всего, контроллер неисправен. Причин для этого можно несколько: технологический брак, статика и т.д. В конце концов, это мог оказаться и не новый контроллер,
такое тоже случается.

2. Вопрос:
Требуется выполнить задержку 5..40 с. Хочется для этого использовать Real Time Counter, который вроде бы имеется в mega8.
Для этого нужен внешний часовой кварц?
Ответ:
Все зависит от конкретной задачи.
У Mega8 можно внутренний RC генератор использовать.
Используется Real Time Counter таким образом:
Ставится часовой кварц вместо обычного, во фьюзах включают внутренний калиброванный или иной генератор, настраивается таймер на счет импульсов от часового кварца - и все.

3. Вопрос:
Подскажите, как представляеться переменная с плавающей точкой (float) в двоичной системе АВР?
Ответ:
Тип float использует 32 битный (4 байт) формат стандарта IEEE с 8-разрядной экспонентой, 23 разрядной мантисой и 1-м знаковым битом.
Представление получается такое, например, 221e2, т.е. 221*10^2, 221-мантисса, 2-экспонента.

4. Вопрос
Как настраивать внешние прерывания прерывания на AVR?
Ответ:
Чтобы верно обрабатывать прерывания в общем случае нужно:
1. Выставить вектор прерывания (таблица векторов приведена в описании на конкретный контроллер). Вектор - это адрес перехода на обработчик прерывания.
Для каждого прерывания команда должна переходить по строго определенному адресу, эти адреса и указаны в описании контроллера.
2. Выставить биты ISCx0 и OSCx1 регистра MCUCR в соответствии с нужным режимом прерывания (по низкому уровню, по изменению уровня, по перепаду с 1 в 0
или по перепаду с 0 в 1) - табличка в описании контроллера есть.
3. Выставить биты в регистре GIMSK или ином подобном (int0, int1 - в зависимости от номера нужного прерывания).
4. Разрешить прерывания командой SEI. Эту команду дают обычно после конфигурации всех прерываний. Это команда глобального разрешения перерываний.
Ну и собственно выход из обработчика прерывания - командой RETI (а не RET !).

5. Вопрос:
Есть ли какие-либо не очень сложные схемы для начинающего на отечественных микроконтроллерах?
Ответ:
Есть такой микроконтроллер - Ангстремовский КР1878ВЕ1.
Описание КР1878ВЕ1, программатор, компилятор для него выложено на сайте сайте производителя: www.angstrem.ru
Есть такая книга - называется она "Шина I2C в радиотехнических конструкциях". Автор - Семенов Б.Ю.
Так вот там подробно рассматривается архитектура этого контроллера и есть много примеров его применения.
Еще есть МК48 (КР1816ВЕ4) или МК51(КР1816ВЕ751), но эти чипы не для начинающих.

6. Вопрос:
Как можно перезапустить программно МК?
Ответ:
1.Наиболее просто - подавать сигнал с вывода порта на вывод сброса, но этот вариант не так прост: не для всех МК возможен.
Например, в МК семейства MCS-51 сброс дается высоким уровнем, и при сбросе все выводы всех портов тоже устанавливыаются в высокий уровень,
т.е. если просто соединить какой-то вывод с RST - процесс сброса никогда не кончится, программа будет стоять и все.
2. Применение WDT(сторожевого таймера).
Так же не всегда возможно, т.к. месколько миллисекунд ожидания могут быть критически важны и недопустимы.
Остаются два варианта: либо использовать МК, в которых имеется стандартный способ программного сброса (например С8051F330),
или искать иной способ нарушить работу программы. В некоторых МК сброс получается, если сделать переход на несуществующий адрес ПЗУ или обратиться к несуществующему адресу EEPROM.
В общем, задача не так проста и универсального решения не имеет.

7. Вопрос:
Не могу понять почему появляется ошибка: "Relative branch out of reach". Компилятор начал ругаться когда я добавил в программе несколько подпрограмм
(даже если они пустые) на brne, breq?
Ответ:
Команды условных переходов brne и breq имеют "дальность работы" от -64 до +63. У Вас расстояние до метки больше, поэтому ассемблер и выдает ошибку.
Используйте RCALL и RJMP, у которых дальность действия составляет от -2047 до +2047. И не строк, а команд (слов по 2 байта).

8. Вопрос:
В чем разница между командами?
add r1,r2
adc r3,r4
Ответ:
Первая (add) суммирует r1 и r2 и результат помещает в r1, а вторая (adc) не только прибавляет к r3 значение r4, но еще прибавляет значение флага переноса С,
т.е. r3=r3+r4+С, а в некоторых ассемблерах вторая команда может прибавлять к r3 константу r4.

9. Вопрос:
Что такое флаг переноса?
Ответ:
Флаг переноса устанавливается когда результат сложения больше 0хFF (255). Этото флаг используется при сложениии 16-ти разрядных чисел, т.е. додаются сначала младшие биты (команда add), а затем при сложении старших (команда adc) к результату присоединяется флаг переноса 1 или 0.

10. Вопрос:
Что за команды .macro и .endmacro?
Ответ:
Директивы .macro и .endmacro обозначают начало и конец макроописания. Это означает, что если вы опишите этими директивами какой-то макрос, а потом в тексте
программы просто укажите его имя - компилятор подставит на это место всю последовательность команд между этими директивами.

11. Вопрос:
а) Почему в Мega16 не работает порт С?
б) Нужно ли в Мega16 отключать интерфейс JTAG, чтоб работал порт С?
Ответ:
Порт С работает неправильно, потому что включен JTAG. Соответственно, да, его надо отключить. Для этого следует снять запрограммированный по-дефолту фьюз JTAGEN
(JTAG Enable) или воспользоватся программным отключеним, которое описано в даташите.

12. Вопрос:
Как умножить 2 беззнаковых 16 битных значения с получением 32 битного?
Ответ:
Пример для чисел со знаком (примерно 22 такта):

Код:
Example:
;******************************************************************************
;* DESCRIPTION
;*Signed multiply of two 16-bit numbers with 32-bit result.
;* USAGE
;*r19:r18:r17:r16 = r23:r22 * r21:r20
;******************************************************************************

muls16x16_32:
clr r2
muls r23, r21 ; (signed)ah * (signed)bh
movw r19:r18, r1:r0
mul r22, r20; al * bl
movw r17:r16, r1:r0
mulsu r23, r20 ; (signed)ah * bl
sbc r19, r2
add r17, r0
adc r18, r1
adc r19, r2
mulsu r21, r22 ; (signed)bh * al
sbc r19, r2
add r17, r0
adc r18, r1
adc r19, r2
ret


13. Вопрос:
Как сделать длинную задержку на микроконтроллере AVR (час и больше)?
Ответ:
Существует несколько способов:
1.Если на Си, то в CVAVR вот так:
функция delay_ms(сколько миллисекунд), можно до 0xFFFF делать.
Пример находится в папке C:\CVAVR\examples\ADC8535.
2. Настроить таймер на минимальную частоту, счет от 0, прерывание по переполнению.
В прерывании инкрементируем какую-либо переменную и по достижении ей определенного значения, которое задается нужным временем задержки, осуществляем действие.
Например, при частоте 3кГц 16-ти разрядный таймер переполнится примерно за 20с, т.е. через 180 срабатываний прерывания получим задержку в 1 час.
3. Если без таймеров и прерываний, то ничего иного, кроме как вложенные циклы, не придумать:

Код:
loop1:
   dec   r0
   brne  loop1
   dec   r1
   brne  loop1
   dec   r2
   brne  loop1
   dec   r3
   brne  loop1


Если перед его началом r0=r1=r2=r3=0, то при тактовой частоте 10МГц этот код будет выполняться более 20 секунд. Добавьте регистры и время увеличится.
А у товарища или может господина, как ему будет угодно, Ю.Ревича, в его замечательной книге "Практическое программирование микроконтроллеров Atmel AVR на языке ассемблера" на стр.104 это выглядит так:
Код:
Delay:
          subi Razr0,1
          sbci Razr1,0
          sbci Razr2,0
          brcc Delay



4.В Application notes на сайте www.atmel.com есть апноут под номером 133. Там использован очень хитрый прием и его можно использовать.
Только учитывайте, что при использовании таймера почти все время можно использовать спящий режим, а при delay_ms() и функциях ветвления контроллер будет работать
"вхолостую".

14. Вопрос:
Как использовать последовательные регистры (например 74HC164) для расширения количества портов?
Ответ:
В простейшем случае регистр с последовательной загрузкой управляется по трем проводам.
В линию тактирования подаются импульсы с некоторой частотой. По фронту (спаду) каждого из этих импульсов происходит захват данных с линии данных и запись их во внутренний регистр микросхемы. Таким образом можно последовательно загрузить в регистр какие-то данные.
Обычно регистры 8- или 16-ти разрядные, соответственно можно последовательно загрузить 8 или 16 бит. Можно и больше, но начнут затираться первые биты.
По сигналу (импульсу) на третьей ноге микросхемы происходит вывод данных из внутреннего регистра на ноги микросхемы.
Могут еще быть дополнительные выводы для защелкивания данных, каскадирования и т.п.


15. Вопрос:
Как можно подать 10 импульсов (или вообще сформировать импульсы) через ножку МК?
Ответ:
Наиболее вероятный вариант - использовать таймер, а возможно ШИМ, в зависимости от требуемых параметров.
В СИ можно использовать цикл while или for, в нем - изменение уровня на ножке, настроеной выходом, и паузу.

16. Вопрос:
Где можно посмотреть пример кода для подключения ЖКИ-модуля фирмы МЭЛТ (например МТ-10S1)?
Ответ:
Обычно, нормальные производители чего бы то ни было выкладывают примеры использования своей продукции у них на сайтах. В данном случае стоит
обратиться на http://www.melt.com.ru (не реклама! :) )

17. Вопрос:
Как следует правильно организовать получение пакета данных через UART?
Ответ:
Стандартный пакет выглядит так: [стартовый символ][данные][контрольная сумма][стоп символ]. Контрольная сума может формироватся по разным критерием
(четная и нечетная), данных может быть 8 и 9 бит.
Пример алгоритма:
1. Ждем начало пакета[стартовый символ]
2. После обнаружения [стартового символа] принимаем [данные], иначе переход 1.
3. Принять [контрольнау сумму]
4. Очистка буфера (перемещение данных в другой регистр).
5. Обнаружение [стоп символа].
Программно, в Си, это может выглядеть так:
Пусть есть буфер для получения - RX_buf[20], указатель на положение символа в буфере int* pointer (можно без указателя, простой переменной) и CRC пусть
считается как xor.
Тогда:

Код:
pointer = RX_buf;
CRC = 0;
ждем стартовый байт
пока (не стоп символ)
{
*pointer = байт
 pointer++;
проверка переполнения буфера
}
проверка контрольной суммы


Если длина заранее известна, то проверку CRC можно организовать в основной цикле. при получении байта - сразу посчитать CRC.
Все цировые значения передаются в HEX и в ASCII.

18. Вопрос:
Хочу сделать программатор для МК, но у моего ноутбука (компьютера) нет COM (LPT) порта. Что можно сделать?
Ответ:
Собрать преобразователь USB-COM, USB-LPT (микросхем сейчас достаточно) и к нему прицепить программатор. К примеру, http://www.radiokot.ru/circuit/digital/pcmod/05.
Но МОЖЕТ не пойти. Зависит от программатора и софта. Ознакомтесь через поиск в интернете с удачными вариантами таких преобразователей, их довольно много.

19. Вопрос:
Как мне узнать, сколько времени уходит на выполнение той или иной процедуры, например на деление 4 байта на 4 байта?
Ответ:
Для корректного ответа, надо уточнить следующее:
1. Тип микроконтроллера
2. Его тактовую частоту
3. Какой алгоритм деления используется.

Третий пункт можно игнорировать, если взять отладчик-симулятор, который просто умеет сам вычислять время выполнения той или иной команды (или группы команд). И просто посмотреть.
Например, вот простой способ: написать

Код:
long d1, d2;
d1 = 0xFF00FF00; // просто для примера
d2 = 0x00FF00FF;
d2 = d1 / d2;


и при помощи симулятора "засечь" время выполнения последнего оператора.
Второй способ - посчитать вручную сколько тактов занимает та или иная команда и вся процедура вцелом.
Конкретно, в случае деления многобайтных чисел, время напрямую зависит от значения делимого и делителя, так что может сильно варьироваться (иногда в 100 раз).
Последний раз редактировалось Aheir Вс апр 26, 2009 19:26:05, всего редактировалось 1 раз.

Пн дек 29, 2008 21:49:00

Тут у коллеги smac родилось довольно объемное дополнение к обучалке по АВР в части обработки прерываний. Большая просьба к присутствующим оценить творение, а также высказать все свои замечания, дополнения и т.д., как по форме, так и по содержанию. :) По результатам редактирования будет выложено в обучалке.
Спасибо.
Вложения
man_correction1.doc
(91 KiB) Скачиваний: 2721

Чт янв 01, 2009 23:01:42

Aheir писал(а):... родилось довольно объемное дополнение к обучалке по АВР в части обработки прерываний...
Спасибо.

Не хочу показаться назойливым, но что-то пока никаких пожеланий/замечаний нет, наверное я слишком много написал, да и Новый Год на дворе, но все-же, надеюсь, высказывания скоро появятся.
З. Ы. На данный момент я вижу, что счетчик скачивания остановился на 14, хорошо, если 14 человек действительно скачали и читают/ уже прочитали дополнения к обучалке)

Пн янв 12, 2009 01:31:34

т.к. я пока (надеюсь что пока :) ) не знаком с коддингом на асме , то будет единственное замечание по оформлению : довольно сложно читать голый текст , причём минимально форматированный .

Пн янв 12, 2009 23:15:41

Не, ну это самом собой, будет оформлено в стиле Обучалки :)

Пт янв 23, 2009 14:36:46

Aheir писал(а):6. Вопрос:
Как можно перезапустить программно МК?
Ответ:
1.Наиболее просто - подавать сигнал с вывода порта на вывод сброса, но этот вариант не так прост: не для всех МК возможен.
Например, в МК семейства MCS-51 сброс дается высоким уровнем, и при сбросе все выводы всех портов тоже устанавливыаются в высокий уровень,
т.е. если просто соединить какой-то вывод с RST - процесс сброса никогда не кончится, программа будет стоять и все.
2. Применение WDT(сторожевого таймера).
Так же не всегда возможно, т.к. месколько миллисекунд ожидания могут быть критически важны и недопустимы.
Остаются два варианта: либо использовать МК, в которых имеется стандартный способ программного сброса (например С8051F330),
или искать иной способ нарушить работу программы. В некоторых МК сброс получается, если сделать переход на несуществующий адрес ПЗУ или обратиться к несуществующему адресу EEPROM.
В общем, задача не так проста и универсального решения не имеет.


Для CodeVisionAVR пишем:
Код:
#asm("rjmp __RESET")

Самое главное чтобы при вызове программного сброса, расстояние до ассемблерной метки
Код:
__RESET:
было не более 64 слов, иначе компилятор выдаст ошибку: "Relative branch out of reach" (смотрите файл проекта .asm)
Если расстояние больше, то можно воспользоваться несколькими переходами через несколько разных меток.
Следует помнить что состояние регистров при сбросе СОХРАНЯЕТСЯ.
Если в программе используются прерывания то следует сперва снять бит разрешения глобальных прерываний
Код:
#asm
                cli
                rjmp __RESET
#endasm


Спасибо, пригодится :) Aheir

Пт янв 23, 2009 19:54:48

Последняя версия материала по обработке прерываний.
Смотрим.
Вложения
man_correction1.doc
(94 KiB) Скачиваний: 2509

Пт янв 23, 2009 21:12:07

john_rise дал в корне неверный совет, зря принимаете к сведению, Aheir! переход на нулевой адрес абсолютно не аналогичен аппаратному сбросу! об этом уже говорилось в других темах.

единственное полностью верное средство программно сбросить МК - это использовать WDT (если нет нормальных средств программного сброса), о чем вы, Aheir, ранее и сообщали.

Пт янв 23, 2009 21:53:17

Я же указал:
john_rise писал(а):Самое главное чтобы при вызове ПРОГРАММНОГО сброса...

И я вовсе не претендую на Ваш:
ARV писал(а):...переход на нулевой адрес абсолютно не аналогичен аппаратному сбросу!

И кстати не обязательно "0"-адрес, уж как ни Вам лучше знать что там могут находиться вектора прерываний.

Кому нужно - применят, кому неподходит - пропустят мимо ушей. Ещё раз повторю - это программный сброс. И мой ответ прозвучал в основу вопроса:
Aheir писал(а):6. Вопрос:
Как можно перезапустить программно МК?

Сб янв 24, 2009 07:30:56

Здравствуйте.
Предложение. Разбить статью на 2 раздела
- флаги. Добавить пример использования флага H для устранения недостатка системы команд AVR, а именно отсутствие десятичной коррекции результата
- прерывания и устранение недоразумений при их обработке

Уточнение.
"...2. Нуль- флаг - здесь попроще - нуль флаг устанавливается когда результат операции, а точнее младшие 8 бит результата равны 0.
Например:
..."
Для однобайтных операций это так, чего нельзя сказать о многобайтных операциях
Код:
   LDI R16,HIGH(256)
   LDI R17,LOW (256)
   
   LDI R18,HIGH(256+256)
   LDI R19,LOW (256+256)

   ADD R17,R19
   ADC R16,R18
   

В итоге младший байт результата равен 0, а флаг Z сброшен. Поэтому корректнее фразу "...точнее младшие 8 бит результата" убрать.

Сб янв 24, 2009 10:40:41

akl писал(а):Здравствуйте.
...
Для однобайтных операций это так, чего нельзя сказать о многобайтных операциях
Код:
   LDI R16,HIGH(256)
   LDI R17,LOW (256)
   
   LDI R18,HIGH(256+256)
   LDI R19,LOW (256+256)

   ADD R17,R19
   ADC R16,R18
   

В итоге младший байт результата равен 0, а флаг Z сброшен. Поэтому корректнее фразу "...точнее младшие 8 бит результата" убрать.

Доброе время суток. Спасибо за что откликнулись.
По-поводу предложения. Это дополнения к обучалке, посвещены корректной обработке прерываний (с точки зрения сохранения контектса програмы), но обнаружилось что в обучалке достаточно слабо освещены флаги, поэтому в дополнения были введены некоторые "лирические отступления" кратко поясняющие что такое флаги и зачем они нужны. Если честно мне пока не приходилось иметь дело с двоично-десятичной коррекцией для архитектуры АВР, поэтому написать про флаг H я не смогу, да и желания особого нет.
По-поводу замечания На самом деле имелись ввиду операции с однобайтными операндами, т. е. результат сложения 255 и 1 в "обычной арифметике" будет 256, младшие 8 бит результата будут равны 0 (флаг Z установится), а старший (восьмой бит) будет равен 1, что и отражается во флаге переноса. Я хотел акцентировать внимание на том, что действительный результат операции может быть не равен 0, но флаг Z установится. Думаю следует оговориться что такое поведение флага справедливо для восьмибитных операций, для 16-ти битных операций (имею ввиду умножение) будет справедливо вышесказаное, но для младших 16 бит результата. Операции большей разрядности, думаю не имеет смысла рассматривать, поскольку все они раскладываются на 8 -ми либо (для умножения) 16-ти битные.

Вс янв 25, 2009 14:51:58

ARV, да, спасибо, это понятно.

Вс янв 25, 2009 15:07:34

john_rise писал(а):И я вовсе не претендую на Ваш:
ARV писал(а):...переход на нулевой адрес абсолютно не аналогичен аппаратному сбросу!

И кстати не обязательно "0"-адрес, уж как ни Вам лучше знать что там могут находиться вектора прерываний.
. . .
Кому нужно - применят, кому неподходит - пропустят мимо ушей. Ещё раз повторю - это программный сброс. И мой ответ прозвучал в основу вопроса:
Aheir писал(а):6. Вопрос:
Как можно перезапустить программно МК?
прежде всего, если вы собрались давать советы начинающим (т.е. априори неопытным), категорически недопустимо давать ошибочные или верные при определенных допущениях советы!

а теперь, отделим мух от котлет: сброс программы и программный сброс МК - вы считаете, это одно и то же? нет!

программный сброс МК - это сброс аппаратуры МК по инициативе программы. сборс программы - это перезапуск ее с самого начала.

переходом на нулевой адрес (кстати, векторы прерываний начинаются у AVR с памятью менее 64К не с нулевого адреса - и тут вы исказили истину) можно перезапустить программу, но аппаратная часть МК остается в прежнем состоянии! и хотя программа, как правило, начинается с того, что приводит в чувство периферию - это совсем не то же самое, что аппаратный сброс!!!

Пт апр 24, 2009 07:06:47

:) видимо из всех 224 человек скачавших файл, только у меня появилось желание как то автора поддержать.
Очень хорошо написано) Читать приятно, самое главное приближенно к новичкам, все описано на примерах, которые порой очень нужны обучающемуся.
Молодец, Smac)Так держать) кстати по поводу сохранения рабочих регистров в стек буквально недавно была дискуссия.

Пт апр 24, 2009 08:25:29

Aheir писал(а):13. Вопрос:
Как сделать длинную задержку на микроконтроллере AVR (час и больше)?
Ответ:
...
3. Если без таймеров и прерываний, то ничего иного, кроме как вложенные циклы, не придумать:

Код:
loop1:
   dec   r0
   brne  loop1
   dec   r1
   brne  loop1
   dec   r2
   brne  loop1
   dec   r3
   brne  loop1




А у товарища или может господина, как ему будет угодно, Ю.Ревича, в его замечательной книге "Практическое программирование микроконтроллеров Atmel AVR на языке ассемблера" на стр.104 (оч. рекомендую начинающим) это выглядит красивше:
Код:
Delay:
          subi Razr0,1
          sbci Razr1,0
          sbci Razr2,0
          brcc Delay


----------
* к сожелению в книге ошибка вместо команды sbci написана неизвестная для AVR-ов команда suci
Там (в смысле в книге) еще столько вкусного :idea:

Сб апр 25, 2009 04:31:18

ibiza11 писал(а):...
Молодец, Smac)Так держать) кстати по поводу сохранения рабочих регистров в стек буквально недавно была дискуссия.

Спасибо. В принципе статья сюда выложена была для оконательной правки, выявления недочетов. Далее было задумано поместить ее в обучалке, но что-то не видно. Наверное модераторы забыли, или времени нет. Кстати тему эту тоже не закрыли, хотя она была открыта на время для правки статьи.
А по поводу дискусси это мы с Вами как раз дискутировали, думаю там мы пришли к взаимопониманию, хотя и отклонились от собственно темы.
На этом флуд заканчиваю, единственное, что побудило меня написать пост - напомнить о помещении статьи в обучалку.

Вс апр 26, 2009 19:24:44

ДА помним мы все, сделаем:)

Пт июн 19, 2009 15:38:58

Вопрос:
Фузы ( fuse ) у микроконтроллеров AVR. Как их выставлять в разных программах? Мне встречались программы где они "странно" отмечаются, почему?


Ответ:
Поначалу выставлять фузы лучше по любезно представленным кем-то скриншотам той программы, которой вы собрались прошивать AVR.

Путаницы с fuse у AVR нет никакой.
В AVR fuse (фузы) - это конфигурационные биты.

Конфигурационные биты называемые FUSE перекочевали в AVR c более ранней микроэлектроники, где FUSE не были перезаписываемыми, как сейчас у AVR. И представляли просто расплавляемые перемычки.
Чтобы запрограммировать такой фуз необходимо было подать на него напряжение - логическую "1". После чего фуз расплавлялся.

И уже когда устройство с таким запрограммированным фузом запускалось, то при считывании своей конфигурации (проверке логических уровней "1" или "0", т.е. есть ток на этом фузе или нет)
на запрограммированном фузе (при программировании пережгли его) устройство получало логический "0".

Естественно напряжение для проверки фузов, соответствующее логической "1" в самом устройстве, фуз не расплавляло.
И на незапрограммированном фузе устройство получало логическую "1".

Если вы сами хотите запрограммировать фузы - вниматетльно читайте описание или нelp используемой программы, обычно там написано чему именно (указанию какие fuse-биты будут запрограммированы во время прошивки или значению fuse-битов после прошивки) соответствуют те или иные отметки при конфигурировании фузов у AVR.
Тема закрыта