Вопрос по обучалке "Микроконтроллеры AVR..."

Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее :)
Ответить
Аватара пользователя
ВофчеГ
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Пн фев 21, 2011 22:23:43

Вопрос по обучалке "Микроконтроллеры AVR..."

Сообщение ВофчеГ »

Приветсвую участников форума.
Заинтересовался тут микроконтроллерами, решил посмотреть на практике что да как.
Прочитал всю обучалку по микроконтроллерам AVR, купил ATtiny2313 т.к. AT90S2313 в продаже нигде уже нет. Спаял этот програматор и такой девайс для опытов только еще и с кнопками на портах D чтобы другие фишки посмотреть как работают. Код прошивки тоже из обучалки.
Для прошивки написал батник со след. содержимым:
d:\avr\avreal\avreal32.exe +tiny2313 -! -p1 -ab -o10Mhz -ew output\hexfile.hex -n
pause=null
Контроллер прошился, но нифига не заработало. Долго все перепроверял, потом чето решил попробовать поменять частоту. И прошил используя такое содержимое батника:
d:\avr\avreal\avreal32.exe +tiny2313 -! -p1 -ab -o1Mhz -ew output\hexfile.hex -n
pause=null
Все заработало.
Вобщем теперь какуюбы прошивку не лил, если шить с частотой отличной от 1Mhz, то ничего не работает. В чем может быть причина? Кварц стоит на 10Мhz, кондеры на 22пф, все спаяно строго по схеме из обучалки, да и в книгах также нарисовано.
Реклама
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Вопрос по обучалке "Микроконтроллеры AVR..."

Сообщение ploop »

Вобщем теперь какуюбы прошивку не лил, если шить с частотой отличной от 1Mhz, то ничего не работает. В чем может быть причина? Кварц стоит на 10Мhz, кондеры на 22пф, все спаяно строго по схеме из обучалки, да и в книгах также нарисовано.
Всё очень просто.
Настройки тактирования задаются битами конфигурации - фьюзами. ATtiny2313 с завода настроена на тактирование от внутреннего генератора на 8МГц (запрограммированы биты CKSEL0, CKSEL1, CKSEL3), а так же установлен бит деления частоты на 8 (CKDIV8). В итоге контроллер тактируется от 8МГц/8 = 1МГц.
Ноги, куда вы подпаяли кварц в этом случае работают как обычные порты ввода-вывода, кварц просто висит и не работает.

Чтобы запустить контроллер от кварца, вам надо установить правильную конфигурацию фьюзов. Но это дело опасное, хорошо, если переключите на внешнее тактирование (контроллер можно будет оживить внешним генератором), хуже если запретите внутрисхеммное программирование. Тогда его можно будет оживить только параллельным программатором.
Реклама
Аватара пользователя
ВофчеГ
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Пн фев 21, 2011 22:23:43

Re: Вопрос по обучалке "Микроконтроллеры AVR..."

Сообщение ВофчеГ »

ploop писал(а):В итоге контроллер тактируется от 8МГц/8 = 1МГц.
Ноги, куда вы подпаяли кварц в этом случае работают как обычные порты ввода-вывода, кварц просто висит и не работает.
Это радует. Спасибо.
Т.е. мне можно пока не заморачиваться, а даже убрать из схемы кварц и кондеры и работать от внутреннего генератора на 1МГц?
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Вопрос по обучалке "Микроконтроллеры AVR..."

Сообщение ploop »

В принципе да.
Или снять фьюз CKDIV8, тогда он будет работать на 8МГц тоже без кварца. А ноги, на которых кварц, можете для чего-нибудь использовать (светодиоды. кнопки и т.д.)
Реклама
Эиком - электронные компоненты и радиодетали
Arlleex
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

Re: Вопрос по обучалке "Микроконтроллеры AVR..."

Сообщение Arlleex »

Можно программно увеличить частоту синхронизиции МК.
Для этого нужно посмотреть даташит на регистр ВВ CLKPR - уже пробовал - увеличивается частота))
Не умеешь - не берись, но не взявшись не научишься...
Реклама
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Вопрос по обучалке "Микроконтроллеры AVR..."

Сообщение ploop »

Можно программно увеличить частоту синхронизиции МК.
Точнее - уменьшать :)
CLKPR - настройка предделителя. И фьюз CKDIV8 как раз устанавливает биты CLKPS0 и CLKPS1 в регистре CLKPR автоматом, что приводит к делению частоты на 8. Разумеется, можно это сделать программно, с некоторыми оговорками, которые описаны в даташите.
Реклама
Аватара пользователя
ВофчеГ
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Пн фев 21, 2011 22:23:43

Re: Вопрос по обучалке "Микроконтроллеры AVR..."

Сообщение ВофчеГ »

ploop писал(а):В принципе да.
Или снять фьюз CKDIV8, тогда он будет работать на 8МГц тоже без кварца. А ноги, на которых кварц, можете для чего-нибудь использовать (светодиоды. кнопки и т.д.)
Это интересно. А как к ним обращаться в таком случае? когда с портами ввода-вывода там все ясно (например PORTB.1 или PIND.3)
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Вопрос по обучалке "Микроконтроллеры AVR..."

Сообщение ploop »

Точно так же. Только это будет порт A (PORTA, PINA, DDRA и т.д.) В даташите указывается как PA0 и PA1

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

Re: Вопрос по обучалке "Микроконтроллеры AVR..."

Сообщение ploop »

Вообще, все выводы, обозначенные на "P" можно использовать как порты ввода-вывода, даже reset. Но в последнем случае контроллер нельзя будет программировать последовательным программатором. Зато все ноги, кроме питания, в твоём распоряжении.
Аватара пользователя
ВофчеГ
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Пн фев 21, 2011 22:23:43

Re: Вопрос по обучалке "Микроконтроллеры AVR..."

Сообщение ВофчеГ »

Спасибо за пояснения. А то даташит для меня пока что темный лес.
JeikiS
Родился
Сообщения: 6
Зарегистрирован: Ср июн 29, 2011 08:22:05

Re: Вопрос по обучалке "Микроконтроллеры AVR..."

Сообщение JeikiS »

Доброго времени суток, уважаемые радиокоты! о/

Подниму эту тему, потому как другой темы по этой обучалке поиск не показал :-/

с некоторых пор балуюсь микроконтроллерами фирмы атмел, начал с ардуино, потом писал немного на Сях всякие простенькие РГБ-мигалки... кое-что повторял...
вобщем как фтыкать программатор и откомпилировать хекс, да какие фьюзы лучше выставить я разобрался...

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

первоначально возник вопрос по стеку из этой статьи:
Дело в том, что в контроллере 2313 разрядность адреса ОЗУ не превышает 8 бит. Значит, и указатель стека должен быть 8-битным. Для его хранения, соответственно, используется один 8-битный регистр. У некоторых других контроллеров объем ОЗУ больше, и для его адресации используют два 8-битных регистра. Соответственно, младшие разряды указателя стека в таком случае будут храниться в регистре SPL, а старшие - в SPH (Stack Pointer High). В целях унификации кода для всех контроллеров, в 2313 у SPL оставили на конце букву L, хотя никакого SPH в данном контроллере нет и быть не может.
я использую контроллер Atmega8A, но в его даташите указано примерно тоже самое, если я правильно понимаю ангельские иероглифы:
The AVR Stack Pointer is implemented as two 8-bit registers in the I/O space. The number of
bits actually used is implementation dependent. Note that the data space in some implementa-tions of the AVR architecture is so small that only SPL is needed. In this case, the SPH Register will not be present.
не совсем понятно как может адрес в ОЗУ размещаться в 8-ми битах? ведь 8 бит это от 0 до 255, но у нас же памяти не 255 байт?
или всетаки это актуально только для 2313 у которого 127 байт рама? а в атмеге8а при 1 килобайте уже используется SPH?

опять же, вопрос по регистрам из этой статьи:
Итак, как вы помните, в нашем контроллере 16 РОН (регистров общего назначения): R16…R31. С любым из них мы можем сделать все что угодно. Просто полная анархия! Однако, я бы не рекомендовал злоупотреблять количеством используемых регистров. Это очень усложняет процесс написания программы. Я обычно использую 4 или 5 регистров - только самое необходимое в данный момент. Остальное - в оперативке (ОЗУ).
хотя в даташите(как на 2313, так и на атмега8) четко указано:
32 x 8 General Purpose Working Registers
так что же случилось с первыми 16-ю регистрами?

Следующий вопрос по прерываниям и переходами по ним:
Interrupt Vectors - это ни что иное, как указатели на адрес ПЗУ, на который мы переходим в результате прерывания. Все векторы расположены в самом начале адресного пространства, и занимают первые 11 адресов ПЗУ (с $000 по $00A). Это прекрасно видно из таблицы. То есть, если мы, скажем, хотим активизировать прерывание Timer1_comp1, то мы должны по адресу $004 поставить ссылку на подпрограмму - обработчик этого прерывания. А вообще, лучше расставить в начале программы ссылки на все прерывания. Так как эти команды стоят в самом начале программы, значит они как раз таки будут расположены в ПЗУ по первым 11-ти адресам. Таким образом, при каждом прерывании, будет вызываться соответствующий обработчик.
но ведь в начале программы у нас в этих адресах были другие команды... почему они не выполнялись постоянно по прерыванию?


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

Re: Вопрос по обучалке "Микроконтроллеры AVR..."

Сообщение ploop »

не совсем понятно как может адрес в ОЗУ размещаться в 8-ми битах? ведь 8 бит это от 0 до 255, но у нас же памяти не 255 байт?
или всетаки это актуально только для 2313 у которого 127 байт рама? а в атмеге8а при 1 килобайте уже используется SPH?
Именно так. Для 2313 нет смысла использовать двухбайтный указатель, а вот для других используется.
так что же случилось с первыми 16-ю регистрами?
Первые 16 регистров немного урезаны. В частности с ними нельзя использовать операции с константами. Например загрузить константу в регистр R16 можно командой "LDI R16, значение", а вот "LDI R15, значение" уже не получится. А так да, они есть, и ими тоже можно успешно пользоваться.
но ведь в начале программы у нас в этих адресах были другие команды... почему они не выполнялись постоянно по прерыванию?
Потому, что прерывания были отключены, так что по этим адресам вполне можно размещать любой другой код или данные.
Хотя в нормальных программах так не делают, но для обучения вполне сгодится.
JeikiS
Родился
Сообщения: 6
Зарегистрирован: Ср июн 29, 2011 08:22:05

Re: Вопрос по обучалке "Микроконтроллеры AVR..."

Сообщение JeikiS »

ploop писал(а): Именно так. Для 2313 нет смысла использовать двухбайтный указатель, а вот для других используется.
:) а почему тогда в даташите на атмега8а(стр.11) пишут:
Note that the data space in some implementa-tions of the AVR architecture is so small that only SPL is needed. In this case, the SPH Register
will not be present.
еще вопрос про стек: автор пишет, что стек движется от большего к меньшему и стекпоинтер надо распологать в конечной ячейке памяти, а в даташите написано:
Initial Stack Pointer value equals the last address of the
internal SRAM and the Stack Pointer must be set to point above start of the SRAM
если я правельно понимаю ангельский, то стекпоинтер изначально находится на последней ячейке памяти и нужно его разместить выше начала рама... немогу уразуметь что здесь имеется ввиду и куда мне, всетаки, стекпоинтер устанавливать?
ploop писал(а): Первые 16 регистров немного урезаны. В частности с ними нельзя использовать операции с константами. Например загрузить константу в регистр R16 можно командой "LDI R16, значение", а вот "LDI R15, значение" уже не получится. А так да, они есть, и ими тоже можно успешно пользоваться.
тоесть, получается, чтоб загрузить константу в R01 надо:

Код: Выделить всё

LDI R16, значение
mov R01, R16
верно?
ploop писал(а): Потому, что прерывания были отключены, так что по этим адресам вполне можно размещать любой другой код или данные.
Хотя в нормальных программах так не делают, но для обучения вполне сгодится.
получается, что при том или ином использовании прерываний у меня обязательно в любой программе должны в начале стоять джампы на обработку прерывания либо NOPы? или компилятор сам разрулит эту ситуацию?(заполнит нопами)


благодарю, за скорый отзыв.
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Вопрос по обучалке "Микроконтроллеры AVR..."

Сообщение Engineer_Keen »

JeikiS писал(а): In this case, the SPH Register will not be present.
Это просто общий текст для всех AVR контроллеров.
JeikiS писал(а): еще вопрос про стек:
Не "изначально находится", а "эквивалентен" последнему адресу ОЗУ.
Выше начала ОЗУ, потому что он растет вниз, и если его разместить ниже, то он при работе залезет в область регистров В/В. Поэтому обычно берут максимальный вариант - последнюю ячейку ОЗУ.
JeikiS писал(а): верно?
да
JeikiS писал(а): получается, что при том или ином использовании прерываний у меня обязательно в любой программе должны в начале стоять джампы на обработку прерывания либо NOPы? или компилятор сам разрулит эту ситуацию?(заполнит нопами)
Существуют разные варианты. Можно ставить вместо них RETI. Можно ставить RJMP-ы например на сброс - так делают Си-компиляторы, получается что если программа попала на этот вектор, значит это ошибка и контроллер сбросится. Можно использовать незанятые векторы для своих команд (экономия флеша), но с умом, чтобы после их выполнения не улететь в обработчик прерывания, или еще куда...
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Вопрос по обучалке "Микроконтроллеры AVR..."

Сообщение ploop »

Note that the data space in some implementa-tions of the AVR architecture is so small that only SPL is needed. In this case, the SPH Register
will not be present.
Не вижу противоречий.
Почти дословный перевод:
"Обратите внимание, что ОЗУ в некоторых реализациях AVR-архитектуры на столько мала, что требуется только регистр SPL. В этом случае регистр SPH будет недоступен"
немогу уразуметь что здесь имеется ввиду и куда мне, всетаки, стекпоинтер устанавливать?
А куда угодно в адресном пространстве ОЗУ. Хоть в середине. Но смысла размещать его не в последнем адресе не вижу никакого. Если указатель стека заедет на ячейки, где вы храните какие-то данные или переменные, получите такой классный глюк, что отлавливать его придётся долго.
тоесть, получается, чтоб загрузить константу в R01 надо:
Да, по другому никак.
получается, что при том или ином использовании прерываний у меня обязательно в любой программе должны в начале стоять джампы на обработку прерывания либо NOPы? или компилятор сам разрулит эту ситуацию?(заполнит нопами)
Если вы используете компилятор ЯВУ - просто забудьте о них. Это относится только к написанию программ на ассемблере, где каждая команда потом тупо заменяется её числовым кодом (а метки - адресом), и всё заливается в МК как есть. Тут программист контролирует всё, каждый такт, каждый переход. Однако, не смотря на кажущуюся сложность, это не мешает разрабатывать быстрые и надёжные программы на ассемблере, просто времени уходит немного больше.
---
добавлю:
По этим адресам можно что угодно размещать, хоть код. Например, используется прерывание по совпадению таймера. Следующее не используется (вектор за ним не работает). Можно в первое засунуть инверсию какой-нибудь ноги, а в следующем - RETI. При этом, не используя лишний прыжок, можно получить на ноге программный меандр сэкономив 4 такта, т.е. гораздо выше частотой.
Это плохой стиль написания программы, скорее - хак, доступный только на ассемблере, но для общего понимания полезен.
JeikiS
Родился
Сообщения: 6
Зарегистрирован: Ср июн 29, 2011 08:22:05

Re: Вопрос по обучалке "Микроконтроллеры AVR..."

Сообщение JeikiS »

благодарю за ваши ответы.
Буду разбираться дальше, если будут возникать вопросы, то теперь знаю куда обращаться за квалифицированной помощью :)

зы. а простенькие програмки на асме уже работают :)
Ответить

Вернуться в «Теория»