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

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

Desconectado Darkman_A

  • PIC18
  • ****
  • Mensajes: 288
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #45 en: 25 de Enero de 2013, 10:11:51 »
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:

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

Si, ya sabia que se podia hacer asi, lo indique en mi mensaje anterior. Era para que Pajaro lo pensara. Aclaro que se como resolverlo. Si le doy todo el codigo ¿como practica?, ¿que gracia tiene?.

Saludos.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #46 en: 25 de Enero de 2013, 10:28:27 »
Pero no te enojes   :D

Desconectado Darkman_A

  • PIC18
  • ****
  • Mensajes: 288
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #47 en: 25 de Enero de 2013, 10:48:09 »
Pero no te enojes   :D
Hola RALF2.
No me enojo  :-/   :)  :-)  :lol:

Saludos

Desconectado pajaro

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

DarKman llevas razon se me olvido ponerle la  comparacion a 0 o 1.

lo modifico en el pos de arriba (el seudocodigo) vale , pero el fuente esta correcto.

la idea era hacer esto:

 if(text_bit(a,0)==0){hace una cosa}

 if(text_bit(a,0)==1){hace otra cosa}

pero tambine pudes hacer si:

if(text_bit(a,0)){hace una cosa} // si bit 0 es 1 hace eso

 if(!text_bit(a,0)){hace otra cosa} //si bit 0 es distito de 1 entendemos que es cero haces eso

lo de doble condicion es por si las moscas,

si no es 1 es 0 pero si seda otro caso, por alguna circunstancia.

por ejemplo si es 1 apagas el led sino lo enciendes .
esto es: si es 1 led on, pero si es 0, u otro valor tambien haces lo mismo que cero,
no me gusta dejar cosas al azar de otras circustancias remotas, por circustancias,
despues pueden surgir problemas no esperado y dificiles de encontrar.
 
Tambien podia haber usado un if else y dentro de este otro if o un if else if .
pero preferido hacerlo asi con doble comparacíon.

con respecto a este palabrejo: daisy chain, nuevo para mi,
yo en ningun momento lo menciono, la conexion que yo nombro
es diferente.



PD: el codigo me estaba funcionando perfectamente visible desde mi pos anterior.

Saludos.

###############################

 :: Fin del segundo asalto ::

###############################

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

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #49 en: 26 de Enero de 2013, 15:18:33 »
hola compañeros
de nuevo por aca...

 #############################
 
 Asalto 3:
  
 Otro reto:   de master a master por spi

 #############################

 Al pic master anterior le colgamos el / Segmentos  y toda la circuiteria del Pic esclavo
 una vez que lo tenemos borramos los dos esclavos y clonamos el master teniendo
 dos master.

 pic 1 escribira los impares en pic 2 y pic 2 escribira los pares en pic 1.
primero escribira pic 1 , pausas, escribe el 2 , pausa escribe el pic1

 Ejemplo:

 pic 1 escribe 1 en pic 2
 pic 2 escribe 2 en pic 1

 pic 1 escribe 3 en pic 2
 pic 2 escribe 4 en pic 1

 pic 1 escribe 5 en pic 2
 pic 2 escribe 6 en pic 1

 pic 1 escribe 7 en pic 2
 pic 2 escribe 8 en pic 1

 pic 1 escribe 9 en pic 2

 conexiones:
 master1           Master2        
===================
---SCK------------SCK----------
---SDI1------------SDO2--------
---SDO1-----------SDI2---------
---SS1-------------SS2----------

tendre que hacer un semaforo u algo,
por que esto no rula, imagino que si uso quire ser el que envia, al otro le toca escuchar...

--> cuantos ss necesitare ?
--> pueden hablar los dos a la vez (Ful-duplex)?
--> puede hablar uno y el otro escucha y luego se turnan (half-duples) ?

Alguna idea..?
¿que me recomiendan?

« Última modificación: 28 de Enero de 2013, 20:00:43 por pajaro »

Desconectado Darkman_A

  • PIC18
  • ****
  • Mensajes: 288
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #50 en: 28 de Enero de 2013, 14:54:17 »
Hola compañeros

DarKman llevas razon se me olvido ponerle la  comparacion a 0 o 1.

lo modifico en el pos de arriba (el seudocodigo) vale , pero el fuente esta correcto.

la idea era hacer

 if(text_bit(a,0)==o){hace una cosa}

 if(text_bit(a,0)==1){hace otra cosa}
pero
si haces

if(text_bit(a,0)){hace una cosa} // si bit 0 es 1 hace eso

 if(!text_bit(a,0)){hace otra cosa} //si bit 0 es distito de 1 entendemos que es cero haces eso

Los dos ejemplos que escribiste arriba realizan lo mismo.
Lo que yo te decia era que utilices un  if - else como el que mostro RALF2


lo de doble condicion es por si las moscas,

si no es 1 es 0 pero si seda otro caso, por alguna circunstancia.

por ejemplo si es 1 apagas el led sino lo enciendes .
esto es: si es 1 led on, pero si es 0, u otro valor tambien haces lo mismo que cero,
no me gusta dejar cosas al azar de otras circustancias remotas, por circustancias,
despues pueden surgir problemas no esperado y dificiles de encontrar.
 
Tambien podia haber usado un if else y dentro de este otro if o un if else if .
pero preferido hacerlo asi con doble comparacíon.
¿Que otro valor puede venir en un digito binario? ¿ Un 2?. Tenes solamente 2 opciones, 1 o cero.
Programa como quieras. Yo te lo recomendaba porque entra en lo que se llama "buenas maneras" de programar.

con respecto a este palabrejo: daisy chain, nuevo para mi,
yo en ningun momento lo menciono, la conexion que yo nombro
es diferente.

PD: el codigo me estaba funcionando perfectamente visible desde mi pos anterior.

Saludos.
Daisy chain ( o daisy chaining) es una forma de conectar dispositivos SPI en serie.Yo no decia que vos lo habias dicho, te recomendaba que lo vieras. Por lo visto, por tu  ultimo mensaje seguis teninendo problemas con la cantidad de conecciones SS. Esto te permite conectar los dispositivos que quieras con un solo SS.
Habias escrito
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?
Y te respondi
Fijate si podes usar daisy chain.
Aclaro que las conecciones en daisy chain y lo que escribiste arriba son distintas.
Saludos.
Mi idea era que vieras daisy chain para ver si te servia. Perdon si no te gusta la palabreja pero se llama asi y lo vas a encontrar asi. Y es un término, no una palabreja.
con respecto a este palabrejo: daisy chain, nuevo para mi,
yo en ningun momento lo menciono, la conexion que yo nombro
es diferente.

PD: el codigo me estaba funcionando perfectamente visible desde mi pos anterior.

Saludos.
Por supuesto que la coneccion que estas usando es diferente, pero es una cosa que vos creaste. No representa ningun estandar ....

conexiones:
 master1           Master2        
===================
---SCK------------SCK----------
---SDI1------------SDO2--------
---SDO1-----------SDI2---------
---SS1-------------SS2----------

tendre que hacer un semaforo u algo,
por que esto no rula, imagino que si uso quire ser el que envia, al otro le toca escuchar...

--> cuantos ss necesitare ?
--> pueden hablar los dos a la vez (Ful-duplex)?
--> puede hablar uno y el otro escucha y luego se turnan (half-duples) ?

Alguna idea..?
¿que me recomiendan?
..... y te esta dando problemas (por lo que decis en tu ultimo mensaje). Ahora estas usando mas de un master, segun interpreto.

Alguna idea..?
¿que me recomiendan?


Saludos.
« Última modificación: 28 de Enero de 2013, 15:11:10 por Darkman_A »

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #51 en: 28 de Enero de 2013, 20:12:48 »
hola compañeros

En algunos hilos del foro he leido que si es posible
la comunicación en full-duplex pero no logro dar con
algun esquema para guiarme asi que coloco el que yo hice
para ver si entre todos lo hacemos funcionar.

Un Saludo
« Última modificación: 29 de Enero de 2013, 11:24:16 por pajaro »

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #52 en: 28 de Enero de 2013, 21:49:13 »
Citar
En algunos hilos del foro he leido que si es posible
la comunicación en full-duplex pero no logro dar con
algun esquema para guiarme asi que coloco el que yo hice
para ver si entre todos lo hacemos funcionar.


El esquema que colocastes es full duplex
La comunicacion full duplex podriamos decir que es una caracteristica intrinseca del protocolo spi.
Pero para mayor informacion velo aqui   :mrgreen:

Saludos

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #53 en: 28 de Enero de 2013, 22:30:05 »
Hola compañero

muy bueno ese pdf, y en colores, muy bueno,

pongo el codigo que estoy usando, es el mismo para los dos pic
pero con "algunas cosillas que estoy probando".

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



El esquema que utilizo esta en el post anterior.

http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=39900.0;attach=20165

Aclaro que segun el valor del pin A0 el mismo codigo
se ejecutara en el pic 1 y pic 2 de diferente modo resultando
comportamientos diferentes.

Deberia de funcionar, en teoria pero en la simulación
algo falla.

las conexiones (dos master: full-duplex)
==============
  ::PIC1::             ::PIC2::        
===========================
---SCK----------------SCK
---SDI----------------SDO1
---SDO---------------SDI1
---SS1(A5)-----------SS1(A5)
---SS2(A3)-----------SS2(A3)

ambos pic tienen asignados dos ss
si pic 1 quire enviar a pic 2 usara A3(SS2)
y si el pic 2 quiere enviar a pic 1 usara A5(SS1)
como usan diferentes lineas se podria dar el full-duplex

Pero veo un problema, solo hay un solo registro de bufer
que lo utiliza tanto para enviar como para recibir.
Por lo tanto seguro que hay colisiones.

ademas cuando un dispositivo quiere enviar toma el control del pin de clock
pin --> SCK y en mi esquema solo hay una linea de clock que une
a los dos pines de clock de los maestros.
Por lo tanto una vez mas hay colisiones.

voy a sistetizar y analizar cuidadosamente esto con la ayuda del pdf.

....
..

Por lo que he leido en el pdf que me compartio el amigo RALF2
es posible la recepcion y envio simultaneo.

por lo visto es posible pero hay que retocar algunos registros
para saber cuando se envia o se recibe.


voy a ver si resuelvo, el enigma.






« Última modificación: 29 de Enero de 2013, 09:35:37 por pajaro »

Desconectado pink_brenda

  • PIC10
  • *
  • Mensajes: 4
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #54 en: 15 de Marzo de 2013, 17:27:11 »
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





Hola, quisiera saber como implementaste este codigo, he querido implementar algo basado en esta idea, tengo que realizar un programa para un contador regresivo, pero usando pines que no son consecutivos y pense declararlos como una estructura (algo parecido a la libreria de la LCD.C), identificando los pines con los cuales voy a trabajar, pero al compilar en CCS me aparece un error 

**ERROR 38: this type can't be qualified with this qualifier...

Aqui les dejo la declaración de la estructura a ver si me ayudan a identificar el problema.  Muchas gracias!!!

#include <16f873A.h>                          //
#fuses XT,NOWDT,NOPROTECT,NOLVP  //configuracion del pic                      //
#use delay(clock=4000000)        // Velocidad dl clock                        //
//////// Fuses: LP,XT,HS,RC,NOWDT,WDT,NOPUT,PUT,PROTECT,DEBUG,NODEBUG
//////// Fuses: NOPROTECT,BROWNOUT,NOBROWNOUT,LVP,NOLVP,CPD,NOCPD,WRT_50%
//////// Fuses: NOWRT,WRT_25%,WRT_5%
#use fast_io(b)
#use fast_io(A)
#use fast_io(c)
#define g   PIN_b7;                                    ////
#define f   PIN_b6;                                    ////
#define e   PIN_b5;                                    ////
#define d   PIN_b4;                                    ////
#define c   PIN_a5;                                    ////
#define b   PIN_c0;                                    ////
#define a   PIN_b3;                                    ////

typedef struct pinout {                 // This structure is overlayed
           short g;           // on to an I/O port to gain                                        => el error es en esta linea!!!
           short f;               // access to the LCD pins.
           short e;               // The bits are allocated from
           short d;           // low order up.  ENABLE will
           short c;           // on to an I/O port to gain
           short b;               // access to the LCD pins.
           short a;
        } lsb;

!3r3nd@

Desconectado pink_brenda

  • PIC10
  • *
  • Mensajes: 4
Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
« Respuesta #55 en: 15 de Marzo de 2013, 17:28:34 »
Hola, quisiera saber como implementaste este codigo, he querido implementar algo basado en esta idea, tengo que realizar un programa para un contador regresivo, pero usando pines que no son consecutivos y pense declararlos como una estructura (algo parecido a la libreria de la LCD.C), identificando los pines con los cuales voy a trabajar, pero al compilar en CCS me aparece un error

**ERROR 38: this type can't be qualified with this qualifier...

Aqui les dejo la declaración de la estructura a ver si me ayudan a identificar el problema.  Muchas gracias!!!

#include <16f873A.h>                          //
#fuses XT,NOWDT,NOPROTECT,NOLVP  //configuracion del pic                      //
#use delay(clock=4000000)        // Velocidad dl clock                        //
//////// Fuses: LP,XT,HS,RC,NOWDT,WDT,NOPUT,PUT,PROTECT,DEBUG,NODEBUG
//////// Fuses: NOPROTECT,BROWNOUT,NOBROWNOUT,LVP,NOLVP,CPD,NOCPD,WRT_50%
//////// Fuses: NOWRT,WRT_25%,WRT_5%
#use fast_io(b)
#use fast_io(A)
#use fast_io(c)
#define g   PIN_b7;                                    ////
#define f   PIN_b6;                                    ////
#define e   PIN_b5;                                    ////
#define d   PIN_b4;                                    ////
#define c   PIN_a5;                                    ////
#define b   PIN_c0;                                    ////
#define a   PIN_b3;                                    ////

typedef struct pinout {                 // This structure is overlayed
           short g;           // on to an I/O port to gain                                        => el error es en esta linea!!!
           short f;               // access to the LCD pins.
           short e;               // The bits are allocated from
           short d;           // low order up.  ENABLE will
           short c;           // on to an I/O port to gain
           short b;               // access to the LCD pins.
           short a;
        } lsb;
!3r3nd@