TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: groundman en 02 de Junio de 2016, 11:11:17
-
hola a todos.he realizado un proyecto en asm con el MPLAB X para el control de un RTC con el pic 18f87k22.el RTC es el DS1307.y el proyecto lo estoy simulando con el
ISIS del Proteus.
lo he hecho con un Windows 10.y dire que todo han sido problemas.por no decir que he tenido que adaptarme al MPLAB X.que es muy diferente a su antecesor.
pero ya esta funcionando todo perfecto.
la version del ISIS es la 8.4SP0 . ya que la anterior no me funciono el VSM.
una cosa muy importante si quereis simular con el ISIS es que en el diagrama tendreis que poner resistencias PULL-UP simuladas.no sirbe poner resistencias de 4k7.
supongo que le quita velocidad a la simulacion.
(http://www.4shared.com/img/R8j6gJooba/s25/1551148e1c8/ProteusI2C) (http://www.4shared.com/photo/R8j6gJooba/ProteusI2C.html)
El pic que esta trabajando a 64Mhz y el clock del i2c a 100Khz. esta es la configuracion del I2C para este pic:
;configura i2c para el Pic18f87k22
bsf TRISC,SCL1 ;configura pins como entrada del Pic18f87k22
bsf TRISC,SDA1 ;configura pins como entrada del Pic18f87k22
clrf ADCON0
movlw 0x28 ; I2C Master Mode, SSPEN
movwf SSP1CON1 ; SSPEN enabled
movlw 0x80 ; 100khz
movwf SSP1STAT ; cke = 0 (mode 1,1)
movlw .159 ; configurar I2C a 100kHz (para fosc de 64Mhz) clock=Fosc/(4*(SSPxADD+1))
movwf SSP1ADD ;
clrf SSP1CON2
En la imagen podemos ver en el i2c Debug los datos que se han leido del DS1307.
S bit de Start
D0 byte para indicar al DS1307 que vamos a escribir en el.
A acknowledge
00 escribimos el byte que indica la direccion donde leeremos los datos.
Sr
D1 byte para indicar al DS1307 que vamos a leer en el.
A
09 segundos
A
20 minutos
A
15 horas
A
05 dia
A
02 dia de la semana. lunes,martes,miercoles....
A
06 mes
A
16 año
A
12 control
A
P bit de Stop
esta es la rutina que lee del DS1307:
;Lectura de los datos internos del DS1307
READ_RTC movwf CONT_BYTE_RTC ;numero de bytes a leer
rcall Start_I2C ;Llama a la subrutina de START
ID_WRITE ;modo lectura del RTC
movwf SSP1BUF,0 ;Lo carga en el Buffer de salida
rcall Write_I2C ;Llama a la subrutina de escritura
movlw 0x00 ;Carga en W la primer posición de memoria
movwf SSP1BUF,0 ;Lo carga en el Buffer de salida
rcall Write_I2C ;Llama a la subrutina de escritura
rcall Restart_I2C ;Llama a la subrutina de RESTART
ID_READ ;modo escritura del RTC
movwf SSP1BUF,0 ;Lo carga en el Buffer de salida
rcall Write_I2C ;Llama a la subrutina de escritura
Bucle_Leer rcall Read_I2C ;Llama a la subrutina de lectura
movff SSP1BUF,POSTINC2 ;Guarda el dato en la Ram e incrementa el puntero
rcall Send_I2C_Ack ;Llama a la subrutina de ACKNOWLEDGE
decfsz CONT_BYTE_RTC,F ;repite hasta que sea cero
bra Bucle_Leer ;continúa leyendo
rcall Send_I2C_NoAck ;llama a la subrutina de ACKNOWLEDGE
rcall Stop_I2C ;Llama a la subrutina de STOP
return ;Retorna de la subrutina
Antes de llamar a esta rutina.hay que conmutar en los registros FSR la direccion de la ram donde hubicaremos los datos leidos.e indicaremos los bytes a leer.
ejemplo:
BANK15
lfsr FSR2,0X100 ;principio de ram donde se introduciran los datos para escribir en el RTC
movlw 0x08 ;numero de bytes a gestinar
call READ_RTC ;leer datos del DS1307 y hubicarlos en la direccion 0x100 de la ram
-
Gracias por el aporte
-
ya que no tengo tiempo de ayudar.almenos pondre lo que valla aprendiendo.
Ahora pondre el codigo correspondiente al envio de unos datos para programar el reloj.
Esta imagen tiene dos lineas.la primera corresponde al envio de una trama de 8 bytes con todos los datos a cero.la segunda linea los nuemros del 1 al 8.
(http://www.4shared.com/img/kt6Gk5hVce/s25/155117b05b8/Proteus_I2c_1_) (http://www.4shared.com/photo/kt6Gk5hVce/Proteus_I2c_1_.html)
esta es la rutina:
;Escritura en el DS1307 antes de la llamada a esta rutina.cargar en FSR2 el inicio de la ram donde se leeran los datos a transferir al DS1307
; y en WREG la cantidad de datos a transferir.
WRITE_RTC movwf CONT_BYTE_RTC ;numero de bytes a escribir
rcall Start_I2C ;Llama a la subrutina de START
ID_WRITE ;modo lectura del RTC
movwf SSP1BUF,0 ;Lo carga en el Buffer de salida
rcall Write_I2C ;Llama a la subrutina de escritura
movlw 0x00 ;Carga en W la primer posición de memoria
movwf SSP1BUF,0 ;Lo carga en el Buffer de salida
rcall Write_I2C ;Llama a la subrutina de escritura
Bucle_Escribir1 movff POSTINC2,SSP1BUF ;Carga el dato de la Ram en SSPBUF e incrementa el puntero
rcall Write_I2C ;Llama a la subrutina de escritura
decfsz CONT_BYTE_RTC,F ;repite hasta que sea cero
bra Bucle_Escribir1 ;continúa enviando datos
rcall Stop_I2C ;Llama a la subrutina de STOP
return ;Retorna de la subrutina
antes de realizar la llamada a esta rutina.hay que conmutar los registros FSR y el numero de bytes a leer.ademas de introducir desde la direccion 0x110 los datos
a enviar.asi:
lfsr FSR2,0X110 ;principio de ram donde se introduciran los datos para escribir en el RTC
movlw 0x08 ;numero de bytes a gestionar
call WRITE_RTC ;rutina de escritura en el DS1307
espero que os sea de utilidad.ademas adjunto los archivos.
-
hola de nuevo.levo un par de semanas atrancado con el I2C.ya hace años estube liado con el I2C y una memoria 24c16 y todo salio perfecto.al añadir las resistencias de 4k7
claro.
ahora aunque he consegudi que con el ISIS funcione bien.no me funciona con el ICD3 que acabo de adquirir.n se si sera problema de este o del circuito.pero hay algo
que no me cuadra.segun el datasheet del pic18f87k22. el modulo I2C se activa al posicionar poner estas lineas:
bsf TRISC,SCL1 ;configura pins como entrada del Pic18f87k22
bsf TRISC,SDA1 ;configura pins como entrada del Pic18f87k22
pero creo que tiene que haber algo mas.pero no se que es.
-
bsf TRISC,SCL1 ;configura pins como entrada del Pic18f87k22
bsf TRISC,SDA1 ;configura pins como entrada del Pic18f87k22
pero creo que tiene que haber algo mas.pero no se que es.
No se exactamente si SCL1 y SDA1 tienen los valores correctos en el .inc . Pero ahi unicamente lo estas poniendo como entrada
Para habilitar el I2C lo que tenes que hacer es modificar el registro SSP1CON1, y poner los bits SSPM para que sean del modo I2C que desees, hay combinaciones que son para SPI unicamente.
Mirando un poco mas tambien creo que deberias habilitar el Open Drain ( bit SSP1OD ) del registro ODCON.
Finalmente el fuse:
MSSPMSK: MSSP V3 7-Bit Address Masking Mode Enable bit
No se si tendra efecto sobre el I2C
-
gracias por la informacion KILLERJC.en lo de la configuracion del SSP1CON1 tenias razon en que los bits SSPM son los que configuran los modos del MSSP.no me habia dado cuenta
de que son diferentes combinaciones.aun asi para configurar el pic en modo maestro.creo que las siguientes lineas estan bien configuradas:
movlw 0x28 ; I2C master mode
movwf SSP1CON1 ; SSPEN enabled
respecto al MSSPMSK creo que es cuando de trabaja en modo esclavo.y en este caso no nos haria falta.
por el momento solo he logrado hacer funcionar memorias 24LC16 que tienen la dreccion A0 y A1.pero no he logrado comunicarme con el DS1307 direcciones(D0 y D1)
ni con una camara OV7670 direcciones(42 y 43)
solo logro hacer funcionar el DS1307 con un PIC 18f2550.pero no salen bien los datos de la hora.incluso he podido escribir en el.pero la hora no avanza.no se si se habra averiado
o hay que configurar algo.pero por lo menos puedo leer y escribir en el.cosa que en el 18f87k22 no funciona.y eso que ya lo he probado en otro chip nuevo.
lo que no me creo es que tambien tenga la OV7670 averiada.ya que he probado dos y pasa lo mismo.
sospecho que algo no esta bien configurado en el 18f87k22.