PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I2C Netzwerk



Che Guevara
07.09.2011, 13:03
Hallo,

nach einiger Überlegungszeit möchte ich nun mit meiner FA anfangen. Dafür benötige ich ein I2C Netzwerk, da es versch. Module geben wird. Mein Hauptcontroller (M328P) ist bereits fertig aufgebaut auf einer kleinen Platine, als Slave dient derzeit noch ein RN-Control (M32). Diese möchte ich nun miteinander kommunizieren lassen, aber irgendwie habe ich einen Fehler in meinen Programmen:
Master:


$regfile = "m328pdef.dat"
$crystal = 16000000
$framesize = 80
$hwstack = 80
$swstack = 80



$lib "i2c_twi.lbx"
Config Scl = Portc.5
Config Sda = Portc.4
Config Twi = 400000
I2cinit



Config Timer0 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
Pwm0a = 0
Pwm0b = 0

Config Portd.5 = Output
Config Portd.6 = Output


Const Slave_write = &H70
Const Slave_read = &H71
Const Gen_call = &H00

Dim B1 As Byte , B2 As Byte
Dim Ar(3) As Byte
Ar(1) = Asc( "h")
Ar(2) = Asc( "a")



Enable Interrupts



Do


I2csend Slave_write , Ar(1) , 2
Waitms 500
I2cstart
I2cwbyte Slave_read
I2crbyte B1 , Ack
I2crbyte B2 , Nack
I2cstop
Pwm0a = B1
Pwm0b = B2
Waitms 500


Loop

End

Slave:


$regfile = "m32def.dat"
$crystal = 16000000
$framesize = 80
$hwstack = 80
$swstack = 80



$lib "i2c_twi-slave.lbx"
Config Twislave = &H70 , Btr = 2 , Bitrate = 400000 , Save = Save , Gencall = 1
Config Sda = Portc.1
Config Scl = Portc.0
I2cinit


Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
Config Lcdbus = 4
Initlcd
Cls
Cursor Off Noblink



Config Portc.6 = Output
Portc.6 = 0



Dim Flag As Bit
Dim I As Byte


Locate 1 , 1
Lcd "TEST"



Enable Interrupts


Do


!nop


Loop



Twi_slave_error:

Return


Twi_write_addressed:
Toggle Portc.6
Return


Twi_read_addressed:
Toggle Portc.6
Return


Twi_stop_rstart_received:

Return


'this label is called when the master sends data and the slave has received the byte
'the variable TWI holds the received value
Twi_gotdata:

Return


'this label is called when the master receives data and needs a byte
'the variable twi_btr is a byte variable that holds the index of the needed byte
'so when sending multiple bytes from an array, twi_btr can be used for the index
Twi_master_needs_more_byte:
I = Rnd(255)
Twi = I
Locate 2 , 1
Lcd Twi ; " "
Return


'when the mast has all bytes received this label will be called
Twi_master_need_nomore_byte:

Return


End


Die Verkabelung sollte stimmen, da ich mit dem gleichen Setup schon mal eine Kommunikation hinbekommen habe, nur leider habe ich jetzt einen neuen PC und habe die Programme nicht mehr... Das Problem ist, eigentlich sollte bei JEDEM Zugriff des Masters auf den Slave die LED an Pc.6 getoggelt werden, aber nichteinmal das funktioniert.. Erkennt jemand einen Fehler?

Vielen Dank & Gruß
Chris

peterfido
07.09.2011, 21:56
Vor dem ersten Senden fehlt ein Start. Evtl ein Stopp noch vor dem nächsten Start. 500 ms sind eine recht lange Zeit. Aus welchen Gründen auch immer läuft bei mir Software I2C bei einem Pojekt besser als Hardware...

Che Guevara
08.09.2011, 09:31
Ich denke nicht, dass vor i2csend ein Start nötig ist?! Ich habe es schon mal so gemacht und auch in der Hilfe wird kein Start- bzw. Stopbefehl verwendet in Verbindung mit i2csend.
Die 500ms sind nur, damit man besser sehen kann, obs funktioniert.

Gruß
Chris

EDIT:
Tut mir leid, das jetzt sagen zu müssen, aber mein Code funktioniert! Ich hatte nur das Modul auf ein Steckbrett gesteckt und habe nicht überprüft, ob Kontakt besteht.... Das war der Fehler! Die SDA Leitungen waren nicht miteinander verbunden. Sry!