Ne, ich habe es mit den BASCOM-Befehlen gemacht
Hi!
SPI oder I²C?
Hast du den I²C mit den Registern programmiert?
Da kann ich dir leider nix geben, aber Florian hat da mal was gemacht...
VLG Tobi
http://www.tobias-schlegel.de
"An AVR can solve (almost) every problem" - ts
Ne, ich habe es mit den BASCOM-Befehlen gemacht
Hi!
Die I²C sache.
Der Trick ist, dass man die Pins als Eingang definiert.
Bin ich auch lange drauf reingefallen. Aber anders gehts wohl nicht...
VLG Tobi
http://www.tobias-schlegel.de
"An AVR can solve (almost) every problem" - ts
Hallo tobmic,
danke erstmal für Deine Gedulg mit mir *g* und deine vielen Tips!
Zum I2C:
Ich häng mal meinen Code-Schnipsel vom Slave dran. An den entsprechenden Stellen habe ich eine Frage geschrieben....weil du den Tip mit den Pins als Eingangs gebracht hast. Das wird ja für den Slave gelten.
Code:'-----------------i2c_slave_stk500.bas 'mit i2c_master_radbaugruppe.bas verwenden ' '---------------------------------------------- 'Deklarationen + Initialisationen: $regfile = "m8def.dat" $crystal = 8000000 $baud = 9600 $lib "i2c_twi.lbx" 'das war die spezielle Library von MCS-Elektronics, weil die orginal nicht gefunzt hat bei I2C Config Portb = Output 'für LEDs als Kontrolle Config Sda = Portc.4 'Muss ich diese Pins trotzdem so deklarieren? Config Scl = Portc.5 'und hier jetzt noch "Config Portc = Input" '? 'festlegen der Slaveadresse -> stimmt das mit dem festlegen der Slave-Adresse? da war ich mir nie sicher Twar = &B1010_1110 'TWAR=&HAE=Slaveadresse Dim A As Byte Dim Hilf As Byte 'I2C initialisieren I2cinit 'setzt Port und DDR-Bit auf 0 zurück Portb = &H00 'lässt PortB leuchten A = 90 'vom Master gesendetes Byte -> entspricht &B0101_1010 Do Hilf = Twdr 'Datenregister auslesen If Hilf = A Then Portb = Not Portb 'alle LEDs blinken wenn Byte empfangen Waitms 200 Else Portb.4 = Not Portb.4 'ansonsten blinkt nur LED4 Waitms 200 End If Loop End 'end program
Hi!
Ich glaube, du stellst es dir ein bisschen einfacher vor, als es ist...
Du musst noch ein paar dinge machen:
- TWI-Bitrate einstellen
- TWI-Prescaler einstellen siehe 1
- In TWCR einstellen, dass er slave sein soll
Und dann ncoh ein paar lustige Abfragen machen. Aber frag mcih nciht, ich habe das ncoh nie gemacht.
Vielleich kan dir Florian einen Auszug aus seinem Assembler-code zukommen lassen (fragen).
zu 1: Das kannst du mit nem kleinen Tool von mir machen, TwiBitrate
das bekommst du auf meiner Homepage unter (anderes ->) Computer
VLG Tobi
http://www.tobias-schlegel.de
"An AVR can solve (almost) every problem" - ts
Bitrate und Prescaler habe ich beim Master eingestellt.
Obiger Code ist vom Slave.
Dessen Adresse habe ich auch in TWAR festgelegt (ein paar Zeilen nach den config-Befehlen)
gruß
christian
Hi!
OH was schreibe ich in diesem Thread auch schon für Müll zusammen!
SORRY. Natürlich passt sicher der Slave dem Master an.
Siehe dazu auch das Datenblatt ab Seite 160, besonders das Diagramm auf Seite 166 ist interessant.
Vielleicht hilft es auch, wenn man gemäß Abschnitt "Adress Match Unit" auf Seite 167 TWGCE auf 1 setzt. Und das ist Bit0 in TWAR, wie man auf ende Seite 170 anfang 171 sieht.
statt
Twar = &B1010_1110
muss es
Twar = &B10101111
heißen. Oder?
Bitte lies die mal den TWI-Abschnitt (ab S. 160) im Datasheet des M8 durch. Das wirkt manchmal Wunder...
VLG Tobi
http://www.tobias-schlegel.de
"An AVR can solve (almost) every problem" - ts
Hallo Tobi,
nicht ganz.
Das Bit muss gesetzt sein, wenn man einen "Generall Call" ausführen möchte.
D.h. alle Slaves am Bus dürfen empfangen was der Master sendet.
Den Prescaler habe ich auch gesetzt. (im Master).
SCL hat eine Frequenz von 0.5MHz, weil der Slave mind. 16 mal schneller abtasten soll als das SCL-Signal ankommt. Nun, und mein Slave hat ne Frequenz von 8Mhz.
Ich finds aber stark von Dir, dass Du mir soviele Hinweise, Tipps und mögliche Fehlerquellen nennst und dann noch so präzise Quellenangaben lieferst.
Findet man nicht oft in Foren.
THX@ tobmic!
Christian
HI!
*ARGH* JETZT REICHTs!
So viele Fehler in einem Thread hab ich mir ja noch nie geleistet!
Es heißt ja GCE also General Call Enable...
Ich glaube, ich muss mich so langsam echt mal entschuldigen!
*denkbevorschreib*
>>Den Prescaler habe ich auch gesetzt. (im Master).
Ja, gut. Das ist aber zunächst erst mal nebensächlich, solange der Master ein gescheites I²C-Signal sendet.
(hast du das schon kontrolliert mit nem Oszi o.ä. ??)
Was mir an deinem Code noch auffällt sind 3 Dinge:
1) In deinen Slaveadressen gibt es Widersprüche
2) Du nimmst keinerlei Einstellungen in TWCR vor.
3) Man muss auf den Adress-Match Interrupt warten.
zu 1)
>>Twar = &B1010_1110 '= dez. 174
>>A = 90 'vom Master gesendetes Byte -> entspricht NICHT 174
Du musst in TWAR schon die Adresse setzen, die du auch überprüfen willst.
zu 2)
Du willst im Moment einen Slave mit der Daten-Unit machen. Das geht aber viel einfacher mit der Address Match Unit. Dass dein AVR aber weis, dass er ein Slave ist, und dass er die Adress Match Unit einschalte soll usw. musst du es ihm in TWCR sagen. Lies' dir das Datenblatt an der Stelle (s.u.) durch...
zu 3)
Die Adress Match Unit löst einen Interrupt aus. Auf diesen gilt es zu warten, damit man die TWI-Unit über TWCR anweisen kann, ein ACK (oder Non ACK) zu senden, und so den Master überhaupt dazu bringen kann, das Datenbyte zu senden.
Dazu muss TWCR.0 auf 1 gesetzt, und SREG.7 auf 1 (äquivalent zu enable interrupts) gesetzt werden.
Jetzt musst du dich noch schlau machen (und mir dann aber auch sagen, ich weis es nämlich nicht ) wie der TWI-Interrupt in Bascom heißt.
Dann halt noch
On ... TWIr
In der ISR TWIr bearbeitest du dann das Signal weiter (Sendest ACK usw.)
Daszu siehe wieder Abschnitt Adress Match Unit Auf S. 167, uns TWCR auf S. 168
So. Jetzt habe ich aber HOFFENTLICH keine Bugs drin....
>>Ich finds aber stark von Dir, dass Du mir soviele Hinweise, Tipps und mögliche Fehlerquellen nennst und dann noch so präzise Quellenangaben lieferst.
Naja, aber ich erzähle auch viel Mist gerade!
(Bin gerade viel mit meinem JuFo-Projekt beschäftigt...)
>>Findet man nicht oft in Foren.
Naja.
Danke für die Blumen!
VLG Tobi
http://www.tobias-schlegel.de
"An AVR can solve (almost) every problem" - ts
Hallo Tobi,
leider musste ich das Board wieder abgeben, da es nicht mein eigenes ist.
Deshalb konnte ich Deine Vorschläge nicht "live" ausprobieren.
zu 1). Twar ist das Adressregister, A=90 ist einfach nur eine gesendete Information die der Slave üernehmen soll
2) und 3) klingen aber sehr schlüssig. Das schau ich mir mal näher an.
gruß christian
Lesezeichen