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.
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.
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. :'(
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.