Autor Tema: ayuda con i2c por favor..  (Leído 2870 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado calopsia

  • PIC12
  • **
  • Mensajes: 50
ayuda con i2c por favor..
« en: 17 de Septiembre de 2011, 18:02:43 »
 Buenas me gustaria saber si algiuien me puede ayudar a comunicar 2 pics por i2c.. de un lado tengo un teclado y del otro lado tengo un lcd.. el teclado es el maestro y el lcd es el esclavo..

estuve tratando de entender el protocolo y emularlo en proteus y no hay forma.. creo q el problema esta en la parte de recepcion.. y gran parte del problema esta en mi que al parecer no la termino de entender bien al funcionamiento de este protocolo... alguien me puede dar una mano o hecharle una mirada al codigo???

gracias!!!

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: ayuda con i2c por favor..
« Respuesta #1 en: 17 de Septiembre de 2011, 19:16:52 »
Hola!! Ahora ando con poco tiempo como para leer tu codigo, pero te dejo un manual muy completo sobre el bus i2c. Espero que te sirva, saludos!!

http://www.nxp.com/documents/user_manual/UM10204.pdf

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado calopsia

  • PIC12
  • **
  • Mensajes: 50
Re: ayuda con i2c por favor..
« Respuesta #2 en: 17 de Septiembre de 2011, 20:08:05 »
Gracias gera tenia ya ese pdf, en realidad entiendo como funciona el i2c en forma basica.. lo que no entiendo ni medio.. es la logica para la recepcion desde css.. en la interrupcion  #INT_SSP

no entiendo como ver que datos llegan.. ni que formato tienen.. mas alla de que estoy casi seguro de que son hexadecimal.. otra duda es convertir esos datos a decimal o char..

Desconectado NoSepComo

  • PIC18
  • ****
  • Mensajes: 305
Re: ayuda con i2c por favor..
« Respuesta #3 en: 19 de Septiembre de 2011, 04:39:17 »
Pues normalmente, sin haber leido tu código, si usas una PCA,1º haces el i2c_start(), luego tienes que escribir primero la orden de leer al bus (que para una PCA por ejemplo es mandar un uno al final de la dirección en vez de un 0), después ejecutas el comando de lectura (i2c_read)  y finalizas la transacción con i2c_stop().
No se si te servirá pero ese ews el orden para leer datos por i2c.
Básicamente tienes qe iniciar, hacer lo que sea y parar.
« Última modificación: 19 de Septiembre de 2011, 04:41:23 por NoSepComo »

Desconectado calopsia

  • PIC12
  • **
  • Mensajes: 50
Re: ayuda con i2c por favor..
« Respuesta #4 en: 21 de Septiembre de 2011, 11:50:47 »
bueno gracias por los aportes.. ahi lei varias tutoriales y por fin logre algo de comunicacion gracias!!!

Desconectado loesvan

  • PIC10
  • *
  • Mensajes: 2
Re: ayuda con i2c por favor..
« Respuesta #5 en: 21 de Septiembre de 2011, 12:32:18 »



Hola amigos,

Tengo un problema con un programa que he bajado (tambien lo he visto en este foro)
para DMX.
El programa funciona perfectamente, el problema es que quiero poder cambiar el canal
DMX con un mando a distancia por infrarrojo. Un PIC recibe la señal del mando y envia
los datos ya decodificado al segundo PIC via RS232. La comunicacion de los dos PICs es
correcta, los datos recibidos son correctos, pero el segundo PIC, con el programa DMX
cargado no reconoce la variable con los datos recibidos. Estoy utilizando el programa
Picbasic pro 2.46 y estoy mezclando basic con asm.


Este es un ejemplo de un canal con la variable (Dir) definida en basic.

CHAN
 INCF   _Offset   
 MOVF   _Offset,W   
 XORLW   _Dir      ; No funciona, pero si pongo cual quier valor, Por ejemplo 02h o
 BTFSC   STATUS,Z  ; directamente 2, si lo reconoce perfectamente.
 GOTO   CHAN1

Pero lo raro es que si defino la variable en asm tampoco funciona.

Este es un ejemplo con la variable definida en asm.

Dir EQU 020h
 MOVLW 02h
 MOVWF Dir  ; El valor de la variable "Dir" no cambia a 02h, se mantiene en 020h


Seguramente es una tonteria pero no doy con la tecla.

Espero que alguno de vosotros me podais ayudar.

Muchas gracias.

Este es el programa completo.

;----------------------------------------------------------------------------

'Programa para DMX con cambio de canal con mando distancia IR.

@ DEVICE pic16f628a,HS_OSC,MCLR_OFF,PWRT_ON,WDT_OFF,lvp_off,protect_on,CPD_on
INCLUDE "modedefs.bas"

define OSC 20
 
x   var byte 
Dir var byte 
 
OUT1 var PORTA.4   
OUT2 var PORTB.4    
OUT3 var PORTB.5
OUT4 var PORTB.6
OUT5 var PORTB.7    
OUT6 var PORTA.1    
OUT7 var PORTB.2

BREAK var byte
STARTCODE var byte
ADDR9 var byte
RC9   var byte

Reg1    var byte
Reg2    var byte
Reg3    var byte
Reg4    var byte
Reg5    var byte
Reg6    var byte
Reg7    var byte

WSAVE  var byte   $20 system     
SSAVE  var byte bank0 system
PSAVE  var byte bank0 system
pwmcounter var byte

DADDR   var byte
RADDR   var byte
Offset  var byte

DEFINE INTHAND ISR   

asm
 
 goto INICIO
ISR
 bcf     INTCON,GIE     
 btfsc   INTCON,GIE     
 GoTo    ISR           
 movwf   WSAVE           
 movf    STATUS,W
 clrf    STATUS         
 movwf   SSAVE           
 movf    PCLATH         
 movwf   PSAVE           
 clrf    PCLATH         
 
 GOTO INTHANDLER

INICIO
endasm
CMCON=7
 
TRISA= %00000000
TRISB= %00001010

low PortA.2
high PortB.3
pause 100

Loop1:
if PortB.3=0 then goto Loop1
Loop2:
serin PortB.3,T9600,x
if x=0 then goto Loop2  ' Se mantiene aqui hasta recibir datos del otro pic
                        '(nº de canal DMX)
write 2,x       ' Almacena nº de canal en eeprom(La comunicacion con el otro pic
read  2,Dir     ' es correcta) Dir = direccion DMX

Dir=1             ' Solo para Probar <<<<<<<<<<<<

SPBRG = 4         
TXSTA = %00100100 
PIE1.5=1
RCSTA.6=1         

RCREG=0
RCREG=0
RCREG=0
RCSTA = $90
RCSTA.7=1
INTCON.6=1   
INTCON.7=1

Reg1=0
Reg2=0
Reg3=0
Reg4=0
Reg5=0
Reg6=0
Reg7=0
DADDR=0
ADDR9=0   

MAIN:
'low RX
pwmcounter=255
OUT1=0
OUT2=0
OUT3=0
OUT4=0
OUT5=0
OUT6=0
OUT7=0
@ call PWM_CYCLE
goto MAIN

asm
PWM_CYCLE
 
 MOVF   _Reg1,W
 XORWF   _pwmcounter,W
 BTFSC   STATUS,Z
 BSF   _OUT1
 MOVF   _Reg2,W
 XORWF   _pwmcounter,W
 BTFSC   STATUS,Z
 BSF   _OUT2
 MOVF   _Reg3,W
 XORWF   _pwmcounter,W
 BTFSC   STATUS,Z
 BSF   _OUT3
 MOVF   _Reg4,W
 XORWF   _pwmcounter,W
 BTFSC   STATUS,Z
 BSF   _OUT4
 MOVF   _Reg5,W
 XORWF   _pwmcounter,W
 BTFSC   STATUS,Z
 BSF   _OUT5
 MOVF   _Reg6,W
 XORWF   _pwmcounter,W
 BTFSC   STATUS,Z
 BSF   _OUT6
 MOVF   _Reg7,W
 XORWF   _pwmcounter,W
 BTFSC   STATUS,Z
 BSF   _OUT7
 
 DECFSZ   _pwmcounter
 GOTO   PWM_CYCLE
 RETURN
 
INTRETURN
 MOVF   PSAVE,W   
 MOVWF   PCLATH
 MOVF   SSAVE,W
 MOVWF   STATUS
 SWAPF   WSAVE,F 
 SWAPF   WSAVE,W
 RETFIE         

INTHANDLER
 BTFSS   PIR1,RCIF
 GOTO   INTRETURN
 GOTO   DMX

DMX
 BSF    PORTA,2 
 BTFSC   RCSTA,OERR
 GOTO   OVERRUN

 BTFSC    RCSTA,FERR
 GOTO    FRAME

 BTFSS    _BREAK
 GOTO    RET
 
 BTFSS   _STARTCODE   
 
 GOTO   SC            
 BTFSC   _STARTCODE
 GOTO   CHANNEL

RET
 MOVF   RCREG,W
 GOTO   INTRETURN

OVERRUN
 BCF   RCSTA,SPEN
 BSF   RCSTA,SPEN
 MOVF   RCREG,W
 GOTO   LAST

FRAME
 BCF   _BREAK
 BCF   _STARTCODE
 BCF   _RC9
 CLRF   _RADDR
 CLRF   _Offset
 BTFSS   RCSTA,RX9D
 BSF   _BREAK
 MOVF   RCREG,W
 GOTO   INTRETURN

SC
 MOVF   RCREG,W
 XORLW   00h
 BTFSC   STATUS,Z
 BSF   _STARTCODE
 GOTO   INTRETURN

INCREASE
 INCF   _RADDR   
 BTFSC   STATUS,Z
 BSF   _RC9
 RETURN

CHANNEL

 MOVF   _Offset,W
 XORLW   00h          
 BTFSS   STATUS,Z
 GOTO   CHAN

 MOVF   _RADDR,W   
 XORWF   _DADDR,W
 BTFSC   STATUS,Z
 GOTO   NINTH      

 CALL   INCREASE
 GOTO   RET

NINTH
 BTFSC   _ADDR9
 GOTO   TRUE
 MOVF   RCREG,W
 GOTO   FALSE

TRUE
 BTFSC   _RC9
 GOTO   CHAN
 CALL   INCREASE
 GOTO   RET

FALSE
 BTFSS   _RC9
 GOTO   CHAN
 CALL   INCREASE
 GOTO   RET

CHAN
 INCF   _Offset
 MOVF   _Offset,W   
 XORLW   _Dir      ; << Este canal con la variable no funciona >>
 BTFSC   STATUS,Z
 GOTO   CHAN2
 MOVF   _Offset,W
 XORLW   2         ; Si funciona
 BTFSC   STATUS,Z
 GOTO   CHAN3
 MOVF   _Offset,W
 XORLW   3         ; Si funciona
 BTFSC   STATUS,Z
 GOTO   CHAN4
 MOVF   _Offset,W
 XORLW   4         ; Si funciona
 BTFSC   STATUS,Z
 GOTO   CHAN5
 MOVF   _Offset,W
 XORLW   5         ; Si funciona
 BTFSC   STATUS,Z
 GOTO   CHAN6
 MOVF   _Offset,W
 XORLW   6        ; Si funciona
 BTFSC   STATUS,Z
 GOTO   CHAN7
 
 MOVF   _Offset,W
 XORLW   0FFh             
 BTFSC   STATUS,Z
 GOTO   LAST

CHAN1
 MOVF   RCREG,W
 MOVWF   _Reg1
 CALL   INCREASE
 GOTO   INTRETURN

CHAN2
 MOVF   RCREG,W
 MOVWF   _Reg2
 CALL   INCREASE
 GOTO   INTRETURN

CHAN3
 MOVF   RCREG,W
 MOVWF   _Reg3
 CALL   INCREASE
 GOTO   INTRETURN

CHAN4
 MOVF   RCREG,W
 MOVWF   _Reg4
 CALL   INCREASE
 GOTO   INTRETURN

CHAN5
 MOVF   RCREG,W
 MOVWF   _Reg5
 CALL   INCREASE
 GOTO   INTRETURN

CHAN6
 MOVF   RCREG,W
 MOVWF   _Reg6
 CALL   INCREASE
 GOTO   INTRETURN

CHAN7
 MOVF   RCREG,W
 MOVWF   _Reg7
 CALL   INCREASE
 GOTO   INTRETURN

LAST

 BCF   _BREAK
 BCF   _STARTCODE
 CLRF   _Offset
 GOTO   INTRETURN
;-------------------------------------------------------------------------------

endasm

 end

 












     


 

anything