fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Comunicacion i2c en...
 
Avisos
Vaciar todo

Comunicacion i2c entre un master y dos slaves

13 Respuestas
4 Usuarios
0 Reactions
7,821 Visitas
wallen74
Respuestas: 7
Topic starter
(@wallen74)
Active Member
Registrado: hace 18 años

hola a 😮 a todos los interesados del protocolo I2C.

soy nuevo en el foro, mi nick es wallen. No encuentro donde tengo que pinchar para enviar un nuevo mensaje, así que respondo a este en este foro I2C

Si hay algún genio del I2C al otro lado del foro espero que me ayude:

Esoty trabajando mucho sobre el I2C y he conseguido comunicar perfectamente un master y un slave. Es decir, el Master TRANSMITE y el Slave RECIBE.......o bien el Master RECIBE y el Slave TRANSMITE.

De momento los programas están en ensamblador (.asm). Aqui os dejo las rutinas de enviar_I2C y recibir_I2C (funcionan a la perfección) y algunas explicaciones al respecto

Mi problema se presenta cuando quiero establecer comunicacion entre tres microcontroladores pic 16f876, un Master y dos Slaves pic 16f876.

El programa es muy simple, el Master lee de un Slave (SLAVE TRANSMITE un byte) su puerto B y el byte obtenido lo manda por el BUS al Slave (SLAVE RECIBE el byte del BUS) y escribe el resultado por el puerto B.

Después de la primera rutina de lectura (que funciona correctamente mas que probada) el Master al pasar por la rutina de escritura pierde definitivamente el control del BUS. El problema debe estar en la trama serie START, ADRESS, ACK , DATO, ACK, ....., pero a la hora de cambiar de direccíon ...puf se jode todo, perdemos el I2C y no se porqué.

Aqui adjunto las rutinas que funcionan, pero de momento solo MASTER y un Slave (usando dos microcontroladores PIC16F876)

;*******************************************************************
;
SUBRUTINA PARA TRANSMITIR DATOS1 EN MODO MASTER DEL I2C

Envia_i2c

BCF STATUS,RP0 ; Restore Bank0 ................DEN BUS ÜBERNEHMEN
BCF PIR1,SSPIF ; Clear the interrupt flag before RX
BSF STATUS,RP0 ; SSPCON2: is in Bank1
BCF STATUS,RP1

BSF SSPCON2,SEN ; envia bit START
BCF STATUS,RP0 ; Restore Bank0
BTFSS PIR1,SSPIF ; START finalizado?
GOTO $-1 ; no, espera
BCF PIR1,SSPIF ; Clear the interrupt flag before RX

MOVF DIREC,W ;...............................DIE ADRESSE SENDEN
MOVWF SSPBUF ; carga direccion
BTFSS PIR1,SSPIF ; ACK recibido?
GOTO $-1 ; no, espera
BCF PIR1,SSPIF ; Clear the interrupt flag before RX

MOVF Dato,W ; carga dato....................DIE DATEN SENDEN
MOVWF SSPBUF
BTFSS PIR1,SSPIF ; ACK recibido?
GOTO $-1 ; no espera
BCF PIR1,SSPIF

BSF STATUS,RP0 ; Restore Bank1................DEN BUS WIEDER FREIGEBEN
BCF STATUS,RP1
BSF SSPCON2,PEN ; Envia bit de stop
BCF STATUS,RP0 ; Restore Bank0
BTFSS PIR1,SSPIF ; STOP finalizado?
GOTO $-1 ; no espera
BCF PIR1,SSPIF
RETURN

;*********************************************************************
;SUBRUTINA PARA RECIBIR DATOS1 EN MODO MASTER DEL I2C
;
*********************************************************************

Recibe_i2c

BCF STATUS,RP0 ; Restore Bank0......... DEN BUS ÜBERNEHMEN
BCF PIR1,SSPIF
BSF STATUS,RP0 ; Restore Bank1
BCF STATUS,RP1

BSF SSPCON2,SEN ; envia bit START
BCF STATUS,RP0 ; Restore Bank0
BTFSS PIR1,SSPIF ; START finalizado?
GOTO $-1 ; no, espera
BCF PIR1,SSPIF

movf DirSlave,W ;Dirección esclavo
iorlw b'00000001' ;con orden de lectura

; MOVF DIREC,W ; ........................DIE ADRESSE SENDEN
MOVWF SSPBUF ; carga direccion
BTFSS PIR1,SSPIF ; ACK recibido?
GOTO $-1 ; no, espera
BCF PIR1,SSPIF

BSF STATUS,RP0 ; Restore Bank1
BCF STATUS,RP1

BSF SSPCON2,RCEN ; activa modo receptor....DATEN EMPFANG EINSCHALTEN
BCF STATUS,RP0 ; Restore Bank0

BTFSS PIR1,SSPIF ; ACK recibido?
GOTO $-1 ; no, espera
BCF PIR1,SSPIF
MOVF SSPBUF,W ; carga dato
MOVWF MensajeIn

; BSF STATUS,RP0 ; Restore Bank1...........EIN ANDERES BYTE SOLL GELESEN WERDEN
; BCF STATUS,RP1
; BSF SSPCON2,ACKEN ; Genera ACK
; BCF STATUS,RP0 ; Restore Bank0

BSF STATUS,RP0 ; Restore Bank1...........DEN BUS WIEDER FREIGEBEN
BCF STATUS,RP1
BSF SSPCON2,PEN ; Envia bit de stop
BCF STATUS,RP0 ; Restore Bank0
BTFSS PIR1,SSPIF ; STOP finalizado?
GOTO $-1 ; no espera
BCF PIR1,SSPIF
RETURN

hay un link muy bueno en alemán sobre el protocolo I2C:

http://www.sprut.de/electronic/pic/grund/i2c.htm#pic

Las direcciones empleadas para ambos Slaves son:

Slave ESCRITURA: b'01111000'

Slave LECTURA: b'01111100'

Para programar el Slave bajarse el programa del siguiente enlace

Alejandro Alonso Puig - mundobot.com, utliza un interrupt Handler muy bueno para I2C

Responder
12 respuestas
wallen74
Respuestas: 7
Topic starter
(@wallen74)
Active Member
Registrado: hace 18 años

hola soy wallen de nuevo.

Si no quedó claro el problema se presenta a la hora de montar 3 micros pic 16f876. Un Master pic16f876 y dos Slaves pic16f876.

Por definción el Master inicia y finaliza la señal de reloj, direcciona esclavos pero en una rutina puede ser el RECEPTOR o el TRANSMISOR, esto hay que tenerlo muy claro

Para probar las rutinas de escritua y lectura he utlizado el potente simulador Proteus.

suerte a todosss

Responder
garrocha
Respuestas: 1110
(@garrocha)
Ardero
Registrado: hace 19 años

te lo muevo a un post independiente

Responder
_jm_
Respuestas: 961
 JM
(@_jm_)
Prominent Member
Registrado: hace 19 años

En el libro de la editorial rama de desarrollo de proyectos con el pic 16f84 tienes un capitulo en el que te vienen las rutinas para I2C y el protocolo, yo las adapte para el 16f690 y me funcionaron para controlar un integrado con i2c, te lo digo por si lo ves por alguna biblio echarle un ojo.

Responder
wallen74
Respuestas: 7
Topic starter
(@wallen74)
Active Member
Registrado: hace 18 años

Hola a todos,

Dirigido al Moderador: si crees oportuno derivarme a otro foro o conoces a algún forero que pueda ayudarme te lo agradecería...

Respondo a JM,

Mi problema se presenta a a hora de comunicar tres micros pic16f876, 1 Master y 2 Slaves. Es decir realmente a la hora de cambiar de Adress 7 bits.

El protocolo I2C le tengo más o menos controlado, he conseguido comunicar un pic Master pic16f876 y dos integrados PCF8574; también he conseguido la comunicación entre un Master pic16f876, una eeprom 24LC256 y un PCF8574; entre un Master pic16f876 y un Slave pic16f876 pero por cualquier razón que desconozco con tres pic, en el momento que cambia de dirección de Slave, el Master pierde el control del bus para siempre.

si se te ocurre algo, estoy abierto a cualquier ayuda...

Responder
Página 1 / 3
Compartir: