TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: pajaro en 07 de Enero de 2013, 18:12:05

Título: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: pajaro en 07 de Enero de 2013, 18:12:05
hola

Me gustaria saber si ustedes antes pusieron uno o varios bloques de 7 segmentos
para encender con un pic y en tal caso, ¿que chip usaron pra ahorrarse pines?.
¿cual me reconedarian? usando solo 4 lineas.

0000 --> 0
0001 --> 1
0010 --> 2
...
asi hasta
1111 --> F


yo ahora tengo uno problemilla un poco raro..
Por el momentos yo monte un PIC18F2550 con 1 solo chip de 7 segmentos en el simulador de proteus
acionado por: 7447, 4511, 7449 y no funciona muy bien.
pero si lo acciono de forma manual si que funciona, pero desde el pic solo me muestra de 0 a 4  

la cosa es sencilla con el bus spi le envio del master al esclavo los 9 primeros numeros
pero solo me muestra del 0 al 4 no se lo que pasa con el resto.

alguna idea de que puede ocurrir?

sigo indagando en la resolucion del problema...

coloco el codigo del master y del esclavo ...

Código: CSS
  1. #include "C:\spi_pic18F2550\master_04\main.h"
  2.  
  3. //char taBCD[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
  4. int taBCD[]={0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09};
  5. //int taBCD[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67};
  6. int dato;    //variable entera que sirve para que , al incrementar, vaya variando el dato.
  7.  
  8. void main()
  9. {
  10. //int cnt=0;
  11.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  12.    setup_adc(ADC_CLOCK_DIV_2);
  13.    setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_16);
  14.    setup_wdt(WDT_OFF);
  15.    setup_timer_0(RTCC_INTERNAL);
  16.    setup_timer_1(T1_DISABLED);
  17.    setup_timer_2(T2_DISABLED,0,1);
  18.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  19.    setup_comparator(NC_NC_NC_NC);
  20.    setup_vref(FALSE);
  21. //Setup_Oscillator parameter not selected from Intr Oscillator Config tab
  22.  
  23.    // TODO: USER CODE!!
  24.  
  25.     while(true) {
  26.         for(dato=0;dato<10;dato++) {
  27.        
  28.           spi_write(taBCD[dato]);
  29.           delay_ms(300);
  30.         }//fin for
  31.        // dato=0;
  32.     } //fin while
  33.  
  34.  
  35. }


codigo del esclavo:

Código: CSS
  1. #include "C:\spi_pic18F2550\esclavo_04\main.h"
  2.  
  3. //char taBCD[]={0x00,0x01,0x02,0x03,0x04,0x06,0x07,0x08,0x09};
  4. //int dato;
  5.  
  6. void main(){
  7.  
  8.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  9.    setup_adc(ADC_CLOCK_DIV_2);
  10.    setup_spi(SPI_SLAVE);
  11.    setup_wdt(WDT_OFF);
  12.    setup_timer_0(RTCC_INTERNAL);
  13.    setup_timer_1(T1_DISABLED);
  14.    setup_timer_2(T2_DISABLED,0,1);
  15.    setup_comparator(NC_NC_NC_NC);
  16.    setup_vref(FALSE);
  17.  
  18. //Setup_Oscillator parameter not selected from Intr Oscillator Config tab
  19.  
  20.    // TODO: USER CODE!!
  21.  //set_tris_c(0x00);
  22.  while(true) {
  23.    if(spi_data_is_in()){      // Esto sirve para detectar que hay o no un dato en el SPI al leer.          
  24.       dato=spi_read();
  25.       //output_high(PIN_B0);
  26.       output_c(dato);
  27.       delay_ms(500);
  28.      }
  29.  }
  30.  
  31.  }

si alguno lo desea puedo poner el circuito
solo tienen que pedirlo.

Un saludo.



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

::  Indice de pruebas ::

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


1.- 1 Master por SPI enciende  1 Modulo de 7seg de un esclavo.

2.- 1 Master por SPI enciende  n Modulos de 7seg de N esclavos a la vez.

3.- 1 Master por SPI enciende  1 Modulo de 7seg de un esclavo numeros pares
     y en otro esclavo de construcion igulito enciende los numeros impares.




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






# Enlaces #
========

http://www.todopic.com.ar/foros/index.php?topic=28952.msg239608#msg239608



Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: jfmateos2 en 07 de Enero de 2013, 18:21:38
Yo uso el MAX6951
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: BrunoF en 07 de Enero de 2013, 19:01:20
Con 74HC595 o simil podés lograr controlar infinidad de salidas con capacidad source/drain de 20ma y sólo 3 pines del uC, mediante un protocolo serial que puede usarse con el módulo SPI.

Saludos.
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: AcoranTf en 07 de Enero de 2013, 19:47:50
Echale un vistazo a la hoja tecnica del TPIC6B595.

Saludos.
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: RALF2 en 07 de Enero de 2013, 20:38:21
Si todos son equivalentes  :mrgreen:
Tambien puedes usar el mm5450 y sirve hasta para manejar matriz de led  :mrgreen:

Y aqui (http://www.datasheetdir.com/MM5450-5451+LED-Drivers) para manejo de displays


Saludos
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: pajaro en 09 de Enero de 2013, 11:22:54
HoLa compañeros

por el momento no dispongo de ellos  fisicamente asi que lo estoy simulando con el proteus
pero alguno de ellos no vienen en las librerias como es el caso del mm5450, TPIC6B595,
pero el MAX6951 si que vienen al igual que la serie74hcxxx,
yo cuando empece a simularlo lo hice con un 7447 pero solo me mostraba de 0 a 4
adjunto las fotos comprimidas en rar y el fichreo de proteus.
el codigo que cargan lo mostre anteriormente.

sigo investigando los problemillas..

Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: willynovi en 09 de Enero de 2013, 12:51:23
No he visto los últimos adjuntos, despues en casa los bajo y te digo.

Lo que si veo en el primer mensaje es que en el programa del esclavo estas usando el puerto C para sacar los datos, si usas un conversor BCD a 7 segmentos solo usas los 4 bits de menor peso.

Tambien veo que comentas la linea donde decis que el puerto c es salida, aunque no creo que sea el error, pero verificalo.

Lo mejor para ahorrar pines del pic es usar el 74hc595, es mas complicado el programa, pero no por eso imposible.
Podes multiplexar muchos y tener muchas salidas.
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: pajaro en 09 de Enero de 2013, 20:22:27
Hola
por mas que miro el codigo no encuentro el error
es sencillo cargo los valores del 0 a 9 en un vector
y mediante un for los envio del master al esclavo por spi
si se detecta datos en spi lo muestra en la parte baja
del puerto c.

he comentado lo del fast_io porque da errores con
en la comunicación con spi.
En la depuración del proteus
he notado una cosa rara:

como si fuera desfasado lo que envia el master de lo que recibe el esclavo:

lo que muetra la salida del depurador spi
====================================
 master: 00 00 00 81 01 82 02 03
esclavo: 00 01 02 03 04 05 06 07

 master: 03 84 04 80 00 81 01 82
esclavo: 08 09 00 01 02 03 04 05

 master: 02 83 03 84 04 80 00 81
esclavo: 00 07 08 09 00 01 02 03

no entiendo muy bien lo que pasa,

sigo investigando...




Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: willynovi en 09 de Enero de 2013, 20:45:00
he comentado lo del fast_io porque da errores con
en la comunicación con spi.

Ahí me parece que está el error, vos usas el SPI con RC6 y RC7?

Probaste hacer la salida por otro puerto, por ejemplo el puerto B?

Si quieres usar el puerto C para la salida al 7 segmentos quizas deberias modificar bit a bit.

Nunca he hecho algo con SPI, pero viendo el diagrama del 18f2550 me surge esa duda.
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: pajaro en 09 de Enero de 2013, 21:14:54
hola willynovi

Eso fue lo que pense en un primer momento, de tratar al puerto c
con el fuse fast_io, y set_tris_c(), pero con ello activado la comunicacion no
funcionaba y el spi no se realizaba fue comentar eso y el fuse y enpezar a ir.

En teoria del c0 al c3 son salida el resto de bit me da igual lo que sean,
quitando que el c7 es SDO, no se lo que puede ser seguro que es alguna cosa
muy tonta y no lo logro ver.

Voy a seguir leyendo más post sobre el 7 segmentos y el spi,
no hay mal que dure 100 años...
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: irukza en 14 de Enero de 2013, 09:40:42
Hola pajaro

Te adjunto el circuito que uso yo para estos casos. No es tan elegante como tu idea pero funciona muy bien, y usa 3 líneas del uC.
No es la manera más económica de realizarlo, pero los componentes se consiguen siempre por acá y como yo lo uso a nivel comercial no puedo arriesgarme a la falta de stock  :?

Como te decía, hay 3 lineas:

- dt_disp: por aca mandas los datos en serie (BCD) para cargar los registros de desplazamiento

- ck_disp: esta es la linea de clock

- LE_disp: una vez que transmitiste todos los bits, esta señal te permite pasa los datos a los 4511 (latch)



Otra forma de hacerlo es quitar los 4511 y manejar directamente los segmentos, pero necesitas cortar la masa de los 7 seg mientras realizas la transmisión, para que los displays no muestren basura mientras se acomodan los bits.
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: pajaro en 15 de Enero de 2013, 20:13:20
hola

hace dias que lo tengo apartado
el cirduito a un lado del escritorio y de vez en cuando lo miro
no se, no entiendo que cosas más raras hace,

termine por hacer el spi por software.
pero no me comunica nada bien.

he mirado detenimamente los pines que prenden el  7 segmentos
veo como solo cuentasn hasta 4, lo que no entiendo por que no cuentan hasta 9
ya que dedico 4 pines equivalente a 4 bit, en teroria 1111 es F, y si enciende 4
que es 100 tambien deberia de hacer lo mismo con 7 ya que es  111
no se que le pasa .

creo que primero conectare el pic con un decoder y un 7 seg y lo hare contar de 0 a F
y cuando funcione seguro y bien lo hare con spi,

Agradezco que me compartas tu circuito.


Un saldo y gracias por su colaboracion.

Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: RALF2 en 16 de Enero de 2013, 07:02:25
Que tal amigos!
Pajaro prueba lo siguiente: en el programa del maestro coloca un retardo de digamos 200ms antes del while, debado de donde dice: TODO: USER CODE!!
y aumenta el delay del maestro de 300ms a digamos 700ms para ver bien la cuenta  :-/

Para el slave: quita el retardo de 500ms   :mrgreen:

Porque me parece que el problema es de sincronizacion entre el esclavo y el maestro  :mrgreen:

Prueba y nos dices que paso  ;-)

Saludos
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: BrunoF en 16 de Enero de 2013, 13:21:08
hola

hace dias que lo tengo apartado
el cirduito a un lado del escritorio y de vez en cuando lo miro
no se, no entiendo que cosas más raras hace,

Hola pájaro,

tu contador no funciona porque estás intentando usar RC4 como salida de propósito general, lo que no está disponible ni para ese pin ni para el pin C5, ambos condicionados por estar multiplexados con el módulo USB. Usá otro pin disponible que permita ser configurado como lo estás necesitando.  :mrgreen:

Saludos!
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: RALF2 en 16 de Enero de 2013, 17:11:55
Es correcto lo que comenta al amigo Bruno debes utilizar otro pin distinto de RC4, pero si haces la modificacion que comente arriba y en vez de contar hasta 9 lo haces hasta 7 funciona perfecto, ya lo probe asi :mrgreen:

Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: pajaro 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,..?

Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: Suky 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!
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: RALF2 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
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: pajaro 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


Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: RALF2 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

Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: Suky 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!

Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: pajaro 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);

¿ :??




Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: RALF2 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
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: pajaro 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?


Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: RALF2 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
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: pajaro 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.

Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: RALF2 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 (http://www.ucontrol.com.ar/wiki/index.php?title=Ejemplos_CCS_-_003_Display_7_segmentos_en_PORTB)

Saludos
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: pajaro 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.

Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: pajaro 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?



Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: willynovi 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  ;-)
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: RALF2 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
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: Darkman_A 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.
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: pajaro 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...?


Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: willynovi 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.
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: RALF2 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
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: Darkman_A 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.
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: RALF2 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
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: pajaro 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?
(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=39900.0;attach=20083;image)

Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: RALF2 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

Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: pajaro 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...








Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: RALF2 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
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: Darkman_A 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?
(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=39900.0;attach=20083;image)



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
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: Darkman_A 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.
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: Darkman_A 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.
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: RALF2 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:
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: Darkman_A 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.
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: RALF2 en 25 de Enero de 2013, 10:28:27
Pero no te enojes   :D
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: Darkman_A en 25 de Enero de 2013, 10:48:09
Pero no te enojes   :D
Hola RALF2.
No me enojo  :-/   :)  :-)  :lol:

Saludos
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: pajaro 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 ::

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

 
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: pajaro 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?

Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: Darkman_A 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.
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: pajaro 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
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: RALF2 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 (http://www2.ate.uniovi.es/fernando/Doc2007/Presentaciones/Serie_sincrona_en_C.pdf)   :mrgreen:

Saludos
Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: pajaro 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.






Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: pink_brenda 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;

Título: Re: :: SPI - Decoder 7 Segmentos - ahorrar pines en PIC ::
Publicado por: pink_brenda 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;