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.
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.
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.
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.
tach tach schrieb: > jetzt überleg nochmals genau, welche Leitungen du zusammenschalten must. Ja, bitte überlege du nochmal genau. Die Verschaltung ist völlig richtig.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.