TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: calopsia 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!!!
-
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
-
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..
-
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.
-
bueno gracias por los aportes.. ahi lei varias tutoriales y por fin logre algo de comunicacion gracias!!!
-
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