Atmega162

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Atmega162

Сообщение ARV »

что делать-то? С++ компилировать или простого С достаточно?

С++ лучше применять в комплекте с Eclipse, а простой С можно и с AVR Studio - именно об этой студии я и говорил. С нею все просто: установили WinAVR, запустили студию и создали новый проект AVR GCC - все. после этого можете добавлять файлы исходников, редактировать их и т.п.

про WinAVR на форуме есть отдельная тема, про AVR Studio, по-моему, тоже.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Re: Atmega162

Сообщение SII »

GP1 писал(а):
SII писал(а): один раз написать таблицу переходов с командами jmp (именно ими -- rjmp имеет меньший размер)


Один раз не получится полюбому
1. у tiny нет команды jmp
2. а у младших mega вектора переходов однословные, а jmp занимает 2 слова
так что вот как-то так, плавно перетекаем к правилам написания векторов, описанных в предыдущем посте :tea:


Абсолютно не согласен с Вами. Программа пишется под конкретную задачу и должна работать на конкретном контроллере, а не на абы каком, а посему этих проблем попросту нет: таблица прерываний пишется именно под этот контроллер. Если же всё-таки потребуется "переезд" (что при серийном производстве маловероятно хотя б из экономических соображений), то написать новую таблицу векторов никакой проблемы не составит, лишь бы остальная часть кода была портабельной (ну а то, для чего нужна как минимум атмега-162, уж точно на тиньке работать не будет никоим образом -- не влезет попросту).

указал случайно, например, неверное имя вектора

как можно указать неправильное имя вектора при копи-пастном методе, необходимые имена тупо копируются из def* файла.


Ну так тупо скопировать неправильно можно всегда. Поэтому сия проблема остаётся при любом методе определения таблицы прерываний.
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Atmega162

Сообщение ARV »

SII писал(а):Абсолютно не согласен с Вами. Программа пишется под конкретную задачу и должна работать на конкретном контроллере, а не на абы каком, а посему этих проблем попросту нет: таблица прерываний пишется именно под этот контроллер. Если же всё-таки потребуется "переезд" (что при серийном производстве маловероятно хотя б из экономических соображений), то написать новую таблицу векторов никакой проблемы не составит, лишь бы остальная часть кода была портабельной
вот именно такой подход и порождает мифы о чрезвычайной трудоемкости разработки и плохой портируемости (даже в пределах одного семейства!) программ на ассемблере.
вместо того, чтобы делать ПРАВИЛЬНО ищутся аргументы в пользу НЕПРАВИЛЬНОГО подхода...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Re: Atmega162

Сообщение SII »

Извините, бред. Если моя программа занимает около 12 килобайт программной памяти и поряда 900 байт оперативной, использует аналоговый компаратор, два 16-разрядных таймера и 33 ноги для обмена информацией с внешним миром, её ну никак не перенесёшь не только на тиньку, но и на целый ряд других контроллеров того же семейства.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Atmega162

Сообщение ARV »

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

P.S. ну кто б меня держал за руку, чтобы я больше никогда не встрявал в обсуждение "стиля оформления таблицы векторов"?! :kill:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Re: Atmega162

Сообщение SII »

И Ваш стиль, и мой без должной внимательности благополучно могут привести к проблемам, ну а с внимательностью -- не приведут (кстати говоря, простой копипастинг "моей" таблицы векторов из одного проекта в другой, предназначенный для того же микроконтроллера, проблем не вызовет в принципе, они могут возникнуть лишь при изменении имён обработчиков, а от этого никакой стиль не спасёт: по пьяной лавочке имя обработчика А можно вписать в вектор Б, и транслятору по очевидным причинам это будет абсолютно пофиг). Поэтому никакой стиль панацеей от всех бед не является и являться не может. Точно так же никакой стиль не обеспечит гарантированную переносимость программ даже на языке высокого уровня -- мало ли какие привязки к конкретному железу имеются. Но "моя" таблица мне нравится куда больше Вашей по той причине, что у меня гарантированно определены все векторы, причём именно в том порядке, в каком они располагаются в памяти. Мне это значительно удобнее, да и отлаживать на самом деле легче: если поставить брякпоинт на общий для всех незадействованных векторов reti, можно увидеть, не возникают ли какие непредусмотренные прерывания (мало ли, где-то допустил ляп и разрешил прерывание не от того устройства, от которого требуется). При Вашем подходе такое левое прерывание поймать проблематично: вектор-то для него не определён.
Реклама
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Re: Atmega162

Сообщение GP1 »

SII писал(а):...вектор-то для него не определён.

в железе этого не выловить никак, а в симуляторе будет выдано сообщение что-то типа такого: "ссылка на незапрограммированную область".
Чем дальше, тем больше становлюсь занудой...
Изображение
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Re: Atmega162

Сообщение SII »

Угу, но с "моей" системой очень даже можно выловить под отладчиком. У меня же для всех незадействованных векторов выполняется переход на общую метку (_IRQ), где стоит iret. Если на этот iret поставить точку останова, прерывание будет поймано, ну а дальше уже рутина: смотри регистры устройств да разбирайся, откуда прерывание взялось. Ну а симулятор... Далеко не всё и не всегда на нём проверить, да и отладку на реальном железе он не заменяет.
Archangel089
Родился
Сообщения: 12
Зарегистрирован: Ср июл 21, 2010 23:04:18
Откуда: Петропавловск-Камчатский

Re: Atmega162

Сообщение Archangel089 »

Вот вы спорите-спорите.... а объясните мне, что это вообще за ругательство такое-таблица прерывания?
Приветствую прямые ссылки. Ибо Internet на камчатке не из дешевых....
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Re: Atmega162

Сообщение GP1 »

для твоего мк вот:
Вложения
вектора.jpg
(73.43 КБ) 643 скачивания
Чем дальше, тем больше становлюсь занудой...
Изображение
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Re: Atmega162

Сообщение SII »

Archangel089
Вот вы спорите-спорите.... а объясните мне, что это вообще за ругательство такое-таблица прерывания?


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

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

        .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

Сообщение GP1 »

Archangel089 послушай нас и не делай таблицу векторов как у SII, потом спасибо нам скажешь.
Учись писать сразу правильно, я бы даже сказал - красиво, переучиваться гораздо сложнее.
Чем дальше, тем больше становлюсь занудой...
Изображение
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Re: Atmega162

Сообщение SII »

Пишите, как больше нравится -- подводные камни существуют в обоих подходах (ИМХО, в подходе ARV и GP1 их больше -- там даже не видно, что таблица векторов -- это таблица, но не суть). Но всегда помните, что неверное определение векторов -- одна из основных причин, почему код не работает вообще (неверно определён вектор сброса) или работает, но не обрабатывает правильно какие-то события (неверно определены векторы соответствующих прерываний). Ну а значит, во-первых, внимательно формируйте таблицу прерываний, а во-вторых, при возникновении подобных проблем в первую очередь проверьте её.
Аватара пользователя
Antosha079
Родился
Сообщения: 6
Зарегистрирован: Вс май 02, 2010 19:23:55
Откуда: Харьков

Re: Atmega162

Сообщение Antosha079 »

Если кто сталкивался подскажите пожалуйста Почему AVR910 невидит ATMEGA8515, ATMEGA162, а STK200 видит? :shock:

До этого AVR910 шил mega8, tiny2313, tiny13, tiny45, mega8535.

И еще, я гдето читал что можна както "подтолкнуть" МК и AVR910 их увидит, но к сожалению уже найти этого немогу :cry:

Заранее блаодарен
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Atmega162

Сообщение YS »

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


+100.

Это аппаратное программирование, товарищи. Программа пишется под совершенно конкретное железо в совершенно конкретном проекте. Поэтому все разговоры о совместимости/переносимости - скорее чисто теоретические, и к жизни не имеют никакого отношения. Тут совместимость и переносимость никого не волнует, ибо другой проект - другое железо - другая программа. А если железо то же самое, то это тот же проект. И программа, естесственно, покатит та же. Да, такой подход приводит в изумление прикладников, но надо понимать, что мы пишем не игрушку, которая должна работать на любой кофеварке и тем самым приносить прибыль создателям, а программу, которая управляет отдельно взятой системой.

Вообще, именно нездоровое желание впихнуть в новый проект как можно больше кода из всех предыдущих (навеянное нездоровым влиянием современных ЯВУ) чаще всего порождает большую часть глюков. Для каждого проекта должна писаться своя программа, оптимизированная именно под целевое железо. Конечно, это не исключает возможности использования отдельных участков уже имеющегося кода, однако это должны быть именно отдельные участки, а не половина программы. А иначе получаются такие системы, на которые ругался тов. Brigadir - опрашивающие десять датчиков за пятнадцать минут и вылетающие каждые полчаса. И докажи потом человеку, что это не есть недостаток контроллеров вообще, а исключительно проблема программы и инженеров, ее писавших. И что, будь она нормально написана, все работало бы молниеносно и надежно.

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

... с "моей" системой очень даже можно выловить под отладчиком. У меня же для всех незадействованных векторов выполняется переход на общую метку (_IRQ), где стоит iret. Если на этот iret поставить точку останова, прерывание будет поймано, ну а дальше уже рутина: смотри регистры устройств да разбирайся, откуда прерывание взялось.


+1.

Именно в таком стиле и именно этим методом нами с другом был отлажен один из совместных проектов. А вот как отловить "левое" прерывание при написании в "правильном" стиле?

там даже не видно, что таблица векторов -- это таблица


+100.

Написание в стиле Обучалки (и официального даташита, кстати) наиболее соответствует расположению кода в памяти, а потому более удобочитаемо в контексте рассмотрения аппаратных средств.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
Antosha079
Родился
Сообщения: 6
Зарегистрирован: Вс май 02, 2010 19:23:55
Откуда: Харьков

Re: Atmega162

Сообщение Antosha079 »

Уже разобрался. В дорожке на плате царапина образовалась, вот сигнал и непроходил. :)
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»