Autor Tema: spi con 16f876  (Leído 3378 veces)

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

Desconectado pablofer78

  • PIC10
  • *
  • Mensajes: 20
spi con 16f876
« en: 04 de Diciembre de 2007, 11:36:23 »
hola a todos.
estoy tratando de comunicar mi pic (16f876) con un pote digital (mcp41100) via spi en lenguaje c.
el tema es no me responde,,,,creo q lo q estoy haciendo esta bien, ya mire mil veces el datasheet del pote y no veo q esta mal. aca mando el prog si alguno me puede ayudar se lo agradeceria.
muchas gracias

#include <16F876.h>
#fuses NOWDT,NOPROTECT,NOLVP,NODEBUG,XT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)


#define cs_41100 pin_c2
#define sck_41100 pin_c3
#define s1_41100 pin_c5
#define led pin_b7


void main(){
{
set_tris_a(0xFF);
set_tris_b(0x7F);
set_tris_c(0xD3);
setup_spi(spi_master|spi_l_to_h|spi_xmit_l_to_h|spi_clk_div_4);
}
//// seteo como deben estar cada uno de los pines del pic para empezar la comunicacion

output_high(cs_41100);
output_low(sck_41100);
output_high(s1_41100);
output_low(led);

////seteo la transmision

output_low(cs_41100);
spi_write(0x06);
output_high(cs_41100);

delay_ms(500);

//// mando dato al pote por spi para R=71.5K
//// mando primero el command byte y despues el dato

while(true){
output_low(cs_41100);
spi_write(0x02); ////instruccion para escribir
spi_write(0x11);
spi_Write(0xB7);
output_high(cs_41100);
}
delay_ms(500);

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: spi con 16f876
« Respuesta #1 en: 04 de Diciembre de 2007, 15:46:18 »
El programa sigue o termino aqui???
De ser asi te faltan cierres de while, inclusive el de main().... :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado pablofer78

  • PIC10
  • *
  • Mensajes: 20
Re: spi con 16f876
« Respuesta #2 en: 06 de Diciembre de 2007, 11:11:14 »
gracias por la respuesta
el prog continua pero lo q sigue no viene al caso.
el tema es q haga lo q haga con el spi no responde, lo use por soft y anda, pero no lo puedo hacer andar por hardware, cosa q tendria q ser menos complicada.
si alguien me puede ayudar con esto se lo agradeceria.
un saludo a todos

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: spi con 16f876
« Respuesta #3 en: 06 de Diciembre de 2007, 11:55:22 »
Hola


 Yo cada vez que uso un tipo de pic siempre siempre tengo problemas con el SPI .... yo utilizo C30 para dsPICs y una vez configure el SPI en un 16F876 con niple ... siempre tuve este problema ... cuando envias un dato por SPI al mismo tiempo recibes un dato ... cuando le explique esto a mi asesor me dijo que era como una cadena de bicicleta .. jajaja!!  :D :D  ... bueno esa es la analogia ...  como estas recibiendo un dato debes leerlo para que el buffer se limpie .. si volves a enviar se activa una bandera de error y el pic no hace nada de nada  :2] ... .. en el dsPIC esa bandera se llama SPIROV ...  mira como hago para enviar ... la siguiente rutina me funciona bien con todo lo que sea SPI ..

        IFS0bits.SPI1IF = 0;                         /* Borrar fin de TX/RX*/

   SPI1STATbits.SPIROV = 0;               /* Para reset del buffer */            
   
   SPI1BUF = dato;                              /* Comenzar transmision */
   
   while( !IFS0bits.SPI1IF );                  /* Esperar fin de transmision */

   SPI1STATbits.SPIROV = 0;                /* Leer dato */

   dato_salida = SPI1BUF;

   IFS0bits.SPI1IF = 0;

Observa que primero borro todas las banderas que puedan indicar que existe algun dato en el buffer ... luego envio el dato y espera a que se termine de enviar .. recuerdo muy bien que pase semanas tratando de que funcionara esa pendejada ... y solo haciendolo de esa manera me funciono!!!  :5] :5]      

Ademas, recuerdo que se puede elegir la forma del clock ... ejemplo si el estado de espera es en alto .. el activo en bajo .. el cambio en la salida es cuando la transicion del reloj es de bajo a alto .. alto a bajo .. etc ! LE PUSE DE TODAS LAS FORMAS POSIBLES ....

el unico  :8} que me funciono fue poniendo los bits en de la configuracion en:

#define SPI1_CKE  1      /* Cambio de dato de salida,*/
                                    /* 0: cambio de idle a active, */
                                    /* 1: cambio de active a idle */

#define SPI1_CKP  0      /* Polaridad del reloj de salida,*/
                                    /* 0: idle bajo y active alto, */
                                    /* 1: idle alto y active bajo, */

Otra configuracion ... ni a p#t@s  :5] !!! No creas .. una critica muy fuerte es que estos perifericos ( SPI, I2C, ADC, etc ) de microchip estan llenos llenos de errores y muchos modos no funcionan correctamente ... cuando tengas tiempo hechale un ojo a la hoja de silicon errata 

Hace el intento variando la forma polaridad del reloj sino intentá leyendo el buffer antes de enviar cualquier dato ...  SUERTE!!!
   
Control Automático, DSP & Microcontroladores

Desconectado cerebro

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
Re: spi con 16f876
« Respuesta #4 en: 06 de Diciembre de 2007, 16:34:53 »
me extraña que sea complicada si justamente eso es lo interesante de la comunicacion spi... yo estube provando tu codigo si solo se utilizara para modificar el valor de las resistencias andubo bien(capas que no entendi bien que es lo que querias hacer)..... igualmente la falla puede estar en el conexionado no se...... yo te paso lo que veo y decime si era lo que buscabas :P.
LAS MALVINAS SON ARGENTINAS!

Desconectado cerebro

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
Re: spi con 16f876
« Respuesta #5 en: 06 de Diciembre de 2007, 17:31:55 »
fijate esta nota de aplicacion de microchip capas te ayuda..
LAS MALVINAS SON ARGENTINAS!

Desconectado pablofer78

  • PIC10
  • *
  • Mensajes: 20
Re: spi con 16f876
« Respuesta #6 en: 10 de Diciembre de 2007, 10:49:51 »
gracias  a todos por las respuestas.
la cosa es q sigue sin andar y ya nose q puede ser
el conexionado esta bien y creo q el codigo ("creo") q esta bien.......aparte me dicen q les anda.
asiq no se...................ya cambie varias cosas y no lo puedo hacer andar. si alguno tiene un ejemplo le voy a pedir por favor q me lo mande asi veo q puede ser
desde ya muchisimas gracias y espero su ayuda. les adjunto el conexionado q use


Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: spi con 16f876
« Respuesta #7 en: 10 de Diciembre de 2007, 13:40:26 »
Parece que esta todo bien ... solo esa conexion del led que no es correcta pero no viene al tema ... yo probaria haciendolo manual .. es decir configurando uno mismo los registros del SPI ya sea en ASM o en el mismo C ... de esa forma uno tiene mas control del pic
Control Automático, DSP & Microcontroladores

Desconectado pablofer78

  • PIC10
  • *
  • Mensajes: 20
Re: spi con 16f876
« Respuesta #8 en: 11 de Diciembre de 2007, 09:00:24 »
decis hacer la comunicacion via spi pero por soft?????
eso lo puedo hacer pero queria hacerla por hard ya q teoricamente tendria q ser mas facil y consumir menos recursos...........
yo la verdad q ya no se q cambiar y a alguien se le ocurre algo por favor diganmelo
y de nuevo gracias por la ayuda a todos

Desconectado pablofer78

  • PIC10
  • *
  • Mensajes: 20
Re: spi con 16f876
« Respuesta #9 en: 11 de Diciembre de 2007, 15:53:58 »
hola blackcat.......................
te pido un favor, si podes mandar el codigo q usaste cuando usaste el spi en este pic, asi veo como es eso q me decis.
muchas gracias y espero tu respuesta

Desconectado pablofer78

  • PIC10
  • *
  • Mensajes: 20
Re: spi con 16f876
« Respuesta #10 en: 10 de Marzo de 2008, 10:45:04 »
por favor si alguno tiene idea de q puede estar fallando por favor avisen
agradeceria cualquier ayuda.
un saludo y gracias

Desconectado cerebro

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
Re: spi con 16f876
« Respuesta #11 en: 14 de Abril de 2008, 09:48:27 »
hola pablofer estuve mirando el data del 41000 y hay ciertas cosas que haces que no entendi muy bien... de igual manera a mi me fnc correcto mira la imagen que subo y fijate los otros modos aplicados...   saludos
LAS MALVINAS SON ARGENTINAS!

Desconectado cerebro

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
Re: spi con 16f876
« Respuesta #12 en: 17 de Abril de 2008, 11:09:51 »
 :-/ hola de nuevo!!! estuve jugando con el pote.... y se me ocurrio un bolazo.. lo que intente hacer fue como esos sistemas de luz en los autos mas modernos que se apagan gradualmente ..... bueno lo  mismo pero con este pote (en realidad no se como lo haran imagino un capacitor descargandose pero no se...... no investigue mucho....). El problema esta e la forma de actualizar el dato del pote tengo que cambiar de modo y esto me parecee raro..... de cualquier forma les dejo el codigo para que lo chusmeen si quieren y digan mejoras......

#include <16F876.h>
#fuses NOWDT,NOPROTECT,NOLVP,NODEBUG,XT
#use delay(clock=4000000)


#define cs_41100 pin_c2
#define sck_41100 pin_c3
#define s1_41100 pin_c5

int h=255;

void putspi(int8* i){

output_low(cs_41100);
spi_write(0xF1);//instruccion para escribir C0 C1
spi_write(i);// dato al pote
output_high(cs_41100);

}

void clearspi(){
output_low(cs_41100);
spi_write(0x01);//instruccion para escribir C0 C1
spi_write(0x02);// dato al pote
output_high(cs_41100);
}

#INT_EXT
void IntRB0()
{
 

while(!input(PIN_B0)){
putspi(0xFF);
delay_ms(1);
//clearspi();
}



while(h>0){

putspi(h);
delay_ms(1);
clearspi();  //no entiendo por que tengo que borrarlo o cambiar de modo para que me tome un nuevo dato.....
h=h-1;
}

h=255;
}
LAS MALVINAS SON ARGENTINAS!