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

 
 
> Массив портов ввода PINx, вопрос к знатокам GCC
singlskv
сообщение Nov 27 2006, 21:57
Сообщение #1


дятел
*****

Группа: Свой
Сообщений: 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,
НО, осадок остается sad.gif smile.gif

Собствено вопросы:

1. Есть ли в GCC другие варианты доступа к массиву PINx, без использования _SFR_IO8 ?

2. Насколько такой вариант портируем на более старые/новые реализации GCC AVR ?

3. 0x20 режет глаз, а что с этим делать ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aesok
сообщение Nov 27 2006, 23:06
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 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


Вроде работает правильно, но перепроверьте.

Анатолий.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Nov 27 2006, 23:45
Сообщение #3


дятел
*****

Группа: Свой
Сообщений: 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?"

Ну это я посмотрел прежде чем задавать вопрос smile.gif
Там про то как записать значение в порт.
Цитата
Масив я объявил так:
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);
  ......


Как правильно написать доступ в таком варианте ?
Go to the top of the page
 
+Quote Post
aesok
сообщение Nov 28 2006, 00:04
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Я бы сделал чтото вроде этого:

1. Объявил структуру.
struct __port {
volatile uint8_t *port;
unsigned char pin;
};

2. Масив:
struct __port ports[3] = {
{&PINB, 1<<PINB5},
{&PINF, 1<<PINF2},
{&PING, 1<<PING1}
};

3. Доступ:
PIN_tmp=*(ports[0].port);
tmp=PIN_tmp & ports[0].pin;


Код я не тестировал, привожу только как идею!!!

Анатолий.

Сообщение отредактировал aesok - Nov 28 2006, 00:05
Go to the top of the page
 
+Quote Post
singlskv
сообщение Nov 28 2006, 14:40
Сообщение #5


дятел
*****

Группа: Свой
Сообщений: 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

???
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 28 2006, 18:05
Сообщение #6


Шаман
******

Группа: Модераторы
Сообщений: 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 не знаю.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


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

 


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


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