Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
18.02.2010, 12:27
|
|
Вид на жительство
Регистрация: 18.06.2006
Сообщений: 434
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
переопределение констант?
Ниже кусок кода из вайла интерфейса 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
... |
|
|
|
|
18.02.2010, 12:43
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
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 |
|
|
|
|
18.02.2010, 12:49
|
|
Вид на жительство
Регистрация: 18.06.2006
Сообщений: 434
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
Re: переопределение констант?
bit_port я так понимаю должна быть глобальная переменная?
|
|
|
|
18.02.2010, 13:14
|
|
Вид на жительство
Регистрация: 18.06.2006
Сообщений: 434
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
Re: переопределение констант?
и как быть если порты находятся по разным регистрам, где то так:
RA0 – 1й
RA1 – 2й
RA2 – 3й
RA3 – 4й
RA5 – 5й
RB2 – 6й
RB3 – 7й
RB1 – 8й
|
|
|
|
18.02.2010, 13:41
|
|
Временная регистрация
Регистрация: 20.06.2007
Сообщений: 70
Сказал спасибо: 1
Сказали Спасибо 12 раз(а) в 11 сообщении(ях)
|
Re: переопределение констант?
|
|
|
|
18.02.2010, 13:55
|
|
Вид на жительство
Регистрация: 18.06.2006
Сообщений: 434
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
Re: переопределение констант?
Есть еще какие варианты? Да и еще в предложеном варианте я не вижу переключения порта (вход/выход)
Последний раз редактировалось maxNTF; 18.02.2010 в 14:11.
|
|
|
|
18.02.2010, 15:40
|
|
Вид на жительство
Регистрация: 18.06.2006
Сообщений: 434
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
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
...ну и так далее |
|
|
|
|
18.02.2010, 16:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
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;
|
Это плохой стиль.
|
|
|
|
18.02.2010, 17:05
|
|
Вид на жительство
Регистрация: 18.06.2006
Сообщений: 434
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
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);
} |
|
|
|
|
18.02.2010, 17:37
|
|
Вид на жительство
Регистрация: 18.06.2006
Сообщений: 434
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
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 тогда работает.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 04:56.
|
|