Forum: Mikrocontroller und Digitale Elektronik SPI Atmega168


von Karl (Gast)


Angehängte Dateien:

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)

von Stefan E. (sternst)


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.

von Karl (Gast)


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.

von Karl (Gast)


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?

von Karl (Gast)


Lesenswert?

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.

von Stefan E. (sternst)


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.

von Karl (Gast)


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

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
Noch kein Account? Hier anmelden.