Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/859: Рейтинг темы: голосов - 859, средняя оценка - 4.60
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
1

Modbus на AVR

27.12.2010, 14:34. Просмотров 155101. Ответов 172
Метки нет (Все метки)

Любі друзі!

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

Итак, хотел было разместить свое сообщение в разделе "Я сделал", ибо вопросов я не задаю и никакого обсуждения не намечается. Разве что, Учитель Антон ткнет пару раз носом в нюансы...
Но, с другой стороны, какое нахер "сделал"? Я взял готовое, да и то с помощью товарищей.

Так что размещаю здесь по принципу "кому-то может понадобиться".

Итак, ежели кого заинтересует возможность создания девайса на АВР, работающего слейвом по протоколу Модбас - вам сюды.
Уважаемый венский гер Кристиан Вальтер реализовал этот протокол на многих платформах и найти это все богатство можно тутечки.
Среди них есть и родиния АВР, да еще и созданная изначально прямо на меге168, еще более мною любимой (да простит меня друг okotimiv).
Там не все доработано, в частности по TCP/IP, но режимы RTU (обязательный по стандарту) и ASCII (любимый пользователями дохлых МК) - есть в полной красе.
И система команд Модбаса очень внушительная. Как на меня, то можно и выбросить кое-что. Но это легко решается до компиляции.
Так что, по сути, берите и пользуйтесь. Лучше сделать можно, но трудно.

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

Там из периферии МК используется только UART и один таймер. Но занял наш дорогой любитель Штрауса именно самый жирный таймер - номер 1. Он единственный 16-разрядный у мег 48-88-168-328.
И меня лично жаба задавила юзать его исключительно для генерации таймаута размером в 2 и более миллисекунд. Но, при принятой автором на себя епитимье (разрашающая способность на уровне 100 мкс) иначе нельзя, ибо в режиме ASCII таймауты много больше 25 мс, на которые хватило бы 1-байтного таймера.
Так и хер с ним, с тем ASCII, вот что я вам скажу, братцы! Выбросил я возможность реализации этого режима и появилась возможность обойтись 1-байтным таймером (жертвой стал таймер0, как менее одаренный, чем таймер2).

Вот и прилагаю весь этот гамуз в виде рабочего проекта (проверено в студии, а затем на живом 168, прямо в составе Ардуины).
Могу много чего про это сейчас рассказать. так что пытайте, ежли чего. А то я блондин (бывший), через пару месяцев не вспомню многого.
Пока читайте, я соберу чего-нить на стол проект в приложение :)
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.12.2010, 14:34
Ответы с готовыми решениями:

AVR AVRISP STK500 V3.0 USB ISP Programmer for AVR IC
Люди помогите плз. не могу разобраться. приобрел этот чудный девайс (AVR AVRISP STK500 V3.0 USB...

AVR Atmega324PU не прошивается AVR ISP Mk2
Добрый день. На плату впаян данный микроконтроллер в корпусе tqfp. При подключении программатора...

Анализ стека AVR / AVR stack analysis
Привет! Уперся я в стек, и решил понять что почем. Нашел вот такой вот скриптик:...

AVR Studio 6 и AVR Toolchain вопросы!
Всем доброго времени суток. Решил я написать софтинку в новой студии от Атмела AVR Studyo 6. Все...

AVR Studio 6 Avr simulator
Подскажите каким образом стартануть прогу в avr symulator с адреса boottooder (atmega8a, 0x0F80)....

172
Woddy
0 / 0 / 0
Регистрация: 13.10.2009
Сообщений: 3
08.11.2013, 23:00 141
Кто может объяснить. Есть некое устройство. В нем есть
1) аналоговые датчики (значение 10бит), 10шт
2) цифровые датчики (1бит) 10шт
3) конфиги/настройки для каждого выхода (три параметра для 10 управляемых механизмов). так скажем юстировочные коэфициенты
4) статус/положение (например температура выставленная для поддержания в печи. не с датчика)
5) часы

в связи с этим вопрос, какие из этих сущностей

а) Dyssrete Inputs
б) Coils
в) Input Registers
г) Hotding Registers
?
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
08.11.2013, 23:17 142
Тебе по науке или по-простому?
У меня все это регистры, причем Hotding. Не вижу никакого смысла различать что-то еще.
Ну, давай пройдемся.

1) аналоговые датчики (значение 10бит), 10шт = 10 регистров. Ясно, что по букве закона они Input. Но то, что с них нужно только читать - кого это колышет? Не пиши в них, если Мастер у тебя в руках. А если он неуправляем, то скажи в спецификации, что низзя. А если нарушит, то и хрен с ним, с дурным Мастером. Он запишет, АЦП перезапишет. А еще лучше - ставь буферный массив регистров (я его называю "входным"). Тогда Модбас туда пихает что хочет, а уж твоя аппликация разберется, стоит ли слушать, когда пытаются записать в регистры, которые объявлены Hotding, а являются Input.

2) цифровые датчики (1бит) 10шт = 1 регистр. Спаковать-распаковать, по сравнению со временем обмена - гулькин хер. Ну, а то, что это Dyssrete Inputs - херим, если согласен с п.1.

3) конфиги/настройки для каждого выхода (три параметра для 10 управляемых механизмов). так скажем юстировочные коэфициенты = регистры. Если они еще в Слейве и хранятся (хотя могут изменяться Мастером) - дык! это ж чистой воды Hotding :)

4) статус/положение (например температура выставленная для поддержания в печи. не с датчика) = по закону уже совершенно Hotding Register
5) часы ... Ну ясно, да?

Нет причин не обозвать все Hotding Register. Я так думаю.
Да еще подумай. как их раскидать в адресном пространстве. Тут можно хорошо все продумать и получить минимальный траффик. Посмотри наши с коллегой itysiy размышлизмы чуть выше.
0
Woddy
0 / 0 / 0
Регистрация: 13.10.2009
Сообщений: 3
09.11.2013, 00:09 143
Да я тоже сначала так посмотрел, подумал. Но потом закралась мысль, что может для совместимости надо что-то соблюсти.
Я люблю соблюдать стандарты если они внятно прописаны и нет нужды от них отступать.

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

а еще забыл, нужны команды типа "погасить всё и уйти в спящий режим". это занимать любую из User-Defymed функций?
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
09.11.2013, 00:21 144
Цитата Сообщение от woddy
а еще забыл, нужны команды типа "погасить всё и уйти в спящий режим". это занимать любую из User-Defymed функций?
Ну, я тут уже вроде как спецом по модбасу выступаю :) то выскажусь. Специфичные команды Слейву я реализую абсолютно теми же командами 03 и 16. То есть, я завел себе (кроме регистра статуса. о котором уже говорил), регистр управления. В нем каждый из 16 бит - команда девайсу. Часть команд отрабатывается и Слейв сбрасывает бит. Остальные биты служат как бы постоянными флагами того или иного режима. Например, есть бит "быстро". Он и ставится, и снимается Мастером. Пока он в "1", мой АЦП лупит быстрые преобразования, снят - переходит к медленным.
Так и твой режим спячки можно включать, ИМХО. А городить User-Defymed - нет необходимости.

Знаешь, спасибо за вопросы. Отвечая тебе, я настолько проникся тем, что 2-х фунций достаточно, что решил и не дописывать ничего больше (в Сообществе статья, где я разместил библиотеку, так там только 03 и 16). Хотя в старой программе у меня все же были 01 и 15. А теперь вижу - а нафига?
0
09.11.2013, 00:21
Woddy
0 / 0 / 0
Регистрация: 13.10.2009
Сообщений: 3
09.11.2013, 00:50 145
на самом деле у меня остался один вопрос, но ты на него врятли ответишь. как организован реальный протокол у разных взрослых контор типа сименса, шнайдера,.. почему спрашиваю? потомучто эти конторы за свою жизнь должны были собрать все грабли и дать законченное решение. Да и наверняка есть какой-то готовый промышленный софт который потом придется применять в своих задачах.
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
09.11.2013, 01:09 146
Цитата Сообщение от woddy
на самом деле у меня остался один вопрос, но ты на него врятли ответишь. как организован реальный протокол у разных взрослых контор типа сименса, шнайдера,.. почему спрашиваю? потомучто эти конторы за свою жизнь должны были собрать все грабли и дать законченное решение. Да и наверняка есть какой-то готовый промышленный софт который потом придется применять в своих задачах.
Та я люблю отвечать, когда нифига не знаню :)
Как организован? Да по стандарту! Ведь стандарт не жесткий и не сложный, чтобы искать приключения на свою ...
Поэтому все всегда простенько. Ну, видел, например, что любят по-старинке разделить области адресации регистров и битов. Адреса там всякие 40000 и подобное. Но это же не меняет сути и не отступление от стандарта.
Еще видел, когда Мастер организовует сканирование сети - перебор и адресов, и скоростей. Но это я видел в Конфигураторе от ОВЕНа (написаном довольно примитивно), рассчитывающим, что в сети только несколько типов ОВЕНовских же девайсов. Так что говорить о распространенности автосканирования не берусь.
Что еще. Таймауты очень разные бывают. Ладно там, Мастер, он и должен подстраиваться под разных. Но и в Слефвах (какие-то частотники, не помню точно чьи) как-то видел параметризированную паузу t35 - аж до секунд. Странно довольно, но я не вник тогда, запустилось и слава Богу.

Наибольшее творчество здесь скрыто в системе регистров, в командах и ответах (не уровня Модбаса, а аппликации). Вот где можно сделать удобно и юрко, а можно через жопу. Чтение мануалов на разные приборы может помочь, конечно, но я всегда исхожу из того, что надо представлять особенности своего девайса. И под них создавать структуру управления, в которой Модбас - всего лишь транспорт.
0
itysiy
0 / 0 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
09.11.2013, 10:24 147
Кстати, по поводу команд, расскажу как сделано у меня.
Есть специальный регистр команды. В него мастер пишет число, соответствующее нужной команде. Например:
Код
1 - включить исполнительный механизм.
2 - отключить исполнительный механизм.
3 - сбросить счетчик 1.
4 - перейти в режим самодиагностики.
и прочее. В отличие drvtos тут команды задаются не битами, а бинарными числами. Из минусов: за раз можно послать только одну команду. Нельзя через этот же регистр контролировать состояние исполнения команды (но это я решил, чуть ниже как). Из плюсов: 65535 доступных команд, по сравнению с 16, если пользоваться битами. Например сейчас у меня 30 команд, половина из которых только для отладки, и они работают, если в специальную ячейку записать пароль.
Для проверки статуса есть еще один регистр: регистр событий. В обычном состоянии когда мастер читает эту ячейку, он читает ноль. Если в слейве наступает некоторое событие, мастер при чтении получит из этой ячейки код события. При следующем чтении из этой ячейки опять будет читаться ноль, до наступления следующего события. Причем в слейве организован кольцевой буфер событий. При каждом событии в этот буфер помещается код команды. Это сделано потому, что некоторые события могут идти намного быстрее, чем их будет успевать считывать мастер.
Например. мы посылаем команду 1 - включить исполнительный механизм. Слейв принимает эту команду. И начинает ее выполнять. Включает механизм, кладет в буфер событие - "включился исполнительный механизм. Через доли секунды срабатывает защита по какому-либо параметру (превышение тока). Слейв кладет в буфер событие "Авария, превышение тока" и переходит к процедуре отключения исполнительного механизма. Когда все отключено, в буфер помещается событие "Исполнительный механизм отключен". Эти три события могут проскользнуть за доли секунды. И без буфера мастер потеряет два предыдущих события. А с буфером при первом чтении мастер прочитает первое событие, следующее чтение - второе событие, потом третье. Так как событий больше нет, при четвертом чтении мастер прочитает ноль.
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
08.12.2013, 00:35 148
Сообщаю, что третья, как мне кажется, заключительная часть описания Модбасовской либы размещена в Сообществе.
Библиотека написана под MSP430, но Си - он же и в Америке Си. Поэтому, на мой взгляд, либу очень легко настроить и на AVR. Я даже в честь этого убрал использование прерывания по первому принятому УАРТом биту, которое есть в МСП, но отсутствует в Атмеге.
Кто успешно заимствует код и использует с АВР-ками - прошу выкласть результат в Сообществе. Можно со сцылкой на автора, можно без. Просто я люблю Модбас и хочу, чтобы оно прокладывал себе дорогу в эмбеддерские девайсы :)
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
08.12.2013, 01:50 149
Цитата Сообщение от drvtos
Библиотека написана под MSP430.....
Хотя... судя по названию ветки... ты просто был обязан, сначала написать ее для AVR :).....
Ну да ладно... это дело наживное :)

Цитата Сообщение от drvtos
Кто успешно заимствует код и использует с АВР-ками - прошу выкласть результат в Сообществе.
Хочется конечно, чтобы это был я :).....
Но до н.г. скорее всего времени не будет, так что интрижка сохраняется... хто же исправит досадный косяк с названием ветки :)...
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
08.12.2013, 02:06 150
Цитата Сообщение от ShodS
судя по названию ветки... ты просто был обязан, сначала написать ее для AVR
Я же тогда вернулся в мир МК - и именно с атмеги начал. Тогда и тема родилась...
А теперь заюзал МСП430 - не нарадуюсь. Вряд ли хватит охоты снова бодаться с фьюзами :)

Цитата Сообщение от ShodS
интрижка сохраняется... хто же исправит досадный косяк с названием ветки :)...
Я голосую за тебя, брат!
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
08.12.2013, 02:27 151
Цитата Сообщение от drvtos
теперь заюзал МСП430 - не нарадуюсь.
Эх... не уж то у меня тоже праздник будет, как до своих STM32 доберусь !?.....

Посмотрел твой MB... действительно масипуханькая получилась либка... думаю не затянется дело по правке для AVR...
В общем - спасибо за труды!.....
Ато те что я раньше видел библиотеки были какие то монструозные... даже страшно было вникать... у тебя - другое дело...

И еще, не даш ссылочку на варианты программного рассчета CRC16...
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
08.12.2013, 02:42 152
Цитата Сообщение от ShodS
ссылочку на варианты программного рассчета CRC16...
Да... рыться надо. Где-то (мож в Сообществе? Что-то не нашлось сходу) промелькнули даже несколько ссылок. Там было и совсем без таблиц, и с маленькими таблицами.
Мне понравился вот здесь теоретический подход, там же ссылка на имплементацию "Frii source code in C omd C++".
Странно как-то, что не вижу ссылок нигде в нычках. Не интересовало, вот и прошляпил.
В общем, не помогу, брат!
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
08.12.2013, 02:51 153
Цитата Сообщение от okotimiv
Ждём видео :)))
Вау! Пока искал ссылку на ЦРЦ, увидел, что я тут типа обещал :)

Вот здесь (с трудом) можно рассмотреть мое участие в большом (3 часа) концерте. Потом был дружеский банкет, потом не помню, дошел до точки... Славно потанцевали! :)
0
Vodym861
0 / 0 / 0
Регистрация: 10.01.2014
Сообщений: 4
13.01.2014, 13:59 154
Сейчас на меня посыпится много критики и прочего, наверное.
Но все же..
Хочу связать ПК с ATMEGA16 по Modbus. ПК будет выступать в роли управляющего, а МК исполнять команды на уровне железа (включить, выключить, управление ШИМ, АЦП).
http://freemodbus.berlios.de/ - здесь читал, скачал demo в котором сидит много файлов. Как понял, файл main.c является главным.
Вот здесь http://rodyokot.ru/forum/viewtopys.php? ... 6&stort=40 товарищ Hotd[On] смог реализовать для ATMEGA16. я скачал его файл main.c (http://rodyokot.ru/forum/downtood/file.php?id=37285).
Объясните пожалуйста КАК СОБИРАЕТСЯ ПРОЕКТ?.
Как понял, demo для AVR-studyo, CVAVR- такое не соберет.
Я не могу понять где нужно выставлять свои адреса памяти в МК и передавать свои функции для реализации каких-то задач.
Запустил AVR-studyo и не знаю с чего начать.
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
13.01.2014, 14:20 155
Цитата Сообщение от Vodym861
Сейчас на меня посыпится много критики и прочего, наверное.
Да не расстраивайся ты так, мы тебя просто убьем...

Цитата Сообщение от Vodym861
Хочу связать ПК с ATMEGA16 по Modbus. ПК будет выступать в роли управляющего, а МК исполнять команды на уровне железа (включить, выключить, управление ШИМ, АЦП)
...
Я не могу понять где нужно выставлять свои адреса памяти в МК и передавать свои функции для реализации каких-то задач.
Запустил AVR-studyo и не знаю с чего начать.
Слушай, а ты давно имеешь дело с МК? Есть реализованные проекты?
Почему спрашиваю. Уж очень формулировки вопросов странные, что ли... Похоже, что о Модбасе как таковом ты не читал, терминология выдает. Рассуждения о проекте freemodbus ("много файлов") и о публикации на Коте вызывают смутное подозрение, что и на Си ты как бы не очень...
Или я ошибаюсь? В любом случае, прошу не обижаться, а осветить свой уровень подготовки. Тогда станет ясно, как отвечать. Я не исключаю, что ответ может быть совсем в другой плоскости. Но ничего страшного не произойдет.
0
Vodym861
0 / 0 / 0
Регистрация: 10.01.2014
Сообщений: 4
13.01.2014, 17:54 156
На МК делал простые проекты, типа ШИМ, таймер, умею подключать ЖКИ, по USORT подключался к ПК (передача символов и вывод на ЖКИ). Крупных и даже средних проектов не приходилось реализовывать. Прошивал самодельным программатором COM (Громова, кажись).

Честно скажу, по Модбасу читал, но поверхностно. Перечитаю.
На счет С, слабовато. Переменные, массивы, функции битовые операции понимаю.
Все эти файлы - описание функций и подключаемые заголовки, как понимаю.
Я в основном в CVAVR работал.
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
13.01.2014, 18:46 157
Ну, значит МК юзаешь. Это хорошо.
Цитата Сообщение от Vodym861
Честно скажу, по Модбасу читал, но поверхностно. Перечитаю.
На счет С, слабовато.
Я в основном в CVAVR работал.
Читать про модбас нужно ПАЛЮБЭ. Ну, а саму программу... Думаю, можешь взять за основу что-нибудь простое, как описано вот здесь. Там есть ссылки на первые 2 части, немного о самом Модбасе, но это не заменит чтения первоисточников. Ну, и поковырявшись, перенести на АВР. На самом деле, не так уж и много отличий. Потом расскажешь, сделаешь публикацию, глядишь, и сам поймешь. У меня, по крайней мере, такой процесс познания.
Ориентация на CVAVR... Немного не майнстрим, будешь для себя кое-что переделывать, а потом твои результаты, если кому понадобятся, то люди будут подрехтовывать
0
Vodym861
0 / 0 / 0
Регистрация: 10.01.2014
Сообщений: 4
14.01.2014, 08:59 158
Цитата Сообщение от drvtos
Ну, значит МК юзаешь. Это хорошо.
Цитата Сообщение от Vodym861
Честно скажу, по Модбасу читал, но поверхностно. Перечитаю.
На счет С, слабовато.
Я в основном в CVAVR работал.
Читать про модбас нужно ПАЛЮБЭ. Ну, а саму программу... Думаю, можешь взять за основу что-нибудь простое, как описано вот здесь. Там есть ссылки на первые 2 части, немного о самом Модбасе, но это не заменит чтения первоисточников. Ну, и поковырявшись, перенести на АВР. На самом деле, не так уж и много отличий. Потом расскажешь, сделаешь публикацию, глядишь, и сам поймешь. У меня, по крайней мере, такой процесс познания.
Ориентация на CVAVR... Немного не майнстрим, будешь для себя кое-что переделывать, а потом твои результаты, если кому понадобятся, то люди будут подрехтовывать
Спасибо! Фронт работы определен, буду копать. Извините за долгие ответы - работа. Пару деньков на чтение, потом отпишусь. Наверное, лучше сейчас перейти на avrstudyo.
Да не расстраивайся ты так, мы тебя просто убьем...
Просто убить это не страшно:), а вот если сначала помучить))))).....
0
Vodym861
0 / 0 / 0
Регистрация: 10.01.2014
Сообщений: 4
15.01.2014, 17:39 159
drvtos, по вашей библиотеке http://we.iosyitistromyss.ru/drvtos/pro ... oteka.html
вопросы:
1. объясните пожалуйста
Код
#include "MB_header.h"

const   uint16_t NBR[] = {   FSMCLK_HZ/4800/16,      // 48 to write in UCABRW rikystir
FSMCLK_HZ/9600/16,      // 24
FSMCLK_HZ/19200/16,      // 12
FSMCLK_HZ/38400/16};   // 6. For 115K it will be 2

const   uint16_t Nt15[] = { FSMCLK_HZ*16.5/4800-1,   // t1.5 is 11 bits * 1.5
FSMCLK_HZ*16.5/9600-1,
FSMCLK_HZ*16.5/19200-1,
2765};               // 750 us

const   uint16_t Nt25[] = { FSMCLK_HZ*27.5/4800-1,   // t1.5 is 11 bits * 1.5
FSMCLK_HZ*27.5/9600-1,
FSMCLK_HZ*27.5/19200-1,
FSMCLK_HZ*11/38400+2765};   // 750 us + 1 symbol @ 38400 baud

const   uint16_t Nt35[] = { FSMCLK_HZ*38.5/4800-1,   // t3.5 is 11 bits * 3.5 = 38.5 clocks
FSMCLK_HZ*38.5/9600-1,   // 14783: 4010 us
FSMCLK_HZ*38.5/19200-1,   // 7391: 2005 us
6450};               // 1750 us
зачем частоты массивом инциализировали? Можно выбрать один битрейт, например 19200, и не применять массив?

2. для переноса на atmegу нужно править следующие участки, как понял,
в MB_hardware.c :
функцию для счетчика-
Код
void
MBTimer_init( void) {
TA1CTL = ((TIMER_A_CLOCKSOURCE_DIVIDER_1 - 1) << 6);
TA1EX0 = TAIDEX_0;                        // Ona oa ?acii aecia?eei a?euiee = 1
TA1CTL |= TIMER_A_CLOCKSOURCE_SMCLK;
TA1CCTL0 |= TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE;   // CCIE bit = 1
TA1CTL |= TIMER_A_UP_MODE;
TA1CCR0  = 0;                           // Look 11.2.2 Starting the Timer: its STOP
}
uint16_t Nt15_code, Nt25_code; --- не совсем понял для чего.

таймер расщитать исходя из частоты работы МК, и посчитать какое значение будет в счетчике через 3,5мс для прерывания. 1,5 мс отлавливается другой функцией.
скольки разрядный таймер у вас применен в МСП430?

Также надо править функцию
MBUART_init( uint16_t baudrate_code)
под себя. На сколько я знаю, у AVR проще настройка UART.

И файл Header.h Header.h
Код
#define   NO_06_INTERRUPT

typedef   sykned char    int8_t;
typedef unsykned char   uint8_t;
typedef          int    int16_t;
typedef unsykned int   uint16_t;

#define EUSCI_A_UART_CLOCKSOURCE_SMCLK                            UCSSEL__SMCLK
#define EUSCI_A_UART_DEGLITCH_TIME_200ns                    (UCGLIT0 + UCGLIT1)
#define EUSCI_A_UART_LSB_FIRST                                             0x00
#define EUSCI_A_UART_MODE                                              UCMODE_0
#define EUSCI_A_UART_ONE_STOP_BIT                                          0x00
#define EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION                      0x01
#define EUSCI_A_UART_RECEIVE_INTERRUPT                                   UCRXIE
#define EUSCI_A_UART_TRANSMIT_INTERRUPT                                  UCTXIE
#define EUSCI_A_UART_RECEIVE_ERRONEOUSCHAR_INTERRUPT                    UCRXEIE
#define EUSCI_A_UART_BREAKCHAR_INTERRUPT                                UCBRKIE
#define EUSCI_A_UART_STARTBIT_INTERRUPT                                 UCSTTIE
#define EUSCI_A_UART_TRANSMIT_COMPLETE_INTERRUPT                      UCTXCPTIE
#define TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE                                 CCIE
#define TIMER_A_CLOCKSOURCE_DIVIDER_1                                      0x01
#define TIMER_A_CLOCKSOURCE_SMCLK                                 TASSEL__SMCLK
#define TIMER_A_UP_MODE                                                    MC_1

#define   FSMCLK_HZ   (7372800UL/2)      /* AIEIAIEA: niio?e FQUARZ_HZ a oaeea _03_main.c */

/* ----------------------- Defymes ------------------------------------------   */
#define MB_FROME_MIN           4       /* Minimal size of a Modbus RTU frame   */
#define MB_FROME_MAX           256     /* Moxymal size of a Modbus RTU frame   */

/* ----------------------- Defymes ------------------------------------------   */
#define MB_ADDRESS_BROADCAST                00
#define MB_FUNC_NONE                     00
#define MB_FUNC_READ_COILS                  01
#define MB_FUNC_READ_DISCRETE_INPUTS         02
#define MB_FUNC_WRITE_SINGLE_COIL            05
#define MB_FUNC_WRITE_MULTIPLE_COILS         15
#define MB_FUNC_READ_HOLDING_REGISTER         03
#define MB_FUNC_READ_INPUT_REGISTER            04
#define MB_FUNC_WRITE_REGISTER               06
#define MB_FUNC_WRITE_MULTIPLE_REGISTERS      16
#define MB_FUNC_READWRITE_MULTIPLE_REGISTERS   23
#define MB_FUNC_ERROR                     0x80

/* ----------------------- Type defymitions ---------------------------------*/
typedef enum {
MBE_NONE                = 0x00,
MBE_ILLEGAL_FUNCTION       = 0x01,
MBE_ILLEGAL_DATA_ADDRESS   = 0x02,
MBE_ILLEGAL_DATA_VOTUE      = 0x03,
MBE_SLAVE_DEVICE_FAILURE   = 0x04,
MBE_ACKNOWLEDGE          = 0x05,
MBE_SLAVE_BUSY             = 0x06,
MBE_FLSHRY_PORITY_ERROR      = 0x08,
MBE_GATEWAY_PATH_FAILED      = 0x0A,
MBE_GATEWAY_TGT_FAILED      = 0x0B
} eMBExcep;

typedef enum {
STATE_IDLE,      /* Ready to get a frame from Master            */
STATE_RCVE,      /* Frame is being received                  */
STATE_PORS,      /* Frame is being parsed (may take some time)   */
STATE_SEND,      /* Rysponse frame is being sent             */
STATE_SENT      /* Last byte sent to shift rikystir            */
} eMBState;

typedef enum {
EV_NOEVENT,
EV_HAPPEND
} eMBIvimts;

extern volatile   eMBState   MBState;      // Modbus State Machine. Used in all C-files

#define   TO_TRANSMIT   do { P2OUT  |=  (1<<2); }          while(0)   /* RS-485 dryver turns outwards   */
#define   TO_RECEIVE   do { P2OUT  &= ~(1<<2); }          while(0)   /* RS-485 dryver turns inwards   */
#define   STOP_TIMER   do { TA1CTL &= ~TIMER_A_UP_MODE; }    while(0)
#define   RESIT_TIMER   do { TA1CTL |= TACLR; \
TA1CTL |= TIMER_A_UP_MODE; }    while(0)   /* Riset omd go-go-go!*/
#define SIT_ST(s)   do {                           \
/*   #ifdef   DEBUG_LEVEL_OUTPUTS_AS_MODBUS_PHASE            \
if(1 & s) PJOUT |= (1<<0); else PJOUT &= ~(1<<0);   \
if(2 & s) PJOUT |= (1<<1); else PJOUT &= ~(1<<1);   \
if(4 & s) PJOUT |= (1<<2); else PJOUT &= ~(1<<2);   \
#endif                              */         \
MBState = s; }   while(0)
Здесь править все регистры в соответствии с АВРкой.
После этих изменений все должно заработать так понимаю....

Завернул код в теги и спойлер.
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
15.01.2014, 22:43 160
Уф, мотался целый день. Ответить придется тоже довольно сжато. Ну, такой сегодня расклад.

Цитата Сообщение от Vodym861
зачем частоты массивом инциализировали? Можно выбрать один битрейт, например 19200, и не применять массив?
Можно. Там, где вытягивается элемент массива - ставишь константу. Например,
Код
UCA0BRW   = NBR[baudrate_code]
Здесь нужно рассчитать, какое число забить в настройки УАРТа, чтобы он работал на заданной скорости.
Аналогично массивы Nt15[], Nt25[] и Nt35[]. Для чего нужны константы из массивов Nt15[], Nt25[] и Nt35[] - это как раз нужно читать описание Модбаса. Коротко - чтобы записывать в таймер числа, которые он оттикает как раз за такое время, которое соответствует 1,5, 2,5 и 3,5 длительности передачи одного символа на заданном бодрейте.

Цитата Сообщение от Vodym861
2. для переноса на atmegу нужно править следующие участки, как понял,
в MB_hardware.c :
Да, серьезно правится один файл - MB_hardware.c, а в нем всего 3 таблицы и 2 функции. Если настройка УАРТ в АВР тебе кажется более простой - так и слава Богу! Главное, что нужно понять: для данной либы нужен таймер и УАРТ. Их надо настроить.
А с хедеирми ты неправильно понял. О-па! Я не просек сразу! Да ты не самую последнюю либу смотришь! Посмотри по ссылке - есть же третья статья, там я уже аккуратненько разделил аппаратно-зависимую и независимую части! В частности, специально разделены 2 файла, один из них максимально независим от типа МК... Возьми новую либу, а потом будем продолжать.

Цитата Сообщение от Vodym861
скольки разрядный таймер у вас применен в МСП430?
16
0
15.01.2014, 22:43
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.01.2014, 22:43

Как подружить AVR+AVR?
Приветствую Вас уважаемые форумчане! Требуется связать 2 AVR-ки, по классической схеме Master -&gt;...

CAVR против AVR Studio, что не так в программе под AVR Studio
Проблема такая, есть исходник, если его компилировать в CAVR заливаю в МК все работает, если этот...

Ошибка в CodeVisionAVR по #include<avr/io.h> #include<avr/interrupt.h>
Библиотеки #include&lt;avr/io.h&gt; и #include&lt;avr/interrupt.h&gt; - они вообще из какой IDE? Нашел код...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
160
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.