SPI mit ATMEGA8 - mehrere Bits

OP #4144961
Lesenswert?
• ▲
▼
Hallo zusammen, dies ist mein erster Beitrag hier. Ich habe aber schon 
öfter hier vorbeigeschaut und bin deshalb auch schon ein ganzes Stück 
weit gekommen bei meinem Projekt.

Ich habe 2 Atmega8 mit einander verbunden. Es ist mir auch gelungen eine 
LED am Slave zum blinken zu bringen. Ich bekomme es aber nicht hin mehr 
als ein Bit zu verschicken und bin mir nicht sicher, was ich falsch 
mache.

Ich erkenne, dass nicht die gewünschten Daten ankommen, da ich in diesem 
Fall die LED am Slave schnell blinken lasse.
Kommen die richtigen Daten an, erwarte ich ein gleichmäßiges Blinken.

Meine Frage ist nun, wie ich das Programm ändern müsste, damit ich 
mindestens 2 verschiedene Bytes nacheinander versenden kann.
Verdrahtung usw sind im Anhang.

Ich habe auch schon ähnliche Beiträge gesehen, aber diese haben mir 
nicht geholfen das Problem zu lösen, das Senden einzelner Bytes habe ich 
ja auch schon hinbekommen.
Angehängte Dateien:
#4145057
Lesenswert?
• ▲
▼
else {  PORTD = 0b11111111; _delay_ms(100);        // schnelles Blinken, 
wenn das Signal vom Gewünschten abweicht
      PORTD = 0b00000000; _delay_ms(100);
      PORTD = 0b11111111; _delay_ms(100);
      PORTD = 0b00000000; _delay_ms(100);
      PORTD = 0b11111111; _delay_ms(100);
      PORTD = 0b00000000; _delay_ms(100);
      PORTD = 0b11111111; _delay_ms(100);
      PORTD = 0b00000000; _delay_ms(100);
      PORTD = 0b11111111; _delay_ms(100);
      PORTD = 0b00000000; _delay_ms(1000);
  }

delay?
Dir ist aber schon klar, dass man sich mit delays so gut wie jedes 
Timing zunichte machen kann?

Wenn du wissen willst, was der Slave krieg, warum gibst du dann nicht 
ganz einfach das empfangene Byte am PORTD aus? Das geht schnell und 
bringt dir nicht alles durcheinander, weil der Slave die meiste Zeit nur 
Däumchen dreht und in der SPI ein Byte nach dem anderen durchrauscht 
ohne dass der Slave sie auswertet.

Jedes mal, wenn der Master ein Byte wegschickt, gibt der Slave das Byte 
aus.

Im übrigen musst du dir noch eine Systematik überlegen, wie der Slave 
weiss, ob du nun das Highbyte oder das Lowbyte deines unsigned int 
kriegt.

> das Senden einzelner Bytes habe ich ja auch schon hinbekommen.
Na, dann passt es doch.
n Bytes zu übertragen ist nichts anderes als n mal 1 Byte zu übertragen.
Die Schwierigkeit besteht darin, dass der Empfänger weiss, welches der n 
Bytes er nun bekommen hat. Dafür musst du dir was ausdenken. 
Üblicherweise gibt es dann noch eine Leitung zum 'synchronisieren'. Das 
kann zb die SS Leitung sein (oder irgendeine andere, die du als Chip 
Select benutzt). Solange die auf inaktiv ist, ignoriert der Slave alle 
eingehenden Bytes. Kommt der Chip Select auf 'aktiv', dann zählt der 
Slave mit einem Zähler mit und weiss damit das wievielte Byte er 
bekommen hat. D.h. der Master kann damit dem Slave mitteilen: jetzt 
beginnt eine neue Nachricht aus n Bytes, setz deinen Zähler auf 0 und 
danach schick ich dir genau diese n Bytes.
(was auch immer dieses n war. WEnn das n nicht programmweit fix ist, 
dann kann der Master zb als erstes Byte übertragen, wieviele weitere 
Bytes noch kommen werden).

Du bist gerade drauf und drann zu entdecken, was ein Protokoll ist und 
warum man eines bei der Übertragung von Nachrichten, die aus >1 Bytes 
bestehen braucht und dass dich die Hardware dabei nicht unterstützt 
sondern du selbst etwas erfinden muss.
Wobei du dich vom Empfänger leiten lassen musst. Wie kann ein Empfänger 
bei einer n-Byte Nachricht rausfinden, das wievielte Byte er gerade 
bekommen hat? Das ist die Frage, die du dir stellen musst und für die du 
eine deiner Aufgabenstellung angemessene Lösung brauchst. Wenn du die 
Lösung hast, dann muss sich der Sender nach dieser gefundenen 
Lösungsvereinbarung richten. Hier hat der Empfänger erst mal das Sagen.
#4145077
Lesenswert?
• ▲
▼
Karl Heinz schrieb:

> Wenn du wissen willst, was der Slave krieg, warum gibst du dann nicht
> ganz einfach das empfangene Byte am PORTD aus? Das geht schnell und
> bringt dir nicht alles durcheinander, weil der Slave die meiste Zeit nur
> Däumchen dreht und in der SPI ein Byte nach dem anderen durchrauscht
> ohne dass der Slave sie auswertet.

Um es ganz klar zu sagen:
Der Übeltäter sind die delays hier!
Das ist so, wie wenn du in ein Konzert gehst und jedesmal, wenn die 
Violinen einen bestimmten Ton spielen, haltest du dir für 10 Minuten die 
Ohren zu. Dass du dann vom Konzert nur wenig mitkriegst, dürfte auf der 
Hand liegen.

Man kann es nicht oft genug betonen:
delay_ms ist selten die Lösung aber oft genug das Problem.
Gast #4145644
Lesenswert?
• ▲
▼
Wenn die Verkabelung in deinen Text-Files wirklich so ist, kann es nicht 
funktionieren!

MOSI -> MOSI ???
MISO -> MISO ???

MOSI steht für MaterOutSlaveIn
MISO steht für MasterInSlaveOut

jetzt überleg nochmals genau, welche Leitungen du zusammenschalten must.

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.