SPI Atmega168

Gast #2487138
Lesenswert?

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)
Angehängte Dateien:
#2487215
Lesenswert?

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.
Gast #2487669
Lesenswert?

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.
Gast #2487691
Lesenswert?

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?
#2487748
Lesenswert?

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.
Gast #2489489
Lesenswert?

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

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