|
Передача в качестве параметра порта ввода-вывода, как? |
|
|
|
Oct 7 2007, 17:23
|
Местный
  
Группа: Свой
Сообщений: 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) и еще один датчик, подключенный к другому порту. Пробовал переделать функции так, чтобы рабочий порт можно было передавать, как параметр в функцию, но либо я чего-то не допер, либо это невозможно. На текущий момент предыдущим разработчиком просто сделан второй набор функций, где они работают с другим портом. На мой взгляд это не совсем правильно.
|
|
|
|
|
 |
Ответов
|
Oct 8 2007, 13:38
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 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;
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Oct 8 2007, 16:19
|
дятел
    
Группа: Свой
Сообщений: 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 ? Недопонимаю...
|
|
|
|
|
Oct 8 2007, 16:54
|

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

|
Цитата(singlskv @ Oct 8 2007, 18:19)  Объясните мне пожалуйста, зачем эту структуру содержащую адреса регистров портов нужно объявлять volatile ? Недопонимаю... В данном конкретном случае - может и не нужно. Но рано или поздно захочется написать while( pport->pin & mask ) { }и тут уже в полный рост встанет то, что оптимизатор компилятора не имеет права делать предположения типа "раз только что прочитано это значение, то ещё раз его читать не нужно". Цитата(singlskv @ Oct 8 2007, 18:51)  Проблемма в том что я обращения к портам еще не увидел  А читать структру содержащую адреса портов можно и через volatile, тока зачем ? Да не адреса портов в структуре! Вся структура "мапится" на пространство ввода-вывода, у нас указатель на структуру, мы говорим, что она лежит по такому-то адресу, а там не память, а порты.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Oct 8 2007, 17:14
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(ReAl @ Oct 8 2007, 20:54)  Да не адреса портов в структуре! Вся структура "мапится" на пространство ввода-вывода, у нас указатель на структуру, мы говорим, что она лежит по такому-то адресу, а там не память, а порты. В таком варианте, согласен, тока я не понял как предполагается реализация того что спрашивал автор поста, те по сути, нужно некоторое количество например входов, которые "произвольным" образом размазаны по портам и их нужно опрашивать.
|
|
|
|
Сообщений в этой теме
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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|