Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 18.02.2010, 12:27  
maxNTF
Вид на жительство
 
Регистрация: 18.06.2006
Сообщений: 434
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
maxNTF на пути к лучшему
Вопрос переопределение констант?

Ниже кусок кода из вайла интерфейса 1-Wire. Там порт определен в виде константы и в таком виде его нельзя измениять в основном коде. Как можно сделать, чтоб в процесе выполнения основного кода, можно было менять порт?
Код:
#define D_PIN	RB4
#ifndef D_PIN
#error D_PIN Must Be Defined for 1-wire Bus I/O
#endif
		
#define D_TRIS TRISB4
#ifndef D_TRIS 
#error D_TRIS Must be defined for 1-wire Bus I/O
#endif


bit  D_Presence;
bit  D_ShortCircuit;
bit  D_Data;


char D_Reset(void)
{
 char count=47;
unsigned char  D_Error;
 //-- Reset the status bits
 D_Error=0;

 //-- Ensure Correct port pin settings
 D_TRIS=1;
 D_PIN=0;

 //-- Start the reset Pulse
 D_TRIS=0;          //-- Pull Line Low to start reset pulse
 for(;count›0;count--)
 {
  DelayUs(10);      //-- 480uS Delay
 }
 D_TRIS=1;          //-- Release the line
 DelayUs(60);       //-- Delay to about centre of presence pulse
 D_Presence=D_PIN;  //-- Get Presence status 1=None 0=something there
...
Реклама:
maxNTF вне форума  
Непрочитано 18.02.2010, 12:43  
urry
Почётный гражданин KAZUS.RU
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию Re: переопределение констант?

Код:
#define BITSET(var,bitno) ((var) |= 1 ‹‹ (bitno))   
#define BITCLR(var,bitno) ((var) &= ~(1 ‹‹ (bitno)))
char D_Reset(char bit_port)
{
 char count=47;
unsigned char  D_Error;
 //-- Reset the status bits
 D_Error=0;
 //-- Ensure Correct port pin settings
BITSET(TRISB,bit_port);
BITCLR(PORTB,bit_port); 
 D_PIN=0;
 //-- Start the reset Pulse
BITCLR(TRISB,bit_port);         //-- Pull Line Low to start reset pulse
 for(;count›0;count--)
 {
  DelayUs(10);      //-- 480uS Delay
 }
BITSET(TRISB,bit_port);         //-- Release the line
 DelayUs(60);       //-- Delay to about centre of presence pulse
__________________
warez
urry вне форума  
Непрочитано 18.02.2010, 12:49  
maxNTF
Вид на жительство
 
Регистрация: 18.06.2006
Сообщений: 434
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
maxNTF на пути к лучшему
По умолчанию Re: переопределение констант?

bit_port я так понимаю должна быть глобальная переменная?
maxNTF вне форума  
Непрочитано 18.02.2010, 13:14  
maxNTF
Вид на жительство
 
Регистрация: 18.06.2006
Сообщений: 434
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
maxNTF на пути к лучшему
По умолчанию Re: переопределение констант?

и как быть если порты находятся по разным регистрам, где то так:
RA0 – 1й
RA1 – 2й
RA2 – 3й
RA3 – 4й
RA5 – 5й
RB2 – 6й
RB3 – 7й
RB1 – 8й
maxNTF вне форума  
Непрочитано 18.02.2010, 13:41  
Petr_Dynin
Временная регистрация
 
Регистрация: 20.06.2007
Сообщений: 70
Сказал спасибо: 1
Сказали Спасибо 12 раз(а) в 11 сообщении(ях)
Petr_Dynin на пути к лучшему
По умолчанию Re: переопределение констант?

Отсюда не подойдет? http://www.microchip.su/showthread.p...5&highlight=DQ
Petr_Dynin вне форума  
Непрочитано 18.02.2010, 13:55  
maxNTF
Вид на жительство
 
Регистрация: 18.06.2006
Сообщений: 434
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
maxNTF на пути к лучшему
По умолчанию Re: переопределение констант?

Есть еще какие варианты? Да и еще в предложеном варианте я не вижу переключения порта (вход/выход)

Последний раз редактировалось maxNTF; 18.02.2010 в 14:11.
maxNTF вне форума  
Непрочитано 18.02.2010, 15:40  
maxNTF
Вид на жительство
 
Регистрация: 18.06.2006
Сообщений: 434
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
maxNTF на пути к лучшему
По умолчанию Re: переопределение констант?

Попробовал так, вообще не работает код, компилятор выдает кучу ошибок, первая из которых not a member of the struct/union ""
Это в хедере
Код:
typedef struct 
{
    char *pPort;
    char  mask;
} SPinPointer;
 
#define PIN_INIT(pinpointer, port, pin)    	 \
    {                                       				 \
        pinpointer.pPort = &port;           	        \
        pinpointer.mask  = 1 ‹‹ pin;        	 \
    }
#define PIN_OUT1(pinpointer)    *pinpointer.port |= mask
#define PIN_OUT0(pinpointer)    *pinpointer.port &= ~mask
#define PIN_IN(pinopinter)      *pinpointer.port & mask ? 1 : 0

char D_Reset(void);
void D_Write(char Data);
char D_Read(void);
void D_MatchRom(const char address[]);
void D_ReadRom(char *address, char comm, char n);

SPinPointer D_PIN;
SPinPointer D_TRIS;
это в исходнике
Код:
char D_Reset(void)
{
 char count=47;
unsigned char  D_Error;
 //-- Reset the status bits
 D_Error=0;

 //-- Ensure Correct port pin settings
 PIN_OUT1(D_TRIS);//D_TRIS=1;
 PIN_OUT0(D_PIN);//D_PIN=0;

 //-- Start the reset Pulse
  PIN_OUT0(D_TRIS);//D_TRIS=0;          //-- Pull Line Low to start reset pulse
 for(;count›0;count--)
 {
  DelayUs(10);      //-- 480uS Delay
 }
  PIN_OUT1(D_TRIS);//D_TRIS=1;          //-- Release the line
 DelayUs(60);       //-- Delay to about centre of presence pulse
 D_Presence=PIN_IN(D_PIN);//D_PIN;  //-- Get Presence status 1=None 0=something there
...ну и так далее
maxNTF вне форума  
Непрочитано 18.02.2010, 16:35  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: переопределение констант?

Сообщение от maxNTF Посмотреть сообщение
первая из которых not a member of the struct/union ""
Код:
typedef struct 
{
    char *pPort;
    char  mask;
} SPinPointer;
Цитата:
#define PIN_OUT1(pinpointer) *pinpointer.port |= mask
pPort и .port не одно и то же.
И не объявляйте переменные в хидерах:
Цитата:
SPinPointer D_PIN;
Это плохой стиль.
kison вне форума  
Непрочитано 18.02.2010, 17:05  
maxNTF
Вид на жительство
 
Регистрация: 18.06.2006
Сообщений: 434
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
maxNTF на пути к лучшему
По умолчанию Re: переопределение констант?

Сообщение от kison Посмотреть сообщение
И не объявляйте переменные в хидерах:
Цитата:
SPinPointer D_PIN;
Это плохой стиль.
Как же тогда мы ее увидем в основном коде? Где собственно и собираюсь менять порты
Код:
main
{
...
PIN_INIT(D_TRIS, TRISA, 0);
PIN_INIT(D_PIN, PORTA, 0);
...
...
PIN_INIT(D_TRIS, TRISB, 1);
PIN_INIT(D_PIN, PORTB, 1);
}
maxNTF вне форума  
Непрочитано 18.02.2010, 17:37  
maxNTF
Вид на жительство
 
Регистрация: 18.06.2006
Сообщений: 434
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
maxNTF на пути к лучшему
По умолчанию Re: переопределение констант?

Все равно что то не работает, чтото с областью видемости переменных.
1wire.h
Код:
typedef struct 
{
    char *pPort;
    char  mask;
} SPinPointer;
 
#define PIN_INIT(pinpointer, port, pin)    	 \
    {                                       		 \
        pinpointer.pPort = &port;           	 \
        pinpointer.mask  = 1 ‹‹ pin;        	 \
    }
#define PIN_OUT1(pinpointer)    (*pinpointer.pPort |= pinpointer.mask)
#define PIN_OUT0(pinpointer)    (*pinpointer.pPort &= ~pinpointer.mask)
#define PIN_IN(pinpointer)      (*pinpointer.pPort & pinpointer.mask ? 1 : 0)

char D_Reset(void);
void D_Write(char Data);
char D_Read(void);
void D_MatchRom(const char address[]);
void D_ReadRom(char *address, char comm, char n);

static near SPinPointer D_PIN;
static near SPinPointer D_TRIS;
1wire.c
Код:
#include	‹htc.h›
#include	"wire1.h"
#include	"delay.h"

#define D_RiseSpace 10       // Rise Time + Minimum Space (3uS+1uS absolute min)
		
char D_Reset(void)
{
 char count=47;
unsigned char  D_Error;
 //-- Reset the status bits
 D_Error=0;

 //-- Ensure Correct port pin settings
 PIN_OUT1(D_TRIS);//D_TRIS=1;
 PIN_OUT0(D_PIN);//D_PIN=0;

 //-- Start the reset Pulse
  PIN_OUT0(D_TRIS);//D_TRIS=0;          //-- Pull Line Low to start reset 
... и так далее
main.c
Код:
#include	‹htc.h›
#include	"main.h"
#include	"delay.h"
#include	"wire1.h"

int main()
{
PIN_INIT(D_TRIS, TRISA, 1);
PIN_INIT(D_PIN, PORTA, 1);
D_Reset();
}
Все компилируется без ошибок, а вот значение порта не меняется. Хотя если делаю переопределение в самой функции D_Reset тогда работает.
maxNTF вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Размещение констант в памяти программ в PIC ST_Senya Микроконтроллеры, АЦП, память и т.д 10 15.10.2009 20:12


Часовой пояс GMT +4, время: 04:56.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot