|
Передача в качестве параметра порта ввода-вывода, как? |
|
|
|
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 7 2007, 19:58
|

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

|
В avr-gcc нормально передаются указатели на порты, думаю, что и у IAR должны передаваться, причём не удивлюсь, если там найдётся какое-то "волшебное слово" по типу __flash, которое ещё и делает это более удобным. Для большинства портов идёт единый порядок PIN-DDR-PORT (не выполняется это, например, для порта F у меги64, который в наследство от меги103 достался как порт толькона чтение и его DDRF, PORTF улетели в memory-mapped IO, включаемое при стёртом фьюзе M103). Учитывая это, можно (но осторожно) обойтись одним указателем. Код #include <avr/io.h> #define F_CPU 8000000UL #include <util/delay.h>
typedef struct { uint8_t pin; uint8_t ddr; uint8_t port; } port_t;
uint8_t OneWireReset(volatile port_t *pport, uint8_t mask) { pport->port &= ~mask; if( (pport->pin & mask) == 0) return 0; // detect 0V on buss error pport->ddr |= mask; // out at 0 _delay_ms(0.5); pport->ddr &= ~mask; // Set to input _delay_us(70); if( (pport->pin & mask) == 0) { _delay_ms(0.5); return mask; } mask &= ~pport->pin; _delay_ms(0.5); return mask; }
uint8_t test(void) { return OneWireReset( (volatile port_t*)&PINB, 0x02); }
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Oct 8 2007, 04:48
|
Местный
  
Группа: Свой
Сообщений: 262
Регистрация: 18-02-05
Из: SPb
Пользователь №: 2 743

|
Цитата(ReAl @ Oct 7 2007, 23:58)  Учитывая это, можно (но осторожно) обойтись одним указателем. Код #include <avr/io.h> #define F_CPU 8000000UL #include <util/delay.h>
typedef struct { uint8_t pin; uint8_t ddr; uint8_t port; } port_t;
} Вот тут уже ближе. Я с ходу именно так и сделал, но, толи кодевижен это не хочет понимать, толи это все-таки не получится. У меня при инициализации Код pin=PINB , а также по остальным двум портам матерно ругается, что PINB должно быть константой, указатель на PINB тоже не принимает, говорит порты нельзя передать  После этого я свой вопрос и задал. А вот насчет обращения, как к памяти это интересно, попробую.
|
|
|
|
|
Oct 8 2007, 09:12
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(AlexMad @ Oct 8 2007, 12:48)  А вот насчет обращения, как к памяти это интересно, попробую. В ИАРе прокатывает вот такой код Код
char* pPORTA = &PORTA; *pPORTA = 0x55; То бишь, при присвоении указателю адреса порта происходит прибавление к адресу IO 0х20
--------------------
|
|
|
|
Сообщений в этой теме
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 Цитата(AlexMad @ Oct 8 2007, 06:48) Я с х... Oct 8 2007, 08:36 prottoss Всем известно (надеюсь), что адреса портов находят... Oct 8 2007, 02:20 defunct В общем случае я бы вероятно сделал так:
создал бы... Oct 8 2007, 10:54 rezident 2 ReAl, в сообщении #6 вызывает сомнение, должен л... Oct 8 2007, 13:20 ReAl Цитата(rezident @ Oct 8 2007, 15:20) долж... Oct 8 2007, 13:38  singlskv Цитата(ReAl @ Oct 8 2007, 17:38) Собствен... Oct 8 2007, 16:19   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, 18:19) Объя... Oct 8 2007, 16:54    singlskv Цитата(ReAl @ Oct 8 2007, 20:54) Да не ад... Oct 8 2007, 17:14     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
|
|
|