|
Массив портов ввода PINx, вопрос к знатокам GCC |
|
|
|
Nov 27 2006, 21:57
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Контроллеры от ATmega8 до Atmega128, и т.д. Есть такой массив: Код BYTE PIN_[3]={ (BYTE)(&PINB), (BYTE)(&PINF), (BYTE)(&PING) }; Доступ к нему присходит вот так: Код PIN_tmp=_SFR_IO8(PIN_[0]-0x20); ...... PIN_tmp=_SFR_IO8(PIN_[2]-0x20); Все работает, более того мне даже нравится код который генерит при этом GCC, НО, осадок остается Собствено вопросы: 1. Есть ли в GCC другие варианты доступа к массиву PINx, без использования _SFR_IO8 ? 2. Насколько такой вариант портируем на более старые/новые реализации GCC AVR ? 3. 0x20 режет глаз, а что с этим делать ?
|
|
|
|
|
 |
Ответов
|
Nov 27 2006, 23:06
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Во первых посмотрите в avr-libc-user-manual: FAQ - 7.3.13 "How do I pass an IO port as a parameter to a function?" Масив я объявил так: volatile uint8_t *ports[2] = {&PINB, &PIND}; Если не хотите инициализировать при объявении, то инициализируете так: ports[0] = &PINB; ports[1] = &PIND; Доступ к порту: uint8_t test; test = *ports[0]; Ассемблерный код: Цитата uint8_t test; test = *ports[0]; 482: e0 91 88 00 lds r30, 0x0088 486: f0 91 89 00 lds r31, 0x0089 48a: 80 81 ld r24, Z Вроде работает правильно, но перепроверьте. Анатолий.
|
|
|
|
|
Nov 27 2006, 23:45
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(aesok @ Nov 27 2006, 23:06)  Во первых посмотрите в avr-libc-user-manual: FAQ - 7.3.13 "How do I pass an IO port as a parameter to a function?" Ну это я посмотрел прежде чем задавать вопрос Там про то как записать значение в порт. Цитата Масив я объявил так: volatile uint8_t *ports[2] = {&PINB, &PIND};
Доступ к порту: uint8_t test; test = *ports[0]; Да, так оно работает правильно! Cпасибо. ----------------- НО, На самом деле я конечно не очень точно задал свой вопрос. Есть такой массив: Код BYTE PIN_[3][2]={ {(BYTE)(&PINB), 1<<PINB5}, {(BYTE)(&PINF), 1<<PINF2}, {(BYTE)(&PING), 1<<PING1} }; Доступ к нему присходит вот так: Код PIN_tmp=_SFR_IO8(PIN_[0][0]-0x20); tmp=PIN_tmp & PIN_[0][1]; ...... PIN_tmp=_SFR_IO8(PIN_[2]-0x20); ...... Как правильно написать доступ в таком варианте ?
|
|
|
|
|
Nov 28 2006, 14:40
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(aesok @ Nov 28 2006, 00:04)  Я бы сделал чтото вроде этого:
1. Объявил структуру. struct __port { volatile uint8_t *port; unsigned char pin; }; Такая структура занимает 3 байта. Адрес порта <0x100, поэтому достаточно 2 байт. Если массив будет большим, это серьезная экономия. Вот еще вопросики появились: почему Код PIN_tmp=_SFR_MEM8(PIN_[0][0]); при компиляции выдает warning, а Код PIN_tmp=_SFR_MEM8(PIN_[0][0]+0); не выдает ? при компиляции этого кода получаем: Код +0000020A: 91800109 LDS R24,0x0109 Load direct from data space +0000020C: 2FE8 MOV R30,R24 Copy register +0000020D: 27FF CLR R31 Clear Register +0000020E: 8180 LDD R24,Z+0 Load indirect with displacement кто-нибудь может обьяснить зачем в lds используется r24 почему не так: Код LDS R30,0x0109 CLR R31 LDD R24,Z+0 ???
|
|
|
|
|
Nov 28 2006, 18:05
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(singlskv @ Nov 28 2006, 13:40)  Цитата(aesok @ Nov 28 2006, 00:04)  Я бы сделал чтото вроде этого:
1. Объявил структуру. struct __port { volatile uint8_t *port; unsigned char pin; };
Такая структура занимает 3 байта. Адрес порта <0x100, поэтому достаточно 2 байт. Если массив будет большим, это серьезная экономия. Чтобы указатель был однобайтовым, он должен указывать на tiny память. В IAR это __tiny, а как в GCC не знаю.
|
|
|
|
Сообщений в этой теме
singlskv Массив портов ввода PINx Nov 27 2006, 21:57    singlskv На первый вопрос отвечу сам себе
Цитата(singlskv ... Nov 28 2006, 16:56 Lem сделайте структуру
Кодtypedef struct
{
unsigned... Nov 28 2006, 00:06 aesok Цитата(Lem @ Nov 28 2006, 01:06) сделайте... Nov 28 2006, 00:35  singlskv Цитата(aesok @ Nov 28 2006, 00:35) НЕВЕРН... Nov 28 2006, 00:55   aesok Цитата(singlskv @ Nov 28 2006, 01:55) Цит... Nov 28 2006, 01:04    singlskv чтение и запись(volatile переменных) - это две бол... Nov 28 2006, 01:12     aesok Цитата(singlskv @ Nov 28 2006, 02:12) чте... Nov 28 2006, 02:06      Lem Да нет, в процедуре доступа (обработки) обращения ... Nov 28 2006, 10:38       aesok Цитата(Lem @ Nov 28 2006, 11:38) Да нет, ... Nov 28 2006, 13:33       IgorKossak Цитата(Lem @ Nov 28 2006, 09:38) Да нет, ... Nov 28 2006, 13:52 singlskv Цитата(aesok @ Nov 28 2006, 00:35) Цитата... Nov 28 2006, 17:25 aesok Цитата(singlskv @ Nov 28 2006, 18:25) Обя... Nov 28 2006, 18:10  singlskv Цитата(aesok @ Nov 28 2006, 18:10) Цитата... Nov 28 2006, 18:23   aesok Созрело 2 решения:
1. Ваше.
BYTE PIN_[2]={
(B... Nov 28 2006, 18:49    singlskv Цитата(aesok @ Nov 28 2006, 18:49) Созрел... Nov 28 2006, 19:08
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|