TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: pablofer78 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);
-
El programa sigue o termino aqui???
De ser asi te faltan cierres de while, inclusive el de main().... :mrgreen:
-
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
-
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!!!
-
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.
-
fijate esta nota de aplicacion de microchip capas te ayuda..
-
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
-
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
-
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
-
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
-
por favor si alguno tiene idea de q puede estar fallando por favor avisen
agradeceria cualquier ayuda.
un saludo y gracias
-
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
-
:-/ 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;
}