Pin einlesen

Gast #464500
Lesenswert?

habe das jetzt so gemacht

SPI sendet ein Byte und empfängt 11 bit (msb first)

void soft_spi_Mastersend (char command2)
{
char n, i;
i = 0;

PORTB = (0 << PB0);                         //ss auf low
for (n = 7; n > 0; n--)
  {
  PORTB = (1 << PB1);               //CLK high
  command2 = command2 >> n;
  PORTB = (command2 <<PB2);
  timer0_init();                    //Timer 0 = 3,3mysec (f=150kHz)
  while (!(TIFR & (1<<TOV0)));           //Timerzeit
  TIFR = (1<<TOV0);
  PORTB = (0 << PB1);               //CLK low
  timer0_init();                    //Timer 0 = 3,3mysec (f=150kHz)
  while (!(TIFR & (1<<TOV0)));           //Timerzeit
  TIFR = (1<<TOV0);
  }
}


int soft_spi_Slavesend (void)

{
for(n = 11 ;n > 0 ;n--)
  {
  PORTB = (1 << PB1);               //CLK high
  timer0_init();                    //Timer 0 = 3,3mysec (f=150kHz)
  while (!(TIFR & (1<<TOV0)));           //Timerzeit
  TIFR = (1<<TOV0);
  PORTD = (0 << PD0);                  //Clk low
  timer0_init();                     //Timer 0 = 3,3mysec (f=150kHz)
  while (!(TIFR & (1<<TOV0)));           //Timerzeit
  TIFR = (1<<TOV0);                //Timerreset
  sensorwert = (PINB & _BV(B3));          //Einlesen der Werte MSB first
  xGes = xGes <<1;
  xGes += sensorwert;
  }
  PORTB = (1 << PB0);                         //ss auf high
  return xGes;
}
#464502
Lesenswert?

PORTB = (1 << PB1);               //CLK high
PORTD = (0 << PD0);                  //Clk low

Zweite Zeile sieht etwas unsinnig aus...ausserdem stehen beide CLK-Ports 
in keinem Bezug. Ich vermute mal, das ist so nicht gedacht... ich 
vermute, das sollte PORTD&=~_BV(PD0) heissen...(wenn nicht sogar portb)

Ich nehme an, die DDRB's werden verher schon irgendwo gesetzt?
Gast #464589
Lesenswert?

ja senden auch msb first
die if/else glaube ich zu vertehen. das ist ja wie

if (data & 1){
  PIN_SPI_DATA = 1;
else{
  PIN_SPI_DATA = 0;
}
data = data >> 1;

aber das mit dem ausmaskieren verstehe ich nicht.
Gast #464604
Lesenswert?

habe das jetzt mal so gemacht:


PORTB = (0 << PB0);                         //ss auf low
for (n = 7; n > 0; n--)
  {
  PORTB = (1 << PB1);               //CLK high
  if (command2 & 0x8000)                // Wenn MSB-Bit gesetzt
     {
       PINB = (1<<PINB2);                 // Data-Pin auf 1 schalten,
     }
    else
     {
       PINB = (0<<PINB2)                 // ansonsten auf 0
     }
    command2 = command2 << 1;
#464605
Lesenswert?

Ich sehe, da fehlen ein klein wenig die logischen Grundlagen.

Ein Byte besteht aus 8 Bit. (Das war jetzt hoffendlich nicht die grosse 
Neuigkeit). Die 8 Bits in diesem Byte haben unterschiedliche Wertigkeit:
1 2 4 8 16 32 64 und 128
Sind alle 8 Bits in diesem Byte gesetzt kommt man so auf die Summe von 
255 die das Byte dann als Wert hätte.

Wir interessieren uns zunächst aber nur für das höhstwertigste Bit 
(128). Deshalb blenden (maskieren) wir alle anderen Bits aus.

wert=command2 & 128;

War das MSB gesetzt, hat "wert" jetzt den Wert 128. Falls nicht, 0.

Ich habe dieses MSB (ob gesetzt oder nicht) dann einfach auf die 
Position von PB2 (um 5 nach 'unten') um es dann einfach direkt den 
PortBit zuzuweisen. Der Ausdruck dafür wäre aber vermutlich etwas zuviel 
für einen Anfänger gewesen, deshalb hab ichs dann doch mit IF gemacht. 
Etwas blöd...sorry. Tatsächlich kannst du die Zeile mit dem >>5 
weglassen.

command2 = command2 << 1 schubst einfach das Bit6 (64) auf die Stelle 
von Bit7(128), damit beim nächsten schleifendurchlauf damit gearbeitet 
wird.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren