Forum: Mikrocontroller und Digitale Elektronik Software SPI - Register lesen


von Jan H. (janiiix3)


Lesenswert?

Moin Moin,

irgendwie stehe Ich gerade auf dem Schlauch.
Möchte anstatt einer "if" Abfrage die Bits so einsammeln..
1
uint8_t spiSoftRead( uint8_t byte )
2
{
3
  uint8_t n = 0;
4
  uint8_t ret = 0;
5
6
  /*
7
  *  Adresse zum lesen senden
8
  */
9
  spiSoftWrite( byte );
10
11
  /*
12
  *  Bits einsammeln..
13
  */
14
  for( n = 0 ; n < 8 ; n++ )
15
  {  
16
    ret |= ( ( SPI_MISO_PIN & SPI_MISO_BP ) >> SPI_MISO_BP );
17
    ret<<=1;          
18
  }
19
  
20
  return ret;
21
}
Aber das möchte nicht klappen. Was mache Ich falsch?

von Och nöö (Gast)


Lesenswert?

Jan H. schrieb:
> Was mache Ich falsch?

Du zeigst nicht deinen kompletten Code.

Wie ist denn SPI_MISO_BP definiert?

von Jan H. (janiiix3)


Lesenswert?

Folgend.

Der Port ist PINB.
Und die Bitposition 1<<4

von Och nöö (Gast)


Lesenswert?

Jan H. schrieb:
> Und die Bitposition 1<<4

Du schaffst es ja nicht mal meine Frage zu beantworten.
Was eigentlich gaaaaaaanz einfach sein sollte.

Die lautete:

Och nöö schrieb:
> Wie ist denn SPI_MISO_BP definiert?

von holger (Gast)


Lesenswert?

Wo ist dein SPI Clocksignal?

von Jan H. (janiiix3)


Lesenswert?

/*
*uC = MEGA32
*/
SPI_MISO_PIN = PINA;
SPI_MISO_BP = (1<<4);

Es geht erstmal nur um die Abfrage was Ich gerade nicht so ganz blicke. 
Um das Clocksignal kümmere Ich mich später.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Jan H. schrieb:
> Um das Clocksignal kümmere Ich mich später.

Du kannst SPI keine Daten entlocken, wenn du es nicht taktest. Mit Glück 
liest du mit deinem Code immer das erste Bit, das aus der Peripherie 
tropft, aber kein bisschen mehr.

von Och nöö (Gast)


Lesenswert?

Jan H. schrieb:
> SPI_MISO_BP = (1<<4);
>
> Es geht erstmal nur um die Abfrage was Ich gerade nicht so ganz blicke.

Wie matzetronics schon sagte musst du mit jedem Bit das du
liest auch einmal den Clock toggeln.

Um die If-Abfrage wirst du kaum herumkommen (was auch nicht
sinnvoll ist) da dein Datenbit im Port nicht auf Position
Null steht.

Also dann lieber so:
1
  
2
for( n = 0 ; n < 8 ; n++ )
3
{ 
4
  if  ( ( SPI_MISO_PIN & SPI_MISO_BP ) != 0) ret |= 1;
5
  ret<<=1;
6
  // hier noch den Clock betätigen
7
  // oder vorher, je nach Datenlage ....
8
}

von holger (Gast)


Lesenswert?

SPI_MISO_BP = (1<<4);  // Das ist 16

 >> SPI_MISO_BP  // Du willst hier aber nur um 4 schieben

von Och nöö (Gast)


Lesenswert?

Natürlich muss es heissen:

#define  SPI_MISO_BP (1<<4)

Aber das ist auch sonst noch einiges im Argen ...

von Jan H. (janiiix3)


Lesenswert?

Jan H. schrieb:
> ( ( SPI_MISO_PIN & SPI_MISO_BP ) >> SPI_MISO_BP );
Damit wollte Ich bezwecken, dass das Bit (SPI_MISO_BP) mit dem Port 
(SPI_MISO_PIN) verUNDET wird. Wenn das Bit auf "high" liegt dann soll es 
ganz nach "rechts" geschoben werden, so dass das erste Bit gesetzt ist.
Dann wird weiter geschoben (das ganze 8x) sollte doch so klappen oder?

von Och nöö (Gast)


Lesenswert?

Jan H. schrieb:
> sollte doch so klappen oder?

Nein.

von Jim M. (turboj)


Lesenswert?

Jan H. schrieb:
> Dann wird weiter geschoben (das ganze 8x) sollte doch so klappen oder?

Nö. Denn da wird um 1<<4 geschoben und nicht nur um 4.

Lass Dir das Präprozessor Ergebnis (gcc -E) mal anzeigen, dann sieht man 
was passiert ist.

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.