Autor Tema: Bus 16 bits entre 8051 y PIC  (Leído 1364 veces)

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

Desconectado Dancrazy

  • PIC16
  • ***
  • Mensajes: 134
Bus 16 bits entre 8051 y PIC
« en: 15 de Junio de 2007, 14:41:09 »
Hola a todos...

les tengo una consultica...

Estoy trabajando con un Intel 8051, este microcontolador lo tengo bien montado y el realiza por medio de dos de sus puertos de 8 bits accesos a memoria externa... y generalmente los perifericos que se le colocan  se manejan como si fuesen direcciones de memoria interna...  es decir, se publica una direccion donde no hay memoria fisicamente existente externa (ejemplo si tiene una memoria externa de 32K, a partir de la posicion 8000 hexa esta libre) y con la direccion usada se esta sencillamente codificando la seleccion para activar el periferico al cual se le esta hablando en realidad, una vez hecho esto, el c8051 coloca (o lee) el dato por un bus compartido...  con un esquema de este proceso lo intento explicar 8adjunto)

el hecho es que esto lo hago bien.. (y ocurre en micro segundos) pero el dato queda en el extremo del latch de la figura hasta que le ordeno al 851 que publique otro dato para ese periferico especifico... y asi puedo comprobar con un tester que el dato se haya alli...  bueno, el resto del proyecto es donde consigo el problema...

tengo ese latch conectado a un pic 16F877A en uno de sus puertos, y ese pic esta eternamente esperando un valor de ese puerto, distinto de un valor estandar que indica reposo (0xFF). cualquier valor distinto es un comando que llama a un procedimiento en mi PIC
el 8051 inicializa al pic y le fija un 0xff, cuando desea comunicarse, lo activa por medio de la direccion adecuada y le envia el comando, espera un corto tiempo,  y le reenvia el comando 0xFF

todo suena muy bien, solo que el PIC recoje cualquier porqueria de su puerto y se vuelve loco, y empieza a detectar valores locos todo el tiempo... cuando aun no se les ha enviado....  alguna idea de qué falló...?

utilice (en C) los set_tris  y toda la cosa...

gracias por adelantado
Daniel 
Caracas, Venezuela 

-----------------

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Bus 16 bits entre 8051 y PIC
« Respuesta #1 en: 15 de Junio de 2007, 17:09:19 »
Dancrazy, el PIC 16F877A no tiene RA0 a RA7, solo RA0 a RA5.

¿Puedes indicarnos si está ok ese esquemático?

¿Además, has configurado el puerto A como digital?
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado Dancrazy

  • PIC16
  • ***
  • Mensajes: 134
Re: Bus 16 bits entre 8051 y PIC
« Respuesta #2 en: 15 de Junio de 2007, 17:29:04 »
Bueno, si, fue un pequeño desliz por mi parte, lo omiti para no hacer la explicacion mas extensa... gracias por tomarte la molestia de leerlo...

Fijate, en realidad envio los datos siguientes 0x0F es reposo y recibo por los puertos

D0---RD2
D1---RD3
D2---RC4
D3---RC5
D4---RC6
D6---RC7
D7---RD4
parece algo excentrico, pero si te fijas en el pinout, esta distribucion de pines es identica a la seccion inferior derecha del mismo. el dato o comando lo recibo en el nibble inferior de D0 a D3 {RD2, RD3, RC4, RC5} y con D4 y D5 {RC6, RC7}  es un par de bit de control donde envio 4 posibles valores para dimensionar

Como leo el dato? asi...
Citar
int8 dame_Letra()
{
int8 que_hay;
#bit que_hay0=que_hay.0
#bit que_hay1=que_hay.1
#bit que_hay2=que_hay.2
#bit que_hay3=que_hay.3
#bit que_hay4=que_hay.4
#bit que_hay5=que_hay.5
#bit que_hay6=que_hay.6
#bit que_hay7=que_hay.7

      que_hay0=input(pin_D2);
      que_hay1=input(pin_D3);
      que_hay2=input(pin_C4);
      que_hay3=input(pin_C5);
      que_hay4=0;
      que_hay5=0;
      que_hay6=0;
      que_hay7=0;
   return que_hay;
}

una vez leido el dato, en el main() hago esto:

Citar
...
      if(!input(PIN_C5) || !input(PIN_C4) || !input(PIN_D2) || !input(PIN_D3))
         {
         valor=dame_letra();
         if(!input(PIN_C6))
              {
              if(!input(PIN_C7))
                     Caso_1(valor);
              if(input(PIN_C7))
                     Caso_2(valor);
               }
         if(input(PIN_C6))
              {
              if(!input(PIN_C7))
                     Caso_3(valor);
              if(input(PIN_C7))
                     Caso_4(valor);
              }
         }

donde caso_1()  son distintos procedimientos que hacen cosas con el valor en 0x0X

y yo preformatie todo asi...
Citar
   #use fast_io(C)
   #use fast_io(D)    //  b7  b6  b5  b4  b3  b2  b1  b0
   set_tris_D(0x1C);  //   0   0   0   1   1   1   0   0 
   set_tris_C(0xF0);  //   1   1   1   1   0   0   0   0 


no se si faltarán pullups o algo... el esquematico es alguito complicado

gracias por leerlo...
Daniel 
Caracas, Venezuela 

-----------------

Desconectado Dancrazy

  • PIC16
  • ***
  • Mensajes: 134
Re: Bus 16 bits entre 8051 y PIC
« Respuesta #3 en: 20 de Junio de 2007, 16:13:36 »
Hola de nuevo...
modifiqué todo el sistema... coloque tiempos realmente miserables desde el 8051 (con un Flip-Flop en el camino para fijar la señal) (hasta 3 segundos) e intercalé unos leds en el camino del bus para ver si lo que ponía en él esta bien. Puse el pic a leer ese bus y envié lo leido via serial a la computadora
  y aunque los leds muestran que lo que estoy poniendo en el bus  es correcto, el PIC sigue leyendo cosas raras

Auxilio!!! adjunto otro esquema de que ocurre... y no tengo idea dónde se pierde el sistema
Daniel 
Caracas, Venezuela 

-----------------


 

anything