Autor Tema: problemas con 16f877 y 24lc256  (Leído 3057 veces)

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

Desconectado caeshark_

  • PIC10
  • *
  • Mensajes: 41
problemas con 16f877 y 24lc256
« en: 26 de Marzo de 2008, 17:59:47 »
Pues estoy intentando comunicar un 16f877 y una memoria 24lc256 pero tengo problemas.
El programa q utilizo es un ejemplo q Gokuden colgo en el foro, simplemente q he creado una libreria con las subrutinas de la comunicacion y en el programa principal he añadido un plusador en el puerto b para q empiece a transmitir. Os comento simulo con proteus 7.1 sp4 y mplab, con un watch en el mplab veo los registros q me interesan q son W I2c_BYTE y sspbuf, cuando voy simulando en esta ventana salen los registros con los valores correctamente, envio un start, el identificador de la memoria, la direccion en la q quiero escribir, luego el dato y luego un stop. Todo esto en la ventana del mplab es correcto pero en el i2c debugger del proteus salen valores q no tienen nada q ver o al menos eso creo yo.

este es el circuito



y esto lo q sale en el i2c debugger del proteus:




Os pego el programa principal

Código: [Seleccionar]
;**********************************************************************
;                                                                     
;    Filename:     CONTROL I2C         
;    Date:          25.03.08                                         
;    File Versión:   *.*                                                           
;                                                                 
;    Autor: LUCIANO GARCÍA ALMENA                                   
;    Company:                                               
;                                                                     
;                                                                 
;**********************************************************************


list      p=16f877            ; list directive to define processor
#include <p16f877.inc>        ; processor specific variable definitions
ERRORLEVEL -302
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _XT_OSC & _WRT_ENABLE_OFF & _LVP_OFF & _DEBUG_OFF & _CPD_OFF


;**********************************************************************


BYTE_I2C EQU 20

ORG     0X00             ; processor reset vector
  NOP
GOTO INICIO
ORG 0X05





INICIO


CALL CONFIGURACION
BSF STATUS,RP0
BCF STATUS,RP0
BCF OPTION_REG,NOT_RBPU
MOVLW B'11111111'
MOVWF TRISB
BTFSC PORTB,0
GOTO INICIO

CALL S_START ;start
MOVLW B'10100000' ; byte identificador a W
CALL S_BYTE ; envio de byte en W, que es identificador
MOVLW 0X00 ; direccion alta
CALL S_BYTE ; envio de direccion alta
MOVLW 0X00 ; direccion baja
CALL S_BYTE ; envio de direccion baja
INCF BYTE_I2C
MOVF BYTE_I2C,W ; dato a grabar en posicion 000h


CALL S_BYTE ; envio de dato a grabar
CALL S_STOP ; stop, si deseas, mandas mas datos antes de parar

GOTO INICIO

INCLUDE  <I2C.INC>
END

y la libreria:

Código: [Seleccionar]
;Libreria para comunicacion I2C



;S_STAR es la rutina de start
;S_STOP es la rutina de stop
;S_BYTE es la rutina de enviar byte
;R_BYTE es la rutina de recivir byte.


;-----------------INICIO, CONFIGURACION DE PTOS Y I2C-------------------
CONFIGURACION
CALL BANK_1 ; TE CAMBIAS AL BANCO 1
MOVLW 0FFH
MOVWF TRISC
MOVLW B'10000000'
MOVWF SSPSTAT
MOVLW .9
MOVWF SSPADD
CALL BANK_0 ; TE CAMBIAS AL BANCO 0
MOVLW B'00101000'
MOVWF SSPCON
MOVLW .0
RETURN


;-------------RUTINAS I2C-------------------
S_START

BCF PIR1,SSPIF ; CON ACK
CALL BANK_1
BSF SSPCON2,SEN
CALL BANK_0
START_W
BTFSS PIR1,SSPIF
GOTO START_W
RETURN



S_STOP

BCF PIR1,SSPIF
CALL BANK_1
BSF SSPCON2,PEN
CALL BANK_0
STOP_W
BTFSS PIR1,SSPIF
GOTO STOP_W
RETURN



S_BYTE
BCF PIR1,SSPIF
MOVWF SSPBUF
SEND_B
BTFSS PIR1,SSPIF
GOTO SEND_B
RETURN


R_BYTE
BCF PIR1,SSPIF ;PARA GRABAR
CALL BANK_1
BSF SSPCON2,RCEN
CALL BANK_0
READ_W
BTFSS PIR1,SSPIF
GOTO READ_W
BCF PIR1,SSPIF
CALL BANK_1
BCF SSPCON2,ACKDT
BSF SSPCON2,ACKEN
CALL BANK_0
ACK_W
BTFSS PIR1,SSPIF
GOTO ACK_W
MOVF SSPBUF,W
RETURN


;---------------------------BANCOS------------------
BANK_0
BCF STATUS,RP0
BCF STATUS,RP1
RETURN

BANK_1
BSF STATUS,RP0
BCF STATUS,RP1
RETURN

BANK_2
BCF STATUS,RP0
BSF STATUS,RP1
RETURN

BANK_3
BSF STATUS,RP0
BSF STATUS,RP1
RETURN





os adjunto los dos archivos y el de proteus. El de proteus es el i2cproteus.zip

Desconectado ales

  • PIC10
  • *
  • Mensajes: 33
Sobre tu problema
« Respuesta #1 en: 31 de Marzo de 2008, 11:03:12 »
Antes que todo deja desconectada la pata WR de la memoria, y pon resistencias PULL-UP (así mismo se llaman en el Proteus) y conectalas a Vcc asi como lo tienes en tu circuito.
Yo no he programado en ensamblador con PIC utilizo el CCS pero tienes que esperar por Ack cuando hagas los write al menos cuando mandes la dirección, fíjate en un tema que yo pregunté y después me respondí donde adjunto mis software quizás te sirva de algo, en el logré conectar 8 memorias 24LC512 al I2C, al final es lo mismo que tus memorias solo cambia el tama;o.

Saludos

 Ales.

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
Re: problemas con 16f877 y 24lc256
« Respuesta #2 en: 31 de Marzo de 2008, 11:11:47 »
Matizo lo que dices, alex. El ACK es como una "señal de vida" del dispositivo I2C, como una forma de decir "OK estoy listo"... debe ser leido en todos los casos, de lo contrario algo ha ido mal. La excepcion es, que cuando vamos leyendo (READ) bytes del esclavo, no enviamos ACK para señalar que no queremos mas.



 

anything