Forum: Mikrocontroller und Digitale Elektronik SPI Kommunikation zwischen zwei ATmega8 mit Bascom-AVR


von Sebastian D. (Firma: HS-Hannover) (basti-494)


Angehängte Dateien:

Lesenswert?

Guten Tag,

ich sitze seit einiger Zeit an meinem Programm zur Datenübertragung 
zwischen zwei ATmega8. Die Schaltung ist so aufgebaut:

Beide ATmega8 sind über die Pins SS -> SS , MOSI -> MOSI , MISO -> MISO 
, SCK -> SCK angeschlossen.
An dem 1. ATmega8 (Master) ist ein Poti am ADC(0) angeschlossen.
Am 2. ATmega8 ist ein Display (161a) im 4-Bit Modus angeschlossen.


Zum eigentlichen Programm:

Die Stellung vom Poti wird über den ADC-Pin vom 1. ATmega8 eingelesen 
und dann mit der SPI Übertragung an den 2. ATmega8 gesendet werden. Der 
2. ATmega8 soll diese "Daten" dann in einer Variablen speichern und über 
die LCD Anzeige ausgeben.


Das Programm im Anhang "funktioniert" zwar, aber irgendwie nicht so wie 
ich es gerne haben möchte. :|

Der Wert vom Poti wird übermittelt, angezeigt bekomme ich auf dem 
Display Zahlen zwischen 0-255 dann springt er wieder auf "0". Das ganze 
viermal, wenn ich das Poti drehe. (Es werden ja auch immer nur 1 Byte 
übertragen!?!)

Wie kann ich die Daten die vom Master zum Slave gesendet werden einer 
bestimmten Speicheradresse zuordnen. In meinem Fall: Awert vom Master zu 
Awert vom Slave. Zur Zeit ist es vollkommen egal wie die Variable im 
Slave heißt, es funktioniert trotzdem.
Oder wenn ich zwei LED unterschiedlich ein und wieder ausschalten 
möchte, dann brauche ich doch zwei verschiedene Adressen die ich per SPI 
ansteuere oder denke ich da in die Flasche Richtung?


Ich hoffe Ihr versteht mein Anliegen und könnt mir weiter helfen. :'D

Mit freundlichen Grüßen
Sebastian D.

von ügo (Gast)


Lesenswert?

Sebastian D. schrieb:
> Wie kann ich die Daten die vom Master zum Slave gesendet werden einer
> bestimmten Speicheradresse zuordnen. In meinem Fall: Awert vom Master zu

Wofür hast du denn den Slave Select Pin? Immer wenn der vom Master 
aktiviert wird, könntest du der Reihenfolge der Bytes die dann gesendet 
werden eine Ordnungsnummer geben. Also: Slave select aktiv machen, 1. 
Byte senden ist Awert, 2.Byte senden ist Bwert. ... Slave select 
inaktiv. Übertragung beendet. Der Slave muß natürlich den Slave Select 
überwachen und die ankommenden Bytes in die richtige Variable speichern.

von Sebastian D. (Firma: HS-Hannover) (basti-494)


Angehängte Dateien:

Lesenswert?

So wie du das geschrieben hast habe ich es mal ausprobiert und solange 
ich nur die Werte vom ADC Pin übertrage funktioniert es. (Habe es auch 
hinbekommen die 10Bit ADC in zwei 8Bit Werte aufzuteilen, diese werden 
nacheinander gesendet und im 2. ATmega8 wieder zusammengefügt werden)

Wenn ich dann noch einen Taster anschließe der eine LED steuern soll, 
kommt wieder alles durcheinander. Dann kann ich mit dem Poti die LED 
steuern und im Display wird entweder "0", "1", "2" oder "3" angezeigt, 
aber nicht mehr der eigentliche Wert. :'(

von ügo (Gast)


Lesenswert?

Wenn ich das richtig überblicke, aktivierst und deaktivierst du den SS 
auf der Masterseite bei jedem der 3 zu übertragenden Bytes.

Es war aber so gedacht, daß vor Senden der SS aktiviert wird und dann 
alle 3 Bytes gesendet werden und erst dann SS wieder deaktiviert wird. 
Durch das SS weiß der Slave, daß die Übertragung beginnt, das 1. Byte 
Awerth ist, das 2. Byte Awertl ist und das 3. Byte Led ist. Dann erst 
soll der Master den SS wieder deaktivieren und der Slave weiß, daß die 
Übertragung der 3 Byte beendet ist.

Wenn ein ADC Wert zur Übertragung ansteht aber für die Led keine Taste 
gedrückt wurde, sich also nichts geändert hat, werden die beiden "neuen" 
ADC Bytes übertragen aber halt der alte Led-Wert von der vorherigen 
Übertragung nochmal übertragen. Das sollte im Slave keine Auswirkung 
haben oder sollte dort abgefangen werden.

von Sebastian D. (Firma: HS-Hannover) (basti-494)


Angehängte Dateien:

Lesenswert?

Jetzt habe ich es verstanden. :D

Beide Programme habe ich geändert und es funktioniert. Es werden keine 
Daten mehr vermischt, die Anzeige gibt den Potiwert wieder und die LED's 
leuchten je nachdem wie die Schalter gedrückt sind.

Danke für deine Hilfe! :)

Als nächstes versuche ich die SPI Übertragung mit dem NRF24L01 zu 
erweitern. Mal gucken wie weit ich komme bevor ich wieder auf dem 
Schlauch stehe :'D

von ügo (Gast)


Lesenswert?

Sebastian D. schrieb:
> Beide Programme habe ich geändert und es funktioniert.

Prima.
Schau aber auch mal nach der Tastenentprellung um nicht unerwünschte 
Effekte zu bekommen. Die bequemste Art ist das DEBOUNCE Kommando in 
Bascom.

von Sebastian D. (Firma: HS-Hannover) (basti-494)


Lesenswert?

Danke für den Tipp. Das werde ich noch einfügen.

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.