Autor Tema: Ejemplo Simulación del módulo spi  (Leído 62300 veces)

0 Usuarios y 6 Visitantes están viendo este tema.

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re: Ejemplo Simulación del módulo spi
« Respuesta #120 en: 07 de Septiembre de 2015, 16:59:59 »
Si de hecho tengo 2 .DSN tuyos No me di cuenta porque no mostraban el icono de proteus y tuve que hacer "abrir con"
pero van bien. Gracias. Un ejemplo visual es lo mejor. Esfuerzo cero.
Me e giado de tu primer proyecto porque yo tambien quiero mandar unas tablas contienen variables que pretendo que sean globales para los dos micros. EL problema es que yo necesito refrescar todas las variables en el esclavo de forma instantanea.
Este parte:
///////////////////////////////////MASTER
for(i = 0; i<10; i++)
       {
           spi_write(tabla);
           delay_ms(2000);
       }
//////////////////////////////////SLAVE
if(spi_data_is_in())
       {
         puerto_b = spi_read();
       }
No es fiable con delays-cortos (y a my me combienen que nisiquiera existan) El spi_data_is_in() no es suficiente o no se utilizarlo. E pensado utilizar un par de pins de cada micro tipo "-embiar -recivido" para sincronizar bien al isntante. Pero antes buscare y hare lo que menos me gusta leer sobre este protocolo. Quizas pueda aorrarme algo

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ejemplo Simulación del módulo spi
« Respuesta #121 en: 07 de Septiembre de 2015, 22:58:54 »
Citar
No es fiable con delays-cortos (y a my me combienen que nisiquiera existan)


Utiliza interrupciones, mas rapido que eso no lo veo posible.

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re: Ejemplo Simulación del módulo spi
« Respuesta #122 en: 09 de Septiembre de 2015, 20:12:02 »
Eso es Interrupciones. ahora puedo pasar una gran cantidad de variables casi al instante.
Como siempre hay un problema spi_write(mony); mony=spi_read(); no sirven para embiar variables "long" que es lo que es mony

//Estas variables deben ser globales para los dos
//int peti,cliente,salir;
//int1 tarje;
//long mony;//////Hay un problema con "long" no se puede enviar con spi_write(mony);
//int1 fclee[5];
//int1 fcpos[5];
////////////////////MASTER

main(){
while(true){//whil

refresco();//Es importante que sea funcion porque mi proyecto debe embiar las variables actualizadas
           //para que "slave" las trabaje bastantes veces


}//whil
}


void refresco(){

int co,cu;
output_low(PIN_c6);//S.envio incial 0
lcd_putc("\f"); cu=1;
for (co=0;5>co;co++){  //for int1
valor=rand();
if (valor>20000) { fclee[co]=1; } else { fclee[co]=0; }
lcd_gotoxy(cu,1); lcd_gotoxy(cu,1); printf(lcd_putc,"fl[%d]=%d ",co,fclee[co]);  cu+=8; //printf(lcd_putc,"fl[%d]=%d ",co,valor);
spi_write(fclee[co]);
protMaster(); /// protocolo de envio vajo SPI MAESTRO.........*
}  //for int1
cu=1;
for (co=0;5>co;co++){ // for int1_2
valor=rand();
if (valor>20000) { fcpos[co]=1; } else { fcpos[co]=0; }
lcd_gotoxy(cu,2); printf(lcd_putc,"ps[%d]=%d ",co,fcpos[co]);  cu+=8; //printf(lcd_putc,"fl[%d]=%d ",co,valor); 
spi_write(fcpos[co]);
protMaster(); /// protocolo de envio vajo SPI MAESTRO.........*
} //  for int1_2
    delay_ms(4000);//para mostrar principales boolean master & savle
peti=rand();
spi_write(peti); /// int peti
protMaster();
cliente=rand();   
spi_write(cliente); /// int cliente
protMaster();
salir=rand();   
spi_write(salir); /// int salir
protMaster();
valor=rand();
if (valor>20000) { tarje=1; } else { tarje=0; }
spi_write(tarje); /// int1 tarje
protMaster();
mony=rand();   
spi_write(mony); /// long mony
protMaster();/// protocolo de envio vajo SPI MAESTRO.........*
lcd_putc("\f");
lcd_gotoxy(1,1); printf(lcd_putc,"INT...peti=%d cliente=%d salir=%d",peti,cliente,salir);
lcd_gotoxy(1,2); printf(lcd_putc,"int1 tarje=%d    LONG mony=%lu",tarje,mony);   
  delay_ms(4000);
 
lcd_putc("\f  envio completo");  delay_ms(500);
}
void protMaster(){/// protocolo de envio vajo SPI MAESTRO
output_high(PIN_c6); // s.envio=true afecta PIN_B7_SLAVE/E.envio
delay_ms(5);
while (Input(PIN_c0)==0) { delay_ms(5); } //Impide + envios asta SLAVE lo diga con su S.pin_a1_(S.recivido) -----> E.pin_c0_MASTER(E.recivido)
output_low(PIN_c6); // s.envio=false afecta PIN_B7_SLAVE/E.envio
delay_ms(5);
}
//////////////////////////sclavo/SLAVE//////////////////////

main(){

while(true){//whil

if(Input(PIN_b7)) { //pin_b7=E.envio=true afectado por pin_c6_MASTER/S.envio=true
lcd_putc("\f"); cu=1;
for (co=0;5>co;co++) {//for nt1_1
fclee[co]=spi_read();
lcd_gotoxy(cu,1); printf(lcd_putc,"fl[%d]=%d ",co,fclee[co]);  cu+=8;
protSlave();///protocolo de recivo vajo SPI SLAVE...........*
}//for nt1_1
cu=1;
for (co=0;5>co;co++){//for int1_2
fcpos[co]=spi_read();
lcd_gotoxy(cu,2); printf(lcd_putc,"fp[%d]=%d ",co,fcpos[co]);  cu+=8;     
protSlave();///protocolo de recivo vajo SPI SLAVE...........*
}//for it1_2*/

peti=spi_read();// int* peti
protSlave();///protocolo de recivo vajo SPI SLAVE
cliente=spi_read();// *cliente
protSlave();
salir=spi_read();// *salir
protSlave();
tarje=spi_read();// int1 targe
protSlave();
mony=spi_read();// long mony lectura erronea******
protSlave();///protocolo de recivo vajo SPI SLAVE...........*
lcd_putc("\f");
lcd_gotoxy(1,1); printf(lcd_putc,"int...peti=%d cliente=%d salir=%d",peti,cliente,salir);
lcd_gotoxy(1,2); printf(lcd_putc,"int1 tarje=%d long mony=%lu",tarje,mony);///long mony siempre falla******
delay_ms(1000);
lcd_putc("\f  nuevo recivo");

}//whil
}
void protSlave(){///protocolo de recivo vajo SPI SLAVE
output_high(PIN_a1);//S.recivido=true -----> pin_c0_MASTER/E.recivido
delay_ms(2);
output_low(PIN_a1); //S.recivido=false----->  pin_c0_MASTER/E.recivido
while (Input(PIN_b7)==0) { delay_ms(2); } //Se queda esperando asta qu b7=true (E.envio) afectado por pin_c6_MASTER/S.envio=true
delay_ms(2);
}

Otra cosa que no me gusta es que "slave" se atrasa mas con los delay. No se como sera en la practica pero eso es lo que me hace en proteus.
output_high(PIN_a1);//S.recivido=true -----> pin_c0_MASTER/E.recivido
delay_ms(2);
output_low(PIN_a1); //S.recivido=false----->  pin_c0

Me estraña que funcione porque cuando pin_c0_MASTER es true. Master podria estar sumergido en un delay(5) y luego nunca saldria de
while (Input(PIN_c0)==0) { delay_ms(5); } //Impide + envios asta SLAVE lo diga con su S.pin_a1_(S.recivido) -----> E.pin_c0_MASTER(E.recivido)





Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re: Ejemplo Simulación del módulo spi
« Respuesta #123 en: 09 de Septiembre de 2015, 21:37:22 »
Citar
Como siempre hay un problema spi_write(mony); mony=spi_read(); no sirven para embiar variables "long" que es lo que es mony

Claro es una característica del protocolo debido a que funciona a 8 bits, lo que puedes hacer es dividir la variable tipo long en dos byte haciendo uso de la make8() "No recuerdo si esta", con esta función puede des-concatenar variables tipo long en 2 variables tipo int. Así puedes transmitir la parte alta y la parte baja de la variable tipo long. 

Ahora para refrescar simultáneamente los datos en Slave no podrías utilizar una comunicación full duplex? 
Un saludo desde Pereira - Colombia

Desconectado CARlosDAN783

  • PIC10
  • *
  • Mensajes: 11
Re:Ejemplo Simulación del módulo spi
« Respuesta #124 en: 31 de Diciembre de 2015, 16:31:51 »
 :-/ Amigo no sabes lo agradecido que estoy muchas gracias por sus ejemplos pues como no consegui nada con dicho pic ya estaba empezando a crear mi propia libreria con sus funciones lo cual se me estaba dificultando mucho. Ahora lo que no entiendo es porque en ningun lado del codigo se llama a ninguna libreria referente al spi si me puedes esplicar se lo agradesco.

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re:Ejemplo Simulación del módulo spi
« Respuesta #125 en: 01 de Enero de 2016, 14:45:42 »

Todas las funciones utilizadas en los ejemplo vienen incorporadas en la cabecera .h del microcontrolador, es decir, cuando se utiliza

Código: [Seleccionar]
#include<pic16f877.h>
Se cargan las funciones como spi_read(), spiwrite() etc. Ahora para saber las funciones por defecto de cada cabecera .h (de un microcontrolador específico) se puede consultar el respectivo .txt que se encuentra en la carpeta de drivers del compilador. 
Un saludo desde Pereira - Colombia