Autor Tema: Ejemplo de utilizacion del Modulo I2C del 16F877a  (Leído 42726 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: Ejemplo de utilizacion del Modulo I2C del 16F877a
« Respuesta #15 en: 16 de Mayo de 2008, 17:38:36 »
OK,entendido.

y queria hacerte otra pregunta.
el 24LC256 y toda esta serie tiene un pin WP que creo que es para la proteccion de escritura.

en el datasheet creo haber entendido de que este`pin tiene una resistencia interna que hace de que si el pin esta desconectado,el chip este desprotegido.
es realmente asi o por el contrario estaria protegido y puede que sea ese el motivo de que no me grabe nada?

ademas probando el pic ,me he dado cuenta de que se me queda parado en estas lineas:

bcf      STATUS,RP0      ;banco 0   
btfss      PIR1,SSPIF     ;espera a que salte la interrupcion por cambio del flag SSPIF
goto      $-1

supongo que sera.que esta interrupcion no se sucede nunca.hay que activar gie?

y otra cosa que he visto:

movlw       b'00001011'     ;.11 para 400khz @ 20 mhz   
movwf       SSPADD            ;400 khz @ 20 mhz   

si este codigo esta optimizado para 20Mhz y yo estoy utilizando 4Mhz puede que el valor .11 no sirva para esta frecuencia.donde esta la tabla para poner el valor adecuado?
« Última modificación: 16 de Mayo de 2008, 19:02:13 por groundman »
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ejemplo de utilizacion del Modulo I2C del 16F877a
« Respuesta #16 en: 16 de Mayo de 2008, 21:25:43 »
OK,entendido.

y queria hacerte otra pregunta.
el 24LC256 y toda esta serie tiene un pin WP que creo que es para la proteccion de escritura.

en el datasheet creo haber entendido de que este`pin tiene una resistencia interna que hace de que si el pin esta desconectado,el chip este desprotegido.
es realmente asi o por el contrario estaria protegido y puede que sea ese el motivo de que no me grabe nada?

Si no recuerdo mal, WP debe ir conectado a GND...
ademas probando el pic ,me he dado cuenta de que se me queda parado en estas lineas:

bcf      STATUS,RP0      ;banco 0   
btfss      PIR1,SSPIF     ;espera a que salte la interrupcion por cambio del flag SSPIF
goto      $-1

supongo que sera.que esta interrupcion no se sucede nunca.hay que activar gie?

Nono. No utilice las interr del modulo en este ejemplo.

y otra cosa que he visto:

movlw       b'00001011'     ;.11 para 400khz @ 20 mhz  
movwf       SSPADD            ;400 khz @ 20 mhz   

si este codigo esta optimizado para 20Mhz y yo estoy utilizando 4Mhz puede que el valor .11 no sirva para esta frecuencia.donde esta la tabla para poner el valor adecuado?

Es probable que debas cambiarlo...consulta el datasheet. allí debe estar.

Saludos
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: Ejemplo de utilizacion del Modulo I2C del 16F877a
« Respuesta #17 en: 18 de Mayo de 2008, 20:04:04 »
hola,BrunoF.

ya que todabia estoy estancado en el codigo.se me ha ocurrido empezar de la forma mas facil.y es grabar un dato en la eeprom directamente con el programador.
y despues leerlo con el codigo que has diseñado.

ya he eliminado las instrucciones relacionadas con las interrupciones.pero sigue quedandose el programa estancado en esta linea:

btfsc       SSPSTAT,R_W      ;esperar a que termine el envio         
goto       $-1

esta en el subprograma i2c_write.no se que puede dar lugar a que no salga de este bucle. tienes alguna idea?
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ejemplo de utilizacion del Modulo I2C del 16F877a
« Respuesta #18 en: 18 de Mayo de 2008, 20:32:15 »
La verdad que no...

¿Pusiste las pullups en las lineas, no?

WP y D2,D1 y D0 de la EEPROM deberian ir a GND.

Debería funcionar...

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: Ejemplo de utilizacion del Modulo I2C del 16F877a
« Respuesta #19 en: 18 de Mayo de 2008, 20:36:08 »
esas lineas estan a masa,pero no he puesto ningun tipo de resistencia en el circuito.sera ese el fallo?
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ejemplo de utilizacion del Modulo I2C del 16F877a
« Respuesta #20 en: 18 de Mayo de 2008, 21:55:34 »
Ambas líneas del I2C deben llevar(por separado) resistencias a 5V de 3.3k o 4.7k...sino no te va a funcionar nunca! :S

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: Ejemplo de utilizacion del Modulo I2C del 16F877a
« Respuesta #21 en: 19 de Mayo de 2008, 10:43:56 »
 :x que ravia.el tiempo que he perdido.pero no hay mal que por bien no benga,almenos he profundizado en la utilizacion de este modulo.

ah.supongo que las resistencias hay que conectarlas entre los  pin y vcc.   no?
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ejemplo de utilizacion del Modulo I2C del 16F877a
« Respuesta #22 en: 19 de Mayo de 2008, 15:20:27 »
Sisi. Ambas van a Vcc. Jeje como bien dices...no hay mal que por bien no venga :D

Ya me comentaras si arranca.

Tendrian que quedarte similar a esto la resistencias..




Saludos.
« Última modificación: 19 de Mayo de 2008, 15:24:31 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: Ejemplo de utilizacion del Modulo I2C del 16F877a
« Respuesta #23 en: 19 de Mayo de 2008, 17:50:32 »
lo de mal que por bien no venga. tengo un tio que es sepulturero y dice que el no quiere que nadie se muera,pero que a el  no le falte el trabajo. :D :D :D :shock:

ya he puesto las resistencias,y el programa ha salido del bucle donde estaba pillado.

pero ahora se ha quedado pillado en otro, en el subprograma i2c_read.

btfsc       SSPCON2,RCEN      ;termino la recepcion? 
goto       $-1         ;no, esperar   

yo tengo los pin A0,A1,A2 y WP a GND despues de poner las dos resistencias no creo que tenga mas fallos de hardware. o tu programa no esta puesto para que estos pin esten a GND?

ah las resistencias las he puesto de 10k como en el esquema.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ejemplo de utilizacion del Modulo I2C del 16F877a
« Respuesta #24 en: 19 de Mayo de 2008, 18:10:50 »
jaja

Mi programa esta hecho para direccionar a la memoria 0, asi que deberia funcionar.

No he usado resistencias de 10k. Siempre use 4.7k. Igualmente supondria que deberia funcionar...:(
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: Ejemplo de utilizacion del Modulo I2C del 16F877a
« Respuesta #25 en: 20 de Mayo de 2008, 16:57:19 »
hola de nuevo BrunoF.

solo hay una cosa de tu programa que no encuentro ni en los datasheet del 16f876 ni en otro datasheet dedicado especificamente con el MSSP.
y es esta linea que te comente anteriormente.

movlw       b'00001011'     ;.11 para 400khz @ 20 mhz   ;3º
movwf       SSPADD            ;400 khz @ 20 mhz   

no se porque se pone este valor.y es que no encuentro ninguna tabla.sera que no existe?

esto es lo que he visto respecto al baud rate generator pero no lo entiendo todo.

in I2C master mode,the reload value for the BRG is located in the lower 7 bits of the SSPADD register.when the BRG is loaded with this value,the BRG counts down
to 0 and stop util another reload has taken place.in I2C master mode,the BRG is reloaded automatically.if clock arbitration is taking place for instance ,the BRG will be reloaded when SCL pin is sampled higt.
« Última modificación: 20 de Mayo de 2008, 17:33:46 por groundman »
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ejemplo de utilizacion del Modulo I2C del 16F877a
« Respuesta #26 en: 20 de Mayo de 2008, 17:55:46 »
Hola. El SSPADD es el que define la velocidad del I2C.

clock = Fosc / (4*(SSPADD+1))

Proba cargandole el valor .9 a SSPADD para que funcione a 100khz(@4mhz) o .4(@20mhz) segun tu oscilador.

Saludos.
« Última modificación: 20 de Mayo de 2008, 17:58:11 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: Ejemplo de utilizacion del Modulo I2C del 16F877a
« Respuesta #27 en: 20 de Mayo de 2008, 18:59:16 »
aunque todabia no funciona.

ya he entendido lo que querias decirme.   clock = Fosc / (4*(SSPADD+1))   4Mhz/(4*(9+1))=100Khz

seguire comprobando que es lo que pasa.

saludos.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: Ejemplo de utilizacion del Modulo I2C del 16F877a
« Respuesta #28 en: 21 de Mayo de 2008, 18:59:36 »

EUREKA¡¡¡.ya me funciona. :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/

tu programa esta perfecto despues de las modificaciones que me has estando diciendo que hiciera.y cambiando algunas
directivas del compilador para este pic 16f876.me ha funcionado en los 24LC16,24LC64 y 24LC256.

el problema era que desde que empeze a modificar tu programa para adaptarlo con este chip,modifque una linea que
luego no me acorde de activarla.ademas de las resistencias de 4K7 que no puse en los pin SCL y SDA a VCC,y entonces cree un nuevo asm y puse los dos ultimos programas que posteastes,y los demas
subprogramas.ademas de modificar todos los B"00000000" por b'00000000' es decir sin las comillas.
y el  (#define    OK   D'0').y eliminar toda referencia hacia lor puertos PORTD y PORTE

abajo pongo el programa que me funciona.

saludos,y muchas gracias por tu tiempo. :-)


progama que graba dato A0 en la direccion 00h de una memoria eeprom externa mediante protocolo I2C

LIST      P=16F876
      #include   "p16F876.INC"
         __CONFIG    _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC & _BODEN_OFF &_LVP_OFF &_CPD_OFF ;&_WRT_ENABLE_OFF   
      ERRORLEVEL   -302

;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; CONSTANTES:
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#define      CLOCK         D'0'
#define      STROBE         D'2'
#define      SCL         D'3'
#define      SDA         D'4'
#define       OK         D'0'

;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;Memoria EEPROM
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; MACROS
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

BANK0      MACRO
      BCF   STATUS,RP0
      BCF   STATUS,RP1
      ENDM

BANK1      MACRO
      BSF   STATUS,RP0
      BCF   STATUS,RP1
      ENDM

BANK2      MACRO
      BSF   STATUS,RP1
      BCF   STATUS,RP0
      ENDM

BANK3      MACRO
      BSF   STATUS,RP1
      BSF   STATUS,RP0
      ENDM

;GPR: GENERAL PURPOSE REGISTERS

;0x20 -> 0x47 Reservados Memoria cartel.

;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

DIRL      EQU   0X20
DIRH      EQU   0X21   
DATO      EQU   0X22   ;temporar. byte a enviar/dato leido
flag      EQU   0X24
cuenta      EQU   0X25
CONTA0      EQU   0X26
CONTA1      EQU   0X27
DATASSP      EQU      0x70

;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



      ORG   0X0000
      GOTO   INICIO

      ORG   0X0004
      return

      ORG   0X0020

INICIO      BANK0
      BSF   STATUS,RP0
      MOVLW   0x06       ;PINS DEL PUERTO A Y PUERTO E TODOS DIGITALES.
      MOVWF   ADCON1
      CLRW
      MOVWF TRISA

      BANK0
      CLRF   PORTA
      BSF      STATUS,RP0
      MOVLW   0X00
      MOVWF   TRISB

      BANK0
      CLRF   PORTB
      BSF      STATUS,RP0
      MOVLW   B'00011000'
      MOVWF   TRISC
   
      BANK0
      MOVLW   B'00010000'
      MOVWF   PORTC
      BSF   STATUS,RP0
      ;MOVLW   0X00
      ;MOVWF   TRISD

      BANK0
      ;CLRF   PORTD
      BSF      STATUS,RP0
      ;MOVLW   0X00
      ;MOVWF   TRISE
   
      BANK0
      ;CLRF   PORTE

      call   i2c_init   ;configurar y encender I2C
      clrf   DIRH      ;cargar paginas de 24LC08B en las cuales escribir
      clrf   DIRL      ;cargar direccion de 24LC08B en las cuales escribir     
      movlw   0xA0
      movwf   DATASSP      ;cargar dato a escribir en la 24LC08B
      call   WriteI2CByte
      btfss   flag,0
      goto   errorcom

      call   DEMORA      ;dar 10ms a que termine la escritura

      clrf   DIRH      ;cargar paginas de 24LC08B de las cuales leer
      clrf   DIRL      ;cargar direccion de 24LC08B de las cuales leer
      call   ReadI2CByte
      btfss   flag,0
      goto   errorcom

      movlw   .1      ;escritura y lectura OK. encender RA0, mostrar dato leido en PuertoB y loop eterno
      movwf   PORTA
      movf   DATO,w
      movwf   PORTB
      nop
      goto   $-1

errorcom   movlw   .3      ;error de escritura o lectura, encender RA0 y RA1 y loop eterno
      movwf   PORTA
      nop
      goto   $-1


;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

DEMORA
   movlw   .55
   movwf   CONTA0
RET1
   movlw   .181
   movwf   CONTA1
RET2
   nop
   nop
   decfsz   CONTA1,1
   goto   RET2
   decfsz   CONTA0,1
   goto   RET1
   return


;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

i2c_init

   movlw       b'00011000'
   banksel       TRISC         ;banco 1
   iorwf       TRISC,F
   movlw       b'00001011'      ;.11 para 400khz @ 20 mhz
   movwf       SSPADD         ;400 khz @ 20 mhz   
   clrf       SSPSTAT
   movlw      b'00101000'
   bcf      STATUS,RP0      ;banco 0
   movwf       SSPCON
   CLRF      PIR1
   call      i2c_idle
   return


;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

i2c_idle

   bsf      STATUS,RP0      ;banco 1
   btfsc       SSPSTAT,R_W
   goto       $-1

   movf       SSPCON2,w
   andlw       0x1F
   btfss       STATUS,Z
   goto       $-3

   bcf      STATUS,RP0      ;banco 0
   return

;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

i2c_start
   call      i2c_idle
   bsf      STATUS,RP0      ;banco 1
   bsf       SSPCON2,SEN
   btfsc       SSPCON2,SEN
   goto       $-1

   bcf      STATUS,RP0      ;banco 0
   btfss      PIR1,SSPIF
   goto      $-1

   bcf      PIR1,SSPIF
   return

;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

i2c_restart

   bsf      STATUS,RP0      ;banco 1
   bsf       SSPCON2,RSEN
   btfsc       SSPCON2,RSEN
   goto       $-1

   bcf      STATUS,RP0      ;banco 0
   return

;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

i2c_read

   call      i2c_idle   
   bsf      STATUS,RP0      ;banco 1   
   bsf       SSPCON2,RCEN      ;activar modo lectura
   btfsc       SSPCON2,RCEN      ;termino la recepcion?
   goto       $-1         ;no, esperar

   btfss      SSPSTAT,BF      ;dato disponible en SSPBUF para ser leidos?
   goto      $-1         ;no, esperar

   bcf      STATUS,RP0      ;banco 0
   movf      SSPBUF,W
   movwf      DATO
   return

;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

i2c_write

   bcf      flag,0         ;inicializar flag como "error"
   call      i2c_idle
   movf      DATO,w         ;mover DATO a W
   movwf       SSPBUF         ;cargar dato en buffer I2C
   bsf      STATUS,RP0      ;banco 1
   btfsc       SSPSTAT,R_W      ;esperar a que termine el envio
   goto       $-1

   btfss      SSPCON2,ACKSTAT    ;checkear ack
   goto      okack

   bsf       SSPCON2,PEN      ;error ack. enviar STOP
   bcf      STATUS,RP0      ;banco 0
   return               ;volver con flag= 0 error

okack   bcf      STATUS,RP0      ;banco 0
   btfss      PIR1,SSPIF      ;esperar finalizacion del noveno clock
   goto      $-1

   bcf      PIR1,SSPIF
   bsf      flag,0         ;volver con flag = 1 OK!
   return
   
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

i2c_sendack

   bsf      STATUS,RP0      ;banco 1
   bcf       SSPCON2,ACKDT
   bsf       SSPCON2,ACKEN
   bcf      STATUS,RP0      ;banco 0
   return

;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

i2c_sendnack

   bsf      STATUS,RP0      ;banco 1
   bsf       SSPCON2,ACKDT
   bsf       SSPCON2,ACKEN
   bcf      STATUS,RP0      ;banco 0
   return

;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

i2c_stop
   bsf      STATUS,RP0      ;banco 1
   bsf       SSPCON2,PEN      ;enviar STOP
   bcf      STATUS,RP0      ;banco 0
   return


;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;WriteI2CByte
;DIRH<1:0>                  ;paginas de la eeprom en las cuales grabar
;DIRL                     ;direccion baja de la posicion de eeprom en las cuales grabar
;DATASSP                  ;dato a grabar
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

WriteI2CByte

   call      i2c_start      ;enviar START, esperar a que se libere el BUS
   movlw      b'10100000'      ;"1010"= identificador EEPROM. "000" = numero EEPROM "0"= Write
   movwf      DATO
   call      i2c_write
   btfss      flag,OK
   return

   movf      DIRH,W
   andlw      b'01111111'      ;solo 7 bits de paginas admitidas para esta eeprom.
   movwf      DATO         ;cargar byte en variable a enviar(DATO)
   call      i2c_write
   btfss      flag,OK
   return                  ;volver. error de escritura

   movf      DIRL,W
   movwf      DATO
   call      i2c_write
   btfss      flag,OK
   return                  ;volver. error de escritura
   
   movf      DATASSP,W
   movwf      DATO         ;cargar en DATO
   call      i2c_write
   btfss      flag,OK
   return                  ;volver. error de escritura

   call      i2c_stop
   return                  ;flag = 1 OK!


;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;ReadI2CByte
;DIRH<1:0>               ;paginas de la eeprom de las cuales leer
;DIRL                  ;direccion baja de la posicion de eeprom de las cuales leer

;devuelve:
;DATASSP                  ;dato leido
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

ReadI2CByte
   
   call      i2c_start      ;enviar START, esperar a que se libere el BUS

   movlw      b'10100000'      ;1010=identificador EEPROM 000= numero EEPROM 0=write
   movwf      DATO         ;cargar byte en variable a enviar(DATO)
   call      i2c_write
   btfss      flag,OK
   return                  ;volver. error de escritura

   movf      DIRH,W
   andlw      b'01111111'      ;solo 7 bits admitidos para esta EEPROM
   movwf      DATO
   call      i2c_write
   btfss      flag,OK
   return

   movf      DIRL,W
   movwf      DATO
   call      i2c_write
   btfss      flag,OK
   return                  ;volver. error de escritura

   call      i2c_restart      ;enviar RESSTART

   movlw      b'10100001'      ;1010=identificador EEPROM 000= numero EEPROM 1=read
   movwf      DATO         ;cargar byte en variable a enviar(DATO)
   call      i2c_write
   btfss      flag,OK
   return                  ;volver. error de escritura

   call      i2c_read
   call      i2c_sendnack
   call      i2c_stop
   return                  ;flag = 1 OK!


;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

CurrentI2CRead

   call      i2c_start      ;enviar START, esperar a que se libere el BUS

   movlw      b'10100001'      ;1010=identificador EEPROM 000= numero EEPROM 1= read
   movwf      DATO         ;cargar byte en variable a enviar(DATO)
   call      i2c_write
   btfss      flag,OK
   return                  ;volver. error de escritura

   call      i2c_read
   call      i2c_sendnack
   call      i2c_stop
   return                  ;flag = 1 OK!
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

         END
« Última modificación: 21 de Mayo de 2008, 19:02:29 por groundman »
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ejemplo de utilizacion del Modulo I2C del 16F877a
« Respuesta #29 en: 21 de Mayo de 2008, 19:13:01 »
Wiiiiiiiiiiii!!!!!!!!!! Ya te tocaba que te funcionara! Como ves...el I2C en assembler hace sudar a uno hasta que funciona(o acaso creias que bromeaba? :D)

Felicitaciones! Y ahora a reventar esas EEPROMs

;)

 :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/

Un abrazo.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.