mit #define definierten Pin während der Laufzeit ändern

Gast #3472614
Lesenswert?
• ▲
▼
Hallo,

also ich habe hier einen Code zum Auslesen eines DHT22 
Temperatursensors. Der Code ist leider nicht für eine Nutzung mit 
mehreren DHT's geschrieben.
Im Code muss der DHT_PIN, DHT_TRIS und DHT_LAT vorab definiert werden.

Nun möchte ich aber im Programm diese PINs wechseln so dass ich mehrere 
Sensoren auslesen kann.
Ich habe schon es schon versucht mit #undef DHT_PIN und anschließendem 
neu definieren, allerdings ohne Erfolg.

Der einmal am Anfang definierte PIN bleibt über die gesamte 
Programmlaufzeit bestehen, auch mit #undef und #define des neuen Pins.

Was kann ich machen?
1
#ifndef DHT22_H
2
#define  DHT22_H
3

4
#ifndef DHT_LAT
5
#error "Define the LAT address of the DQ pin (example:LATCbits.LATC1) for writting"
6
#endif
7

8
#ifndef DHT_PIN
9
#error "Define the PORT address of the DQ pin (example:PORTCbits.RC1) for reading"
10
#endif
11

12
#ifndef DHT_TRIS
13
#error "Define the TRIS address of the DQ pin (example:TRISCbits.TRISC1)"
14
#endif
15

16
#define OUTPUT 0
17
#define INPUT 1
18

19

20
unsigned char DHT_Read(void)
21
{
22

23
extern unsigned int DHTHdy;
24
extern unsigned int DHTTemp;
25
unsigned char Checksum;
26
unsigned char bitsum;
27
unsigned char bittime;
28
unsigned char i;
29
unsigned char timeout = 0;
30

31

32
    DHT_TRIS = OUTPUT;
33
    DHT_LAT = 0;
34
    __delay_ms(10);   //10ms Delay
35
    DHT_LAT = 1;
36
    DHT_TRIS = INPUT;
37
    __delay_us(40);   //40µs Delay
38
    while(DHT_PIN == 0) { timeout++; if (timeout==255) return 0; }
39
    timeout = 0;
40
    while(DHT_PIN == 1) { timeout++; if (timeout==255) return 0; }
41
    timeout = 0;
42

43
    
44
for (i=0;i<16;i++)
45
    {
46
    bittime = 0;
47
    while(DHT_PIN == 0) { timeout++; if (timeout==255) return 0; }
48
    timeout = 0;
49

50
.
51
.
52
.
53
.
54
.
Gast #3472619
Lesenswert?
• ▲
▼
breezer schrieb:
> Ich habe schon es schon versucht mit #undef DHT_PIN und anschließendem
> neu definieren, allerdings ohne Erfolg.

Wie auch?
#define und #undefine werden vom C-Präprozessor abgearbeitet, also noch 
bevor der C-Compiler sich dein Machwerk anguckt. Wie soll da während der 
Laufzeit irgendetwas änderbar sein.
Gast #3472620
Lesenswert?
• ▲
▼
breezer schrieb:
> Der einmal am Anfang definierte PIN bleibt über die gesamte
> Programmlaufzeit bestehen, auch mit #undef und #define des neuen Pins.

was für ein Wunder.

Während des compilerens wird nur eine Textersetzung vorgenommen. Es sind 
keine Variablen die man ändern kann.

Es geht also nicht.
Gast #3472701
Lesenswert?
• ▲
▼
A. K. schrieb:
> Sinngemäss:
>
> #define DHT_LAT  lat_var
> #define DHT_PIN  pin_var
> #define DHT_TRIS tris_var
>
> volatile ... *lat_var;
> volatile ... *pin_var;
> volatile ... *tris_var;
>
> Und dann jeweils die 3 Vars setzen.

Hallo,

hab das Ganze mal versucht, leider ohne Erfolg.
Ich bekomme so folgende Fehlermeldung:

error: undefined identifier "lat_var"
warning: illegal conversion of pointer to integer

Mein Code:
1
#define DHT_LAT lat_var
2
#define DHT_PIN pin_var
3
#define DHT_TRIS tris_pin
4

5
volatile unsigned char *lat_var;
6
volatile unsigned char *pin_var;
7
volatile unsigned char *tris_var;
8

9
lat_var = &LATBbits.LATB4;
10
pin_var = &PORTBbits.RB4;
11
tris_var = &TRISBbits.TRISB4;

@Dani, das wäre eine Möglichkeit, aber von zusätzlicher Hardware wollte 
ich absehen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren