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

 
 
> Передача в качестве параметра порта ввода-вывода, как?
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
Ответов
ReAl
сообщение Oct 7 2007, 19:58
Сообщение #2


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

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


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


Местный
***

Группа: Свой
Сообщений: 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 тоже не принимает, говорит порты нельзя передать sad.gif После этого я свой вопрос и задал.

А вот насчет обращения, как к памяти это интересно, попробую.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Oct 8 2007, 09:12
Сообщение #4


Гуру
******

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



Цитата(AlexMad @ Oct 8 2007, 12:48) *
А вот насчет обращения, как к памяти это интересно, попробую.


В ИАРе прокатывает вот такой код

Код


char* pPORTA = &PORTA;
*pPORTA = 0x55;
То бишь, при присвоении указателю адреса порта происходит прибавление к адресу IO 0х20


--------------------
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   Цитата(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


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

 


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


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