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

 
 
 
Reply to this topicStart new topic
> Как передать в функцию указатель на вывод порта
gena1959
сообщение Aug 9 2007, 06:38
Сообщение #1





Группа: Новичок
Сообщений: 3
Регистрация: 26-06-06
Пользователь №: 18 357



Есть некоторое количество выводов контроллера, к которым подключены DS1820. Функция, которая измеряет температу, не успевает формировать временные интервалы необходимой длительности, если из нее вызывать другую, которая выбирает нужный вывод. Хотелось бы передавать в функцию измерения температуры нужный вывод контроллера.
Go to the top of the page
 
+Quote Post
TBI
сообщение Aug 9 2007, 07:10
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 170
Регистрация: 11-05-07
Пользователь №: 27 656



Попробуйте запрограммировать таймер на требуемую длительность опросов. Затем разрешите прерывание от таймера и в процедуре обработки прерывания опрашивайте DS1820, а данные записывайте в буфер. При переполнении буфера - забирайте данные.
Go to the top of the page
 
+Quote Post
vmp
сообщение Aug 9 2007, 07:13
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 20-01-05
Из: Зеленоград
Пользователь №: 2 070



Если на разных портах - то никак. В MCS-51 для этого адресного пространства косвенная адресация не предусмотрена. Только делать несколько копий кода функции.
Если на разных ножках одного порта - то просто передавать в функцию маски выводов.
Код
void func(char mask)
{
....
P1 |= mask; // Поставить вывод в 1
P1 &= ~mask; // Поставить вывод в 0
P1 ^= mask; // Инвертировать
....
}
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 19 2007, 00:46
Сообщение #4


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(vmp @ Aug 9 2007, 10:13) *
Если на разных портах - то никак. В MCS-51 для этого адресного пространства косвенная адресация не предусмотрена.

Можно, если программа выполняется из внешней памяти и есть внешний RAM.
В этом случае можно в Run-Time (на лету) формировать требуемый опкод. Для этого надо знать только то, что:

Адреса битов формируются прозрачно

битовое адресное пространсто покрывает от 0 до 255.
Биты SFR регистров соответвуют адресу регистра + номер бита.
Например если адрес порта P1 == 90h в адресном пространстве SFR,
то адреса битов этого порта будут соответственно:

P1.0 -> 90h
P1.1 -> 91h
..
P1.7 -> 97h

Команды обращения к битам состоят из опкода и адреса бита.
Например MOV P1.1, C --> 0x92 0x91 (где - 0x92 - опкод, 0x91 - адрес бита).

SETB P1.1 --> 0xD2 0x91 (где 0xD2 - опкод, 0x91 - адрес бита)
CLR P1.1 --> 0xC2 0x91 (где 0xC2 - опкод, 0x91 - адрес бита).

Исходя из этого в ОЗУ формируем пару функций
SETB 0xXX.X
RET
(0xD2 0xXX 0x22)
и
CLR 0xXX.X
RET
(0xC2 0xXX 0x22)

В Run-Time достаточно подменять 0xXX на адрес нужного бита, и получится косвенная адресация битов.

Цитата(gena1959 @ Aug 9 2007, 09:38) *
Есть некоторое количество выводов контроллера, к которым подключены DS1820. Функция, которая измеряет температу, не успевает формировать временные интервалы необходимой длительности, если из нее вызывать другую, которая выбирает нужный вывод.

А если создать несколько функций
к примеру таких:

Код
void SetP1_1(void)
{
    P1^1 = 1;
}

void SetP1_2(void)
{
    P1^2 = 1;
}


и т.д.

И передавать адрес функции.
Go to the top of the page
 
+Quote Post

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

 


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


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