Forum: Mikrocontroller und Digitale Elektronik mit #define definierten Pin während der Laufzeit ändern


von breezer (Gast)


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
.

von breezer (Gast)


Lesenswert?

Achso, es handelt sich übrigends um den XC8 Compiler...

von Mr. Tom (Gast)


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.

von Peter II (Gast)


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.

von breezer (Gast)


Lesenswert?

Ok, erst einmal danke für die Antworten. So habe ich es mir auch schon 
fast gedacht.

Aber welche Möglichkeiten hätte ich nun das ganze variabel zu gestalten?

MfG

von (prx) A. K. (prx)


Lesenswert?

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.

von Karl K. (leluno)


Lesenswert?

breezer schrieb:
>
> variabel
>
> MfG

Variable

von Dani (Gast)


Lesenswert?

Du könntest auch mit einem Multiplexer wie z.B. den 74HC4052 die 
Sensoren abwechselnd an den PIN schalten.

von breezer (Gast)


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.

von (prx) A. K. (prx)


Lesenswert?

Für ... bitte den richtigen Typ reinschreiben. Also den, mit dem der 
jeweilige Portkram deklariert ist. Beim Bitfeld für den Pin dürfte das 
allerdings scheitern, da ist mehr Umbau angesagt.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.