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

 
 
> Передача в качестве параметра порта ввода-вывода, как?
AlexMad
сообщение Oct 7 2007, 17:23
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 262
Регистрация: 18-02-05
Из: SPb
Пользователь №: 2 743



Есть набор функций работы с однопроводными устройствами,вроде
Код
#define ONEPIN       PINC // PIN register
#define ONEDDR       DDRC // Data Direction Register
#define ONEPORT      PORTC// PORT

unsigned char OneWireReset(unsigned char mask)
{
ONEPORT &= ~(mask);                 // Normal input no pull up
if (ONEPIN == 0) return 0;        // detect 0V on buss error
ONEDDR |= mask;                        // out at 0
  delay_us(500);
ONEDDR &= ~(mask);                  // Set to input
  delay_us(70);
if ((ONEPIN & mask) == 0)
   {
     delay_us(500);
   return mask;
   }
mask&=~ONEPIN;  
  delay_us(500);
return mask;
}

Работают замечательно, НО в железе есть восемь датчиков DS18b20, подключенных к одному порту (PORTC) и еще один датчик, подключенный к другому порту. Пробовал переделать функции так, чтобы рабочий порт можно было передавать, как параметр в функцию, но либо я чего-то не допер, либо это невозможно. На текущий момент предыдущим разработчиком просто сделан второй набор функций, где они работают с другим портом. На мой взгляд это не совсем правильно.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rezident
сообщение Oct 8 2007, 13:20
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



2 ReAl, в сообщении #6 вызывает сомнение, должен ли быть только указатель на структуру port_t типом volatile или все-таки все члены структуры должны быть volatile?
ИМХО более правильно было бы
Код
typedef struct {
    volatile uint8_t pin;
    volatile uint8_t ddr;
    volatile uint8_t port;
} port_t;
Go to the top of the page
 
+Quote Post
ReAl
сообщение Oct 8 2007, 13:38
Сообщение #3


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(rezident @ Oct 8 2007, 15:20) *
должен ли быть только указатель на структуру port_t типом volatile или все-таки все члены структуры должны быть volatile?
volatile там не указатель, а тот объект, на который он указывает.
Ведь не
port_t * volatile pport;
написано.
Т.е. вся структура (все её поля) - volatile. Так же, как все они const, если вся структура const.
Вместо этого приписывать кавлификатор персонально к полям имеет смысл только тогда, когда часть полей volatile, часть - нет.

Собственно, квалификатор нужно было вообще в typedef включить и везде использовать просто port_t *

Код
typedef volatile struct {
    uint8_t pin;
    uint8_t ddr;
    uint8_t port;
} port_t;


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
singlskv
сообщение Oct 8 2007, 16:19
Сообщение #4


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(ReAl @ Oct 8 2007, 17:38) *
Собственно, квалификатор нужно было вообще в typedef включить и везде использовать просто port_t *

Код
typedef volatile struct {
    uint8_t pin;
    uint8_t ddr;
    uint8_t port;
} port_t;

Объясните мне пожалуйста, зачем эту структуру содержащую адреса регистров портов нужно
объявлять volatile ? Недопонимаю...
Go to the top of the page
 
+Quote Post
ReAl
сообщение Oct 8 2007, 16:54
Сообщение #5


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(singlskv @ Oct 8 2007, 18:19) *
Объясните мне пожалуйста, зачем эту структуру содержащую адреса регистров портов нужно объявлять volatile ? Недопонимаю...
В данном конкретном случае - может и не нужно. Но рано или поздно захочется написать
while( pport->pin & mask ) { }
и тут уже в полный рост встанет то, что оптимизатор компилятора не имеет права делать предположения типа "раз только что прочитано это значение, то ещё раз его читать не нужно".

Цитата(singlskv @ Oct 8 2007, 18:51) *
Проблемма в том что я обращения к портам еще не увидел smile.gif
А читать структру содержащую адреса портов можно и через volatile, тока зачем ?

Да не адреса портов в структуре!
Вся структура "мапится" на пространство ввода-вывода, у нас указатель на структуру, мы говорим, что она лежит по такому-то адресу, а там не память, а порты.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
singlskv
сообщение Oct 8 2007, 17:14
Сообщение #6


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(ReAl @ Oct 8 2007, 20:54) *
Да не адреса портов в структуре!
Вся структура "мапится" на пространство ввода-вывода, у нас указатель на структуру, мы говорим, что она лежит по такому-то адресу, а там не память, а порты.

В таком варианте, согласен, тока я не понял как предполагается реализация того что спрашивал
автор поста, те по сути, нужно некоторое количество например входов, которые "произвольным"
образом размазаны по портам и их нужно опрашивать.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- AlexMad   Передача в качестве параметра порта ввода-вывода   Oct 7 2007, 17:23
- - rezident   Почему это по-вашему неправильно? У вас нехватка п...   Oct 7 2007, 17:55
|- - AlexMad   Цитата(rezident @ Oct 7 2007, 21:55) Поче...   Oct 7 2007, 18:18
|- - rezident   Цитата(AlexMad @ Oct 8 2007, 00:18) Непра...   Oct 7 2007, 18:40
|- - AlexMad   Цитата(rezident @ Oct 7 2007, 22:40) Дык ...   Oct 7 2007, 18:54
- - ReAl   В avr-gcc нормально передаются указатели на порты,...   Oct 7 2007, 19:58
|- - AlexMad   Цитата(ReAl @ Oct 7 2007, 23:58) Учитывая...   Oct 8 2007, 04:48
|- - ReAl   Цитата(AlexMad @ Oct 8 2007, 06:48) Я с х...   Oct 8 2007, 08:36
|- - prottoss   Цитата(AlexMad @ Oct 8 2007, 12:48) А вот...   Oct 8 2007, 09:12
- - prottoss   Всем известно (надеюсь), что адреса портов находят...   Oct 8 2007, 02:20
- - defunct   В общем случае я бы вероятно сделал так: создал бы...   Oct 8 2007, 10:54
- - rezident   Цитата(singlskv @ Oct 8 2007, 22:19) Объя...   Oct 8 2007, 16:42
|- - singlskv   Цитата(rezident @ Oct 8 2007, 20:42) Пото...   Oct 8 2007, 16:51
- - ReAl   Цитата(singlskv @ Oct 8 2007, 19:14) В та...   Oct 8 2007, 20:01
- - AlexMad   Цитата(ReAl @ Oct 9 2007, 00:01) Ну это у...   Oct 13 2007, 19:37


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

 


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


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