TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: josselo24 en 08 de Marzo de 2006, 10:42:00
-
estoy tratando de configurar la comunicacion spi de mi pic18f452, este como master y un conversor (max 191 ) co slave, no me funciona el reloj, alguien podria ayudarme, tendra que ver con las interrupciones
-
Suponiendo que lo has mirado con un osciloscopio y no va pues...
pueden ser varias cosas. Si estás programando en C, intenta inicializar de forma manual los registros afectos (SSPSTAT=0x...). Fíjate bien en el datasheet respecto al modo en que se transmiten los datos (forma de la onda ,inicia en alto, en bajo,etc). Inicializa bien el puerto C.(TRISCbits.RC3=0//TRISC=0b00010000).
Fijate bien en los registros del conversor y lee al dedillo el datasheet.
No sé , en fin si te ves muy apurado, está el asembler: Un ejemplo
LIST P=18F452
#include<p18f452.inc>
udata
dato res 1
reset code 0x00
goto start
pgm code
start nop
movlw b"00001010" ;E/S digitales
movwf ADCON1
movlw b"10010010" ;rc4 sdi
movwf TRISC ;rc3 clock
movlw 0x07 ;rc5 sdo
movwf CMCON
movlw b"00000000" ;CKE=0 MODO 1,1 inicia alto
movwf SSPSTAT
movlw b"00110010" ;ckp=1 fosc/64
movwf SSPCON1
bcf PORTC,0 ;cs=0
movlw 0x20
movwf SSPBUF ;enviamos un byte ejemplo un comando
btfss PIR1,SSPIF
goto $-2
bcf PIR1,SSPIF
movlw .0
movwf SSPBUF ;enviamos pulsos de relog
btfss PIR1,SSPIF
goto $-2
bcf PIR1,SSPIF
movff SSPBUF,Dato ;recogemos un dato
end
bueno es tarde y me duermo hasta pronto
-
gracias por el consejo, igual realice la programacion manualmenet y me dio resultado
-
Hola muy buenas,
Yo estoy usando un PIC16F877, que es el homólogo al de la familia 18F que estás utilizando. Al ver tu mensaje, yo tengo unas dudas, ya que coloco en el programa el siguiente código en C, programado mediante CCS, y no consigo leer el valor de un LM35, y posteriormente visualizarlo en el display. Es correcto el código que genero para conseguir la conversion de 12 bits de mi MAX187?, porque como consigo los 13 pulsos de reloj que necesita mi conversor para convertir el dato? Haber como lo realizas, para ver si debo corregir algún error:
// Configuracion chip y compilador
#include "16F877.h"
#fuses EC_IO,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP
#use delay(clock=10000000)
#use rs232(baud=57600, xmit=PIN_C6, rcv=PIN_C7)
// Definición de pins ADC
#define MAX187_CS = 7.2
#define MAX187_SCLK = 7.3
#define MAX187_DOUT = 7.4
// Funciones
int leerMAX187(void);
void main(void)
{
// Variables
int dato;
// Configuracion de los puertos
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)
set_tris_a(0b00000000);
set_tris_b(0b00000000);
set_tris_c(0b00110110);
set_tris_d(0b00000000);
set_tris_e(0b00000000);
// Inicializacion del SPI
output_high(MAX187_CS); // Activo el pin CS a nivel bajo
// Inicialización del puerto SPI
setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_16);
while(1)
{
dato = leerMAX187();
printf("Este es el valor procedente del ADC: %d
",dato);
delay_us(100);
}
return;
}
int leerMAX187(void)
{
int datoMAX187;
output_low(MAX187_CS); // Seleciono CS para decirle al ADC que va ha comenzar la adquisición de datos
delay_us(MAX187_Aquire_Time); // Espera
datoMAX187 = spi_read(0); // Adquiero el dato del MAX187
output_high(MAX187_CS); // Desabilito el ADC
return datoMAX187;
}
No se si estoy realizando lo correcto y si te servirá de ayuda.
Un saludo,
-
vi tu porgrama y en general esta bien, la diferencia que hice yop, fue utilizar los comandos directamente (osea los registros), para asi no utilizar el comando que te facilita el ccs para esta comunicacion, ya que, al visualizar estos registros en en mi lcd no me reflejaba exactamente lo que yo queria.
como tu sabras el pic solo convierte 8 bit, y yo necesitaba la conversion de 12, por lo que use el max 191 he utilice el pic como master, a mi solo me interesa los datos que envia el conversor para reflejarlos en mi lcd, como el pic almacena de 8 bit, hay que decirle que pida dos veces y asi puedes leer completa la informacion
-
Hola Josselo,
Es cierto lo que comentas, espero realizar algunos cambios en el programa que postee aqui, porque me da la sensación de que no recibiré bién los datos. Ya que viendo el data sheet de ambos componentes me asaltan varias dudas que espero resolver en estos días para posteriormente hacer lo mismo que tú, visualizar por el lcd el valor convertido por mi MAX187, hay vienen mis dudas, porque al ser de 12 bits, y recibir solo 8 bits, me quedan 4 del conversor, no se como gestionarlo. Espero poder gestionarlo de forma correcta.
Un saludo,
-
hola

ojala puedas solucionar tu problema, lo que te puedo decir como experiencia personal, es que el microcontrolador es muy, pero muy inteligente...me explico....
el pic te va a tomar los datos cuanto tu le digas y los va ha almacenar en ocho bit,
el max es torpe, ya que te envia dos byte con la informacion de la conversion de alli tu tienes que interpretarla, lo que tienes que hacer es leer dos veces inicializando dos variables disyintas y te daras cuenta que sus valores son distintos al visualizarlas en tu lcd, yo lo hice...incluso le pedi que le leyera mas veces en una conversion y sólo me da los datos de dos variables, ya que el max te envia en cada conversion 16bit de los cuales 4 son basuras, ojala te ayude esto ha aclarar un poco tus ideas.
aprovecho de preguntarte si has tenido experiencias con la comunicacion serial utilizando las normas rs 232 y rs485
chao
-
Hola josselo,
Efectivamente todo lo que comentas es cierto, una de las utilidades que he visto para poder modificar el programa que postee es leer en dos bytes, tal y como dice el data sheet del MAX187 de la siguiente forma:
for (i=0;i<16;i++){
shift_left(&data,2,input(MAX187_DOUT)); //leer en 2 bytes el dato del adc del pin MAX187_DOUT
output_high(MAX187_SCLK);
output_low(MAX187_SCLK);
}
En referencia a lal comunicación, yo lo realizo mediante RS232, el problema que he tenido principalmente es que fundi totalmente la fuente de alimentación del primer PC, el integrado del port 1 del RS232 de otro PC, incluso saltaba el diferencial de mi casa al conectar la fuente de alimentación de mi aplicación...hasta que me di cuenta que tenía un condensador polarizado incorrectamente con el MAX232. Yo segui un ejemplo en este enlace:
http://miarroba.com/foros/ver.php?foroid=46840&temaid=4061462&pag=6
del amigo vszener...un carck
y de este:
http://miarroba.com/foros/ver.php?foroid=46840&temaid=4679539
Pero para la próxima vez, he conseguido averiguar que donde cursaba mis estudios, hay una aplicación para comprobar el hardware, antes de que pase lo que te comentaba antes, menos mal que lo que no fundi es el puerto serie del portátil, sino me da algo. Ya que puedes encontrar PC"s por 35€ para programar este tipo de comunicaciones antes de fastidiar algo.
Un saludo,
-
Hola O_R_E

Lamento que te pasara eso en tu pc al conectar la max232, a mi nunca me ha pasado, quizas estuve con un poco mas de suerte, igual al armar circuitos uno siempre se equivoca y es normal quemar algunos dispositivos por una mala conexion
, lo importante , es no cometer el error mas de una vez.
Yo estoy trabajando en el protocolo Modbus utilizando un Pic, he realizado una conexion utilizando las pastillas 75176b para realizar una conversión rs232 a rs485, baje un esquema de este mismo foro, pero solo me funciona a veces, espero solucionar luego ese problema, bueno estamos en contactos....
adios