реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Как правильно пошевлить ногой в Хмеге?, (в АмелСтудии)
Alexey_N
сообщение Apr 17 2014, 11:30
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 308
Регистрация: 12-05-05
Из: мск
Пользователь №: 4 943



Господа, вот в когда я рисовал софт в ИАРе на обычных мегах, всё было просто - в начале игры ножка обозначалась:

#define LED0 PORTD_Bit5

И дальше уже этой самой LED0 присваивалось 1 или 0.
(LED0 = 0;)

Сейчас я переползаю на Хмеги и пытаюсь с ними договориться в АтмелСтудии. Вот как правильно там шевелить ногами принято?

Спасибо.
Go to the top of the page
 
+Quote Post
__Alexander
сообщение Apr 17 2014, 12:04
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 76
Регистрация: 18-07-07
Из: Киев
Пользователь №: 29 202



Цитата(Alexey_N @ Apr 17 2014, 14:30) *
#define LED0 PORTD_Bit5
И дальше уже этой самой LED0 присваивалось 1 или 0.
(LED0 = 0;)


это с каких пор в иаре просто запись вида #define LED0 PORTD_Bit5 приводила к адресации конкретной ноги? если расскажете, то я расскажу как это делать в хмеге.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Apr 17 2014, 12:11
Сообщение #3


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(Alexey_N @ Apr 17 2014, 15:30) *
Господа, вот в когда я рисовал софт в ИАРе на обычных мегах, всё было просто - в начале игры ножка обозначалась:
#define LED0 PORTD_Bit5
И дальше уже этой самой LED0 присваивалось 1 или 0.
(LED0 = 0;)
Сейчас я переползаю на Хмеги и пытаюсь с ними договориться в АтмелСтудии. Вот как правильно там шевелить ногами принято?


У Хмеги на каждый порт аж по 32 регистра зарезервировано, каждый для своих целей. Я когда сама переползала, то сперва злилась, испугавшись сложности, но потом поняла, как же всё чудесно сделано на ХМеге. После нее обычные Меги програмировать становится противно. sm.gif

Смотрите хидер с описанием вашей ХМеги. Там сам порт называется по-старинке PORTD, а конкретный регистр этого порта уточняется через точку или подчеркивание (зависит от компилятора). Например:
PORTD.OUTSET
PORTD.OUTCLR
PORTD.OUTTGL
PORTD.DIR
PORTD.DIRSET
PORTD.DIRCLR
PORTD.DIRTGL
и т.д.
А если на ассеблере пишите, но у всех этих регистров есть адреса (они все соседи):

sfrb PORTD_DIR = 0x0660 ///< I/O Port Data Direction
sfrb PORTD_DIRSET = 0x0661 ///< I/O Port Data Direction Set
sfrb PORTD_DIRCLR = 0x0662 ///< I/O Port Data Direction Clear
sfrb PORTD_DIRTGL = 0x0663 ///< I/O Port Data Direction Toggle
sfrb PORTD_OUT = 0x0664 ///< I/O Port Output
sfrb PORTD_OUTSET = 0x0665 ///< I/O Port Output Set
sfrb PORTD_OUTCLR = 0x0666 ///< I/O Port Output Clear
sfrb PORTD_OUTTGL = 0x0667 ///< I/O Port Output Toggle
sfrb PORTD_IN = 0x0668 ///< I/O port Input
sfrb PORTD_INTCTRL = 0x0669 ///< Interrupt Control Register
sfrb PORTD_INT0MASK = 0x066A ///< Port Interrupt 0 Mask
sfrb PORTD_INT1MASK = 0x066B ///< Port Interrupt 1 Mask
sfrb PORTD_INTFLAGS = 0x066C ///< Interrupt Flag Register
sfrb PORTD_PIN0CTRL = 0x0670 ///< Pin 0 Control Register
sfrb PORTD_PIN1CTRL = 0x0671 ///< Pin 1 Control Register
sfrb PORTD_PIN2CTRL = 0x0672 ///< Pin 2 Control Register
sfrb PORTD_PIN3CTRL = 0x0673 ///< Pin 3 Control Register
sfrb PORTD_PIN4CTRL = 0x0674 ///< Pin 4 Control Register
sfrb PORTD_PIN5CTRL = 0x0675 ///< Pin 5 Control Register
sfrb PORTD_PIN6CTRL = 0x0676 ///< Pin 6 Control Register
sfrb PORTD_PIN7CTRL = 0x0677 ///< Pin 7 Control Register

Зажечь или потушить светодиод можно так:
PORTD.OUTSET = PIN5_bm; // поднимаем 5-ый пин порта D
PORTD.OUTCLR = PIN5_bm; // опускаем 5-ый пин порта D

А мигнуть можно одной командой:
PORTD.OUTTGL = PIN5_bm; // мигнуть 5-ым пином порта D

Заметили, как замечательно происходит управление за один такт?
А по старинке вам один пин так быстро не поднять, т.к.
LED0 |= PIN5_bm;
это три операции! Сначала читает весь порт, потом на число маску ставит, а затем назад в порт записывает.

P.S. Только я сама на IAR пишу, но в Студии оно похоже.

И еще вам от меня подарок - очень короткое руководство на русском языке, которого обычно достаточно для перехода с обычной Меги на ХМегу:
Прикрепленные файлы
Прикрепленный файл  _________________XMEGA_________________________________________._______1_3_2008_.pdf ( 1.49 мегабайт ) Кол-во скачиваний: 108
 
Go to the top of the page
 
+Quote Post
__Alexander
сообщение Apr 17 2014, 12:22
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 76
Регистрация: 18-07-07
Из: Киев
Пользователь №: 29 202



пардонирую, всё работает. )

Сообщение отредактировал __Alexander - Apr 17 2014, 12:26
Go to the top of the page
 
+Quote Post
Alexey_N
сообщение Apr 17 2014, 12:43
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 308
Регистрация: 12-05-05
Из: мск
Пользователь №: 4 943



Цитата(__Alexander @ Apr 17 2014, 16:22) *
пардонирую, всё работает. )

Я рад, что у Вас всё получилось!
Но на всякий случай, если у кого не получается намекну - надо подкрутить галочку в свойствах проекта:
Project -> Options -> General Options -> (вкладка)System -> Enable bit definitions jn N/O-include files

А теперь обещанный ответ: а в Студии - как?
sm.gif
Go to the top of the page
 
+Quote Post
__Alexander
сообщение Apr 17 2014, 12:45
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 76
Регистрация: 18-07-07
Из: Киев
Пользователь №: 29 202



я не про то "получилось". жду вашего решения.
а про хмегу Xenia всё уже расписала.
Go to the top of the page
 
+Quote Post
Alexey_N
сообщение Apr 17 2014, 12:53
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 308
Регистрация: 12-05-05
Из: мск
Пользователь №: 4 943



Цитата(Xenia @ Apr 17 2014, 16:11) *
Зажечь или потушить светодиод можно так:
PORTD.OUTSET = PIN5_bm; // поднимаем 5-ый пин порта D
PORTD.OUTCLR = PIN5_bm; // опускаем 5-ый пин порта D

А мигнуть можно одной командой.

PORTD.OUTTGL = PIN5_bm; // мигнуть 5-ый пином порта D

Заметили, как замечательно происходит управление за один такт?
А по старинке вам один пин так быстро не поднять, т.к.
LED0 |= PIN5_bm;
это три операции! Сначала читает весь порт, потом на число маску ставит, а затем назад в порт записывает.

P.S. Только я сама на IAR пишу, но в Студии оно похоже.

И еще вам от меня подарок - очень короткое руководство на русском языке, которого обычно достаточно для перехода с обычной Меги на ХМегу:

Да, Ксения, спасибо, так шевелить лапами у меня получается, но уж больно некузявый способ получается...
Вот в ИАРЕ всё просто:
LED0 = 0; // Свет
LED0 = 1; // Тьма

И сразу видно о чем идет речь!
А вот когда я пишу

PORTD.OUTCLR = PIN5_bm; // опускаем 5-ый пин порта D

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

PORTС.OUTCLR = PIN5_bm; // опускаем 5-ый пин порта D
Чувствуете моментик? wink.gif

Я думаю, что у опытных софтописцев наверняка уже давно нарисованы хитрые макросы, обходящие эту беду, - вот бы кто поделился?
sm.gif
Go to the top of the page
 
+Quote Post
__Alexander
сообщение Apr 17 2014, 13:04
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 76
Регистрация: 18-07-07
Из: Киев
Пользователь №: 29 202



так у вас в первом посте и есть макрос #define LED0 PORTD_Bit5, только это не будет работать без еще одного макроса, а вы утверждаете что работает.

что мешает написать:
#define LED0 PORTD.OUTCLR = PIN5_bm; // опускаем 5-ый пин порта D
#define LED1 PORTD.OUTSET = PIN5_bm; // подымаем 5-ый пин порта D

и пользуйтесь только LED0 и LED1
Go to the top of the page
 
+Quote Post
megajohn
сообщение Apr 17 2014, 13:06
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(Alexey_N @ Apr 17 2014, 16:53) *
Я думаю, что у опытных софтописцев наверняка уже давно нарисованы хитрые макросы, обходящие эту беду, - вот бы кто поделился?


для AVR ссылка
не сложно переделать на Xmega



--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
Alexey_N
сообщение Apr 17 2014, 13:23
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 308
Регистрация: 12-05-05
Из: мск
Пользователь №: 4 943



Цитата(megajohn @ Apr 17 2014, 17:06) *
для AVR ссылка
не сложно переделать на Xmega

Ну да, именно этим макросом я пользовался во времена оны, когда ещё не отковырялась вот эта (выше описанная) галочка в ИАРе. Вот именно этого и хочется сейчас в Студии с Хмегой.
Но... я как-бы намекнул, что не являюсь уж настолько компетентным софтописцем, чтобы вот так сходу прорубать светлый путь для всего человечества wink.gif... может всё-таки есть где-то готовый вариант?

ЗЫ. Э-ээ, не сочтите за любителя халявы, я бы с удовольствием возместил затраты на сей подвиг...
Go to the top of the page
 
+Quote Post
megajohn
сообщение Apr 17 2014, 14:20
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(Alexey_N @ Apr 17 2014, 17:23) *
ЗЫ. Э-ээ, не сочтите за любителя халявы, я бы с удовольствием возместил затраты на сей подвиг...


попробуйте. Сделано в слепую - иксмеги не юзаю Прикрепленный файл  gpio.rar ( 6.17 килобайт ) Кол-во скачиваний: 93


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
Alexey_N
сообщение Apr 17 2014, 14:44
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 308
Регистрация: 12-05-05
Из: мск
Пользователь №: 4 943



Цитата(megajohn @ Apr 17 2014, 18:20) *
попробуйте. Сделано в слепую - иксмеги не юзаю Прикрепленный файл  gpio.rar ( 6.17 килобайт ) Кол-во скачиваний: 93

Попробовал - понравилось sm.gif...
Мерси, однако!
(Ваш мобильник, плз. - мне в личку santa2.gif )

Одно место сразу не пошло - в файле pin_macros.h вручную вбил:

#elif defined(__AVR__)
#include "XMEGA_pin_macros.h"
//#include "AVR_pin_macros.h"
Ну то есть я как-бы прикинулся АВР-ом. Наверное для общности надо это как-то подрулить...

И ещё по ходу вопрос - вот там в макросе показано как крутить порт "OUT", а вот как юзать порт "DIR"?
( и может быть "PIN" - по-моему в старом макросе.аш это было доступно...)
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Apr 17 2014, 14:52
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Alexey_N @ Apr 17 2014, 18:44) *
#elif defined(__AVR__)
#include "XMEGA_pin_macros.h"
//#include "AVR_pin_macros.h"
Ну то есть я как-бы прикинулся АВР-ом. Наверное для общности надо это как-то подрулить...

Код
#elif defined(__AVR_XMEGA__)
Go to the top of the page
 
+Quote Post
Alexey_N
сообщение Apr 17 2014, 15:11
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 308
Регистрация: 12-05-05
Из: мск
Пользователь №: 4 943



Цитата(_Артём_ @ Apr 17 2014, 18:52) *
Код
#elif defined(__AVR_XMEGA__)

Не, не прокатывает sad.gif.
Go to the top of the page
 
+Quote Post
megajohn
сообщение Apr 18 2014, 06:16
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(Alexey_N @ Apr 17 2014, 18:44) *
Попробовал - понравилось sm.gif...
Мерси, однако!
(Ваш мобильник, плз. - мне в личку santa2.gif )


можете сюда


Цитата(Alexey_N @ Apr 17 2014, 18:44) *
Одно место сразу не пошло - в файле pin_macros.h вручную вбил:


выложите проект, запущу у себя и поправлю


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 19:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01489 секунд с 7
ELECTRONIX ©2004-2016