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