Autor Tema: ¿Me ayudáis a resolver un expediente X?  (Leído 617 veces)

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

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
¿Me ayudáis a resolver un expediente X?
« en: 17 de Julio de 2022, 07:03:21 »

Trato de leer un MAX 6675.
Procesador: PIC18F4550 a 48 Mhz.
Puerto usado para leer desde el max "SDI" PORTE.0
Analógicos configurados para AN0 TO AN4 analógicos, el resto digitales, por lo que AN5 que sería el puerto E.0 debería ser digital.

 Lo que me sucede:

   Pongo señal CS a bajo para que el MAX inicie la transmisión de lo que tiene en el buffer.  Espero 100 ns mínimos y leo el primer bit, que debe ser 0.

  Voy generando los pulsos de reloj y voy leyendo el puerto SDI (E.0).

   Conecto el osciloscopio y podemos observar que ahí están los 16 pulsos (traza azul) y los 16 bits (traza amarilla) lo que indica que el bucle for está funcionando bien, se generan bien los 16 ciclos de reloj, y el MAX6675 está entregando el valor por su pin data out. Señal que llega perfectamente al pin E.0 del pic, comprobado ya varias veces.

  ¿El problema?.  Que la variable piro.piro1 siempre queda a cero. No me lee los bits a pesar de que están ahí.

   Si pongo el pin E.0 a nivel alto (con un puentecito y un trozo de cable por ejemplo) entonces la variable se carga con el valor 65535, es decir, que el puerto leer, lee.

 
  He probado con variables locales, normales, globales fuera de estructuras, etc.  No hay manera.
  He probado al desactivar por completo los analógicos. Nada.
  He probado con tiempos mas altos, hasta 1 uS por si es problema de velocidad, y nada.
 
 Según la siguiente traza, que se obtiene directamente del propio circuito, aquí se debería leer: 0000001110100000 (El primer 0 lo entrega el max al bajar CS a bajo. Los otros 15 hay que orquestarlos con el clock.


  Sin embargo se lee cero. El fprintf del final está ahí para enviarme por la terminal el valor al que queda la variable tras el bucle for.

   
 

* NewFile1.png
(46.04 kB, 800x480 - visto 131 veces)




Este es el codigo que hace la lectura, genera los clock y "lee". Ojalá.  :lol:

Código: C
  1. cs1 = 0;    // Habilito el piro1. En unos 100 ns Ya tendremos el primer bit disponible en SDI.
  2.  delay_cycles(7);   // Antes de leer el primer byte debemos esperar unos 100 nS.  Pausamos aquí la mitad de ese tiempo, y la otra mitad dentro del bucle de lectura en su primera iteracción.
  3.  
  4.     for(int i=0;i<16;i++) {
  5.         delay_cycles(7);           // Medio semiperiodo. (50 ns aprox)
  6.         shift_left(&piro.piro1,2,input(PIN_E0));   // Leo el bit presente y lo cargo en la variable de estructura piro.piro1 que es de 16 bits.
  7.         sck = 1;              // Genero flanco subida.
  8.         delay_cycles(7);       // Medio semiperiodo.  (50 ns aprox)                      
  9.         sck = 0;     // Cambio el flanco.                
  10.     }                                        
  11.     cs1 = 1;           // Fin de transmisión.
  12.     delay_us(10);                                  
  13.     fprintf(ECU,"\r\nPiro1: %Lu",piro.piro1);

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re:¿Me ayudáis a resolver un expediente X?
« Respuesta #1 en: 17 de Julio de 2022, 08:09:40 »
Prueba con esto:

Código: C
  1. int lectura = 0;
  2.     cs1 = 0;
  3.     for(int i=0;i<16;i++) {
  4.         delay_cycles(7);           // Medio semiperiodo. (50 ns aprox)
  5.         lectura <<= 1;
  6.         if (input(PIN_E0)) {
  7.             lectura = lectura | 0x0001;
  8.         }
  9.         sck = 1;              // Genero flanco subida.
  10.         delay_cycles(7);       // Medio semiperiodo.  (50 ns aprox)                      
  11.         sck = 0;     // Cambio el flanco.                
  12.     }                                        
  13.     cs1 = 1;           // Fin de transmisión.
  14.     delay_us(10);
  15.     fprintf(ECU,"\r\nPiro1: %u", lectura);
  16.     piro.piro1 = lectura;
« Última modificación: 17 de Julio de 2022, 08:12:02 por Picuino »

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:¿Me ayudáis a resolver un expediente X?
« Respuesta #2 en: 17 de Julio de 2022, 08:34:23 »
Prueba con esto:

Código: C
  1. int lectura = 0;
  2.     cs1 = 0;
  3.     for(int i=0;i<16;i++) {
  4.         delay_cycles(7);           // Medio semiperiodo. (50 ns aprox)
  5.         lectura <<= 1;
  6.         if (input(PIN_E0)) {
  7.             lectura = lectura | 0x0001;
  8.         }
  9.         sck = 1;              // Genero flanco subida.
  10.         delay_cycles(7);       // Medio semiperiodo.  (50 ns aprox)                      
  11.         sck = 0;     // Cambio el flanco.                
  12.     }                                        
  13.     cs1 = 1;           // Fin de transmisión.
  14.     delay_us(10);
  15.     fprintf(ECU,"\r\nPiro1: %u", lectura);
  16.     piro.piro1 = lectura;

Gracias Picuino.

  Probado, pero con el mismo resultado.  Variable lectura siempre se lee a cero habiendo señal correcta en el puerto.

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:¿Me ayudáis a resolver un expediente X?
« Respuesta #3 en: 17 de Julio de 2022, 08:44:37 »
Hola de nuevo.

  Al final se ha solucionado probando lo ultimo que uno se espera que sea. El Micro.  Lo he cambiado y listo. :shock:

  Por alguna razón ese puerto debia estar dañado y tardaría mas de la cuenta en responder o vete a saber. Por que el puerto funcionaba. Tanto como entrada, así como en salida.  En fin. Cosas de la electrónica



 

anything