Forum: Mikrocontroller und Digitale Elektronik sbit als Variable in C


von tom (Gast)


Lesenswert?

Hallo,
ich bin neu in der MC C Programmierung.
Ich hätte eine generelle Frage in Bezug auf sbits.
Wie kann ich ein sbit dynamisch an eine Funktion übergeben.

Wenn man z.B. mehrere gleiche Sensoren an verschiedene PINS anschließt 
möchte ich immer die gleiche Treiberroutine benutzen.


sbit DQ  =  P3^3;  // sollte später in main programm durch P3^0 bis P3^5 
ersetzt werden

//----------------------------------------
// Reset DS1820
//----------------------------------------
bit ResetDS1820(sbit DQ)  <-- funktioniert nicht
{
  bit presence;
  DQ = 0;     //pull DQ line low
  DelayUs(29);   // leave it low for about 490us
  DQ = 1;     // allow line to return high
  DelayUs(3);   // wait for presence 55 uS
  presence = DQ;   // get presence signal
  DelayUs(25);   // wait for end of timeslot 316 uS
  return(presence); // presence signal returned
}   // 0=presence, 1 = no part

Könntet ihr mir bitte helfen wie ich das Problem lösen kann?

Vielen Dank im Voraus!

Grüße....

von H.J.Seifert (Gast)


Lesenswert?

C an sich kennt keine Bits, die kleinste Einheit ist ein char.
Ab und zu gehts doch, das sind dann aber compilerspezifische 
Erweiterungen. Ob man das dann auch noch als Funktionswert übergeben 
kann? Ich glaube nicht.
Zumindest wenn die einzelnen Sensoren an einem Port hängen, sollte es 
kein Problem sein, den Funktionswert als Maske zu übergeben.

#define Sensor1 0x01 //Port0.0
#define Sensor2 0x02 //Port0.1

von tom (Gast)


Lesenswert?

Danke für deine Antwort.

Könntest du mir bitten ein kleines BSP geben. Da ich auf dem Schlauch 
stehe und nicht genau weiß was du meinst...

Vielen Dank...

von H.J.Seifert (Gast)


Lesenswert?

#define Sensor1 0x01 //Port0.0
#define Sensor2 0x02 //Port0.1
.
.

//----------------------------------------
// Reset DS1820
//----------------------------------------
unsigned char ResetDS1820(unsigned char Sensor)
{unsigned char presence;

  Port0 = PORT0 & (~Sensor);     //pull DQ line low
  DelayUs(29);   // leave it low for about 490us
  Port0 = Port0 | Sensor1;     // allow line to return high
  DelayUs(3);   // wait for presence 55 uS
  presence = Port0 & Sensor;   // get presence signal
  DelayUs(25);   // wait for end of timeslot 316 uS
  return(presence); // presence signal returned
}   // 0=presence, nicht 0 = no part

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.