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