dein programm ist aber irgendwie anderst aufgebaut wie die meisten beispiele. Du schreibst z.B. Twar = &H40 in einem anderem Thread steht Config Twislave = &H40 , Btr = 1 , Bitrate = 400000
Druckbare Version
dein programm ist aber irgendwie anderst aufgebaut wie die meisten beispiele. Du schreibst z.B. Twar = &H40 in einem anderem Thread steht Config Twislave = &H40 , Btr = 1 , Bitrate = 400000
Buch hab ich keines zum AVR oder µC, kann deswegen auch keine Tipps geben, hab nur alles aus dem Inet, bzw. halt den Datenblättern.
Programmieren in diese Richtung kenne ich aber schon von früher her aus C64 Zeiten, da hat mich damals schon mehr interresiert was unter der Haube ist und rumgebastelt, ziemlich viel in ASM. Das kommt den µC schon ziemlich nahe.
Dann zu Config TWIslave, das kann man nur verwenden wenn man die berühmte Lib für Bascom hat.
Deswegen muss/kann man auch die gewünschte Geschwindigkeit angeben, was beim Slave normalerweise nicht gebraucht wird, weil das mit der Lib auch in Software möglich ist, und Bascom sich wohl einen Timer einstellt um an der Clock und Datenleitung zu lauschen.
Ist aber nur eine Vermutung.
Wenn ich am Wochenende mal Zeit/Lust habe, probier ich mal mein Testprogramm etwas aufzubohren. :-k :-k
wenn ich aber twislave eingeba dann meldet bascom mir immer Unknown Interrupt TWI Error : 117
In deinem Programm kenn ich mich irgendwie gar nicht aus. Wo empfängst du das Byte? gibts da nich solche Befehle Receive?
Edit: Könntest du mir noch zeigen wie ich vom Slave auch senden kann? Die Hilfe in Bascom kann man da ja vergessen.
Ich hab jetzt dieses Programm hergenommen:
Doch wenn ich X empfangen will empfängt er nur 65 doch Err ist 0. Das bedeutet doch dass kein fehler aufgetreten ist?Code:$regfile = "M32def.dat" ' the used chip
$crystal = 16000000 ' frequency used
$baud = 9600 ' baud rate
$lib "i2c_twi.lbx" ' we do not use software emulated I2C but the TWI
Config Scl = Portc.0 ' we need to provide the SCL pin name
Config Sda = Portc.1 ' we need to provide the SDA pin name
'On the Mega8, On the PCF8574A
'scl=PC5 , pin 28 pin 14
'sda=PC4 , pin 27 pin 15
I2cinit ' we need to set the pins in the proper state
Config Twi = 100000 ' wanted clock frequency
'will set TWBR and TWSR
'Twbr = 12 'bit rate register
'Twsr = 0 'pre scaler bits
Dim B As Byte , X As Byte
Print "TWI master"
Do
Input B ' increase value
I2csend &H40 , B ' send the value
Print "Error : " ; Err ' show error status
I2creceive &H41 , X ' get a byte
Print X ' show error
Print "Error" ; Err
Waitms 500 'wait a bit
Loop
End
Das Byte B finde ich im Slave ja gar nicht. Wie empfängt der denn das?
Wie kommst du denn aus der Hauptschleife wieder heraus?
Ich habe das Programm mal Simuliert. Der hüpft ja kreuz und quer durchs Programm. Was soll denn dann das Do Loop in der Hauptschleife?
Twcr = &B00000100
Twcr = &B01000100
das ist wohl auch doppelt oder?
Welche Adresse hat denn der Master?
So das waren jetzt etwas viel Fragen aber sonst blick ich da nie durch.
Im Slave wird das Byte direkt aus dem register TWDR geholt, siehe Kommentar.
Wie ich schon beschrieben habe, kann der SlaveCode so wie er jetzt ist, nichts senden, weil das da nicht vorgesehen ist.
Warum soll ich aus der Hauptschleife heraus, es gibt sonst nix zu tun ?
Die schleife wird immer durchlaufen und überprüft ob TWI-seitig was anliegt, wenn über TWI ein Byte angekommen ist, wird das Byte an PortD angezeigt.
Der Master hat keine Adresse, weils eben der Master ist.
Lese Dir mal im Wiki die I2C Seiten durch, sonst muss ich hier alles nochmal erzählen.
Wenn du eine Eierlegende Wollmilchsau in Sachen I2C haben willst, musst Du die Lib von Bascom ans laufen bekommen, dann muss man nicht denken, und alles läuft fast von selber, und es gibt schöne funktionen zum aufrufen.
Doppelt ist etwas, wenns zweimal dasgleiche ist, ist hier aber nicht der Fall !Zitat:
Zitat von Zeroeightfifteen
Man kann sich evtl. darüber streiten wie man das macht, hier ist es schön der Reihe nach eingestellt.
zum thema I2C steht in der Wiki nicht viel drin. Da wird ja nur beschrieben wie das mit SCL und SDA ist aber solche sachen wie Twar, Twcr, Twdr nicht dran. Wie kann dann der Atmega die Unterprogramme (TWi als Slave aktivieren, Schaun ob was gekommen ist, warten bis TWINT gesetzt ist) aufrufen? Die muss er ja auch verarbeiten?
In jedem Datenblatt von Atmel zu den AVR Megas steht ausführlich drinnen wie man mit den Registern umgeht, Kapitel Two Wire Serial Interface kurz -> TWI . Das ist bei allen Megas gleich.
hier die Seite der Datasheets, einfach eins nehmen von einem Mega der TWI hat (M8, M16, M32, ...):
http://www.atmel.com/dyn/products/da...ily_id=607#760
Danke für den Link aber Englisch ist nicht meine stärke. Ich bestell mir jetzt mal das Buch von Roland Walter. Vielleicht steht da etwas brauchbares drin.
Hi Leute,
bin so newby bei dem Thema TWI aber könnt ihr mir ma sagen ob ich mit euren programmcodes jetzt einfach die scl und sda leitungen meiner atmega32 verbinden kann und loslegen senden oder brauch ich noch irgendwelche anderen bauteile dazu?
Mfg
Sven