Autor Tema: Una manito por favor  (Leído 49111 veces)

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

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Una manito por favor
« Respuesta #60 en: 15 de Mayo de 2009, 16:25:29 »
si, así lo hacía yo, colocando una letra por matriz.

Pero con la pequeña charla que me dio Bruno manejaré de otra manera los datos, para hacerlo con punteros, pues me ha convencido que es la mejor manera para poder lograr varios efectos y hacerlos de la manera más sencilla posible.

podrías usar entonces dos int32 y tu cartel llegará a 64 columnas :mrgreen: y al rotar el carrie excesivo pasa a la cola del otro byte y el carrie de ese byte al primero, pero Bruno te dirá que mejor guardes los datos por columnas uses un buffer y en estos ordenes de una manera diferente los datos recibidos, pues todos los últimos bits de los bytes de tu buffer serán la primera fila, del cartel, todos los bits6 serán la segunda y así sucesivamente hasta la 7ma u 8va fila. Todos los bits 7 los vas mandando de ocho en ocho a los registros y tienes los datos para cada fila. Los punteros te ayudarán a tener un desplazamineto y otros efectos más eficientemente según las experiencias de Bruno.

Ahora solo queda hacer algo de código, que personalmente estoy en eso, solo que dejo unos pequeños pendientes y me pongo a full a trabajar con esto.

Un saludo.
.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Una manito por favor
« Respuesta #61 en: 15 de Mayo de 2009, 19:17:46 »
Hola.

Que pena entrometerme, pero, segun las imagenes que puso Cryn, veo que por matriz de led hay una letra ..... en el codigo que yo hice, dejo un espacio solo de una columna entre letra y letra, pero al maximo que he llegado es a 32 columnas, esto debido a que no hay mas variables mas grandes que int32 ....

Lo que yo hago es cargar las letras una a una segun el mensaje en un arreglo de int32, en mi caso como son 7 filas, sera un arreglo de 7 int32. Luego en otro arreglo de int32 auxiliar voy cargando cada una de las filas y las despliego con el shift_left();.

No he tenido tiempo de arreglar mi matriz a mas leds, queria hacerla -o quiero hacerla de 7x64 al menos- pero ando liado con el espacio!!!!

Que sugerencia me das Bruno?

Saludos

Hola! Ahí Rodrigo te ha indicado el método que simplifica la cosa. En unos días si termino mi archivito, lo archivo para que podamos tener una librería standard entre todos. :)

Un saludo.
"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 MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Una manito por favor
« Respuesta #62 en: 15 de Mayo de 2009, 21:50:44 »
Ok!!!

Gracias amigos
El papel lo aguanta todo

Desconectado marvicdigital

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 311
Re: Una manito por favor
« Respuesta #63 en: 16 de Mayo de 2009, 13:37:11 »
 :(  Valla que si me a tocado leer a raudales, hasta el punto de dormirme al frente de este monitor con un PDF abierto  :D..llevo más de 5 horas analizando el código y no encuentro explicación alguna, dentro de lo que conozco a mi problema.
Seguí tu consejo BrunoF, de poner el programa por bloques en la memoria flash, por ejemplo las siguientes rutinas:

Código: ASM
  1. ;****************leer memoria 24LC256 ******
  2.           ORG   0X1400
  3. LEER_EEPROM
  4.        
  5.          CLRF   HADDEEPROM
  6.          CLRF   LADDEEPROM
  7. LOOP_EE                
  8.          CALL   CONFIG_TRANSMISION_I2C
  9.          CLRF   IC2DATA
  10.          CLRF   PALABRA
  11.          CALL   BIT_START_I2C
  12.         MOVLW   B'10100001'
  13.          CALL   TRANSMITIR_DATO_I2C
  14.          CALL   RECIBIR_DATO_I2C
  15.         CALL            BIT_STOP_I2C
  16.         MOVF    IC2DATA,W
  17.         MOVWF   PALABRA
  18.         XORLW   0FFH
  19.         BTFSC   STATUS,Z
  20.         GOTO    BLANQUIAR_PANTALLA
  21.         MOVLW   .32
  22.         SUBWF   PALABRA,F
  23.          PAGESEL        SIGUIENTE_FASE
  24.          CALL   SIGUIENTE_FASE
  25.         MOVF    PALABRA,W
  26.         XORLW   .32
  27.         BTFSS   STATUS,Z
  28.         GOTO    LOOP_EE
  29.         CALL            BIT_STOP_I2C
  30.          PAGESEL        ESPACIOS_BLANCO
  31.          CALL   ESPACIOS_BLANCO
  32.         GOTO    LEER_EEPROM
  33.        
  34. BLANQUIAR_PANTALLA
  35.          PAGESEL        ESPACIOS_BLANCO
  36.          CALL   ESPACIOS_BLANCO
  37.         GOTO    LEER_EEPROM
  38.  
  39. INCLUDE <I2C.INC>
  40. ;**********************************************
  41. ;EFECTOS  EN BANCO 03
  42. ;***********************************************
  43. ;DESPLAZAR HACIA LA IZQUIERDA
  44. ;**********************************************
  45.           ORG   0X1800
  46. ROTAR_IZQUIERDA
  47.                 MOVLW           COL31
  48.                 MOVWF           FSR
  49. OTRA_ROT_IZQ
  50.                 MOVF            INDF,W
  51.                 INCF            FSR,F
  52.                 MOVWF           INDF
  53.                 DECF            FSR,F
  54.         DECF    FSR,F
  55.                 MOVLW   COL1-1
  56.                 XORWF           FSR,W
  57.         BTFSS           STATUS,Z
  58.         GOTO            OTRA_ROT_IZQ
  59.         CLRF    INDF
  60.         RETURN
  61. ;****************************************

El problema es que de esta forma no me funciona, pero si pongo estas 2 rutinas en el banco en donde están las lineas que hacen el llamado,me fuciona bien sin problemas..y no es por que le falte el PAGESEL, por que lo tengo bien:

Código: ASM
  1. INICIO 
  2.          CLRF   FLAGEE
  3.          CLRF   PORTA
  4.          CLRF   PORTB
  5.          CLRF   PORTC
  6.          BANCO1
  7.          MOVLW  018H
  8.          MOVWF  TRISC
  9.          CLRF   TRISB
  10.          CLRF   OPTION_REG
  11.          MOVLW  006H
  12.          MOVWF  ADCON1
  13.          MOVLW  0C0H
  14.          MOVWF  TRISA
  15.          BANCO0
  16.        
  17. LOOP_INICIO
  18.          MOVLW  0FFH
  19.          MOVWF  PORTB
  20.          BCF    LOAD
  21.          MOVLW  .32
  22.          MOVWF  COLUMNAS
  23.          MOVLW  COL1
  24.          MOVWF  FSR
  25. CERO S_COLUMNAS                 ;BORRAR TODAS LAS COLUMNAS
  26.          CLRF   INDF            ;PARA LIMPIAR AL INICICAR
  27.          DECFSZ COLUMNAS
  28.          GOTO   SEGUIR_BORRANDO
  29.         ;GOTO   DEMO_FASE
  30.          PAGESEL        LEER_EEPROM
  31.          GOTO   LEER_EEPROM     ;ME VOY A EMPEZAR A LEER LA EEPROM
  32. SEGUIR_BORRANDO
  33.          INCF   FSR,1
  34.          GOTO   CEROS_COLUMNAS

En esta parte no hay problema alguno, este inicio está junto con el llamado de generar caracteres, mostrar la pantalla y todos las tareas que hacen posible ver un caracter en la matrix.

En la única parte en la que tengo duda es en el llamado de una tabla de una tabla; siguiendo tu ejemplo para poder seleccionar el valor hexadecimal correcto para cada columna  dependiendo del caracter; en él usas mucho el PAGESEL por que el ejemplo expone también que se puede hacer el llamado de una tabla sin importar en donde esté, y como mis tablas  las tengo en el banco 0 pues le quité el PAGESEL, claro después de ver que no me funcionaba bien el código y por probar si era esto.
Mi duda es que la rutina modifica varias veces el PCLATH, pero supuestamente esto no tendría nada que ver ya que la dirección completa de donde se hace el CALL queda grabada en el Stack, y revisando no paso de usar 5 como máximo, cosa que queda comprobada al unir las rutinas en le primer banco de memoria y asi funcionar bien todo.
He revisado PDFs de Microchip, incluyendo el que trata sobre el MPASM y no veo mi error...si sirve de algo estoy usando el MPLAB 8.30.

Que me he tragado? en que parte metí la pata?

Gracias por la ayuda que me puedan dar....

Saludos

Edit: En el foro encontré este post de Maunix, en donde explica que al volver de un CALL en otra página y si vulevs hacer otro llamado asi sea dentro de la misma página debes agregar el pagesel ya que este seguirá cargado con la página anterior.

Voy a probar  a ver si es esto...No se, pero este pasamensajes ha sido la mejor experiencia hasta la fecha, nunca imagine encontrarme con tantos obstáculos que me enseñaran y me hicieran ver cosas que nunca imagine que existieran  :-)
« Última modificación: 16 de Mayo de 2009, 13:56:02 por marvicdigital »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Una manito por favor
« Respuesta #64 en: 16 de Mayo de 2009, 14:47:08 »
Es altamente probable que sea lo que Mauricio dice en ese post.

Tendrias que tenerlo en cuenta en mi rutina de tablas de tablas, porque esa salta páginas seguramente.

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 marvicdigital

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 311
Re: Una manito por favor
« Respuesta #65 en: 16 de Mayo de 2009, 16:03:20 »
SIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

Siiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii   :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :D :D :mrgreen: :mrgreen: :mrgreen: :lol: :-) :-) :mrgreen: :mrgreen: :D :D :-/ :-/



 y cuando vi que me funcionó ..me fui..



Por seguridad, cuando se esté trabajando con micros que tiene varias páginas de memoria, ponerle un PAGESEL  después de una etiqueta, si esta forma parte de una rutina, y si dentro de esta hay una llamada a otra que nos lleve a otra página, al volver inmediatamente poner el PAGESEL para recuperar el valor real del PCLATH de esa rutina...no se si me quedó bien explicado  :D ..es que me estoy partiendo de la risa al ver este gif:



....Luego vuelvo a explicar con un ejemplo mi experiencia.

Gracias BrunoF y sigo pensando que este foro es el mejor dle mundo mundial  :mrgreen:

Saludos

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Una manito por favor
« Respuesta #66 en: 16 de Mayo de 2009, 16:12:26 »
 :D  :D  :D  :D  (Por los gif)
« Última modificación: 17 de Mayo de 2009, 12:07:52 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado marvicdigital

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 311
Re: Una manito por favor
« Respuesta #67 en: 17 de Mayo de 2009, 00:08:10 »
Bueno, ahora si explicaré como se debe hacer en rutinas de CALL y GOTO cuando nos enfrentamos a uC que tiene más de una página de memoria y cuando nos pasamos más allá de la primera página en nuestro código...No soy muy bueno haciendo esto, si tengo errores por favor me lo hacen saber y ojala pueda explicar bien.
Lo primero, cuando nuestro código supera la barrera de memoria correspondiente al primer banco, o mejor dicho cuando ya pasamos a ocupar más de un banco de memoria debemos tener mucho cuidado en las rutinas que invoquemos tanto con CALL como con GOTO, ya que se puede presentar que si estamos en una linea de nuestro código y esta está en el primer banco, tengamos que hacer un llamado a una rutina que se encuentre en otro banco de memoria, para evitar que nuestro programa se pierda y no sepa a donde ir, debemos usar el PCLATH, que no es más que la dirección alta del PCL, y es el encargado de direccionar el paginado de la memoria flash de nuestro uC.

Para los que usamos el Assambler  podemos usar la siguiente instrucción para direccionar correctamente el PCLATH:

Código: ASM
  1. org         0x05h      comienza en la posición  005h de la memoria flash
  2.          goto        inicio
  3.          .....
  4.          ........
  5.          ..
  6.           .
  7. INICIO
  8.           pagesel   retardo
  9.           call         retardo
  10.           PAGESEL   INICIO
  11.           BTFSS    registro,4
  12.           goto       inicio
  13.           pagesel  banco3
  14.           call        banco3
  15.  
  16. ...
  17. ..
  18. ..
  19. ..
  20.            org      0x0100
  21.  
  22. retardo
  23.            pagesel    retardo
  24. retardo_loop
  25.            decfsz......
  26. .....
  27. .........  
  28.             return

Como vemos, debemos poner una linea de código que nos cargue correctamente el PCLATH para ir exactamente a la dirección que indica la instrucción CALL o sea la posición de la rutina retardo en la flash.
Cuando esta rutina hace su trabajo y retorna a la posición de memoria siguiente a la que hizo el llamado, el PCLATH queda cargado con el último valor, osea el PAGESEL  RETARDO, como de donde hicimos el llamado está en otra página debemos indicar al PCLATH que las lineas siguientes son del banco 0 o del banco en donde estén dichas lineas y no del banco en donde está retardo
Para que quede bien, al retorno inmediatamente debemos agregar otro PAGESEL con el valor del PCLATH de las lineas siguientes.

Creo que con el ejemplo es más que suficiente, me perdonan el texto, no soy mur bueno explicando.

Saludos

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Una manito por favor
« Respuesta #68 en: 17 de Mayo de 2009, 01:54:00 »
Código: ASM
  1. org         0x05h      comienza en la posición  005h de la memoria flash
  2.          goto        inicio
  3.          .....
  4.          ........
  5.          ..
  6.           .
  7. INICIO
  8.           pagesel   retardo
  9.           call         retardo
  10.           PAGESEL   INICIO
  11.           BTFSS    registro,4
  12.           goto       inicio
  13.           pagesel  banco3
  14.           call        banco3
  15.  
  16. ...
  17. ..
  18. ..
  19. ..
  20.            org      0x0100
  21.  
  22. retardo
  23.            pagesel    retardo
  24. retardo_loop
  25.            decfsz......
  26. .....
  27. .........  
  28.             return

Hola! Me parece que quisiste poner algo así:

Código: ASM
  1. org         0x05h      comienza en la posición  005h de la memoria flash
  2.          goto        INICIO
  3.          .....
  4.          ........
  5.          ..
  6.           .
  7. INICIO
  8.           pagesel     retardo
  9.           call           retardo
  10.           PAGESEL   INICIO
  11.           BTFSS      registro,4
  12.           goto         INICIO
  13.           pagesel    banco3
  14.           call          banco3
  15.  
  16. ...
  17. ..
  18. ..
  19. ..
  20.            org      0x1000                ;0x0100 está en la misma página que el resto sino...
  21.  
  22. retardo
  23.            ;pagesel    retardo        carece de sentido. PCLATH ya contiene los valores adecuados porque acaba de ser llenado con los valores de este banco
  24.             nop
  25. retardo_loop
  26.            decfsz......
  27. .....
  28. .........  
  29.             return

Por ahi me equivoco pero creo que esta es tu idea.

Saludo.
"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 marvicdigital

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 311
Re: Una manito por favor
« Respuesta #69 en: 17 de Mayo de 2009, 07:58:00 »
Si brunoF muchas gracias por tu corrección, aunque como en mi caso, a veces uso hasta 4 niveles de Stack, entonces es muy conveniente poner al inicio de una rutina el PAGESEL , claro si dentro de esa rutina hay otro llamado a una tabla, por ejemplo:

Código: ASM
  1. INICIO                                                        ;INICIO UBICADO EN EL BANCO 0
  2.                   ...
  3.                   ...
  4.                   PAGESEL   RUTINA_LLAMADA    
  5.                   CALL         RUTINA_LLAMADA
  6.                   PAGESEL   INICIO                     ;AL RETORNAR DEBEMOS INMEDIATAMENTE REDIRECCIONAR EL PCLATH          
  7.                   ....
  8.                   ....
  9.  
  10.  
  11.                   END
  12.  
  13.  
  14.  
  15. ;***************************************************************
  16. RUTINA_LLAMADA                                       ;ESTA RUTINA UBICADA EN EL BANCO 1
  17.                   PAGESEL   RUTINA_LLAMADA
  18.                   INCF          CARACTER
  19.                   CLRF          PORTB
  20. LOOP_CARACTER
  21.                   MOVF        CARACTER,W
  22.                   PAGESEL    TABLAS_CARACTERES
  23.                   CALL          TABLAS_CARACTERES                ;TABLA UBICADA EN EL BANCO 3
  24.                   MOVWF       CARACTER
  25.                   PAGESEL     RUTINA_LLAMADA
  26.                   MOVF          CARACTER,F
  27.                   BTFSC         STATUS,Z
  28.                   RETURN                                                      ;RETORNA AL PROGRAMA PRINCIPAL BANCO 0
  29.                   MOVLW        0FFH
  30.                   XORWF       CARACTER,F                              ;PUEDE PASAR QUE EN ESTE PUNTO SE HAGA OTRA OPERACION
  31.                   GOTO          LOOP_CARACTER                      ; O UN LLAMADO A OTRA TABLA Y QUE HAGA QUE VOLVAMOS
  32.                                                                                     ;AL NICIO DE ESTA RUTINA DE AHI SE EXPLICA DE
  33.                                                                                     ;LA CONVENIENCIA DE PONER UN PAGESEL AL INICIO DE RUTINA
   

Ojala me halla hecho entender bien, sobre lo bueno que es poner un PAGESEL al inicio de una rutina, para evitar dolores de cabeza.

Saludos y mil gracias BrunoF y a todo el foro   lo que he aprendido en estos días no lo había hecho en años                                     

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Una manito por favor
« Respuesta #70 en: 17 de Mayo de 2009, 13:37:35 »
Claro, pero fijate que en este caso también, la directiva PAGESEL RUTINA_LLAMADA no es estrictamente necesaria. Te lo puse en mi post anterior donde te comenté la linea PAGESEL retardo.

Un saludo!
"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 marvicdigital

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 311
Re: Una manito por favor
« Respuesta #71 en: 27 de Mayo de 2009, 02:14:19 »
Bueno luego de varios días sin poder postear y de estar un poco ocupado, quiero compartir una rutina de I2C que estoy usando con este pasamensajes para leer la memoria 24LC256 y el DS1307 ambos en el mismo bus..gracias a todos por confirmar que funciona muy bien.
La rutina tiene varios llamados para hacer, están:

Configurar el I2C
Bit Start
Transmitir dato I2C
Recibir dato I2C y se guarda en I2Cdata
Bit Stop

Esta rutina es para el PIC16F877A, supongo que funciona para el resto de esa familia 873-874 y 876.  Espero les sea de mucha ayuda, parte de ese código lo tomé de muestra de otro que postearon en el foro, no recuerdo de donde lo tome por eso no pongo el enlace..de todas formas tiene algunas modificaciones propias.

Código: ASM
  1. CONFIG_TRANSMISION_I2C
  2.  
  3.         BSF              STATUS,RP0             ; SELECIONO LA PAGINA 1 DE LA MEMORIA
  4.         BSF              TRISC,4
  5.         BSF              TRISC,3
  6.         MOVLW    .2
  7.         MOVWF    SSPADD
  8.         BCF              STATUS,RP0             ;TRANSMISION SERA DE 333 KHZ
  9.          BCF             PIR1,SSPIF             ; SELECIONO LA PAGINA 0 DE LA MEMORIA
  10.         MOVLW     B'00101000'
  11.         MOVWF    SSPCON
  12.         RETURN                                  ; PERMITE LA CONFIGURACION SERIE DE LOS PINES SDA Y SCL.
  13.                
  14. BIT_START_I2C
  15.  
  16.         BSF             STATUS,RP0                      ;BANCO 1
  17.          BSF            SSPCON2,SEN
  18.         BCF             STATUS,RP0                      ;BANCO 0
  19. NO_START        BTFSS           PIR1,SSPIF
  20.         GOTO            NO_START
  21.         BCF             PIR1,SSPIF
  22.         RETURN
  23.  
  24. TRANSMITIR_DATO_I2C
  25.        
  26.         MOVWF    SSPBUF                                 ;CARGAR DATO EN BUFFER I2C
  27.         BSF             STATUS,RP0                      ;BANCO 1
  28.         BTFSS           SSPCON2,ACKSTAT         ;CHECKEAR ACK
  29.         GOTO            OKACK
  30.         BSF             SSPCON2,PEN                     ;ERROR ACK. ENVIAR STOP
  31.         BCF             STATUS,RP0                      ;BANCO 0
  32.         RETURN                                          ;VOLVER
  33. OKACK          
  34.         BCF             STATUS,RP0                      ;BANCO 0
  35. OKACK1          
  36.         BTFSS           PIR1,SSPIF                      ;ESPERAR FINALIZACION DEL NOVENO CLOCK
  37.         GOTO            OKACK1
  38.         BCF             PIR1,SSPIF
  39.         BSF             FLAGEE,0                        ;VOLVER CON FLAG = 1 OK!
  40.         RETURN                                  ;VOLVER CON FLAG= 0 ERROR
  41.        
  42.  
  43. RECIBIR_DATO_I2C
  44.  
  45.         CALL            I2C_IDLE  
  46.         BSF             STATUS,RP0                      ;BANCO 1  
  47.         BSF             SSPCON2,RCEN                    ;ACTIVAR MODO LECTURA
  48. RECI2C 
  49.         BTFSC      SSPCON2,RCEN                  ;TERMINO LA RECEPCION?
  50.         GOTO       RECI2C                                ;NO, ESPERAR
  51. RECI2C2        
  52.         BTFSS           SSPSTAT,BF                      ;DATO DISPONIBLE EN SSPBUF PARA SER LEIDOS?
  53.         GOTO            RECI2C2                                 ;NO, ESPERAR
  54.         BCF             STATUS,RP0                      ;BANCO 0
  55.         MOVF            SSPBUF,W
  56.         MOVWF    IC2DATA
  57.         RETURN
  58.  
  59. BIT_STOP_I2C
  60.         BSF             STATUS,RP0                      ; SELECIONO LA PAGINA 1 DE LA MEMORIA
  61.         BSF             SSPCON2,PEN
  62.         BCF             STATUS,RP0                     ; SELECIONO LA PAGINA 0 DE LA MEMORIA
  63.         RETURN                                         
  64. STOPI2C
  65.         BTFSS   PIR1,SSPIF
  66.         GOTO    STOPI2C
  67.         BCF             PIR1,SSPIF
  68. RESTART_I2C
  69.         BSF             STATUS,RP0
  70.         BSF             SSPCON2,RSEN
  71. RESTI2C
  72.         BTFSC   SSPCON2,RSEN
  73.         GOTO    RESTI2C
  74.         BCF             STATUS,RP0
  75.        
  76.  
  77.  
  78. I2C_IDLE
  79.         BSF                     STATUS,RP0                      ;BANCO 1
  80. IDLEI2C        
  81.         BTFSC           SSPSTAT,R_W
  82.         GOTO            IDLEI2C
  83. IDLE2  
  84.         MOVF            SSPCON2,W
  85.         ANDLW           0X1F
  86.         BTFSS           STATUS,Z
  87.         GOTO            IDLE2
  88.         BCF                     STATUS,RP0                      ;BANCO 0
  89.         RETURN

El orden para hacer el llamado de uno del dispositivo que tengamos en el bus sería asi:

Código: ASM
  1. CALL       CONFIG_TRANSMISION_I2C
  2. CALL       BIT_START_I2C
  3. MOVLW   DIRECCION_DISPOSITIVO             ;SI SE VA A ESCRIBIR O SE VA A LEER
  4. CALL       TRANSMITIR_DATO_I2C
  5. MOVLW   DIRECCION_INICIAL                    ;A DIRECCIÓN A LA QUE QUEREMOS ACCEDER
  6. CALL       TRANSMITIR_DATO_I2C
  7. CALL       BIT_STOP_I2C                              ;SI DECIDIMOS ACCEDER ALEATORIAMENTE A LA LECTURA
  8. CALL       BIT_START_I2C
  9. MOVLW   DIRECCION_DISPOSITIVO            ;MODO LECTURA
  10. CALL       TRANSMITIR_DATO_I2C
  11. CALL       RECIBIR_DATO_I2C
  12. MOVF      IC2DATA,W                                   ; EL DATO RECUPERADO QUEDA GRABADO EN  IC2DATA
  13.                                                                     ; Y EN W

Recuerden consultar el datasheet del dispositivo que quieran controlar por este puerto para saber su dirección, registros o memoria.

Saludos
« Última modificación: 27 de Mayo de 2009, 02:43:17 por marvicdigital »

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Una manito por favor
« Respuesta #72 en: 27 de Mayo de 2009, 10:32:49 »
hola marvicdigital, que buenas rutinas, gracias

aprovechando que usas dos dispositivos I2C, cuando quieres leer la hora que dirección mandas? y para la memoria?

en la memoria se puede cambiar la dirección con los pines de A0 A1 A2??

saludos
.

Desconectado marvicdigital

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 311
Re: Una manito por favor
« Respuesta #73 en: 27 de Mayo de 2009, 17:59:52 »
hola marvicdigital, que buenas rutinas, gracias

aprovechando que usas dos dispositivos I2C, cuando quieres leer la hora que dirección mandas? y para la memoria?

en la memoria se puede cambiar la dirección con los pines de A0 A1 A2??

saludos

Para la hora uso el DS1307 la dirección de este dispositivo es 0D0h para escritura y 0D1h para lectura..la memoria puse los tres pines a tierra por comodidad  :mrgreen:, ya el datasheet te dice con esa configuración que dirección le corresponde.

Saludos

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Una manito por favor
« Respuesta #74 en: 27 de Mayo de 2009, 18:27:22 »
ok, muchas gracias tenía algunas dudas :mrgreen:
.