Forum: Mikrocontroller und Digitale Elektronik 4 Sensoren mit dem selben Programmcode abfragen


von Alex (Gast)


Lesenswert?

Hi,

ich frage mit einem Atmega8 einen DHT11 Feuchtigkeitsfühler ab (ähnlich 
1 wire). Nun möchte ich aber 4 Fühler auslesen (jeder hängt an einem 
eigenen Pin). Kann ich die Port/Pin-Definitionen irgendwie meinen 
Funktionen übergeben?
Danke!

Grüßle,
Alex

von Karl H. (kbuchegg)


Lesenswert?

Alex schrieb:
> Hi,
>
> ich frage mit einem Atmega8 einen DHT11 Feuchtigkeitsfühler ab (ähnlich
> 1 wire). Nun möchte ich aber 4 Fühler auslesen (jeder hängt an einem
> eigenen Pin). Kann ich die Port/Pin-Definitionen irgendwie meinen
> Funktionen übergeben?

Sicher kann man
1
void foo( volatile uint8_t* port, uint8_t pin )
2
{
3
  if( *port & ( 1 << pin ) )
4
    ...
5
}
6
7
int main()
8
{
9
  ....
10
11
  foo( &PINB, PB5 );
12
  ....
13
}

: Bearbeitet durch User
von Alex (Gast)


Lesenswert?

Vielen Dank!
Braucht man das volatile?

von Peter D. (peda)


Lesenswert?

Man muß allerdings aufpassen, ob das 1W-Timing dadurch nicht zu stark 
verzögert wird.
Auch werden dadurch schon 5 Register belegt, die Funktionen werden wohl 
nicht ohne Stackframe auskommen.

Besser ist daher, die Sensoren liegen alle auf einem Port und man 
übergibt der 1W-Funktion nur die Bitmaske.

: Bearbeitet durch User
von R. F. (rfr)


Lesenswert?

Alex schrieb:
> Vielen Dank!
> Braucht man das volatile?

JA!!!

Der Compiler versucht ohne das volatile, das Programm zu optimieren, in 
dem der Zugriff auf uint8_t* port weggelassen wird.

Das Erkennen einer Änderung ist so nicht möglich.

volatile ist zwingend erforderlich, wenn Lesezugriffe auf externe 
Grössen erfolgen sollen.

Gruss

Robert

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.