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

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

Desconectado yair_xiox

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

Desconectado KILLERJC

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

Desconectado yair_xiox

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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: ayuda con mejora de programa
« Respuesta #18 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.
« Última modificación: 15 de Septiembre de 2015, 17:31:51 por KILLERJC »

Desconectado yair_xiox

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

 
}
}

Desconectado KILLERJC

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

Desconectado yair_xiox

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


Desconectado yair_xiox

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

 
}
}


Desconectado yair_xiox

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

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re: ayuda con mejora de programa
« Respuesta #24 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á se explica en detalle este protocolo con un 16f877. Te recomiendo que leas el hilo y estudies los ejemplos que se comparten.  
« Última modificación: 16 de Septiembre de 2015, 22:33:17 por Chenao »
Un saludo desde Pereira - Colombia

Desconectado KILLERJC

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

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re: ayuda con mejora de programa
« Respuesta #26 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.


Un saludo desde Pereira - Colombia

Desconectado yair_xiox

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

 
}
}


Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: ayuda con mejora de programa
« Respuesta #28 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
« Última modificación: 22 de Septiembre de 2015, 19:40:43 por RALF2 »

Desconectado yair_xiox

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


 

anything