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.
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