Autor Tema: ayuda con mejora de programa  (Leído 5767 veces)

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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: ayuda con mejora de programa
« Respuesta #30 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

Desconectado yair_xiox

  • PIC16
  • ***
  • Mensajes: 210
Re: ayuda con mejora de programa
« Respuesta #31 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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: ayuda con mejora de programa
« Respuesta #32 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

Desconectado yair_xiox

  • PIC16
  • ***
  • Mensajes: 210
Re: ayuda con mejora de programa
« Respuesta #33 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();

 
}
}


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: ayuda con mejora de programa
« Respuesta #34 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 ?

Desconectado yair_xiox

  • PIC16
  • ***
  • Mensajes: 210
Re: ayuda con mejora de programa
« Respuesta #35 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();

 
}
}


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: ayuda con mejora de programa
« Respuesta #36 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

Desconectado yair_xiox

  • PIC16
  • ***
  • Mensajes: 210
Re: ayuda con mejora de programa
« Respuesta #37 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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: ayuda con mejora de programa
« Respuesta #38 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
« Última modificación: 23 de Septiembre de 2015, 12:47:00 por KILLERJC »

Desconectado yair_xiox

  • PIC16
  • ***
  • Mensajes: 210
Re: ayuda con mejora de programa
« Respuesta #39 en: 23 de Septiembre de 2015, 12:53:05 »
ok gracias killer ahí lo único que falta es poner mas arriba diagnostico y listo

Desconectado yair_xiox

  • PIC16
  • ***
  • Mensajes: 210
Re: ayuda con mejora de programa
« Respuesta #40 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);
}
 

}
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: ayuda con mejora de programa
« Respuesta #41 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

Desconectado yair_xiox

  • PIC16
  • ***
  • Mensajes: 210
Re: ayuda con mejora de programa
« Respuesta #42 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);
}
 

}
}

Desconectado yair_xiox

  • PIC16
  • ***
  • Mensajes: 210
Re: ayuda con mejora de programa
« Respuesta #43 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);
}
 

}
}

Desconectado yair_xiox

  • PIC16
  • ***
  • Mensajes: 210
Re: ayuda con mejora de programa
« Respuesta #44 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


 

anything