Atmega162
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Atmega162
что делать-то? С++ компилировать или простого С достаточно?
С++ лучше применять в комплекте с Eclipse, а простой С можно и с AVR Studio - именно об этой студии я и говорил. С нею все просто: установили WinAVR, запустили студию и создали новый проект AVR GCC - все. после этого можете добавлять файлы исходников, редактировать их и т.п.
про WinAVR на форуме есть отдельная тема, про AVR Studio, по-моему, тоже.
С++ лучше применять в комплекте с Eclipse, а простой С можно и с AVR Studio - именно об этой студии я и говорил. С нею все просто: установили WinAVR, запустили студию и создали новый проект AVR GCC - все. после этого можете добавлять файлы исходников, редактировать их и т.п.
про WinAVR на форуме есть отдельная тема, про AVR Studio, по-моему, тоже.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
-
SII
- Вымогатель припоя
- Сообщения: 635
- Зарегистрирован: Пт янв 30, 2009 14:50:35
- Откуда: Солнечногорск
Re: Atmega162
GP1 писал(а):SII писал(а): один раз написать таблицу переходов с командами jmp (именно ими -- rjmp имеет меньший размер)
Один раз не получится полюбому
1. у tiny нет команды jmp
2. а у младших mega вектора переходов однословные, а jmp занимает 2 слова
так что вот как-то так, плавно перетекаем к правилам написания векторов, описанных в предыдущем посте
Абсолютно не согласен с Вами. Программа пишется под конкретную задачу и должна работать на конкретном контроллере, а не на абы каком, а посему этих проблем попросту нет: таблица прерываний пишется именно под этот контроллер. Если же всё-таки потребуется "переезд" (что при серийном производстве маловероятно хотя б из экономических соображений), то написать новую таблицу векторов никакой проблемы не составит, лишь бы остальная часть кода была портабельной (ну а то, для чего нужна как минимум атмега-162, уж точно на тиньке работать не будет никоим образом -- не влезет попросту).
указал случайно, например, неверное имя вектора
как можно указать неправильное имя вектора при копи-пастном методе, необходимые имена тупо копируются из def* файла.
Ну так тупо скопировать неправильно можно всегда. Поэтому сия проблема остаётся при любом методе определения таблицы прерываний.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Atmega162
вот именно такой подход и порождает мифы о чрезвычайной трудоемкости разработки и плохой портируемости (даже в пределах одного семейства!) программ на ассемблере.SII писал(а):Абсолютно не согласен с Вами. Программа пишется под конкретную задачу и должна работать на конкретном контроллере, а не на абы каком, а посему этих проблем попросту нет: таблица прерываний пишется именно под этот контроллер. Если же всё-таки потребуется "переезд" (что при серийном производстве маловероятно хотя б из экономических соображений), то написать новую таблицу векторов никакой проблемы не составит, лишь бы остальная часть кода была портабельной
вместо того, чтобы делать ПРАВИЛЬНО ищутся аргументы в пользу НЕПРАВИЛЬНОГО подхода...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
SII
- Вымогатель припоя
- Сообщения: 635
- Зарегистрирован: Пт янв 30, 2009 14:50:35
- Откуда: Солнечногорск
Re: Atmega162
Извините, бред. Если моя программа занимает около 12 килобайт программной памяти и поряда 900 байт оперативной, использует аналоговый компаратор, два 16-разрядных таймера и 33 ноги для обмена информацией с внешним миром, её ну никак не перенесёшь не только на тиньку, но и на целый ряд других контроллеров того же семейства.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Atmega162
свое мнение я высказывал уже не раз - на счет правильного и неправильного подхода к программированию на ассемблере. считать его бредом или нет - дело ваше, ибо я так же ранее говорил о том, что ежели кому-то нравится чистить зубы через задний проход - это его личное дело, но большинству удобнее делать это через рот.
P.S. ну кто б меня держал за руку, чтобы я больше никогда не встрявал в обсуждение "стиля оформления таблицы векторов"?!
P.S. ну кто б меня держал за руку, чтобы я больше никогда не встрявал в обсуждение "стиля оформления таблицы векторов"?!

если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
-
SII
- Вымогатель припоя
- Сообщения: 635
- Зарегистрирован: Пт янв 30, 2009 14:50:35
- Откуда: Солнечногорск
Re: Atmega162
И Ваш стиль, и мой без должной внимательности благополучно могут привести к проблемам, ну а с внимательностью -- не приведут (кстати говоря, простой копипастинг "моей" таблицы векторов из одного проекта в другой, предназначенный для того же микроконтроллера, проблем не вызовет в принципе, они могут возникнуть лишь при изменении имён обработчиков, а от этого никакой стиль не спасёт: по пьяной лавочке имя обработчика А можно вписать в вектор Б, и транслятору по очевидным причинам это будет абсолютно пофиг). Поэтому никакой стиль панацеей от всех бед не является и являться не может. Точно так же никакой стиль не обеспечит гарантированную переносимость программ даже на языке высокого уровня -- мало ли какие привязки к конкретному железу имеются. Но "моя" таблица мне нравится куда больше Вашей по той причине, что у меня гарантированно определены все векторы, причём именно в том порядке, в каком они располагаются в памяти. Мне это значительно удобнее, да и отлаживать на самом деле легче: если поставить брякпоинт на общий для всех незадействованных векторов reti, можно увидеть, не возникают ли какие непредусмотренные прерывания (мало ли, где-то допустил ляп и разрешил прерывание не от того устройства, от которого требуется). При Вашем подходе такое левое прерывание поймать проблематично: вектор-то для него не определён.
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Atmega162
SII писал(а):...вектор-то для него не определён.
в железе этого не выловить никак, а в симуляторе будет выдано сообщение что-то типа такого: "ссылка на незапрограммированную область".
-
SII
- Вымогатель припоя
- Сообщения: 635
- Зарегистрирован: Пт янв 30, 2009 14:50:35
- Откуда: Солнечногорск
Re: Atmega162
Угу, но с "моей" системой очень даже можно выловить под отладчиком. У меня же для всех незадействованных векторов выполняется переход на общую метку (_IRQ), где стоит iret. Если на этот iret поставить точку останова, прерывание будет поймано, ну а дальше уже рутина: смотри регистры устройств да разбирайся, откуда прерывание взялось. Ну а симулятор... Далеко не всё и не всегда на нём проверить, да и отладку на реальном железе он не заменяет.
-
Archangel089
- Родился
- Сообщения: 12
- Зарегистрирован: Ср июл 21, 2010 23:04:18
- Откуда: Петропавловск-Камчатский
Re: Atmega162
Вот вы спорите-спорите.... а объясните мне, что это вообще за ругательство такое-таблица прерывания?
Приветствую прямые ссылки. Ибо Internet на камчатке не из дешевых....
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
-
SII
- Вымогатель припоя
- Сообщения: 635
- Зарегистрирован: Пт янв 30, 2009 14:50:35
- Откуда: Солнечногорск
Re: Atmega162
Archangel089
Иногда с процессором (в частности, с тем, который входит в состав микроконтроллера) происходят некие внешние по отношению к нему события. Например, на процессор подают питающее напряжение, и он должен начать работу, или там нажимают кнопку сброса, или срабатывает таймер... ну и т.д. Такие внешние события должны прервать выполнение программы, которая сейчас выполняется (ну, кроме включения питания, понятное дело -- пока питания нет, ничего выполняться не может
), и вызвать программу, предназначенную специально для обработки данного события. Например, включение питания или нажатие кнопки сброса вызывает обработчик сброса, который подготавливает контроллер к работе и запускает рабочую программу (ту, которая крутится всё время, пока контроллер работает). Так вот, вектором прерывания называют определённую ячейку памяти, в которой (в случае ATmega) находится первая команда обработчика того или иного вида прерывания, ну а таблица векторов -- это просто сборище всех этих ячеек, где находятся первые команды каждого вектора. На ATmega'х таблица векторов располагается в памяти программы с нулевого адреса. В моём примере она заполнена командами jmp, выполняющими переход на собственно обработчики конкретных прерываний, но, поскольку пример жутко примитивный, реально используется только вектор сброса -- он является самым первым, и его команда jmp находится по нулевому адресу.
Все остальные jmp ведут на метку _IRQ, по которой у меня расположена команда reti -- возврат из прерывания. В принципе, все эти векторы, кроме нулевого (сброса) в мигалке можно было бы и не заполнять, поскольку никакие другие прерывания не используются, но я предпочитаю сразу заполнять всю таблицу, чтобы потом просто корректировать имена обработчиков, если надо. Ну а в комментариях у меня указано, какой вектор какому прерыванию соответствует.
Как, надо полагать, Вы уже поняли из нашего спора, таблица векторов прерываний выглядит по-разному на различных микроконтроллерах даже одного семейства (ATmega в данном случае). Эта таблица -- именно для атмеги-162, для другого микроконтроллера она будет выглядеть по-другому, хотя общие принципы остаются неизменными. Точный формат таблицы векторов приводится в руководстве ("даташите" -- datasheet) на конкретный контроллер, так что, если сколько-нибудь серьёзно собираетесь разбираться с этим делом, его скачать нужно обязательно.
Вот вы спорите-спорите.... а объясните мне, что это вообще за ругательство такое-таблица прерывания?
Иногда с процессором (в частности, с тем, который входит в состав микроконтроллера) происходят некие внешние по отношению к нему события. Например, на процессор подают питающее напряжение, и он должен начать работу, или там нажимают кнопку сброса, или срабатывает таймер... ну и т.д. Такие внешние события должны прервать выполнение программы, которая сейчас выполняется (ну, кроме включения питания, понятное дело -- пока питания нет, ничего выполняться не может
Код: Выделить всё
.CSEG
.ORG 0
; =======================
;
; Таблица векторов прерываний
;
; =======================
jmp Reset ; Сброс, включение питания, сторожевой таймер
jmp _IRQ ; Внешнее прерывание INT0
jmp _IRQ ; Внешнее прерывание INT1
jmp _IRQ ; Внешнее прерывание INT2
jmp _IRQ ; Pin Change Interrupt Request 0
jmp _IRQ ; Pin Change Interrupt Request 1
jmp _IRQ ; Timer/Counter3 Capture Event
jmp _IRQ ; Timer/Counter3 Compare Match A
jmp _IRQ ; Timer/Counter3 Compare Match B
jmp _IRQ ; Timer/Counter3 Overflow
jmp _IRQ ; Timer/Counter2 Compare Match
jmp _IRQ ; Timer/Counter2 Overflow
jmp _IRQ ; Timer/Counter1 Capture Event
jmp _IRQ ; Timer/Counter1 Compare Match A
jmp _IRQ ; Timer/Counter1 Compare Match B
jmp _IRQ ; Timer/Counter1 Overflow
jmp _IRQ ; Timer/Counter0 Compare Match
jmp _IRQ ; Timer/Counter0 Overflow
jmp _IRQ ; Serial Transfer Complete
jmp _IRQ ; USART0, Rx Complete
jmp _IRQ ; USART1, Rx Complete
jmp _IRQ ; USART0 Data Register Empty
jmp _IRQ ; USART1 Data Register Empty
jmp _IRQ ; USART0, Tx Complete
jmp _IRQ ; USART1, Tx Complete
jmp _IRQ ; EEPROM Ready
jmp _IRQ ; Analog Comparator
jmp _IRQ ; Store Program Memory Ready
_IRQ: retiВсе остальные jmp ведут на метку _IRQ, по которой у меня расположена команда reti -- возврат из прерывания. В принципе, все эти векторы, кроме нулевого (сброса) в мигалке можно было бы и не заполнять, поскольку никакие другие прерывания не используются, но я предпочитаю сразу заполнять всю таблицу, чтобы потом просто корректировать имена обработчиков, если надо. Ну а в комментариях у меня указано, какой вектор какому прерыванию соответствует.
Как, надо полагать, Вы уже поняли из нашего спора, таблица векторов прерываний выглядит по-разному на различных микроконтроллерах даже одного семейства (ATmega в данном случае). Эта таблица -- именно для атмеги-162, для другого микроконтроллера она будет выглядеть по-другому, хотя общие принципы остаются неизменными. Точный формат таблицы векторов приводится в руководстве ("даташите" -- datasheet) на конкретный контроллер, так что, если сколько-нибудь серьёзно собираетесь разбираться с этим делом, его скачать нужно обязательно.
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Atmega162
Archangel089 послушай нас и не делай таблицу векторов как у SII, потом спасибо нам скажешь.
Учись писать сразу правильно, я бы даже сказал - красиво, переучиваться гораздо сложнее.
Учись писать сразу правильно, я бы даже сказал - красиво, переучиваться гораздо сложнее.
-
SII
- Вымогатель припоя
- Сообщения: 635
- Зарегистрирован: Пт янв 30, 2009 14:50:35
- Откуда: Солнечногорск
Re: Atmega162
Пишите, как больше нравится -- подводные камни существуют в обоих подходах (ИМХО, в подходе ARV и GP1 их больше -- там даже не видно, что таблица векторов -- это таблица, но не суть). Но всегда помните, что неверное определение векторов -- одна из основных причин, почему код не работает вообще (неверно определён вектор сброса) или работает, но не обрабатывает правильно какие-то события (неверно определены векторы соответствующих прерываний). Ну а значит, во-первых, внимательно формируйте таблицу прерываний, а во-вторых, при возникновении подобных проблем в первую очередь проверьте её.
- Antosha079
- Родился
- Сообщения: 6
- Зарегистрирован: Вс май 02, 2010 19:23:55
- Откуда: Харьков
Re: Atmega162
Если кто сталкивался подскажите пожалуйста Почему AVR910 невидит ATMEGA8515, ATMEGA162, а STK200 видит?
До этого AVR910 шил mega8, tiny2313, tiny13, tiny45, mega8535.
И еще, я гдето читал что можна както "подтолкнуть" МК и AVR910 их увидит, но к сожалению уже найти этого немогу
Заранее блаодарен
До этого AVR910 шил mega8, tiny2313, tiny13, tiny45, mega8535.
И еще, я гдето читал что можна както "подтолкнуть" МК и AVR910 их увидит, но к сожалению уже найти этого немогу
Заранее блаодарен
Re: Atmega162
Программа пишется под конкретную задачу и должна работать на конкретном контроллере, а не на абы каком, а посему этих проблем попросту нет: таблица прерываний пишется именно под этот контроллер.
+100.
Это аппаратное программирование, товарищи. Программа пишется под совершенно конкретное железо в совершенно конкретном проекте. Поэтому все разговоры о совместимости/переносимости - скорее чисто теоретические, и к жизни не имеют никакого отношения. Тут совместимость и переносимость никого не волнует, ибо другой проект - другое железо - другая программа. А если железо то же самое, то это тот же проект. И программа, естесственно, покатит та же. Да, такой подход приводит в изумление прикладников, но надо понимать, что мы пишем не игрушку, которая должна работать на любой кофеварке и тем самым приносить прибыль создателям, а программу, которая управляет отдельно взятой системой.
Вообще, именно нездоровое желание впихнуть в новый проект как можно больше кода из всех предыдущих (навеянное нездоровым влиянием современных ЯВУ) чаще всего порождает большую часть глюков. Для каждого проекта должна писаться своя программа, оптимизированная именно под целевое железо. Конечно, это не исключает возможности использования отдельных участков уже имеющегося кода, однако это должны быть именно отдельные участки, а не половина программы. А иначе получаются такие системы, на которые ругался тов. Brigadir - опрашивающие десять датчиков за пятнадцать минут и вылетающие каждые полчаса. И докажи потом человеку, что это не есть недостаток контроллеров вообще, а исключительно проблема программы и инженеров, ее писавших. И что, будь она нормально написана, все работало бы молниеносно и надежно.
По этим же причинам я всегда стараюсь свести использование бибилиотек к минимуму.
... с "моей" системой очень даже можно выловить под отладчиком. У меня же для всех незадействованных векторов выполняется переход на общую метку (_IRQ), где стоит iret. Если на этот iret поставить точку останова, прерывание будет поймано, ну а дальше уже рутина: смотри регистры устройств да разбирайся, откуда прерывание взялось.
+1.
Именно в таком стиле и именно этим методом нами с другом был отлажен один из совместных проектов. А вот как отловить "левое" прерывание при написании в "правильном" стиле?
там даже не видно, что таблица векторов -- это таблица
+100.
Написание в стиле Обучалки (и официального даташита, кстати) наиболее соответствует расположению кода в памяти, а потому более удобочитаемо в контексте рассмотрения аппаратных средств.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
- Antosha079
- Родился
- Сообщения: 6
- Зарегистрирован: Вс май 02, 2010 19:23:55
- Откуда: Харьков
Re: Atmega162
Уже разобрался. В дорожке на плате царапина образовалась, вот сигнал и непроходил. 




