Hallo, ich versuche eine Verbindung zwischen zwei Atmega168 über SPI zu programmieren (siehe Anhang) Das Senden vom Master zum Slave funktioniert super, aber wenn ich mit dem Master Daten empfangen möchte, funktioniert es nicht richtig. Dieses Programm ist nur zum Ausprobieren. Über ein Tool schicke ich Buchstaben an den Atmega, dieser geht dann in die Switch-Anweisung. In der Switch-Anweisung kommuniziert der Master mit dem Slave. (Master schickt ein Buchstaben zum Slave, der dann eine bestimmte Zahl zurückgeben soll. Diese wird über USART zum PC geschickt) Schicke ich ein 'i' über USART kommt immer eine '2' v. Slave zurück (wie es auch sein sollte) schicke ich aber ein 'g' über USART, dann kommt manchmal was Falsches (es sollte eine '1' "kommen") -verstehe ich nicht ganz, da genau die gleichen Befehle benutzt werden würde mich sehr über Verbesserungsvorschläge freuen (der Fehler kann nur am SPI liegen, da die anderen Programmteile an anderer Stelle erprobt sind)
1 | write_spi('a'); |
2 | dreh_l=SPDR; |
3 | write_spi('a'); |
4 | akku=SPDR; |
Bedenke: Nach dem ersten Senden des 'a' muss im Slave erst mal die ISR ausgeführt werden. Erst wenn dort das SPDR=... ausgeführt wurde, darf das zweite Senden starten um das Ergebnis abzuholen. Kurz gesagt, du lässt dem Slave zu wenig Zeit, um die Antwort bereitzustellen.
Danke für den Ansatz Wie weiß ich, dass der Slave ins SPDR geschrieben hat? Soll ich ein "delay()" hinzufügen um den Slave Zeit zu geben(keine schöne Lösung)? Ich setze den B0 Pin auf low, um die Kommunikation zu starten und wieder high, um sie zu stoppen. Muss in dieser Zeit auch der SPDR abgefragt werden, oder geht das auch nach dem high setzen.
Zusatz: Beim ersten write_spi('a') gebe ich den Befehl 'a' an den Slave, dann beende ich die Kommunikation (hier müsste doch der Slave die Antwort ins SPDR schreiben). Beim zweiten write_spi('a') starte ich die Kommunikation nur um das SPDR auszulesen das müsste doch an Zeit genügen, oder?
Ich mal wieder... Ich glaub den Fehler gefunden zu haben: Man muss den SPDR in der Kommunikation abfragen, also vor den high - setzen von B0.
Karl schrieb: > Ich glaub den Fehler gefunden zu haben: > Man muss den SPDR in der Kommunikation abfragen, > also vor den high - setzen von B0. Nein. Karl schrieb: > Beim ersten write_spi('a') gebe ich den Befehl 'a' an den Slave, > dann beende ich die Kommunikation (hier müsste doch der Slave die > Antwort ins SPDR schreiben). Er "müsste" damit es klappt, aber er tut es ja nicht sofort. Das Ausführen von Code braucht nun mal Zeit. Die ISR auf dem Slave wird nicht in 0-Zeit ausgeführt.
Der Slave schreibt seine Daten in sein SPDR nach dem ersten write('a'), weil er den Befehl dazu bekommt. Weil aber die Zeit nicht reicht, das SPDR gleich abzufragen beende ich die Kommunikation und starte sie noch mal, um das SPDR des Slaves abzufragen Wie ich von Anfang an machte. Ich dachte, dass der Slave in das SPDR vom Master schreibt (darum nach High abgefragt), dies ist aber nicht so jetzt klappt alles reibungslos, danke für das Interesse
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.