Autor Tema: Problema con comunicacion serie entre 3 pics y una memoria en I2c  (Leído 6424 veces)

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

Desconectado zeusjorg

  • PIC10
  • *
  • Mensajes: 36
Hola a todos.

Estoy realizando una prueva con tres pic y una memoria eeprom I2c.

El primer pic, llamado Emisor.
Manda la direccion de memoria donde se quiere almacenar.
seguido manda el dato que se quiere almacenar.
seguido el dato se incrementa en 5, y la direccion en 1.
esto se repite en 5 veces.

Luego espera asta que se pulse un pulsador para incrementar en 5 el dato
y volver a realizar lo anterior.

En el segundo pic llamado intermedio.
este micro recibe las direcciones y datos del pic emisor. y lo almacena en la memoria I2c.
Luego lee los datos almacenados en la memoria y manda la direccion y los datos al pic receptor.
y seguido se pone a la espera de recivir datos del emisor.

En el tercer pic llamado receptor.
Recibe las direcciones y los datos del pic intermedio.
y los manda a un LCD en la posicion que pone en la direccion.

el problema que los datos que manda el pic intermedio al pic receptor
no son los correctos  pero las direcciones si.

OS pongo los archivos de los tres programas y la simulacion en proteus.

Agradezco vuestras ayudas.

muchas gracias


Desconectado zeusjorg

  • PIC10
  • *
  • Mensajes: 36
Re: Problema con comunicacion serie entre 3 pics y una memoria en I2c
« Respuesta #1 en: 23 de Abril de 2010, 19:27:21 »
nadie me puede ayudar

muchas gracias

Desconectado psicowifi

  • PIC12
  • **
  • Mensajes: 56
Re: Problema con comunicacion serie entre 3 pics y una memoria en I2c
« Respuesta #2 en: 25 de Abril de 2010, 22:57:34 »
lamentable pero cierto parece nadie te puede ayudar... tranquilo no eres el unico al que no le responden o le dan luces a ver como poder resolver el problema.. ami me pasa lo  mismo jaja soy de poco andar por aqui respondiendo no sea que meta la pata por la poca experiencia pero.... los que si saben y pueden ayudar como que se olvidaron de que alguna ves ellos tambien pasaron por lo mismo... sigue indagando mi amigo que seguro resuelves como e resuelto yo los problemas que e tenido que ms nos queda un saludo pues.
Muchos varios se molestara por esta respuesta y otra quee puse por hay en uno de los post que hice que quedo en el aire pero... bueno si no hay criticas no salen soluciones


Desconectado zeusjorg

  • PIC10
  • *
  • Mensajes: 36
Re: Problema con comunicacion serie entre 3 pics y una memoria en I2c
« Respuesta #3 en: 26 de Abril de 2010, 16:18:08 »
hola psicowifi

Tambien hay que entender que la gente no esta todo el dia en el foro para responder. Y tampoco estan obligado ayudarte.
Pero hay gente que si lo hace y ha esta gente hay que agradecer mucho su ayuda.
Yo tambien soy novato en programacion. llevo unos meses, pero tampoco me puedo implicar todo lo que quisiera,
por obligaciones dee la familia, pero voy haciendo.
Pero por poca idea que tengamos tambien podemos ayudar o almenos dar una pista o idea.

un saludo

Desconectado zeusjorg

  • PIC10
  • *
  • Mensajes: 36
Re: Problema con comunicacion serie entre 3 pics y una memoria en I2c
« Respuesta #4 en: 26 de Abril de 2010, 16:51:11 »
Hola a todos.

como me a recomendado un moderador.
Pondre esquema del circuito y los programas.
Puntualizar, que es PBP.

Programa emisor:

Código: [Seleccionar]
INCLUDE "MODEDEFS.BAS"

symbol HABILITAR = PORTB.0
SYMBOL TRANSMISOR = PORTB.1
SYMBOL PULSADOR = PORTB.2

TRISB=%00000100

A VAR BYTE
DATO VAR BYTE
b var byte

pause 600

DATO=0

INICIO:
a=0
b=0

FOR A=0 TO 5
    HABILITAR=1
    pause 10
    SEROUT TRANSMISOR, 2400, [b]
    pause 10
    SEROUT TRANSMISOR, 2400, [DATO]
    pause 25
    DATO=DATO+5
    b=b+1
NEXT A
    HABILITAR=0

PULSA:
IF PULSADOR=0 THEN
                goto PULSADORACTIVO
            ELSE
                GOTO PULSA
            ENDIF
PULSADORACTIVO:
    IF PULSADOR=0 THEN GOTO PULSADORACTIVO
GOTO INICIO

END


Programa intermedio:

Código: [Seleccionar]
INCLUDE "MODEDEFS.BAS"

symbol SCL = PORTB.0
SYMBOL SDA = PORTB.1
SYMBOL EMISOR = PORTB.2
symbol RECEPTOR = PORTB.3
SYMBOL HABILITARR = PORTB.4
SYMBOL HABILITARE = PORTB.5
SYMBOL led = PORTB.6
SYMBOL CONL=%1010000


TRISB=%00110100

DIR VAR BYTE
DATO VAR BYTE
X VAR BYTE

pause 600

INICIO:

    IF HABILITARE=1 THEN GOSUB EMISOR1
GOTO INICIO

EMISOR1:
    for x=0 to 5
    led=1
    SERIN EMISOR, 2400, DIR
    SERIN EMISOR, 2400, DATO
    I2CWRITE SDA, SCL, CONL, DIR, DATO
    PAUSe 20
    next x
    led=0
   
DIR=0   
    FOR X=0 TO 5
        I2CREAD SDA, SCL, CONL, dir, DATO
        pause 15
        SEROUT RECEPTOR, 2400, [DIR]
        PAUSE 10
        SEROUT RECEPTOR, 2400, [DATO]
        DIR=DIR+1
        PAUSE 10
    NEXT X

    RETURN
END

Programa receptor:

Código: [Seleccionar]
INCLUDE "MODEDEFS.BAS"

Define LCD_DREG portA
Define LCD_DBIT 0
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
DEFINE LCD_BITS 4
DEFINE LCD_LINES 4
 
symbol HABILITAR = PORTB.2
SYMBOL RECIVIR = PORTB.1

TRISB=%00000110
TRISA=0

DIR VAR BYTE
DATO VAR BYTE
x var byte
HABILITAR=0

PAUSE 600

LCDOUT $FE, 1
LCDOUT $FE, "    HOLA"
HABILITAR=1
INICIO:

for x=0 to 5
SERIN RECIVIR, 2400, DIR
SERIN RECIVIR, 2400, DATO
SELECT CASE DIR
            CASE 0
                LCDOUT $FE, $94, dec DATO
            CASE 1
                LCDOUT $FE, $94+3, dec DATO
            CASE 2
                LCDOUT $FE, $94+6, dec DATO
            CASE 3
                LCDOUT $FE, $94+9, dec DATO
            CASE 4
                LCDOUT $FE, $94+12, dec DATO
            CASE 5
                LCDOUT $FE, $94+15, dec DATO
END SELECT
next x
GOTO INICIO
END

Esquema:



Desconectado psicowifi

  • PIC12
  • **
  • Mensajes: 56
Re: Problema con comunicacion serie entre 3 pics y una memoria en I2c
« Respuesta #5 en: 28 de Abril de 2010, 09:44:16 »
weeeno rozon tienes mi estimado amogo en lo que dices bueno.... no importa apartemos el tema si responden o no.. ya eso es otra cosa ya... apartando el tema pues y dejandolo en el pasado.... te pregunto algo...

Por que usas Tres pic en lugar de uno solo pienso que puedes usar un 16F877a de 20 Mhz y soluciones todo no se tu me diras el porque 3 y no uno yo veo que con uno ufff saldrias mas barato y mejor con el programa y menos envia uno datos al otro oro recibe otro pone en display etc etc toood una ensalada... No entiendo..
saludos puessss.
no se que fin tiene tu circuito pero se ve interesante. saludos

Desconectado zeusjorg

  • PIC10
  • *
  • Mensajes: 36
Re: Problema con comunicacion serie entre 3 pics y una memoria en I2c
« Respuesta #6 en: 28 de Abril de 2010, 13:59:32 »
Hola

La verdad que este circuito tal cual es toda una tonteria. Y lo se.

Pero este circuito que estoy haciendo es una prueva para un proyecto mucho mas grande.
Imaginate un menu con display y sus botones.
El cual se pueden modificar 4500 variables diferentes.
hacer un menu de estas caracteristicas ocupa mucho espacio en la memoria de programa.
entonces como todas estas variable no cabe en el micro lo quiero ir almacenando en una eeprom.
Para que otro micro reciva informacion de varios sensores y comparando las medidas de los sensores
con las variables almacenadas en la eeprom realice una accion o otra.

Para no liarla pues prefiero realizar una prueva asta que vea que funciona bien y luego implementarlo en el Proyecto.

Un saludo

Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re: Problema con comunicacion serie entre 3 pics y una memoria en I2c
« Respuesta #7 en: 28 de Abril de 2010, 15:32:20 »
hola que tal

verás, hace mucho tiempo que no uso picbasic ni proteus pero es posible que pueda ayudarte tirando de memoria, al menos con los primeros pasos... y perdona si lo que digo te parece demasiado obvio.

para empezar evitaría el pic receptor y toda su circuitería así como la parte dedicada a i2c para las primeras pruebas; básicamente porque creo que te seguirá pasando lo mismo y esa sería la forma de confirmarlo.
dejando el emisor con un simple código que envíe un valor y el intermedio como encargado de leer ese valor y a su vez sacándolo por otro pin, y chequeando ambos con sus respectivos 'visual terminal'. me atrevo a decir que incluso en este caso el valor será diferente, pero mejor será que lo pruebes.
por ejemplo, en emisor:
DATO = 65
SEROUT PORTB.1, 2400, [DATO]
...
...
en intermedio:
PULSIN PORTB.2, 2400, datorecibido
PULSOUT PORTB.3, 2400, [datorecibido]

ahora, si la memoria no me falla, lo que verás no es la letra A (65) si no cualquier 'basurilla' y eso lo solucionas enviando previamente algo que 'despierte' al dispositivo antes de mandarle los valores correctos. algo así:
DATO = 65
N = 0
SEROUT PORTB.1, 2400, [N, DATO]
...
...
R = 0
PULSIN PORTB.2, 2400, R, datorecibido
PULSOUT PORTB.3, 2400, [R, datorecibido]

ahora si debería mostrarse la letra A en ambos terminales, y si lo que te interesa es el valor 65 y no su caracter correspondiente antepón un barrilete a la variable en PULSOUT (#dato..#datorecibido).

que no se te olvide que proteus es un simulador y que la realidad no tolera algunas cosas como no deshabilitar los comparadores del pic

ya me dirás algo para seguir con la faena. un saludo

Desconectado zeusjorg

  • PIC10
  • *
  • Mensajes: 36
Re: Problema con comunicacion serie entre 3 pics y una memoria en I2c
« Respuesta #8 en: 28 de Abril de 2010, 19:53:03 »
Hola

muchas gracias por tu respuesta.
Lo e realizado el mismo circuito con dos pic, memoria I2c y LCD, y funciona perfectamente.
Voy a provar con lo de mandar un cero antes.

mira te pongo el programa que e echo para los dos PIC.

Emisor:

Código: [Seleccionar]
INCLUDE "MODEDEFS.BAS"

symbol HABILITAR = PORTB.0
SYMBOL TRANSMISOR = 2
SYMBOL PULSADOR = PORTB.3

TRISB=%00001000

A VAR BYTE
DATO VAR BYTE

pause 600


a=0
DATO=0
INICIO:
FOR A=0 TO 5
    HABILITAR=0
    PAUSE 20
    SEROUT TRANSMISOR, 2400, [A]
    PAUSE 20
    SEROUT TRANSMISOR, 2400, [DATO]
    DATO=DATO+5
    pause 20
NEXT A
HABILITAR=1

PULSA:
IF PULSADOR=0 THEN
                goto pulsadoractivo
            ELSE
                GOTO PULSA
            ENDIF
PULSADORACTIVO:
    IF PULSADOR=0 THEN GOTO PULSADORACTIVO
GOTO INICIO

END

Codigo PIC Intermedio:

Código: [Seleccionar]
INCLUDE "MODEDEFS.BAS"

Define LCD_DREG portA
Define LCD_DBIT 0
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
DEFINE LCD_BITS 4
DEFINE LCD_LINES 4

symbol SCL = PORTB.0
SYMBOL SDA = PORTB.4
SYMBOL EMISOR = 1
SYMBOL HABILITARE = PORTB.5
SYMBOL led = PORTB.6
SYMBOL CONL=%1010000
SYMBOL ledrojo = PORTB.7
pause 500

TRISA=0
TRISB=%00100010

DIR VAR BYTE
DATO VAR BYTE
X VAR BYTE

INICIO:
LCDOUT $FE, 1

EMISOR1:
    led=1
    SERIN EMISOR, 2400, DIR
    SERIN EMISOR, 2400, DATO
    I2CWRITE SDA, SCL, CONL, DIR, DATO
    PAUSe 10
    led=0

    I2CREAD SDA, SCL, CONL, DIR, DATO
    ledrojo=1
    if dir=0 then LCDOUT $FE, 1
   
    SELECT CASE DIR
            CASE 0
                LCDOUT $FE, $C0, dec DATO
            CASE 1
                LCDOUT $FE, $C0+4, dec DATO
            CASE 2
                LCDOUT $FE, $C0+7, dec DATO
            CASE 3
                LCDOUT $FE, $C0+10, dec DATO
            CASE 4
                LCDOUT $FE, $C0+13, dec DATO
            CASE 5
                LCDOUT $FE, $C0+16, dec DATO
    END SELECT
    ledrojo=0
GOTO EMISOR1

END

Voy a provar lo de poner el zero delante.

muchas gracias


Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re: Problema con comunicacion serie entre 3 pics y una memoria en I2c
« Respuesta #9 en: 29 de Abril de 2010, 13:54:47 »
ahora caigo que es un 16f628a... ¿porqué no implementas la comunicación por hardware? seguro que te ahorras más de un dolor de cabeza.

dale un ojo a las instrucciones HSERIN y HSEROUT en la ayuda y haz una búsqueda en el Foro para ver problemas concretos. también es bastante posible que encuentres algo en la web de MELabs e incluso en los ejemplos que se instalan con picbasic.

te recuerdo de nuevo que sigues sin desactivar los comparadores y aunque en proteus te funcione en la práctica te dará problemas que aparentemente no tienen ni pies ni cabeza  :shock:
como rutina suelo establecer algunas cosas al principio del programa:
Código: [Seleccionar]
@ DEVICE pic16F628A, 0x3f21   'Osc_XT, MCLR_ON, Power-up_ON

include "modedefs.bas"   'si usas SERIN / SEROUT. en caso de usar HSERIN / HSEROUT cambia esta línea por el Define adecuado para establecer la velocidad
Define OSC 4             'por defecto los comandos de comunicaciones toman como base esta frecuencia de reloj. en caso de ser diferente tendrás que indicárselo
CMCON = 7                'desactivamos comparadores

en proteus, busca el componente PULLUP y sustituye las resistencias de 4k7 que tienes para tal fin en la memoria, en el Foro está documentado un problema a este respecto. en la práctica, lógicamente, usa las res de 4k7

ya me contarás

Desconectado zeusjorg

  • PIC10
  • *
  • Mensajes: 36
Re: Problema con comunicacion serie entre 3 pics y una memoria en I2c
« Respuesta #10 en: 29 de Abril de 2010, 14:06:51 »
Hola

muchas gracias por tu ayuda.

Mirare el manual de picbasic. que esa instruccion no me parado a mirarla.
Realizare las pruevas mañana por la noche.
Hoy me tengo que estudiar un esquema de ascensor a fondo, que me tiene mosca.

muchisimas gracias.

en cuando tenga provado todo lo que me has enseñado.

Te comento.


 

anything