Autor Tema: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::  (Leído 12015 veces)

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

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #30 en: 23 de Enero de 2013, 04:04:30 »
Una posible solucion pajaro seria desde el maestro crear una tabla de constantes con los numeros pares y otra para los impares, luego cuando envies los pares seleccionas el esclavo par y cuando envies los impares seleccionas el esclavo impar  :mrgreen:
Es el maestro que en todo momento selecciona a que lacayo (esclavo)  :D  quiere enviarle datos, claro esta si necesitas enviar informacion a muchos esclavos, entonces podrias utilizar un decodificador, por ejemplo, para asi ahorar pines del master   ;-)

Saludos

Desconectado Darkman_A

  • PIC18
  • ****
  • Mensajes: 288
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #31 en: 23 de Enero de 2013, 07:37:54 »
Hola a todos.
Si tienes un solo esclavo, este es el único que lee el dato, pero si tuvieras mas de un esclavo lo que tienes que hacer es enviar un par de bytes.
El primer byte seria equivalente al "nombre" del esclavo y el segundo byte seria el dígito que el maestro decide que es para ese esclavo.

Hola Willy. En SPI no necesitas enviar un byte con "el nombre del esclavo" o dicho de otra forma, la direccion del esclavo. Eso esta bien para I2C, en cambio en SPI tenes una linea  (entrada, señal, pin o como quieras llamarla)  que indica que esclavo es el habilitado. Esta linea es SS (slave select). El micro debe disponer una linea independiente por cada esclavo y se activa enviando un nivel bajo. Esta claro que se puede utilizar circuitos logicos para disminuir la cantidad de lineas cuando se utilizan muchos esclavos.

Lo que no estoy seguro si puedes colgar mas de un esclavo con SPI.
Si, como decia antes, se pueden conectar varios esclavos a un master.

Una posible solucion pajaro seria desde el maestro crear una tabla de constantes con los numeros pares y otra para los impares, luego cuando envies los pares seleccionas el esclavo par y cuando envies los impares seleccionas el esclavo impar  :mrgreen:
Es el maestro que en todo momento selecciona a que lacayo (esclavo)  :D  quiere enviarle datos, claro esta si necesitas enviar informacion a muchos esclavos, entonces podrias utilizar un decodificador, por ejemplo, para asi ahorar pines del master   ;-)

Saludos
Hola RALF2.
No creo que sea necesario hacer una tabla para los numero pares e impares, con solo mirar el digito menos significativo sabes si el par o impar (impar: LSB=1 , par: LSB=0).
El que tendria que tener la tabla de los numeros seria el esclavo, pero solo haria falta una sola tabla. Es mas, los esclavos podrian tener implementado el mismo circuito y codigo dado que es el master quien lo selecciona por el pin SS. El esclavo impar no recibiria numeros pares y no los utilizaria de la tabla ( tabla para adaptar el numero a los display de 7 segmentos). idem para el esclavo par, que no utilizaria los numeros impares.
Espero no haber interpretado tu comentario en forma erronea.
Saludos.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #32 en: 23 de Enero de 2013, 10:03:55 »
Hola compañeros

la idea es dejar los esclavos como en el caso anterior
y en el master cuando cargo el vector
v[]={0,1,2,3,4,5,6,7,8,9}

mediante el for
...
for(a=0;a<10;a++)
// verifica numero
spi_write(v[a]);
..
que verifique si la variable es par o impar

lo hare mirando el resto
imagino que asi

resto=a%2  (creo que para optener el resto en ccs era con el %)
-->tambien podia usar el text_bit(resto,0);

if(resto=1) impar
if(resto=0) par

si es impar lo mande el esclavo 1
y si par al esclavo 2

la cosa es
¿como se seleciona eso en ccs y con spi?
en i2c es con la direccion, pero en spi es con el ss
pero este pic solo tiene 1 ss en el pin 7

hasta el momento usaba spi_write();

pero ahora ¿como seleciono un esclavo u otro alguna funcion?

alguna idea...?


« Última modificación: 23 de Enero de 2013, 11:03:31 por pajaro »

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #33 en: 23 de Enero de 2013, 10:55:16 »
Entiendo que estas practicando, pero tu aplicación creo que funcionaria muy bien implementando I2C  ;-)

Volviendo al SPI, lo del SS quizás lo tengas que hacer por soft para cuando tengas mas de un esclavo.
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #34 en: 23 de Enero de 2013, 13:21:22 »
Darkman_A
Lo de testear el L.S.B es correcto, es solo otra forma de hacerlo  :mrgreen:
No le quise complicar la vida al amigo pajaro, haciendolo asi como indicas  :D

Y la tabla perfectamente la puede tener el maestro y el esclavo solo tendria es que revisar el L.S.B   ;-)  para saber si el numero es par o impar y luego mostrarlo...  :mrgreen:
De hacerlo asi, entonces los dos esclavos podrian ser habilitados al mismo tiempo  :mrgreen:

Saludos

Desconectado Darkman_A

  • PIC18
  • ****
  • Mensajes: 288
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #35 en: 23 de Enero de 2013, 15:26:02 »
Darkman_A
Lo de testear el L.S.B es correcto, es solo otra forma de hacerlo  :mrgreen:
No le quise complicar la vida al amigo pajaro, haciendolo asi como indicas  :D
No es complicado. Solo tenes que hacer un AND para obtener el valor. :)

Y la tabla perfectamente la puede tener el maestro y el esclavo solo tendria es que revisar el L.S.B   ;-)  para saber si el numero es par o impar y luego mostrarlo...  :mrgreen:
De hacerlo asi, entonces los dos esclavos podrian ser habilitados al mismo tiempo  :mrgreen:

Saludos
RALF2, perdoname pero no te sigo en el razonamiento.
¿La tabla en el maestro que datos contendría?
Porque si es como vos decís, con solo enviarle el numero a los esclavos bastaría. Total los esclavos hacen todo el trabajo (calculan cual es par e impar y luego codifican a 7 segmentos).

Saludos.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #36 en: 23 de Enero de 2013, 16:20:15 »
Claro el maestro envia digamos los numeros del 0 al 9 a los dos esclavos simultaneamente, pero el esclavo par, por ejemplo, revisa el L.S.B del dato que le llega si es 0 entonces despliega el dato sino no muestra nada en el display  :mrgreen:
De manera analoga lo haria el esclavo impar.

Saludos

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #37 en: 23 de Enero de 2013, 20:25:26 »
hola compañeros

lo de la tablas te refieres al vector que le mando al spi_write();...¿?

por el momento reciben los dos esclavo por igual,
pero si le pusiera 30 esclavo, los 30 imagino que lo recibirian,
serian como clones..

pero la idea es ir alternando entre uno y otro,
desde el maestro no desde el esclavo
el esclavo solo muestra lo que le llega

seria ..

Código: CSS
  1. // seudocodigo
  2. ...
  3. dato[]={0,1,2,3,4,,5,6,7,8,9} // datos a enviar
  4.  
  5.  for(a=;a<10;a++)  {
  6.  
  7.     if(!bit_test(a,0)){ // verifico de bit 0 de a es 0 // modificado codigo ya correcto
  8.      
  9.        //selecciono esclavo
  10.        spi_write(dato[a]); //envio al par
  11.      }
  12.  
  13.     if(bit_test(a,0)){ // verifico de bit 0 de a es 1
  14.  
  15.        //selecciono esclavo
  16.        spi_write(dato[a]); // envio al inpar
  17.     }
  18. }//fin for
  19.  
  20. ...


la pregunta¿que pasa con el ss?

hasta el momento no lo habia usado,
ahora como se seleciona desde css al esclavo

debere de modificar en el circuito de conesion
que por el momento lo tenia asi

pic master     esclavo1        esclavo2
===========================
---SCK------------SCK------------SCK
---SDI------------SDO1----------SDO2
---SDO-----------SDI1-----------SDI2
---SS-------------SS1------------SS2


alguna idea?


« Última modificación: 25 de Enero de 2013, 18:34:39 por pajaro »

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #38 en: 24 de Enero de 2013, 00:10:29 »
Si pajaro la tabla es tu caso seria el vector que estas utilizando.
Aunque podrias hacer esto para ahorar RAM:  const int taBCD[]={0,1,2,3,4,5,6,7,8,9};

Lo de la seleccion del esclavo si sigues usando el setup_spi(...), deberas utilizar una salida del pic, como colocas en el ultimo esquema para cada esclavo que tengas o utilizas algun decodificador  :mrgreen:   por ejemplo si quieres escribir en el lacayo1 (esclavo1)  :D  pones el ss de este en cero y el esclavo2 lo mantienes en uno y viceversa si quieres escribir en el otro esclavo y luego escribes en el esclavo seleccionado.
El ss vendria a ser como el chip select, por lo tanto el esclavo que tenga ss en uno no recibira ningun dato.

Saludos


Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #39 en: 24 de Enero de 2013, 10:43:27 »
hola compañeros

si lo de poner como constante los valores de la taba lo pense en un principio,
pero como despues lo pienso usar para otra cosa por eso lo hago asi.
entonces lo del ss o sc selecion de chip lo debeo definir yo, vamos a ello..

en el pic maestro le definire un pin mas, por defecto ss esta en el A5,
que le definire en A4 el otro ss entonces queda asi:


conexiones

pic master     esclavo1        esclavo2
===========================
---SCK------------SCK------------SCK
---SDI------------SDO1----------SDO2
---SDO-----------SDI1-----------SDI2
---SS1------------SS1------------___
---SS2------------___------------SS2

SS1 sera A5 para ss del esclavo 1
SS2 sera A4 para ss del esclavo 2

entonces ahora pudeo hacer:

output_hight(A5);
output_hight(A4);

pero en A4 no me funciona bien asi que paso a A3
quedando asi:

output_hight(A5);
output_hight(A3);

--> en el codigo esta con A3




codigo master:
Código: CSS
  1. //main.h
  2. #include <18F2550.h>
  3. #device adc=8
  4.  
  5. #FUSES NOWDT                    //No Watch Dog Timer
  6. #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
  7. #FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  8. #FUSES NOPROTECT                //Code not protected from reading
  9. #FUSES NOBROWNOUT               //No brownout reset
  10. #FUSES BORV20                   //Brownout reset at 2.0V
  11. #FUSES NOPUT                    //No Power Up Timer
  12. #FUSES NOCPD                    //No EE protection
  13. #FUSES STVREN                   //Stack full/underflow will cause reset
  14. #FUSES NODEBUG                  //No Debug mode for ICD
  15. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  16. #FUSES NOWRT                    //Program memory not write protected
  17. #FUSES NOWRTD                   //Data EEPROM not write protected
  18. #FUSES IESO                     //Internal External Switch Over mode enabled
  19. #FUSES FCMEN                    //Fail-safe clock monitor enabled
  20. #FUSES PBADEN                   //PORTB pins are configured as analog input channels on RESET
  21. #FUSES NOWRTC                   //configuration not registers write protected
  22. #FUSES NOWRTB                   //Boot block not write protected
  23. #FUSES NOEBTR                   //Memory not protected from table reads
  24. #FUSES NOEBTRB                  //Boot block not protected from table reads
  25. #FUSES NOCPB                    //No Boot Block code protection
  26. #FUSES MCLR                     //Master Clear pin enabled
  27. #FUSES LPT1OSC                  //Timer1 configured for low-power operation
  28. #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
  29. #FUSES PLL12                    //Divide By 12(48MHz oscillator input)
  30. #FUSES CPUDIV4                  //System Clock by 4
  31. #FUSES USBDIV                   //USB clock source comes from PLL divide by 2
  32. #FUSES NOVREGEN                 //USB voltage regulator disabled
  33.  
  34. #use delay(clock=20000000)
  35.  
  36. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
  37. //#use fast_io(A)
  38. #define SS2 A5
  39. #define SS2 A3
  40.  
  41. //----------------------------
  42.  
  43.  
  44. //main.c
  45.  
  46. #include "C:\spi_pic18F2550\master_04_01\main.h"
  47.  
  48. int taBCD[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
  49. int dato;    //variable entera que sirve para que , al incrementar, vaya variando el dato.
  50.  
  51. void main()
  52. {
  53. //int cnt=0;
  54.  
  55.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  56.    setup_adc(ADC_CLOCK_DIV_2);
  57.    setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_16);
  58.    setup_wdt(WDT_OFF);
  59.    setup_timer_0(RTCC_INTERNAL);
  60.    setup_timer_1(T1_DISABLED);
  61.    setup_timer_2(T2_DISABLED,0,1);
  62.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  63.    setup_comparator(NC_NC_NC_NC);
  64.    setup_vref(FALSE);
  65. //Setup_Oscillator parameter not selected from Intr Oscillator Config tab
  66.  
  67.    // TODO: USER CODE!!
  68.  
  69.    // deshabilito la secion de esclavo con ssx=1
  70.    output_high(SS1);
  71.    output_high(SS2);
  72.    
  73. delay_ms(200);
  74.     while(true) {
  75.         for(dato=0;dato<10;dato++) {
  76.  
  77.            // detecta numero par-impar
  78.            if(bit_test(dato,0)==1){
  79.                output_low(SS1); // activo esclavo 1
  80.                spi_write(taBCD[dato]);
  81.                delay_ms(300);
  82.                output_low(SS1); // desactivo esclavo 1
  83.            }
  84.  
  85.            if(bit_test(dato,0)==0){
  86.                output_low(SS2); //activo esclavo 2
  87.                spi_write(taBCD[dato]);
  88.                delay_ms(300);
  89.                output_high(SS2); //desactivo esclo 2
  90.            }
  91.  
  92.         }//fin for
  93.        // dato=0;
  94.     } //fin while
  95.  
  96.  
  97. }

El codigo del esclavo sigue igual que la vez anterior.

Pregunta 1.- ¿como configuro el debug de spi?¿no hay quien lo entienda?

pregunta 2.- ¿una cosa que note la vez anterior sobre el ejemplo que me paso el amigo RALF2"?
               es que el enviaba FF y a mi me envia otra cosa 81 82 01 02 ....

 :?

en principio el 7 segmentos funciona como yo esperaba,
pero el dedug spi...








« Última modificación: 24 de Enero de 2013, 17:58:41 por pajaro »

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #40 en: 24 de Enero de 2013, 21:55:23 »
Pajaro lee  el data sheet, RA4 es una salida del tipo open colector debes colocar una resistencia del tipo pull up para que la puedas utilizar  :mrgreen:

Saludos

Desconectado Darkman_A

  • PIC18
  • ****
  • Mensajes: 288
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #41 en: 25 de Enero de 2013, 08:00:53 »
hola compañeros

lo de la tablas te refieres al vector que le mando al spi_write();...¿?

por el momento reciben los dos esclavo por igual,
pero si le pusiera 30 esclavo, los 30 imagino que lo recibirian,
serian como clones..

pero la idea es ir alternando entre uno y otro,
desde el maestro no desde el esclavo
el esclavo solo muestra lo que le llega

seria ..

Código: CSS
  1. ...
  2. dato[]={0,1,2,3,4,,5,6,7,8,9} // datos a enviar
  3.  
  4.  for(a=;a<10;a++)  {
  5.  
  6.     if(bit_test(a,0)){ // verifico de bit 0 de a es 0
  7.      
  8.        //selecciono esclavo
  9.        spi_write(dato[a]); //envio al par
  10.      }
  11.  
  12.     if(bit_test(a,0)){ // verifico de bit 0 de a es 1
  13.  
  14.        //selecciono esclavo
  15.        spi_write(dato[a]); // envio al inpar
  16.     }
  17. }//fin for
  18.  
  19. ...


la pregunta¿que pasa con el ss?

hasta el momento no lo habia usado,
ahora como se seleciona desde css al esclavo

debere de modificar en el circuito de conesion
que por el momento lo tenia asi

pic master     esclavo1        esclavo2
===========================
---SCK------------SCK------------SCK
---SDI------------SDO1----------SDO2
---SDO-----------SDI1-----------SDI2
---SS-------------SS1------------SS2


alguna idea?




Hola. Disculpame, ¿pero estas dos lineas de codigo no son iguales?

if(bit_test(a,0)){ // verifico de bit 0 de a es 0
     
       //selecciono esclavo
       spi_write(dato[a]); //envio al par
     }

    if(bit_test(a,0)){ // verifico de bit 0 de a es 1

¿como sabes cuando es 1 o 0?. Me parece que te hace falta negar (!) uno de los casos (el primero, si no estoy errado).
Si ya verificaste una condicion, ¿para que verificas la otra, si solo hay 2 casos posibles (1 ó 0) ?. ¿No te alcanza con poner el codigo en el else del if?

Saludos

Desconectado Darkman_A

  • PIC18
  • ****
  • Mensajes: 288
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #42 en: 25 de Enero de 2013, 09:22:14 »

Pregunta 1.- ¿como configuro el debug de spi?¿no hay quien lo entienda?


http://www.todopic.com.ar/foros/index.php?topic=21718.0

Saludos.

Desconectado Darkman_A

  • PIC18
  • ****
  • Mensajes: 288
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #43 en: 25 de Enero de 2013, 09:52:19 »

la pregunta¿que pasa con el ss?

hasta el momento no lo habia usado,
ahora como se seleciona desde css al esclavo

debere de modificar en el circuito de conesion
que por el momento lo tenia asi

pic master     esclavo1        esclavo2
===========================
---SCK------------SCK------------SCK
---SDI------------SDO1----------SDO2
---SDO-----------SDI1-----------SDI2
---SS-------------SS1------------SS2

alguna idea?

Fijate si podes usar daisy chain.
Aclaro que las conecciones en daisy chain y lo que escribiste arriba son distintas.
Saludos.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #44 en: 25 de Enero de 2013, 09:55:15 »
Hello!
Citar
¿como sabes cuando es 1 o 0?. Me parece que te hace falta negar (!) uno de los casos (el primero, si no estoy errado).

No hace falta  :mrgreen:

if(bit_test(a,0))         // detecta si el bit0 de la variable a, vale 1
  spi_write(dato[a]); //envio al impar
else
  spi_write(dato[a]); //envio al par  

 :mrgreen:


 

anything