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

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

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #15 en: 16 de Enero de 2013, 21:28:13 »
hola compañeros

RALF2 hice eso del retado de 200 en el maestro antes del while
y en el esclavo le pise el retado a 1 ms y na sigue contando de 0 a 4 pero mas despacio.


Brunof estuve miranddo el data y
si, por hardware en el pic 18f2550
tiene estos pines
port  pin  N  = nombre
A5    pin  7  =  ss
C7    pin 18 = SDO
B0    pin 21 = SDI
B1    pin 22 = SCK
-------------------
C4   pin 15 =
C5   pin 16 =

lo bueno seria ponerlo por soft y
ponerle los pines en donde me venga en gana
para que el pic no me tome mas el pelo

pero como ya dije antes por soft no va nada
esta muerto, tengo varias opciones opciones:

pongo lo pines C4 y C5 de forma normal para poderse usar como salidas
y me olvido del usb, cosa que no se como se hace eso.

otra opcion uso spi por soft y le pongo yo los pines donde quiero yo
cosa que no me funciono antes, por no comunicar bien, nunca antes lo probe, ademas
necesitara inplemtar el protocolo spi por soft con alguna libreria u algo
cosa que sera dificil, ya me lo temo.

otra opcion uso spi por hard y un decoder por spi tambien, pero para eso
no necesito el pic esclavo, y ademas seguro que necesitare un drivers para el decoder y mas pines para cada esclavo

uf.. me duele la cabeza solo de pensarlo


iremos por partes,
me gusta el i2c porque cos dos lineas puedes controlar todo si exceso de pines
pero en spi el maestro hace selecion de sclavo con el ss
si se pudiera hacer algo como:

poner al pic con un espansor de ss o de spi para no gastar pines en el pic
pero necesitaria el drivers del espansor, estoy pillado  lo mire por donde lo mire
me tiene cogido, pero bien cogido.

que me recomiendan,..?


Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #16 en: 16 de Enero de 2013, 22:00:56 »
C4 y C5 solo pueden usarse como entradas, por eso Bruno te indica que no puedes usarlos.



Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #17 en: 17 de Enero de 2013, 06:39:39 »
Pajaro!

Te adjunto el programa que probe, esto lo hice a la carrera ayer porque tenia que ir a la universidad  :mrgreen:

Revisalo alli para que veas como lo hice, veras que es basicamente como el tuyo., Lo hice primero con un pic18f252 y funciono perfecto, luego probe con el pic18f2550 y me dio el problema que menciona suky  :?


Saludos

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #18 en: 18 de Enero de 2013, 21:25:27 »
Hola compañero

funciona muy bien, el ejemplo tuyo,
a tu esquema le añadi un 7 segmentos y va muy bien.

voy a intentar usar una estrutura para definirme un puerto virtual
u poder mantener el spi por hardware.

----------------------------------------------------
...

#define      p0 PIN_A0;           // pin 0 del puerto real
#define      p2 PIN_A1;           // pin 1 del puerto real
#define      p3 PIN_A2;           // pin 2 del puerto real
#define      p4 PIN_B7;           // pin 3 del puerto real

struct vport {                 // This structure is overlayed
           bit p0;           // bit 0 del puerto virtual
           bit p2;           // bit 1 del puerto virtual
           bit p3;           // bit 2 del puerto virtual
           bit p4;           // bit 3 del puerto virtual
        } _7seg-1;

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

y si no me queda otra usare el spi por software


« Última modificación: 18 de Enero de 2013, 21:28:45 por pajaro »

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #19 en: 18 de Enero de 2013, 22:04:56 »
Muy bueno lo del uso de struct Pajaro  :mrgreen:
De seguro te funcionara!  :-/

Si necesitas alguna ayuda por aqui estaremos.

Saludos


Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #20 en: 18 de Enero de 2013, 22:46:27 »
Hola compañero

funciona muy bien, el ejemplo tuyo,
a tu esquema le añadi un 7 segmentos y va muy bien.

voy a intentar usar una estrutura para definirme un puerto virtual
u poder mantener el spi por hardware.

----------------------------------------------------
...

#define      p0 PIN_A0;           // pin 0 del puerto real
#define      p2 PIN_A1;           // pin 1 del puerto real
#define      p3 PIN_A2;           // pin 2 del puerto real
#define      p4 PIN_B7;           // pin 3 del puerto real

struct vport {                 // This structure is overlayed
           bit p0;           // bit 0 del puerto virtual
           bit p2;           // bit 1 del puerto virtual
           bit p3;           // bit 2 del puerto virtual
           bit p4;           // bit 3 del puerto virtual
        } _7seg-1;

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

y si no me queda otra usare el spi por software




Puede que como bit no te funcione, porque si no recuerdo mal la definición PIN_A0 era un valor entero... En la ayuda algo indica, como para cambiarle el tipo y poder usarlo como parámetro para las funciones output_low(), output_high(), etc..


Saludos!

No contesto mensajes privados, las consultas en el foro

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #21 en: 19 de Enero de 2013, 16:37:17 »
Hola compañeros
empece usando el puerto virtual con la esctructura

-----
#byte p0 = PIN_A0           // pin 0 del puerto real
#byte p2 = PIN_A1           // pin 1 del puerto real
#byte p3 = PIN_A2           // pin 2 del puerto real
#byte p4 = PIN_B7           // pin 3 del puerto real

struct vport {                 // This structure is overlayed
           int8 p0;           // bit 0 del puerto virtual
           int8 p2;           // bit 1 del puerto virtual
           int8 p3;           // bit 2 del puerto virtual
           int8 p4;           // bit 3 del puerto virtual
};
struct  vport  x;

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

pero me surge una duda ... ¿como le mando el dato a  mi puerto _7seg
como si fuera un puerto?

output_x(dato);

¿ :??




« Última modificación: 19 de Enero de 2013, 16:39:38 por pajaro »

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #22 en: 19 de Enero de 2013, 16:58:06 »
Facil pajaro!
asi:

Citar
i= spi_read(); 
 
         output_bit(pin_a0,bit_test(i,0));
         output_bit(pin_a1,bit_test(i,1));
         output_bit(pin_a2,bit_test(i,2));
         output_bit(pin_b0,bit_test(i,3));
  :D

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #23 en: 20 de Enero de 2013, 10:35:50 »
hola compañero


i= spi_read();
 
         output_bit(pin_C0,bit_test(i,0));
         output_bit(pin_C1,bit_test(i,1));
         output_bit(pin_C2,bit_test(i,2));
         output_bit(pin_B7,bit_test(i,3));



activas la salida del pin_xx, despues de verificar si el bit
correspondiente a 0 1 2 3 es uno es cero?

pero entonces no me vale de nada la estructura?

parece que funciona muy bien lo unico que no saca los valores de
A,b,C,D,E,F, mpero si en proteus le coloco el display de de 4 pines
si que lo muestra pero en el de 8 pine muestr cosas raras.

en la realidad existen los diaplay de 4 pines o solo los de 8 pines?



--------

analicemos de nuevo,..

i=dato
i es int8 esto es un valor maximo de 255 es decir 1111 1111

es decir 8 bit esta funcion verifica los bit del dato?
corrijanme si estoy equivocado...

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


y otra cosa si lo que quiero es prender de 0 al F, la cosa se complica

si se pudiera engañar al compilador y hacerle
output_v(dato) ; //v mi puerto virtual creado con la estuctura

igual que cuando le pasas output_c(dato);
la cosa es que no encuentro como define output_x(dato);

por decirlo de alguna forma seria un puerto por software
los pines reales existen pero soy  yo el que le digo
que pines conforman el puerto y en que orden estan los bit del puerto

alguna idea,... de esto?


« Última modificación: 20 de Enero de 2013, 11:33:19 por pajaro »

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #24 en: 20 de Enero de 2013, 17:48:33 »
Hola pajaro!
Citar
i= spi_read();
 
         output_bit(pin_C0,bit_test(i,0));
         output_bit(pin_C1,bit_test(i,1));
         output_bit(pin_C2,bit_test(i,2));
         output_bit(pin_B7,bit_test(i,3));

activas la salida del pin_xx, despues de verificar si el bit
correspondiente a 0 1 2 3 es uno es cero?

Eso es correcto.

Citar
pero entonces no me vale de nada la estructura?

Asi es  :(  con la struct puedes direccionar pines individuales o pines consecutivos, eso me parece.

Tu inicialmente utilizastes un 7447 para ello utilizas el display de 7 segmentos anodo comun, los displays de 7 segmentos como lo indican, usan 7 segmenos mas el punto, entre otros.
Por lo tanto al contar de 0 al 15 deberias ver las letras de la A a la F, pon en el maestro el bucle del 0 al 16 y listo.

Y output_bit es equivalente a output_A, por ejemplo   :mrgreen:

Saludos

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #25 en: 20 de Enero de 2013, 20:56:24 »
Hola compañero

Asi es tengo ...montado un pic18f2550 (maestro)
y otro pic 18F2550 (esclavo) conectados por spi por hardware
en el pic esclavo tengo anclado un 7 seg de 4 pines (C0,C1,C3,B7)
y en esos mismos pines, los pines  A, B, C, D del decoder 74LS47 y a
la salida de este ultimo en sus 8 Q pines un 7seg de anodo comun.

Si pongo en el bucle del master que cargue hasta 16 me muestra
muy bien los numeros y letras en el primer modulo 7 segementos (azul), el de 4 pines
pero el 7 segmentos de detras del decoder, solo me muestra bien los comprendidos entre
0 y 9 ambos incluidos, pero en el caso de las letras hace cosas raras, no muestra
una letra bien, todo cosas raras.

todo lo estoy simulando con el proteus, pongo un pdf del circuito real
que se ve mejor que una foto y ocupa mucho menos que esta.

« Última modificación: 20 de Enero de 2013, 21:07:17 por pajaro »

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #26 en: 20 de Enero de 2013, 22:10:43 »
Pero pajaro esta perfecto   :mrgreen:  No has revisado el data sheet del 74LS47, ese es un decodificador de BCD a 7 segmentos, solo opera con los numeros del 0 al 9 para las otras combinaciones aparecen esos caracteres que indicas.

Debes entonces o diseñar el decodificador de hexadecimal a 7 segmentos con compuertas logicas  :shock: o crear una tabla que saque los bits que necesitas para encender cada segmento en este caso necesitaras 7 pines del pic) o utilizar un integrado como por ejemplo el 74HC595 o similar al cual le enviaras los bits que necesitas para encender cada uno de los segmentos utilizando el spi  :mrgreen:

En el foro debe haber alguien que ya lo hizo revisa y lee bien los data sheet de los integrados que vayas a utilizar  :-)

Y aqui

Saludos
« Última modificación: 20 de Enero de 2013, 23:48:51 por RALF2 »

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #27 en: 22 de Enero de 2013, 18:18:36 »
Hola compañeros

a lo dicho con lo actual he conseguido que me muestre de 0 -9
asi que quedo asi:
1 maestro
1 esclavo + 7segmentos
y spi.

codigo maestro
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.  
  39.  
  40. //main.c
  41.  
  42. #include "C:\spi_pic18F2550\master_04_01\main.h"
  43.  
  44. //char taBCD[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
  45. int taBCD[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
  46. //int taBCD[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67};
  47. int dato;    //variable entera que sirve para que , al incrementar, vaya variando el dato.
  48.  
  49. void main()
  50. {
  51. //int cnt=0;
  52.  
  53.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  54.    setup_adc(ADC_CLOCK_DIV_2);
  55.    setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_16);
  56.    setup_wdt(WDT_OFF);
  57.    setup_timer_0(RTCC_INTERNAL);
  58.    setup_timer_1(T1_DISABLED);
  59.    setup_timer_2(T2_DISABLED,0,1);
  60.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  61.    setup_comparator(NC_NC_NC_NC);
  62.    setup_vref(FALSE);
  63. //Setup_Oscillator parameter not selected from Intr Oscillator Config tab
  64.  
  65.    // TODO: USER CODE!!
  66. delay_ms(200);
  67.     while(true) {
  68.         for(dato=0;dato<10;dato++) {
  69.        
  70.           spi_write(taBCD[dato]);
  71.           delay_ms(300);
  72.         }//fin for
  73.        // dato=0;
  74.     } //fin while
  75.  
  76.  
  77. }



codigo esclavo
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.  
  39.  
  40. //main.c
  41. #include "C:\spi_pic18F2550\master_04_01\main.h"
  42.  
  43. //char taBCD[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
  44. int taBCD[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
  45. //int taBCD[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67};
  46. int dato;    //variable entera que sirve para que , al incrementar, vaya variando el dato.
  47.  
  48. void main()
  49. {
  50. //int cnt=0;
  51.  
  52.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  53.    setup_adc(ADC_CLOCK_DIV_2);
  54.    setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_16);
  55.    setup_wdt(WDT_OFF);
  56.    setup_timer_0(RTCC_INTERNAL);
  57.    setup_timer_1(T1_DISABLED);
  58.    setup_timer_2(T2_DISABLED,0,1);
  59.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  60.    setup_comparator(NC_NC_NC_NC);
  61.    setup_vref(FALSE);
  62. //Setup_Oscillator parameter not selected from Intr Oscillator Config tab
  63.  
  64.    // TODO: USER CODE!!
  65. delay_ms(200);
  66.     while(true) {
  67.         for(dato=0;dato<10;dato++) {
  68.        
  69.           spi_write(taBCD[dato]);
  70.           delay_ms(300);
  71.         }//fin for
  72.        // dato=0;
  73.     } //fin while
  74.  
  75.  
  76. }


tambien pongo el circuito

========================

  # Fin Del Primer Asalto #

========================


en la proxima  1 master y dos esclavos
por hardware.


Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #28 en: 22 de Enero de 2013, 19:45:09 »
 ===================================
 =  ::segundo asalto ::
 =  pic2550 master y 2 esclavos
 =
 ===================================

La idea es poner 1 maestro y dos esclavo,
si copiamos el circuito del esclavo y le cargamos el mismo
codigo que al otro esclavo, los dos esclavos reciben lo mismo.

Seria un broadcast, la idea de ahora a ha ser imprimir los numeros
pares en el segundo esclavo y los impares en el primero, el cero no
se considera ni par si impar asi que aparecera en los dos.

para ello tendremos que cambiar el codigo, del maestro
para que si el numero es impar lo saque por el esclavo 1
y es par lo saque por el 2.

la pregunata es como se hace he leido que se debe de poner el ss a 1
entonces trasmite pero la oregunta es que en los esquemas de por ahi
se ve que hay mas de un ss tantos ss como esclavos hay.

Alguna idea?
de esto que propongo?



« Última modificación: 28 de Enero de 2013, 19:55:25 por pajaro »

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #29 en: 22 de Enero de 2013, 20:50:55 »
Con tu programa actual lo que haces es enviar un paquete de un solo dato cada vez.
Es decir, primero envias el 0, luego el 1, el 2, y así ......

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.

Lo que no estoy seguro si puedes colgar mas de un esclavo con SPI. Quizas lo que necesitas es un I2C. Esto seguro alguien con experiencia te lo puede decir bien  ;-)
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.


 

anything