Forum: Mikrocontroller und Digitale Elektronik Bits nacheinander aus Maske lesen


von DummeFrage (Gast)


Lesenswert?

Ich stehe gerade auf dem Schlauch und sehe den Wald grad nicht...


Ich möchte gerne aus einer Bitmaske (0b10011110) - nacheinander die 
einzelnen Bits lesen und auf einen Pin ausgeben.

Da komme ich quasi um eine if Abfrage ja nicht drum herum oder? Da geht 
es um eine Soft-I2C Anwendung die ich gerne schreiben würde. Da muss ja 
der SDA Pin im Low SCL Pegel geschrieben werden, der Pegel von SCL auf 
High - dann ließt der Slave die Pegel von SDA und dann kann ich im 
Master den Pegel von SCL wieder auf Low ziehen.

Ginge das dann einfacher wenn ich als Grundvorraussetzung den Pegel von 
SDA immer auf 0 setze und dann je nachdem welcher Bit in der Maske 
gesetzt ist, den Pegel auf 1 setze oder eben nicht?! Also so:
1
uint8_t Maske = BitMaske;       //Damit BitMaske nicht "leer geschoben" wird
2
3
for( i = 8; i; i--)
4
{
5
6
7
  SDA_PORT &= ~(1<<SDA_PIN);    //SDA: Immer auf 0 setzen
8
  if(Maske & 0x80)              //SDA: Prüfe ob Maskenbit 1
9
    SDA_PORT |= (1<<SDA_PIN);   //SDA: Setze Pin auf 1 wenn Maskenbit 1
10
11
  Maske <<= 1;                  //Maske um eins schieben
12
13
  SCL_PORT &= ~(1<<SCL_PIN);    //Clock auf high
14
  SCL_PORT |= (1<<SCL_PIN);     //Clock auf low
15
}

oder geht das "schöner" ohne den Umweg den Pin immer erstmal auf 0 zu 
legen?!

von M. P. (phpmysqlfreak)


Lesenswert?

Naja, was heißt schöner.
Ich hätte es vielleicht so geschrieben, dass ich nicht immer lösche, 
sondern nur, wenn es notwendig ist. - Und am Ende der Übertragung halt 
den Grundzustand wiederherstellen.

Um auf deinen Code zurück zu kommen:
1
  if(Maske & 0x80)              //SDA: Prüfe ob Maskenbit 1
2
    SDA_PORT |= (1<<SDA_PIN);   //SDA: Setze Pin auf 1 wenn Maskenbit 1
3
  else
4
    SDA_PORT &= ~(1<<SDA_PIN);    //SDA: Setze Pin auf 0 wenn Maskenbit 0

Gruß

: Bearbeitet durch User
von Joe F. (easylife)


Lesenswert?

klugscheisserei bezügl. begriffen:
deine maske ist 0x80, und das was bei dir maske heisst ist das 
datenbyte.

bei i2c darfst du übrigens scl und sda nie aktiv high treiben, sondern 
musst für high die leitung tri-staten und die pullups ihren job machen 
lassen.

start stop condition und clock stretching werden dann deine nächsten 
themen...

: Bearbeitet durch User
von DummeFrage (Gast)


Lesenswert?

Joe F. schrieb:
> klugscheisserei bezügl. begriffen:
> deine maske ist 0x80, und das was bei dir maske heisst ist das
> datenbyte.

Ja ist richtig :D - ich hab da ein wenig verquert gedacht. Weil ich das 
als Maske über die SCL sehe - quasi nicht aus programmiertechnischer 
Sicht. Aber richtig - die eigentliche Maske ist die 0x80 und das zu 
sendende Byte heißt Maske, werde ich - damit es später nicht zu 
Missverständnissen führt, aber umbenennen.

Joe F. schrieb:
> bei i2c darfst du übrigens scl und sda nie aktiv high treiben, sondern
> musst für high die leitung tri-staten und die pullups ihren job machen
> lassen.

Jain - ich betreibe die i2c Slaves ohne Pull-up und nutze die Pull-Up im 
AVR. Ich weiß, ich weiß - ich hole mir auch schonmal mein Popcorn raus 
und freue mich auf die nun entstehende Diskussion! :D

Joe F. schrieb:
> start stop condition und clock stretching werden dann deine nächsten
> themen...

Die Start, Stop Condition ist ja nun so wild. Clock Stretching werde ich 
bei diesem Projekt außer acht lassen - da der von mir eingesetzte i2c 
Slave dies nicht unterstüzt bzw. nutzt / betreibt. Es handelt sich im 
übrigen um ein SDTS25 - Temperatursensor.

Marcel P. schrieb:
1
> if(Maske & 0x80)              //SDA: Prüfe ob Maskenbit 1
2
>     SDA_PORT |= (1<<SDA_PIN);   //SDA: Setze Pin auf 1 wenn Maskenbit 1
3
>   else
4
>     SDA_PORT &= ~(1<<SDA_PIN);    //SDA: Setze Pin auf 0 wenn Maskenbit 
5
> 0

Ja okay, also immer entscheiden lassen ob high oder low... das spart auf 
jeden Fall mal eine Anweisung, das ist richtig - zu lesen und zu 
verstehen natürlich auch einfacher. Werde das wohl so machen. Danke.

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.