TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: yair_xiox en 10 de Septiembre de 2015, 19:22:20

Título: ayuda con mejora de programa
Publicado por: yair_xiox en 10 de Septiembre de 2015, 19:22:20
hola, voy a ponerl el codigo, estoy haciendo que unos leds se prendan cuando hay 0 y se apagen cuando hay uno pero eso no sirve sila entrada es una señal cuadrada que cambia constantemente de 1 0 o viceversa y necesito que me ayuden a cambiar la condicion del if por un while que pregunte por la entrada del pin 4 durante un tiempo si es cero o uno y dependiendo del valor que mas haya sido durante ese tiempo prenda los leds o los apague pero no se como hacerlo
Código: [Seleccionar]
#include <16f73.h>

#fuses XT,NOWDT,PUT, NOPROTECT


#use delay (clock =4000000)



#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use rs232(BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7, BITS=8)

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>





unsigned char datos [16];
int j; 
void diagnostico (void)
{
datos [0]=0;
delay_us(0.4);
datos [1]=1;
delay_us(0.4);
datos [2]=0;
delay_us(0.4);
datos [3]=1;
delay_us(0.4);
datos [4]=0;
delay_us(0.4);
datos [5]=1;
delay_us(0.4);
datos [6]=0;
delay_us(0.4);
datos [7]=1;
delay_us(0.4);
datos [8]=0;
delay_us(0.4);
datos [9]=1;
delay_us(0.4);
datos [10]=1;
delay_us(0.4);
datos [11]=0;
delay_us(0.4);
datos [12]=1;
delay_us(0.4);
datos [13]=0;
delay_us(0.4);
datos [14]=1;
delay_us(0.4);
datos [15]=1;
delay_us(0.4);
for (j=0;j<15;j++ )
{
putc(datos[j]);
}
}

void main(){

set_tris_b(0x00);
set_tris_a(0x10);
set_tris_c(0x80);
setup_adc_ports(NO_ANALOGS);



 
output_high(PIN_A0);
 
while(true)
{
if(input(PIN_A4)==0)
{
output_high(PIN_B0);
output_high(PIN_B1);
output_high(PIN_B2);
output_high(PIN_B3);
}
else
{
output_low(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B2);
output_low(PIN_B3);
}
diagnostico();

 
}
}

Título: Re: ayuda con mejora de programa
Publicado por: RALF2 en 10 de Septiembre de 2015, 20:11:55
Amigo yair_xiox, lo que preguntas ya lo habias hecho aqui:

http://www.todopic.com.ar/foros/index.php?topic=45102.0
Por politicas del foro no es conveniente que formules la misma pregunta varias veces, esa no es la mejor forma de pedir ayuda.
Tenias un problema con la version del compilador segun preguntabas y no haz dicho si lo resolvistes, por otro lado no entiendo bien que es lo que quieres hacer viendo tu programa. podrias ser mas especifico porque eso de poner un pin a cero o uno no me dice mucho.

Saludos
Título: Re: ayuda con mejora de programa
Publicado por: yair_xiox en 10 de Septiembre de 2015, 21:45:53
no estoy preguntando lo mismo, estoy pregntando como usar un while para preguntar por un pin si es uno o cero durante un tiempo y si es mas veces uno prenda los leds o si es cero mas veces los apague porque la entrada es una señal cuadrada
Título: Re: ayuda con mejora de programa
Publicado por: KILLERJC en 10 de Septiembre de 2015, 21:49:42
Podrias haber seguido seguido en el otro hilo, ya que es el mismo codigo.
Espero que no te enojes por lo que te digo y tus consultas seran siempre bien recibidas.

Como te dije estas teniendo serios problemas de programacion (en ASM y en C que son las cosas que vi), pero SERIOS, lei que estas intentando programar un robot con cinematica inversa, etc etc etc.

Pero por ahora lo que mas te vas a tener que enfocar es aprender C y como ejecutan las instrucciones de manera secuencial los microcontroladores, cosas como estas:

Código: [Seleccionar]
datos [0]=0;
delay_us(0.4);
datos [1]=1;
delay_us(0.4);
datos [2]=0;
delay_us(0.4);
datos [3]=1;
delay_us(0.4);
datos [4]=0;
delay_us(0.4);
datos [5]=1;
delay_us(0.4);
datos [6]=0;
delay_us(0.4);
datos [7]=1;
delay_us(0.4);
datos [8]=0;
delay_us(0.4);
datos [9]=1;
delay_us(0.4);
datos [10]=1;
delay_us(0.4);
datos [11]=0;
delay_us(0.4);
datos [12]=1;
delay_us(0.4);
datos [13]=0;
delay_us(0.4);
datos [14]=1;
delay_us(0.4);
datos [15]=1;
delay_us(0.4);

Son realmente absurdas, cuando la funcion delay_us admite nomas enteros y vos intentas pasarle un float.

Citar
Parameters: time - a variable 0-65535(int16) or a constant 0-65535

Ademas de que sirve asignarle un valor a una variable alojada en la RAM con delays entremedio ????, supongamos que acepta el delay ese valor. de que sirve asignarle una y otra ves el valor a ese array ???, se hubiera podido remplazar por:

unsigned char    datos   [16]={1,0,1,0,.....,1};
void diagnostico (void)
{
   int j;
   delay_us(6.4);
   for(j=0,j<16;j++)
...


Eso no va a hacer que se envie un 1 luego un 0 a cada 0.4us, solo estas haciendo que ponerle todos los valroes al array sea lento. (Ni es por que el delay es de 0).
Tampoco valdria la pena hacer eso por un 0 o un 1. utilizar 16 * 8 bits = 128 bits para solo tener la info de 16 bits.

Encima luego usas
for (j=0;j<15;j++ )
{
    putc(datos[j]);
}

Y tenes configurado el RS232. genial, esto es una funcion bloqueante que se queda esperando hasta que se envie todo.

Haciendo que tu if del main, tenga que esperar que se envie todo por la UART, para volver a preguntar sobre la entrada.

Otra cosa no estas enviando un 1 bit si esa fur tu idea. sino estas enviando:
1 bit de start + 8 bits de datos + 2 bits de stop, asincronamente asi que no es una onda cuadrada con un duty 50% si es lo que querias hacer.

Cada 1 o 0 ahi seria algo asi, como para darte un ejemplo
1 0000 0001 11


Otro "error", no estas usando el valor dato[15] xD por tu condicion.


Para resumirtelo, tu funcion diagnostico es igual a esto:

for (j=0;j<16;j++ )
{
   putc((j&0x01));
}

Encima no sale de ahi, de ese for hasta que envio todo de la UART.
Aunque no lo quieras admitir, estas errandole en temas de programacion bastante simples.
El manual de las funciones de CCS lo tenes en internet, solo busca CCS Manual y lo tenes. Ahi te explica cada una.
Pero el tema de los arrays, eso ya como dije es un error de programacion
Título: Re: ayuda con mejora de programa
Publicado por: yair_xiox en 10 de Septiembre de 2015, 22:15:24
lo que pasa es que en esa señal es una cuadrada aleatoria y le pongo retardos para se demore un poco en cada dato y mande un float porque necesitaba 400 nanosegundos pero como no se puede los converti a 0.4 microsegundos o como hago para hacer 400 nanosegundos, killer entonces pongo esa parte que me pusiste y quito lo de la uart pero entonces porque pin puedo enviar esa señal
Título: Re: ayuda con mejora de programa
Publicado por: yair_xiox en 10 de Septiembre de 2015, 22:19:12
killer y si tengo una entrada que si sea una señal cuadrada que varia entre 0 y 1 y lo que necesito es que por el pin que entra hacer un while que dure un tiempo determinado preguntando si la señal esta en 1 o en cero y dependiendo de si se repite mas 1 o 0 en ese intervalo de tiempo prenda o apague los leds como hago eso
Título: Re: ayuda con mejora de programa
Publicado por: KILLERJC en 10 de Septiembre de 2015, 22:52:54
Citar
lo que pasa es que en esa señal es una cuadrada aleatoria y le pongo retardos para se demore un poco en cada dato y mande un float porque necesitaba 400 nanosegundos pero como no se puede los converti a 0.4 microsegundos o como hago para hacer 400 nanosegundos, killer entonces pongo esa parte que me pusiste y quito lo de la uart pero entonces porque pin puedo enviar esa señal

Me parece que no tenes en claro lo que es una onda cuadrada, o un tren de pulsos, sino estamos hablando de cosas distintas. Una onda cuadrada o un tren de pulsos no es aleatorio.

Siguiendo con esto:

con un cristal de 4Mhz la maxima velocidad que se ejecuta cada instruccion en ASM es de 1us en los PIC, es decir para cambiar aunque sea un bit, o X bits de un puerto te lleva 1us, ponerlo a 1 y luego a 0, son 2 us.

Tcy = 4/Fosc = 4 / 4Mhz = 1us

Asi que es IMPOSIBLE que tengas 0.4us
Con lo que si hicieras un programa en ASM con un codigo ineficiente (ya que no podrias introducir saltos) te ocuparia al menos un cristal de 10Mhz ( como minimo ). Aun asi no podrias hacer nada mas.
Hacerlo en C es imposible, ya que C usa mas instrucciones de las que necesitaria, y no tenes un control sobre las isntrucciones que se crean.

Citar
killer y si tengo una entrada que si sea una señal cuadrada que varia entre 0 y 1 y lo que necesito es que por el pin que entra hacer un while que dure un tiempo determinado preguntando si la señal esta en 1 o en cero y dependiendo de si se repite mas 1 o 0 en ese intervalo de tiempo prenda o apague los leds como hago eso

Esto es lo mas simple.. Pero tambien todo depende de la velocidad de entrada. tenes que recordar que C agrega mas instrucciones y por lo tanto estas limitado a la onda cuadrada que llegue.
Si usas FAST_IO al igual que tu programa entonces:

Código: C
  1. while(true)
  2.         {
  3.                 if(input(PIN_A4)) output_b(0x00);     // Si te interesa mantener los demas valores de los demas bits del portb , vas a tener que leer el valor , hacerle una and/or y usar eso en el output_b()
  4.                 else output_b(0x0F);                            
  5.         }

Si tuviera que resumir eso en ASM seria:

Código: ASM
  1. CLRF PORTB
  2.     MOVLW 0x0F
  3. loop:
  4.     BTFSC PORTA,4
  5.     GOTO parte2
  6.     MOVWF PORTB
  7.     GOTO loop
  8. parte2:
  9.     CLRF PORTB
  10.     GOTO loop

Creo que seria lo minimo, lo cual son 5 ciclos de instrucciones para cuando es 0, y 6 para cuando es 1.
Asi que la frecuencia maxima de tu onda cuadrada de entrada con ese codigo en ASM es de unos (1/(6us+6us)) 80Khz a 4Mhz.
Si es con C, entonce por las dudas pasalo a 50Khz, y te va permitir detectar cada medio ciclo. aunque de seguro que por ahi se va a saltar uno.
Título: Re: ayuda con mejora de programa
Publicado por: yair_xiox en 14 de Septiembre de 2015, 12:34:02
hola,amigos aun no funciona la señal que yo genero es una señal aleatoria para darle una señal de entrada a un MBI 5039, que es un integrado que maneja una matriz de leds y la salida del MBI es una señal cuadrada que al entrar por a4 siempre prende los leds aunque esten fallando algunos leds de la matriz o prendan todos los leds de la matriz, lo que necesito es detectar con los leds de mi circuito el cambio de los leds de la matriz que prendan cuando falle y apaguen cuando la matriz de leds este funcionando ayuda, no me funciona
Título: Re: ayuda con mejora de programa
Publicado por: KILLERJC en 14 de Septiembre de 2015, 15:35:12
Hasta que por fin nos decis que queres hacer o conectar.

Leiste el datasheet del MBI5039 para ver las formas de ondas ?

Lo que vas a necesitar usar un SPI y luego cambiar a manejarlo digital, o hacer un SPI por software. (para no complicarla mucho te recomiendo esta ultima opcion)

Tenes 2 opciones para detectar los errores ( short-circuit / open-circuit ) O usas el In-message ( es decir mientras metes los datos, tenes una salida con los errores) , o se desactiva de la configuracion y luego se pide exclusivamente los errores sin enviar datos.
Todo depende de la cantidad de MBI5039 que tengas, y si quisieras realmente hacerte una libreria creo que prefiero hacerme una con la opcion de In-message desactivado, ya que esta puede ser utilizada tanto para tener 1 o mas MBI5039

Asi que para comenzar habria que hacer unas cuantas funciones, yo po ejemplo te doy estos nombres, vos usas el que quiera ya que no importa que nombre tengan

void vEnviarDatosMBI();
void vEnviarConfigMBI();
int iDetScMBI();
int iDetOcMBI();
short int iDetTempMBI(); (esta es opcional)
void vInitMBI();

Creo que con esas funciones ya estaria.., Ahora necesitamos saber los pines a usar

4 Salidas y una entrada:

Salidas Para: OE , LE , SDI , CLK
Entrada para : SDO

Para enviar los datos debes poner la salida SDI en alto o en bajo y dar un pulso en CLK, es decir pones el valor 0 o 1 en la salida , luego pones en 1 CLK y luego a 0, seguis asi para los 15 valores restantes, cuando termina todo esto, teniendo CLK en 0, pones en 1 LE y luego lo pones en 0.

Para detectar error de Short-Circuit ( Cortocircuito ): Pones en 1 OE, Pones en 1 LE, pones a 1 y luego en 0 a CLK, pones en 0 LE, Pones en 0 OE (respetar el tiempo) , Envias 15 pulsos de CLK ( cuando hablo de pulsos es ponerlo en 1 y luego en 0 ) cada ves que lo pones en 1 lees la entrada, ahi vas a tener los 16 bits de error.

Lo mismo para el de Open-Ciurcuit, nomas que cuando pones en 1 LE tenes que darle 2 ciclos de CLK.
Lo mismo para la temperatura, nomas que son 3 ciclos con el LE, en esta no importa el estado de OE. Asi que lo podes dejar en 0.

Te queda la de configurar los registros internos, este es igual que el de enviar datos, pero cuando se pone el LE en 1, debe haber 4 ciclos de clock, y luego se pone a 0.

Y Finalmente una funcion de inicializacion, que es la que se encarga que al momento de encenderse el circuito configure los pines de ser necesario y escriba en los registros de configuracion los valores para que responda como vos queres, ejemplo el de desactivar el in-message, ganancia de correinte etc.

Creo que separados asi en funciones como te los di no es TAN complejo, lo unico que vas a tener que respetar los tiempos.
Título: Re: ayuda con mejora de programa
Publicado por: yair_xiox en 14 de Septiembre de 2015, 16:52:24
gracias killer, tengo 4 MBI 5039 tres de ellos controlan cada uno 16 leds y el ultimo solo 8 leds, me explicas un poco mejor eso de respetar los tiempos y porque dices que SDO es entrada ahi dice que ese es el de salida y se ve la señal de error por ese pin pero hasta ahora yo no he notado la diferencia de esa señal cuando toda la matriz de leds funciona
y cuando algunos leds ya no funcionan la señal sigue igual, y entonces para mejorar el programa me puedes ayudar con la iniciacion de esas funciones,y como es eso de darle masd e un ciclo al CLK
Código: [Seleccionar]
#include <16f73.h>

#fuses XT,NOWDT,PUT, NOPROTECT


#use delay (clock =4000000)



#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use rs232(BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7, BITS=8)

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>





unsigned char datos [16]={0,1,0,1,0,1,0,1,0,1,1,0,1,0,1,1};
 
void diagnostico (void)
{
int j;
delay_us(1);
for (j=0;j<16;j++ )
{
putc(datos[j]);
}
}

void main(){

set_tris_b(0x00);
set_tris_a(0x10);
set_tris_c(0x80);
setup_adc_ports(NO_ANALOGS);



 
output_high(PIN_A0);
 
while(true)
{

if(input(PIN_A4)==0)
{
output_high(PIN_B0);
output_high(PIN_B1);
output_high(PIN_B2);
output_high(PIN_B3);
}
else
{
output_low(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B2);
output_low(PIN_B3);
}
diagnostico();

 
}
}

y como es eso del spi por software
Título: Re: ayuda con mejora de programa
Publicado por: KILLERJC en 14 de Septiembre de 2015, 17:40:44
Citar
porque dices que SDO es entrada ahi dice que ese es el de salida

SDO Salida del MBI5039, pero es una entrada para tu PIC

Citar
y se ve la señal de error por ese pin pero hasta ahora yo no he notado la diferencia de esa señal cuando toda la matriz de leds funciona

No se como tenes configurado tu integrado. normalmente por default viene con la opcion "in-message" activado. De ultima podes usar esto y el SPI. Lo que pasa la complicacion a la configuracion del SPI

Configura el SPI a la velocidad que quieras.
Envias los 16*4 bits, cada ves que envias 8 bits recibis 8bits de los errores, comenzarias recibiendo el error 15 del ultimo MBI de la cadena.
Tenes que tener en cuenta de poner a 0 y luego a 1 el OE de todos los integrados para que sea correcto los valores de la deteccion de error.
Fin. xD

Citar
y como es eso de darle masd e un ciclo al CLK
https://www.rcscomponents.kiev.ua/datasheets/mbi5039gf.pdf
Pagina 13

Citar
entonces para mejorar el programa me puedes ayudar con la iniciacion de esas funciones

Con un SPI por HW para escribir y leer los datos de errores seria algo asi, si no mal recuerdo como hacerlo:

Código: C
  1. int Datos[4];
  2. int Errores[4];
  3.  
  4. void vEnviarDatos(short int *ptr_datos,short int *ptr_error)
  5. {
  6.         short int i;
  7.  
  8.         // Muevo OE por un minimo de 400ns , no necesita de demora a que esto como minimo es de 1us con 4Mhz
  9.         OEaCero();
  10.         OEaUno();
  11.  
  12.         //Envio y recibo datos
  13.         for(i=0;i<8;i++)
  14.                 *ptr_error++ = spi_read(*ptr_datos++);
  15.  
  16.         //Muevo el LE para que se latchee los datos
  17.         LEaUno();
  18.         LEaCero();
  19. }
  20.  
  21. void main()
  22. {
  23.         vEnviarDatos(Datos,Errores);
  24. }

Por SW

Código: C
  1. void vEnviarDatos(short int *ptr_datos,short int *ptr_error)
  2. {
  3.         short int j,i,;
  4.  
  5.         OEaCero();
  6.         OEaUno();
  7.  
  8.         for(j=0;j<8;j++ , ptr_error++,ptr_dato++)
  9.         {
  10.                 for(i=0;i<8;i++)
  11.  
  12.  
  13.                         if(*ptr_dato & (1<<i))
  14.                         {
  15.                                 SalidaUno();
  16.                         }
  17.                         else
  18.                         {
  19.                                 SalidaCero();
  20.                         }
  21.                         *ptr_error |= (input(PIN_SDO) << i)
  22.                         CLKUno();
  23.                         CLKCero();
  24.                        
  25.         }
  26.  
  27.         LEaUno();
  28.         LEaCero();
  29. }

Los indices de ambos codigos pueden estar MUY mal (estoy seguro que estan mal), asi que recomiendo revisarlos pero como ves no se te pide nada complejo. si no te gustan los punteros lo haces directamente con los arrays.
Título: Re: ayuda con mejora de programa
Publicado por: yair_xiox en 14 de Septiembre de 2015, 17:56:42
gracias, pero entonces para hacer ese cambio en le y oe los pongo en algun pin del micro pero, hay una señal que debo enviar por el pin CLK asi que no se como hacerle ese cambio de 1 a 0 al CLK
Título: Re: ayuda con mejora de programa
Publicado por: KILLERJC en 14 de Septiembre de 2015, 18:05:42
gracias, pero entonces para hacer ese cambio en le y oe los pongo en algun pin del micro pero, hay una señal que debo enviar por el pin CLK asi que no se como hacerle ese cambio de 1 a 0 al CLK

por SW, tenes que ponerlo a 0 o a 1, con un output(PIN_XX)
por HW, el mismo hardware del SPI se encarga de generar el CLK.
Título: Re: ayuda con mejora de programa
Publicado por: yair_xiox en 14 de Septiembre de 2015, 18:24:58
ok, entonces la señal que yo genero la envio mas bien por el pin SDI
Título: Re: ayuda con mejora de programa
Publicado por: KILLERJC en 14 de Septiembre de 2015, 18:31:31
Tenes que generar 2 señales, 1 de CLK y otra de datos ( que iria al SDI)

Si, si lo haces por SW, cualquier pin del PIC hace la funcion de una salida serial para tus datos, y eso iria al SDI del MBI. Tambien cualquier haria de CLK para que entre en el CLK del MBI
Si lo haces por HW, tenes que fijarte cual es la salida del SPI y conectar eso al SDI del MBI, y tambien la salida del ultimo MBI a la entrada del SPI.
Título: Re: ayuda con mejora de programa
Publicado por: yair_xiox en 14 de Septiembre de 2015, 21:56:33
entonces la señal que genero con mi codigo a donde la mando al CLK o a SDI y la otra señal qe debo generar debe ser igual a esa o diferente,
Título: Re: ayuda con mejora de programa
Publicado por: KILLERJC en 14 de Septiembre de 2015, 22:45:31
Bueno parece que hay que comenzar por lo basico.

Cuando vos envias una señal hacia otro dispositivo, el otro dispositivo no tiene la menor idea que le estas enviando si es que ademas no le agregas unos bits de sincronismo.
Entonces suponete que quiero enviar el dato 011000011110, y realmente eso envio. Pero el receptor no tiene idea de "Cuando" tomar los datos, supongamos que entre bit y bit hay 5ms

                 _________                                             _______________________________
_________|               |_________________________|                                                     |__________
          0         1        1        0          0          0        0          1           1             1           1             0

Receptor Toma cada 10ms
           0                   1                  0                    0                     1                         1
Cada 20ms
            0                                         0                                        1  

Entonces es imposible para el receptor saber lo que le estamos enviando. Entonces aca entran 2 formas de transmision, una sincrona y otra asincrona. Un ejemplo de transmision asincrona es la UART. Observaras que la UART solo tiene TX y RX, no posee CLK.
Entonces tenemos la ventaja que no debemos enviar una señal de CLK, pero la desventaja de sacrificar unos bits para que se sincronizen. Por eso mismo la UART se envian bits de START y STOP. Ahora cuando es sincrono como es este caso se debe enviar una señal de CLK, el SPI es especial para este caso. El SPI genera una señal de clock y va enviando bit a bit con esa señal de CLK.

Si observas en las graficas del datasheet, el dato es tomado en cuenta en el flanco ascendente del reloj. El CLK no es mas que una onda cuadrada. Pero si vos envias pulsos de clk y sin "datos" realmente lo que estas haciendo es enviando ceros. Cada pulso de CLK es un dato para tu receptor.


      ____       ____      ____       ____      ____       ____        ____       ____      ____       ____      ____       ____      
___|      |___|      |___|      |___|      |___|      |___|      |___|      |___|      |___|      |___|      |___|      |___|      |
                 ___________                                                      _______________________________
_________|                   |______________________________|                                                     |__________

      0           1             1            0          0               0         0               1       1            1               1         0

Fijate en los flancos ascendentes, la señal de arriba es el CLK y la de abajo la de datos


Asi que si vas a utilizar un SPI por Software, debes generar las 2 señales, la de CLK y la de salida serial. Y la idea es la siguiente:
Quiero en enviar 1010 0011

Entonces pongo el bit 0 o 7 segun sea necesario. y envio un pulso de clock, supongamos que comienza por el bit 0.

1 en dato, pulso de CLK ( es decir en 1 esto hace que tome el dato y luego a 0 )
1 en dato, pulso de CLK
0 en dato, pulso de CLK
0 en dato, pulso de CLK
0 en dato, pulso de CLK
1 en dato, pulso de CLK
0 en dato, pulso de CLK
1 en dato, pulso de CLK

Fin, ya envie mi byte al receptor, y el sabe exactamente cuando agarrarlo.

Espero que esto resuelva tu pregunta. O para decirlo mas claro. Tenes que generar 2 señales.
Título: Re: ayuda con mejora de programa
Publicado por: yair_xiox en 15 de Septiembre de 2015, 11:40:36
killer lei el datasheet del micro entonces como hago en ccs para enviar una señal por spi me dice que tengo que tocar algunos registros pero eso solo se puede hacer en asembler no se como hacerlo en ccs para enviar la señal por spi, y entonces si por ejemplo necesito enviar la siguiente señal por spi 0,1,0,1,0,1,0,1,0,1,1,0,1,0,1,1 no entendi bien cual señal deberia enviar por clk
Título: Re: ayuda con mejora de programa
Publicado por: KILLERJC en 15 de Septiembre de 2015, 17:08:02
No manejo CCS, es mi anti-compilador, lo odio xD.

Con respecto a esto:
Citar
entonces si por ejemplo necesito enviar la siguiente señal por spi 0,1,0,1,0,1,0,1,0,1,1,0,1,0,1,1

Te das cuenta cual es la diferencia entre un bit y un byte ?, Sabes como funciona el SPI (es lo que explique en mi anterior respuesta)? Leiste sobre el modulo en el datasheet? Sabes de a cuantos bytes o bits envia el SPI?
Son preguntas que deberias saberlas. Ya que no estas simplemente encendiendo un led, como seria el objetivo de los primeros programas.

Ahora como configurar el SPI para CCS, se debe usar la directiva #use SPI, los parametros estan en el manual de CCS. No se cuales son ya que no soy amante de CCS.

Manual de CCS:
http://es.lmgtfy.com/?q=CCS+manual

Ejemplos de SPI:
http://es.lmgtfy.com/?q=ccs+spi+example
http://www.ccsinfo.com/content.php?page=spi

Lo mejor es que te guies por ejemplo sobre como configurar el SPI y tengas el manual del CCS para aprender que son cada funcion.
Mas no te puedo ayudar, te estuve explicando una y otra ves que es lo que tenes que generar, hasta de un codigo "ejemplo" (obviamente que no funciona pero que deberia ser extremadamente facil de entender y modificarlo para que funcionara, tan facil que es absurdo).
Tambien te dividi en funciones por si querias hacer una libreria para manejar el MBI, asi te era mas facil por si nunca habias hecho una libreria. Lo unico que me queda hacer es ponerme a hacer el programa yo y pasartelo hecho. Y yo no manejo CCS pero tampoco me pondria a hacer el trabajo de los demas. Y creo que parte por ser un poco autodidacta, aca en el foro el 90% de los problemas se soluciona buscando en google

Citar
no entendi bien cual señal deberia enviar por clk

Te dibuje la señal en el tiempo, la tenes en el datasheet del MBI, te di el programa de ejemplo en el que solo ha que cambiar cositas pequeñas para que funcione, te explique como funciona una transmision sincrona para que entendieras lo del clock, no entiendo como es que todavia no entendes cual es la señal de clock, hasta te di pasos basicos de como es y de como tenes que cambiar las salidas (poner a 1 la sailda, luego ponera a 0 y asi), incluso si lo comparas con el programas vas a ver que son identicos, es decir hacen lo mismo . Ya no se mas como explicarte, intente de muchas maneras.

Para terminar y no darle demasiadas vueltas:

Datasheet al micro:
http://ww1.microchip.com/downloads/en/DeviceDoc/30325b.pdf
Ahi esta explicado el SPI, como funciona, como es el hardware, los pines de salida, los registros que tiene (aunque no los modifiques directamente, sabes que poseen) etc.
Si queres otra explicacion podes encontrar varias con solo buscar google, por eso mismo no voy a explicar como funciona el SPI. A pesar que ya di ejmplos de las ondas de salida

Manual de CCS
https://www.ccsinfo.com/downloads/ccs_c_manual.pdf
Ahi estan todas las funciones, abris el PDF y buscas spi, y seguro que tenes todas las funciones explicadas. Es complicado comenzar a usar CCS, pero tranquilamente podes buscar ejemplos en el que el SPI esta aplicado y empezar a entenderle.

Google es tu amigo, busca ejemplos y estudialos, preguntante el por que de cada cosita y asi vas a aprender.
Y mira que hay gente curiosa.. hasta recuerdo que uno pregunto en el foro por que desaparecia un 4 de la formula del PWM en el datasheet en ves de utilizarlo directamente. Me sorprendio que nunca lo habia visto, ni pensado.
Título: Re: ayuda con mejora de programa
Publicado por: yair_xiox en 15 de Septiembre de 2015, 18:29:12
hola, killer entonces para mandar la señal por spi seria mas o menos asi me puedes decir si tengo algun error en el codigo

Código: [Seleccionar]

#include <16f73.h>

#fuses XT,NOWDT,PUT, NOPROTECT


#use delay (clock =4000000)



#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use rs232(BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7, BITS=8)

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>





unsigned char datos [8]={0,1,0,1,0,1,0,1};
unsigned char  datos2 [8]={0,1,1,0,1,0,1,1}; 
void diagnostico (void)
{
int j;
int k;
delay_us(1);
for (j=0;j<8;j++ )
{
putc(datos[j]);
}
for (k=0;k<8;k++ )
{
putc(datos2[k]);
}
}
void init(){             
   setup_spi(SPI_MASTER |SPI_L_TO_H| SPI_XMIT_L_TO_H  | SPI_CLK_DIV_64);
   SET_TRIS_C(0x00);
   spi_write(0x31); //send the write instruction
   //spi_write(0x01); //address of a register to test reading and writing  //
   spi_write(0x2D); //send the write instruction//
   spi_write(0x08); //address of a register to test reading and writing 
}

int x0;
int x1;
void main(){

set_tris_b(0x00);
set_tris_a(0x10);
set_tris_c(0x80);
setup_adc_ports(NO_ANALOGS);



output_high(PIN_A0);
 
while(true)
{

if(input(PIN_A4)==0)
{
output_high(PIN_B0);
output_high(PIN_B1);
output_high(PIN_B2);
output_high(PIN_B3);
}
else
{
output_low(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B2);
output_low(PIN_B3);
}

init();
printf( "datos[j]");
printf( "datos2[k]");
OUTPUT_LOW(PIN_C3);
      delay_us(5);
x0= spi_read(0x32);
x1= spi_read(0x32);
OUTPUT_HIGH(PIN_C3);
      printf( "valor %c\r\n", x0);
printf( "valor %c\r\n", x1);
delay_ms(1000);
diagnostico();

 
}
}
Título: Re: ayuda con mejora de programa
Publicado por: KILLERJC en 15 de Septiembre de 2015, 18:54:30
Tu programa no posee logica, por eso mismo te dije tantas veces que deberias buscar un tutorial de C. Tambien no estas usando correctamente las funciones de CCS, por eso mismo te puse el link al manual de CCS. Y tampoco conoces el hardware, por eso mismo te di el datasheet de tu micro.

Tambien parecen codigos pegados al azar, parecen pero estoy mas que seguro que es asi, tambien veo que no leiste lo que puse sobre como configurar el SPI. O que te saltaste varias cosas de los ejemplo que encontraste en internet.
Seguis teniendo la UART configurada cuando no te haria ni falta usarla. Tampoco veo que la utilizes de debug.

Como consejo: No vas a entender nada si no te pones de cabeza a leer, estas tirando codigos al azar y rogando que funcionen, en ves de leer, estudiarlo, aprenderlo y entenderlo. Asi siempre vas a fallar en lo que quieras realizar con respecto a la programacion.
Debe ser el 1% o menos de los casos en el que el caso de copiar una libreria de internet y funciona todo bien. Para eso esta Arduino, hizo un muy buen trabajo con respecto a eso. Te compras un shield, bajas una libreria que funcione con ese shield y funciona.
Pero la realidad cuando no tenes un shield ya no es asi. Apenas hay un problema tan simple como este y te desmoronas por no saber lo basico.

No te desiluciones, solo se necesita atencion de tu parte, sos vos el que finalmente vas a decidir si queres aprender o no.
De hacer el codigo o decirte que esta mal lo unico que hago es darte el codigo y que no aprendas nada. Y eso va en contra de mis ideas. prefiero que aprendas y seas capaz de valerte por vos mismo y no depender de los demas. Pero que eso no te confunda con que voy a explicar una y otra ves lo mismo. Sos vos el que tiene que poner voluntad para aprender e interesarse, y no yo darte todo en bandeja de plata. Cuando ya agotaste todas tus ideas, buscaste a mas no poder, ahi si recurris a las demas personas.
Título: Re: ayuda con mejora de programa
Publicado por: yair_xiox en 16 de Septiembre de 2015, 17:35:01
hola, esto
Código: [Seleccionar]

#use SPI(
   DO = PIN_C5,
   DI = PIN_C4,
   CLK = PIN_C3,
   baud =9600 ,
   BITS = 8,
   LSB_FIRST,
   SAMPLE_RISE,
   stream = SPI_PORT0
)
no me sirve me vota muchos errores no importa donde lo ponga y cuando lo cambio por esto
Código: [Seleccionar]
void spi_ini(void){
   DO = PIN_C5,
   DI = PIN_C4,
   CLK = PIN_C3,
   baud =9600 ,
   BITS = 8,
   LSB_FIRST,
   SAMPLE_RISE,
   stream = SPI_PORT0
}
me salen dos errores y no se como quitarlos

Clean: Deleting intermediary and output files.
Clean Warning: File "C:\Users\ciel\Desktop\archivos mplab\programa7.o" doesn't exist.
Clean: Deleted file "C:\Users\ciel\Desktop\archivos mplab\programa7.ERR".
Clean: Done.
Executing: "C:\Program files\Picc\CCSC.exe" +FM "programa7.c" +DF +LN +T +A +M +Z +Y=9 +EA #__16F73=TRUE
*** Error 51 "programa7.c" Line 43(7,8): A numeric expression must appear here
*** Error 75 "programa7.c" Line 51(1,2): Expect WHILE
      2 Errors,  0 Warnings.
Build Failed.
Halting build on first failure as requested.
BUILD FAILED: Wed Sep 16 15:34:48 2015

Título: Re: ayuda con mejora de programa
Publicado por: yair_xiox en 16 de Septiembre de 2015, 18:27:32
Y cuando lo uso asi
Código: [Seleccionar]
#use SPI(MASTER,DI=PIN_B1, DO=PIN_B0, CLK=PIN_B2,baud=9600, BITS=8,MODE=0)me salen estos errores
Clean: Deleting intermediary and output files.
Clean Warning: File "C:\Users\ciel\Desktop\archivos mplab\programa7.o" doesn't exist.
Clean: Deleted file "C:\Users\ciel\Desktop\archivos mplab\programa7.ERR".
Clean: Done.
Executing: "C:\Program files\Picc\CCSC.exe" +FM "programa7.c" +DF +LN +T +A +M +Z +Y=9 +EA #__16F73=TRUE
*** Error 100 "programa7.c" Line 15(5,75): USE parameter value is out of range   "#USESPI(MASTER"
*** Error 102 "programa7.c" Line 33(13,14): Expect comma
*** Error 102 "programa7.c" Line 34(14,15): Expect comma
*** Error 102 "programa7.c" Line 38(14,15): Expect comma
      4 Errors,  0 Warnings.
Build Failed.
Halting build on first failure as requested.
BUILD FAILED: Wed Sep 16 16:25:57 2015
codigo completo
Código: [Seleccionar]

#include <16f73.h>

#fuses XT,NOWDT,PUT, NOPROTECT


#use delay (clock =4000000)



#use fast_io(A)
#use fast_io(B)
#use fast_io(C)

#use SPI(MASTER,DI=PIN_B1, DO=PIN_B0, CLK=PIN_B2,baud=9600, BITS=8,MODE=0)
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>




unsigned char datos [8]={0,1,0,1,0,1,0,1};
unsigned char  datos2 [8]={0,1,1,0,1,0,1,1}; 
void diagnostico (void)
{
int j;
int k;
delay_us(1);
for (j=0;j<8;j++)
{
putc(datos[j]);
putc(datos2[k]);
}
for (k=0;k<8;k++ )
{
putc(datos2[k]);
}
}






void main(){


set_tris_b(0x00);
set_tris_a(0x10);
set_tris_c(0x80);
setup_adc_ports(NO_ANALOGS);



output_high(PIN_A0);
 
while(true)
{

if(input(PIN_A4)==0)
{
output_high(PIN_B0);
output_high(PIN_B1);
output_high(PIN_B2);
output_high(PIN_B3);
}
else
{
output_low(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B2);
output_low(PIN_B3);
}
 

 
}
}

Título: Re: ayuda con mejora de programa
Publicado por: yair_xiox en 16 de Septiembre de 2015, 18:47:03
Código: [Seleccionar]

#include <16f73.h>

#fuses XT,NOWDT,PUT, NOPROTECT


#use delay (clock =4000000)



#use SPI(MASTER,MODE=1,DO = PIN_C5,DI = PIN_C4,CLK = PIN_C3,baud =9600,BITS = 8,LSB_FIRST,SAMPLE_RISE,stream = SPI_PORT0)
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)


#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>




unsigned char datos [8]={0,1,0,1,0,1,0,1};
unsigned char  datos2 [8]={0,1,1,0,1,0,1,1}; 
void diagnostico (void)
{
int j;
int k;
delay_us(1);
for (j=0;j<8;j++)
{
putc(datos[j]);

}
for (k=0;k<8;k++ )
{
putc(datos2[k]);
}
}




int j,k;
void main(){


set_tris_b(0x00);
set_tris_a(0x10);
set_tris_c(0x80);
setup_adc_ports(NO_ANALOGS);



output_high(PIN_A0);
 
while(true)
{

if(input(PIN_A4)==0)
{
output_high(PIN_B0);
output_high(PIN_B1);
output_high(PIN_B2);
output_high(PIN_B3);
}
else
{
output_low(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B2);
output_low(PIN_B3);
}
datos2[k]=spi_xfer(0);


 
}
}
este codigo funciona alguien lo puede probar en proteus haber si envia la señal por spi
Título: Re: ayuda con mejora de programa
Publicado por: Chenao en 16 de Septiembre de 2015, 22:27:45
Compañero yair_xiox veo el código muy desorganizado no entiendo para que creas una función diagnostico() si no la utilizas, segundo utilizas la directivas #use fast_io(puerto) pero luego utilizas las funciones tris_puerto(xx) se asume que al definir la directiva no resulta necesario configurar los puertos del micro.

Con respeto al SPI hay muchos ejemplos donde se explica en detalle como programarlo en microcontroladores que posean un módulo de comunicaciones seriales síncrona, además hay simulaciones, códigos en esamblador en fin. Acá (http://www.todopic.com.ar/foros/index.php?topic=28952.0) se explica en detalle este protocolo con un 16f877. Te recomiendo que leas el hilo y estudies los ejemplos que se comparten.  
Título: Re: ayuda con mejora de programa
Publicado por: KILLERJC en 16 de Septiembre de 2015, 22:43:49
Compañero yair_xiox veo el código muy desorganizado no entiendo para que creas una función diagnostico() si no la utilizas, segundo utilizas la directivas #use fast_io(puerto) pero luego utilizas las funciones tris_puerto(xx) se asume que al definir la directiva no resulta necesario configurar los puertos del micro.

Ahi estas equivocado, el standart_io es el que viene por default con CCS, y es el que te acomoda los tris solo, esto lo hace cada ves que escribis una salida. Es decir el compilador agrega lineas de mas. Lo bueno es que si tenes una "salida" y lees el peurto lo convierte en entrada. Lo malo es justamente lo mismo, si tenes una entrada en el bit 6, y queres cambiar del bit 0 al 5, lo mas seguro que termines cambiando todo.

Con fast_io ya no agrega esas lineas de codigo. Y debes setear los TRIS tal cual hace.
Título: Re: ayuda con mejora de programa
Publicado por: Chenao en 16 de Septiembre de 2015, 23:04:50

Compañero KILLERJC tienes toda la razón eso me pasa por no consultar el manual antes de comentar. En efecto la idea de la directiva # USE FAST_IO es construir código mucho más eficientes. Saludos y gracias por la corrección.


Título: Re: ayuda con mejora de programa
Publicado por: yair_xiox en 22 de Septiembre de 2015, 18:49:40
hola, ya cambie el programa por un spi por hardware  porque es mas facil asi pero divide la señal de 2 bytes en dos señales no se si funcione bien o no en proteus sale una señal que sube y baja y despues de cada 3 pulsos parce una señal cuadrada
Código: [Seleccionar]
#if defined(__PCM__)
#include <16f73.h>

#fuses XT,NOWDT,PUT, NOPROTECT


#use delay (clock =4000000)




#use fast_io(A)
#use fast_io(B)
#use fast_io(C)


#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>




unsigned char datos [8]={0,1,0,1,0,1,0,1};
unsigned char datos2 [8]={0,1,1,0,1,0,1,1};
void diagnostico (void)
{
int j;
int k;
 set_tris_c(0x08);            // Configuración del puerto C para trabajar el spi
setup_spi(spi_master | spi_l_to_h | spi_clk_div_64);
delay_us(1);
for (k=0;k<8;k++)
{
for (j=0;j<8;j++)
{

 spi_write(datos[j]);
 spi_write(datos2[k]);
delay_ms(200);
}
}
}


 
 


void main(){


set_tris_b(0x00);
set_tris_a(0x10);
set_tris_c(0x80);
setup_adc_ports(NO_ANALOGS);



output_high(PIN_A0);
 
while(true)
{

if(input(PIN_A4)==0)
{
output_high(PIN_B0);
output_high(PIN_B1);
output_high(PIN_B2);
output_high(PIN_B3);
}
else
{
output_low(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B2);
output_low(PIN_B3);
}

diagnostico();

 
}
}

Título: Re: ayuda con mejora de programa
Publicado por: RALF2 en 22 de Septiembre de 2015, 19:34:20
Esta parte del codigo la veo algo rara:
Citar
for (k=0;k<8;k++)
{
    for (j=0;j<8;j++)
   {
        spi_write(datos[j]);
        spi_write(datos2[k]);
        delay_ms(200);
    }
}

Fijate bien datos[j] enviara 8 datos ditintos repetidos 8 veces, alli esta bien, pero datos2 enviara 8 veces un mismo mismo dato 8 veces para luego cambiar al proximo dato, eso es lo que quieres?

Por otro lado el tris_c en la rutina diagnostico no hace falta puesto que ya lo declarastes en el main.

Saludos
Título: Re: ayuda con mejora de programa
Publicado por: yair_xiox en 22 de Septiembre de 2015, 20:53:42
gracias, pero esa parte esta asi porque datos2 tambien cambia y lo deje asi porque necesito enviar una señal de 2 bytes y por eso la dividi en dos señales
Título: Re: ayuda con mejora de programa
Publicado por: KILLERJC en 22 de Septiembre de 2015, 22:06:50
Pero ahi estas enviando un total de 64 * 2 bytes, es decir 128 bytes , o lo que es lo mismo que 1024 bits.

Con 200ms entre medio de cada uno, eso mismo esta tardando unos 12.8 segundos en terminarse., tal ves 13 hasta que se envie todo + otras instrucciones.
Estoy mas que seguro que no es lo que queres hacer.
El setup del SPI esta dentro del while, y esta mal, solo deberias llamarlo una sola ves. El set_tris esta dentro del while y a pesar que no cambie nada es un error.

Para parender como conectar el integrado ese:

Comenza investigando cuales son las entradas y cuales son las salidas de ese integrado.
Tambien que funcion cumple cada pin del otro integrado. Eso es con lo que deberias comenzar.

Luego esta lo de SPI, busca como es la onda de un SPI, cuantos bits se envian, Lee el datasheet del PIC que estas trabajando , ahi te va a explicar el SPI. Vas a ver un diagrama con los pines y las partes del mismo
Título: Re: ayuda con mejora de programa
Publicado por: yair_xiox en 23 de Septiembre de 2015, 10:08:48
si pero eso ya lo hice ya leí ambos datasheets  y por spi solo se pueden enviar 8 bits pero yo necesito enviar 16 bits
Título: Re: ayuda con mejora de programa
Publicado por: KILLERJC en 23 de Septiembre de 2015, 10:42:40
si pero eso ya lo hice ya leí ambos datasheets  y por spi solo se pueden enviar 8 bits pero yo necesito enviar 16 bits


es que todavia tenes un error, supongo que estos son los bits a enviar:

unsigned char    datos   [8]={0,1,0,1,0,1,0,1};
unsigned char    datos2   [8]={0,1,1,0,1,0,1,1};


Cada uno de esos es un byte!, es decir 8 bits, si pones un 1, no significa que va a enviar un 1. sino que va a enviar 0000 0001 ( 8 bits, en ves de 1 como queres)
La funcion spi_write() acepta de a bytes, asi que si pones un spi-write(1) va a suceder lo mismo que nombre antes

Entonces como haces para tener a la salida del SPI esos bits que queres? Simplemente enviando un byte con esa informacion 0110 1011 = 0x6B

Y con eso usas spi_write(0x6B);

Otra cosa mas, si leiste el modulo del SPI del PIC, te daras cuenta que el SPI por Hardware, genera solo la señal de clock, es decir esto : datos   [8]={0,1,0,1,0,1,0,1};
Lo genera solo el pin de CLK del modulo. no tenes que hacerlo. Asi al poner:

spi_write(0x6B) vas a poder ver como las 2 salidas (CLK y datos) se "mueven" (se van a poner en 0 o 1) enviando ese valor al integrado.

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

Esto hace que no tengas que enviar los 16 bits que nombras.
Si por ejemplo tenes mas de 1 MBI conectado, los primeros 8 bits que envies seran del ultimo MBI, ya que envias los 8 bits, el primero llena su shif-register, y si envias 8 mas, esos 8 que tenia el primer MBI se los pasa al segundo, y los 8 que llegaron se quedan en el primer MBI.
Pensalo como una cadena. En el que hay eslabones, en el cual tenes 8 pertenecen a cada MBI y 8 a tu PIC Vos pones tus datos en los eslabones del PIC y cuando envias 8 es como que siguen la cadena llegando a completarse los 8del primer MBI, luego si pones otros 8 mas en el PIC y envias, cada bit que envies va a seguir moviendo los datos para adelante, con el resultado que dije antes, esos 8 que enviaste primero quedaran en el segundo MBI y los 8 que enviaste segundo quedaran en el primer MBI

Entonces si por ejemplo tenes 3 MBI lo que tenes que hacer para fijar el valor de cada uno es:

spi_write(0x6B)  // Aca enciendo varias salidas 0110 1011 , este es el ultimo MBI
spi_write(0x12)  // Aca solo 2 0001 0010 , MBI del medio
spi_write(0x80)  // Aca solo 1 1000 0000 , Primer MBI

Y para guardar eso en los integrados MBI hay que darle un pulso al pin LE de todos los MBI. (Esto no tiene nada que ver con el SPI )

output_high(PIN_LE);
output_low(PIN_LE);

Listo ya con eso configuraste tus integrados :)

PD: para el SPI creo que necesitas usar el #use SPI de CCS, solo tener cuidado de ponerlo en los pines que tiene Hardware o marcarlo como SPI1
Título: Re: ayuda con mejora de programa
Publicado por: yair_xiox en 23 de Septiembre de 2015, 11:04:31
gracias killer, aunque necesito enviar las dos señales que son aparte del clock datos y datos2 es necesario enviarlas pero ahora ya se como hacerlo creo que seria así porque por ahora estoy solo probando en un solo MBI y si funciona luego ya seria en los 4 MBI
Código: [Seleccionar]
#if defined(__PCM__)
#include <16f73.h>

#fuses XT,NOWDT,PUT, NOPROTECT


#use delay (clock =4000000)

 


#use fast_io(A)
#use fast_io(B)
#use fast_io(C)


#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>




//unsigned char datos [8]={0,1,0,1,0,1,0,1};
//unsigned char datos2 [8]={0,1,1,0,1,0,1,1};
void diagnostico (void)
{
int j;
//int k;       
setup_spi(spi_master | spi_l_to_h | spi_clk_div_64);
delay_us(1);
for (j=0;j<8;j++)
{

 spi_write(0x6B);
 spi_write(0X55);
delay_ms(200);
output_high(PIN_C2);
output_low(PIN_C2);
}
}


 
 


void main(){


set_tris_b(0x00);
set_tris_a(0x10);
set_tris_c(0x80);
setup_adc_ports(NO_ANALOGS);



output_high(PIN_A0);
 
while(true)
{

if(input(PIN_A4)==0)
{
output_high(PIN_B0);
output_high(PIN_B1);
output_high(PIN_B2);
output_high(PIN_B3);
}
else
{
output_low(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B2);
output_low(PIN_B3);
}

diagnostico();

 
}
}

Título: Re: ayuda con mejora de programa
Publicado por: KILLERJC en 23 de Septiembre de 2015, 11:11:32
Quita el for, ahi estarias enviando muchos datos mas que 16 bits

El MBI solo recibe 8 (y puede mantener 8 nomas) no se por que necesitas 16bits, si explicas el por que mejor, asi se entiende lo que estas tratando de hacer.
Si envias mas de 8 solo le va a quedar lo ultimo que le envies, en tu caso envias:

0x6B 0x55 0x6B 0x55 0x6B 0x55 0x6B 0x55 0x6B 0x55 0x6B 0x55 0x6B 0x55 0x6B 0x55

Lo ultimo que le va a quedar es el 0x55, para eso directamente poner un spi_write(0x55) y listo.. te das cuenta cual es tu error ?
Título: Re: ayuda con mejora de programa
Publicado por: yair_xiox en 23 de Septiembre de 2015, 11:19:55
ok gracias, lo de los 16 bits que quiero enviar es por una configuración en el datasheet que dice que necesita esos bits en las salidas de la 0 a la 15 para entrar en modo de detección de error pero ahí dice que necesita todos los bits
Código: [Seleccionar]
#if defined(__PCM__)
#include <16f73.h>

#fuses XT,NOWDT,PUT, NOPROTECT


#use delay (clock =4000000)

 


#use fast_io(A)
#use fast_io(B)
#use fast_io(C)


#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>




//unsigned char datos [8]={0,1,0,1,0,1,0,1};
//unsigned char datos2 [8]={0,1,1,0,1,0,1,1};
void diagnostico (void)
{
//int j;
//int k;       
setup_spi(spi_master | spi_l_to_h | spi_clk_div_64);
delay_us(1);
 spi_write(0x6B);
 spi_write(0X55);
delay_ms(200);
output_high(PIN_C2);
output_low(PIN_C2);

}


 
 


void main(){


set_tris_b(0x00);
set_tris_a(0x10);
set_tris_c(0x80);
setup_adc_ports(NO_ANALOGS);



output_high(PIN_A0);
 
while(true)
{

if(input(PIN_A4)==0)
{
output_high(PIN_B0);
output_high(PIN_B1);
output_high(PIN_B2);
output_high(PIN_B3);
}
else
{
output_low(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B2);
output_low(PIN_B3);
}

diagnostico();

 
}
}

Título: Re: ayuda con mejora de programa
Publicado por: KILLERJC en 23 de Septiembre de 2015, 11:52:01
Tenes razon, hoy parece que me levante dormido, el MBI acepta 16 bits, y no 8 como vengo diciendo asi que te pido perdon.

Es correcto sin el for de todas formas.

Hasta ahora solo lo que se hizo fue programarle las salidas.

- Que ocurre si es que queremos ver los errores?

Para ver los errores no hace falta modificar el pin LE del micro. Pero hay que tener una consideracion
Que se debe poner a 0 el pin OE por un tiempo, luego ponerlo a 1, y ahi "pedir" lso 16 bits que son los errores
(Explicado en la pagina 14 del datasheet)

Entonces
int8 j,k

output_low(PIN_OE);
delay_us(1);
output_high(PIN_OE);
j = spi_read(0);
k = spi_read(0);
// Observa que no toco el pin LE

en j y k tendrias tus errores.
El OE desabilita las salidas del MBI, pero es necesario para detectar los errores. Una ves que ocurre esto usas spi_read, spi_read al ser el maestro envia solo 8 pulsos de clock, moviendose los datos y llegando los primeros 8 errores al PIC y guardo en j, envio de nuevo asi llegan los otros 8 errores y guardo en k
Estos errores salen por el pin SDO del MBI que deberia entrar en el pin de entrada del SPI del PIC
Título: Re: ayuda con mejora de programa
Publicado por: yair_xiox en 23 de Septiembre de 2015, 12:34:44
ok, entonces para mejorar el programa seria mas o menos así
Código: [Seleccionar]
#if defined(__PCM__)
#include <16f73.h>

#fuses XT,NOWDT,PUT, NOPROTECT


#use delay (clock =4000000)

#define PIN_OE PIN_C1
#define PIN_LE PIN_C2


#use fast_io(A)
#use fast_io(B)
#use fast_io(C)


#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>



int8 j,k; 
//unsigned char datos [8]={0,1,0,1,0,1,0,1};
//unsigned char datos2 [8]={0,1,1,0,1,0,1,1};
void diagnostico (void)
{
     
setup_spi(spi_master | spi_l_to_h | spi_clk_div_64);
delay_us(1);
 spi_write(0x6B);
 spi_write(0X55);
output_low(PIN_OE);
delay_us(1);
output_high(PIN_OE);
j = spi_read(0);
k = spi_read(0);
delay_ms(200);


}


 
 


void main(){


set_tris_b(0x00);
set_tris_a(0x10);
set_tris_c(0x80);
setup_adc_ports(NO_ANALOGS);



output_high(PIN_A0);
 
while(true)
{

if(input(PIN_A4)==0)
{
output_high(PIN_B0);
output_high(PIN_B1);
output_high(PIN_B2);
output_high(PIN_B3);
}
else
{
output_low(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B2);
output_low(PIN_B3);
}

diagnostico();

 
}
}

y faltarían conectar y probar pero lo que no he podido hacer y no se como es que cuando detecte error prenda
 los leds y cuando no los apague esa parte es muy difícil ya que el MBI solo manda una señal cuadrada como salida y esto es difícil de detectar para los leds
ya que los leds solo se prenden cuando hay uno o cero pero constantes no una señal que cambia entre ambos estados
Título: Re: ayuda con mejora de programa
Publicado por: KILLERJC en 23 de Septiembre de 2015, 12:44:23
No lo mejoraste estas enviando datos por querer. Pero si es una mejora
Aca un codigo que apenas arranca programa al MBI para que encienda unas salidas.

Luego entra en el while y se la pasa preguntando si hay un error, al haber un error , errores va a ser distinto de 0, y va a encender todos los leds.
Estudia el codigo, fijate que lo primero que se ejecuta es el main, que funciones se ejecutan antes de entrar al while, y preguntate el por que de cada cosa

Código: C
  1. #include <16f73.h>
  2.  
  3. #fuses XT,NOWDT,PUT, NOPROTECT 
  4.  
  5.  
  6. #use delay (clock =4000000)
  7.  
  8. #define PIN_OE  PIN_C1
  9. #define PIN_LE  PIN_C2
  10.  
  11.  
  12. #use fast_io(A)
  13. #use fast_io(B)
  14. #use fast_io(C)
  15.  
  16.  
  17. int16 errores;
  18.  
  19. void diagnostico (void)
  20. {
  21.         int8 j,k;      
  22.         output_low(PIN_OE);
  23.         output_high(PIN_OE);
  24.         j = spi_read(0);
  25.         k = spi_read(0);
  26.         errores = make16(j,k); 
  27. }
  28.  
  29.  
  30. void programarMBI (void)
  31. {
  32.         spi_write(0x6B);
  33.         spi_write(0X55);
  34.         output_high(PIN_LE);
  35.         output_low(PIN_LE);
  36. }
  37.  
  38.  
  39.  
  40.  
  41. void main(){
  42.  
  43.        
  44.         set_tris_b(0x00);
  45.         set_tris_a(0x10);
  46.         set_tris_c(0x80);
  47.         setup_adc_ports(NO_ANALOGS);
  48.         setup_spi(spi_master | spi_l_to_h | spi_clk_div_64);
  49.  
  50.         output_high(PIN_A0);
  51.  
  52.         programarMBI(); //Lo voy a hacer una sola ves
  53.  
  54.         while(true)
  55.         {
  56.  
  57.                 if(errores)
  58.                 {
  59.                         output_b(0x0F);
  60.                 }
  61.                 else
  62.                 {
  63.                         output_b(0x0);
  64.                 }
  65.  
  66.                 diagnostico();
  67.         }
  68. }

Citar
y faltarían conectar y probar pero lo que no he podido hacer y no se como es que cuando detecte error prenda
 los leds y cuando no los apague esa parte es muy difícil ya que el MBI solo manda una señal cuadrada como salida y esto es difícil de detectar para los leds
ya que los leds solo se prenden cuando hay uno o cero pero constantes no una señal que cambia entre ambos estados

Los datos recibidos por el SPI a pesar que sean un tren de pulso, cuando entra al PIC y recibis el byte, ya es un dato "fijo" para vos. Lo tenes almacenado en un byte. si algun bit es 1 significa que hay un error. Si es que no estoy equivocado de logica
Título: Re: ayuda con mejora de programa
Publicado por: yair_xiox en 23 de Septiembre de 2015, 12:53:05
ok gracias killer ahí lo único que falta es poner mas arriba diagnostico y listo
Título: Re: ayuda con mejora de programa
Publicado por: yair_xiox en 23 de Septiembre de 2015, 13:16:02
hola killer el programa funciona bien pero cuando le doy simular la flecha se queda en el primer spiwrite luego de llamar a programarMBI y no la ejecuta y no pasa de ahi
tienes alguna idea porque pasa eso
Código: [Seleccionar]

#include <16f73.h>
 
#fuses XT,NOWDT,PUT, NOPROTECT
 
 
#use delay (clock =4000000)
 
#define PIN_OE PIN_C1
#define PIN_LE PIN_C2
 
 
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
 
 
int16 errores;
 
void diagnostico (void)
{
int8 j,k;       
output_low(PIN_OE);
output_high(PIN_OE);
j = spi_read(0);
k = spi_read(0);
errores = make16(j,k);
}
 
 
void programarMBI (void)
{
spi_write(0x6B);
spi_write(0X55);
output_high(PIN_LE);
output_low(PIN_LE);
}
 
 
 
 
void main(){
 

set_tris_b(0x00);
set_tris_a(0x10);
set_tris_c(0x80);
setup_adc_ports(NO_ANALOGS);
setup_spi(spi_master | spi_l_to_h | spi_clk_div_64);
 
output_high(PIN_A0);
 
programarMBI();
  diagnostico();
while(true)
{
 
if(errores)
{
output_b(0x0F);
}
else
{
output_b(0x0);
}
 

}
}
Título: Re: ayuda con mejora de programa
Publicado por: KILLERJC en 23 de Septiembre de 2015, 13:51:45
A eso le falta algo, algo que ya lo dije muchas veces en este hilo. Pero lo pasaste de largo. Busca ejemplos de SPI con CCS y vas a notar lo distinto.
Ademas no vas a poder simularlo, ya que luego vas a necesitar ingresarle datos por SPI. Si estas usando MPLAB entonces vas a tener que usar el stimulus creo que es el que permite eso. Y se va a poner mas complejo. Tal ves pierdas mas tiempo haciendo eso que solo programando el micro y observandolo en fisico
Título: Re: ayuda con mejora de programa
Publicado por: yair_xiox en 23 de Septiembre de 2015, 15:13:56
hola, ya mire algunos ejemplos y le agregue la habilitación del pin SS que vi en un ejemplo pero también activaban las interrupciones que no entendí para que lo hacían
http://www.forosdeelectronica.com/f24/comunicacion-spi-pic-39734/
Código: [Seleccionar]
#if defined(__PCM__)

#include <16f73.h>
 
#fuses XT,NOWDT,PUT, NOPROTECT
 
 
#use delay (clock =4000000)
 
#define PIN_OE PIN_C1
#define PIN_LE PIN_C2
 
 
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
 
 
int16 errores;
 
void diagnostico (void)
{
int8 j,k;       
output_low(PIN_OE);
output_high(PIN_OE);
j = spi_read(0);
k = spi_read(0);
errores = make16(j,k);
}
 
 
void programarMBI (void)
{
output_low(PIN_A5);
spi_write(0x6B);
spi_write(0X55);
output_high(PIN_LE);
output_low(PIN_LE);
output_high(PIN_A5);
}
 
 
 
 
void main(){
 

set_tris_b(0x00);
set_tris_a(0x10);
set_tris_c(0x80);
setup_adc_ports(NO_ANALOGS);

setup_spi(spi_master | spi_l_to_h | spi_clk_div_64);
output_low(PIN_A5);
    output_high(PIN_A5);
 
output_high(PIN_A0);
 
programarMBI();
  diagnostico();
while(true)
{
 
if(errores)
{
output_b(0x0F);
}
else
{
output_b(0x0);
}
 

}
}
Título: Re: ayuda con mejora de programa
Publicado por: yair_xiox en 28 de Septiembre de 2015, 19:17:58
hola ahora si estara bien asi le agregue estas dos lineas
 if  ( spi_data_is_in() )
   new_data = spi_read();
Código: [Seleccionar]
#if defined(__PCM__)

#include <16f73.h>
 
#fuses XT,NOWDT,PUT, NOPROTECT
 
 
#use delay (clock =4000000)
 
#define PIN_OE PIN_C1
#define PIN_LE PIN_C2
 
 
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
 
 
int16 errores;
 
void diagnostico (void)
{
int8 j,k;       
output_low(PIN_OE);
output_high(PIN_OE);
j = spi_read(0);
k = spi_read(0);
errores = make16(j,k);
}
 
 char new_data;
void programarMBI (void)
{
output_low(PIN_A5);
spi_write(0x6B);
spi_write(0X55);
output_high(PIN_LE);
output_low(PIN_LE);
output_high(PIN_A5);
if  ( spi_data_is_in() )
new_data = spi_read();
}
 
 
 
 
void main(){
 

set_tris_b(0x00);
set_tris_a(0x10);
set_tris_c(0x80);
setup_adc_ports(NO_ANALOGS);

setup_spi(spi_master | spi_l_to_h | spi_clk_div_64);
output_low(PIN_A5);
    output_high(PIN_A5);
 
output_high(PIN_A0);
 
programarMBI();
  diagnostico();
while(true)
{
 
if(errores)
{
output_b(0x0F);
}
else
{
output_b(0x0);
}
 

}
}
Título: Re: ayuda con mejora de programa
Publicado por: yair_xiox en 29 de Septiembre de 2015, 12:32:07
hola me pueden ayudar lo pobre en el circuito pero no funciona la matriz de leds no hace el escaneo que hacia antes cuando estaba por la uart conecte del MBI sdo a sdi del micro y sdi del mbi a sdo del micro pero al mirar la señal del reloj del micro del spi que deberia generar un pulso no lo esta haciendo
Título: Re: ayuda con mejora de programa
Publicado por: yair_xiox en 29 de Septiembre de 2015, 12:59:00
le cambio la frecuencia al reloj en el programa pero sigue sin generar la señal de pulso del reloj no se porque hace eso
Título: Re: ayuda con mejora de programa
Publicado por: yair_xiox en 01 de Octubre de 2015, 19:16:10
no se si asi funcione le puse los 4 ciclos del clk antes de enviar y 5 para leer
Código: [Seleccionar]
#if defined(__PCM__)

#include <16f73.h>
 
#fuses XT,NOWDT,PUT, NOPROTECT
 
 
#use delay (clock =4000000)
 
#define PIN_OE PIN_C1
#define PIN_LE PIN_C2
 
 
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use rs232(BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7, BITS=8)

 
int16 errores;
 
void diagnostico (void)
{
int8 j,k;       
output_low(PIN_OE);
output_high(PIN_OE);
j = spi_read(0);
k = spi_read(0);
errores = make16(j,k);
}
 
void programarMBI (void)
{
set_tris_c(0x10);
output_high(PIN_LE);
output_low(PIN_LE);
output_high(PIN_C3);
output_low(PIN_C3);
output_high(PIN_C3);
output_low(PIN_C3);
spi_write(0x6B);
spi_write(0X55);
output_high(PIN_C3);
output_low(PIN_C3);
output_high(PIN_C3);
output_low(PIN_C3);
output_low(PIN_C3);






void main(){
 

set_tris_b(0x00);
set_tris_a(0x00);
set_tris_c(0x80);
setup_adc_ports(NO_ANALOGS);

setup_spi(spi_master | spi_l_to_h | spi_clk_div_16);

 
output_high(PIN_A0);
 
programarMBI();
  diagnostico();
while(true)
{
 
if(errores)
{
output_b(0x00);
}
else
{
output_b(0x0F);
}
 

}
}
Título: Re: ayuda con mejora de programa
Publicado por: KILLERJC en 01 de Octubre de 2015, 20:41:17
Lamentablemente no te puedo ayudar, soy anti CCS por los mismos problemas que estas teniendo
Título: Re:ayuda con mejora de programa
Publicado por: yair_xiox en 14 de Octubre de 2015, 10:58:35
Código: [Seleccionar]
#if defined(__PCM__)

#include <16f73.h>
 
#fuses XT,NOWDT,PUT, NOPROTECT
 
 
#use delay (clock =4000000)
 
#define PIN_OE PIN_C1
#define PIN_LE PIN_C2
 
 
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)


 
int16 errores;
 
void diagnostico (void)
{
int8 j,k;       
output_low(PIN_OE);
output_high(PIN_OE);
j = spi_read(0);
k = spi_read(0);
errores = make16(j,k);
}
 
void programarMBI (void)
{
set_tris_c(0x10);
output_high(PIN_LE);
output_low(PIN_LE);
output_high(PIN_C3);
output_low(PIN_C3);
output_high(PIN_C3);
output_low(PIN_C3);
output_high(PIN_C3);
output_low(PIN_C3);
output_high(PIN_C3);
output_low(PIN_C3);
spi_write(0x6B);
spi_write(0X55);
output_high(PIN_C3);
output_low(PIN_C3);
output_high(PIN_C3);
output_low(PIN_C3);
output_high(PIN_C3);
output_low(PIN_C3);
output_high(PIN_C3);
output_low(PIN_C3);
output_high(PIN_C3);
output_low(PIN_C3);






void main(){
 

set_tris_b(0x00);
set_tris_a(0x00);
set_tris_c(0x80);
setup_adc_ports(NO_ANALOGS);

setup_spi(spi_master | spi_l_to_h | spi_clk_div_64 |SPI_SS_DISABLED);

 *0x94 |= 0x40;                          // set CKE = 1 - clock idle low
*0x14 &= 0xEF; // set CKP = 0 - data valid on rising edge
output_high(PIN_A0);
 
programarMBI();
  diagnostico();
while(true)
{
 
if(errores==0)
{
output_b(0x00);
}
else
{
output_b(0x0F);
}
 

}
}
hola aqui ya con este codigo en el circuito hace unos pequeños intentos de funcionar pero la mayoria de las veces no funciona no se porque
Título: Re:ayuda con mejora de programa
Publicado por: KILLERJC en 14 de Octubre de 2015, 15:55:06
Nuevamente, busca ejemplos de SPI por internet, eso que hiciste es cualquier cosa.

PD: te deje ahi un programa en ASM que envia unos caracteres por UART para PIC18, tal cual pediste.