TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Pchuqui_1 en 19 de Julio de 2010, 14:13:43
-
Hola a todos. Quisiera saber si existe una libreria para manejar el conversor ADC101S021 por SPI en ccs c ?? Tengo que crear la libreria o puedo utilizar otra de otro DAC con similares caracteristicas?
-
Sería interesante que la realices, en el proceso se aprenden muchas cosas ;-)
Saludos!
-
Ok Suky. Esa es la idea, estoy buscando un empujoncito para empezar, uno no diseña librería todos los días. jaa Saludos
-
Ok Suky. Esa es la idea, estoy buscando un empujoncito para empezar, uno no diseña librería todos los días. jaa Saludos
Pero una librería no son más que funciones especificas del dispositivo, o sea programar :mrgreen: Lo esencial es el datasheet del dispositivo. Si necesitas tener una referencia de como es una librería, toma la de cualquier conversor y observa las funciones que realiza.
Saludos! ;-)
-
Hola otra ves. Esta libreria que voy a tratar de crear es para utilizar los girocopos LISY300LA de parallax que tienen un conversor adc ADC101S021 por SPI. Me voy a guiar por la libreria que trae CCS C de un DAC por SPI tambien, es la MCP3208. Quisiera que mientra vaya posteando los avances me ayuden con posibles errores ya, que van a ser muchos. Gracias. :oops:
-
Hola otra ves. Esta libreria que voy a tratar de crear es para utilizar los girocopos LISY300LA de parallax que tienen un conversor adc ADC101S021 por SPI. Me voy a guiar por la libreria que trae CCS C de un DAC por SPI tambien, es la MCP3208. Quisiera que mientra vaya posteando los avances me ayuden con posibles errores ya, que van a ser muchos. Gracias. :oops:
Hola. Aca muestro el diagrama que hay que utilizar para crear la comunicación.
(http://img138.imageshack.us/img138/3128/diagramao.jpg)
Aca muestro la parte que creo hay que programar para iniciar la memoria.
(http://img143.imageshack.us/img143/3420/captura2e.jpg)
Bueno el pedazo que realize es el siguente, para un pic 16f887. Se que es nada pero es lo que abanse. El problema que no se como seguir.
Estube mirando otras librerias de ADC externos y no entiendo como definen el uso del ptrotocolo SPI. Espero que alguien pueda ayudarme. Saludos
#ifndef ADC101S021
#define ADC101S021_SCLK PIN_C3
#define ADC101S021_SDATA PIN_C5
#define ADC101S021_CS PIN_A5
#endif
void adc_init() {
output_high(ADC101S021_CS); //Inicializa el conversor poniendo el estado de CS
}
-
Revisa por aquí:
http://www.todopic.com.ar/foros/index.php?topic=27422.0
Saludos!
-
Hola Suky gracias por contestar. Hoy a la tarde me la pase leyendo ese mismo link. Si no me equivoco tengo que enviarle al ADC unos bits de configuración, pero este adc no utilza un pin para recibir datos... O no es necesario y solo tengo que leer los datos por el pin de salida? Voy a seguir insistiendo. jaaa
-
Hola a todos. Voy a seguir hasta poder crear la libreria para este adc. Pero antes quiero saber si alguien me puede sacar algunas dudas. Estube leyendo sobre SPI en el foro y demas. Mi intencion es utilizarlo por HARDWARE osea utilizando SETUP_SPI. Bueno busque la instrucción en la ayuda del ccs c y tiene algunos parametros que no puedo encontrar y no conosco sus significados, por ejemplo:
SPI_L_TO_H, SPI_H_TO_L, SPI_SS_DISABLED
Gracias
-
Junto a la ayuda de CCS debes tener a mano el datasheet del microcontrolador utilizado, allí explica que hay cuatro modos de configurar la comunicación SPI dependiendo de los estados IDLE de las señales Data y Clock, y donde muestrea para determinar el estado del bit. Y ese modo debe corresponder con el utilizado por el conversor.
Según se ve en la imagen de más arriba, debería ser configurado como SPI_H_TO_L, SPI_XMIT_L_TO_H, y agregar SPI_MASTER y la velocidad seleccionada.
SPI_SS_DISABLED, des-habilita el módulo, así que ese no lo uses ;-)
Saludos!
-
Hola Suky. Estube investigando un poco mas y encontre las cuatro formas de configurar el modo SPI como me mencionaste antes. Bueno las muestro abajo. Esta configuración hace referencia al modo de inicialización del clock en el modo SPI.
MICROCHIP | CCS
//-----------------------------------------------------------------------
CKP = 0, CKE = 1 | SPI_L_TO_H | SPI_XMIT_L_TO_H
CKP = 0, CKE = 0 | SPI_L_TO_H
CKP = 1, CKE = 1 | SPI_H_TO_L
CKP = 1, CKE = 0 | SPI_H_TO_L | SPI_XMIT_L_TO_H
Segun la hoja de datos del conversor ADC101S021 el estado del clock "SCLK" enpieza en estado alto.. por eso utilizo SPI_H_TO_LO|SPI_XMIT_L_TO_H. Te pregunto si hice bien el razonamiento, para futuros dispositivos sin librerias. :D
En la imagen se ve la 4 formas de configuracion del PIC16f887
(http://img210.imageshack.us/img210/9043/capturaio.jpg)
Hasta hora me quedaria asi:
setup_spi(spi_master|SPI_H_TO_LO|SPI_XMIT_L_TO_H|spi_clk_div_4)
y la coneción entre el pic y el dispositivo seria:
PIC ADC101S021
RA5 (CS) CS
RC4(SDI) SDO
RC3(SCK) SCK
-
Segun la hoja de datos del conversor ADC101S021 el estado del clock "SCLK" enpieza en estado alto.. por eso utilizo SPI_H_TO_LO|SPI_XMIT_L_TO_H. Te pregunto si hice bien el razonamiento, para futuros dispositivos sin librerias. :D
Según se ve en la imagen de más arriba, debería ser configurado como SPI_H_TO_L, SPI_XMIT_L_TO_H, y agregar SPI_MASTER y la velocidad seleccionada.
:D :D
-
:D
jaa Ya se que vos me lo dijiste antes, estoy procurando entender como se razona y no copiar sin pensar. :D :D
-
Hola a todos. Estoy buscando en el foro la forma de tratar las cadenas que recibo por SPI. Mi problema es que el ADC me devuelve 3 ceros| 10 bits | 2 ceros y tengo que encontrar la forma de solo obtener los 10 bits de información que preciso. Además si la comunicación es de 8 bits tengo que tomar por partes no? Gracias. :(
-
Hola a todos. Estoy buscando en el foro la forma de tratar las cadenas que recibo por SPI. Mi problema es que el ADC me devuelve 3 ceros| 10 bits | 2 ceros y tengo que encontrar la forma de solo obtener los 10 bits de información que preciso. Además si la comunicación es de 8 bits tengo que tomar por partes no? Gracias. :(
Revisa las función make16 de CCS, te ayuda a formar una variable de 16-bits con 2 de 8-bits, y luego solo hay que rotar a la derecha para sacar los 2 ceros menos significativos, y listo.
Saludos!
-
Hola a todos. Sigo probando con la librería, bueno estuve investigando y preguntando y algo armé. El problema es que ahora no me responde como debería.
Bueno el asunto es que cuando el giróscopo está quieto se obtiene una tensión de 1.6 V aproximadamente. Eso representa (3.3V/1024)= 0.003222 V por paso del adc. Entonces (1.6V/0.003222V)=496 pasos del adc aproximadamente cuando el giróscopo no se mueve. Bueno el problema que yo veo 30 y no puedo encontrar el problema.
Sin embargo, después de hacer tantas pruebas cambie la línea donde se rota la cadena de bits (result >>= 2) a result >>= 3 y ahí si obtengo 496 pasos aprox. Pero yo se que está mal, por lo que dice la hojas de datos, pero no encuentro otra explicación.
Gracias si alguien puede ayudarme.
:(
#include <16F887.h>
#device adc=10
#fuses HS, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
#FUSES DEBUG
#include <HDM64GS12.c>
#include <graphics.c>
#define ADC101S0121_CS PIN_A5
// SPI mode definitions.
#define SPI_MODE_0 (SPI_L_TO_H | SPI_XMIT_L_TO_H)
#define SPI_MODE_1 (SPI_L_TO_H)
#define SPI_MODE_2 (SPI_H_TO_L)
#define SPI_MODE_3 (SPI_H_TO_L | SPI_XMIT_L_TO_H)
//---------------------------------------------
//Rutina para manejar el ADC101S0121
int16 read_adc101s021(void)
{
int8 lsb;
int8 msb;
int16 result;
output_low(ADC101S0121_CS);
msb = spi_read(0);
lsb = spi_read(0);
output_high(ADC101S0121_CS);
result = make16(msb, lsb);
result >>= 2;
result &= 0x3FF;
return(result);
}
//==========================================
void main()
{
int16 adc_result;
output_high(ADC101S0121_CS);
setup_spi(SPI_MASTER | SPI_MODE_3 | SPI_CLK_DIV_16);
delay_ms(10);
while(1)
{
adc_result =read_adc101s021();
printf("%lu \n\r", adc_result);
delay_ms(500);
}
}
-
Esta bien, por la imagen de uno de los mensajes anteriores envía 3 ceros y luego los 10-bits de la conversión.
Saludos!
-
O sea que debo usar result >>= 3?
Gracias suky.
-
O sea que debo usar result >>= 3?
Gracias suky.
Exactamente!
Saludos!
-
Hola a todos. Sigo con el tema del giróscopo. Tengo que pasar el dato que me entrega "velocidad angular" a grados, para poder obtener los grados de inclinación. Alguien alguna vez realizó algo parecido. Conoces algun trabajo donde pueda esutdiar un poco el tema?
Muchas Gracias.