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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von breezer (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Achso, es handelt sich übrigends um den XC8 Compiler...

von Mr. Tom (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
breezer schrieb:
>
> variabel
>
> MfG

Variable

von Dani (Gast)


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

von breezer (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.