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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.