Autor Tema: Dudas con proyecto en CCS PIC16F877A  (Leído 5020 veces)

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

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Dudas con proyecto en CCS PIC16F877A
« en: 11 de Marzo de 2014, 14:18:40 »
Hola a todos. estoy en mis inicios con el lenguaje C para PICs con CCS y tengo unos problemas y dudas. A ver si alguien se anima a ir ayudándome a sacar éstas dudas.

Tengo pensado realizar un proyecto con unos sensores de fotodiodo para detectar luz (realizaré su acondicionamiento y demás para tener un cierto margen de voltage a su salida en función de la intensidad lumínica). En total utilizaré unos 10 de éstos sensores.

Luego acoplaré éstos sensores a dos ADC MCP3008 de 10bits y 7 canales (como tienen 7 canales tengo que utilizar dos ya que tengo 10 sensores que analizar) cada uno para pasar el voltage analógico de los sensores a digital.

Por último conectaré cada ADC a un PIC16F877A para pasar la información del ADC al PIC con el (desconocido para mi) protocolo SPI (utilizo dos PIC16F877A ya que utilizaré dos ADC que me pasarán la información mediante SPI).

Por último último conectaré estos dos PICs a una placa ARDUINO UNO o DUEMILANOVE  para que me pase la información via RS232. Quiero utilizar solo un bus tipo ONE-WIRE (de solo un hilo) para comunicar mis PICs a la placa ARDUINO via RS232.

Espero que hasta aquí haya quedado un poco claro lo que pretendo realizar. Bien pues ahora explico un poco el algoritmo...

Los sensores captarán la información lumínica cada uno situado en un lugar distinto. Ésta información la irá analizando el ADC externo por turnos (Primero el canal 0, luego el canal 1, etc) el cual se encargará el PIC de seleccionar dicho canal.

Ésta información pasará al PIC via SPI y éste se encargará de enviarla al ARDUINO via RS232. Luego el Arduino enviará la información de los ADC a un PC via RS232 con un programa realizado en Labview para que lo analice.  Cuando el primer Pic haya analizado el último canal, le enviará una señal al segundo PIC para que comience a analizar (Realizaré un efecto barrido sobre los sensores) y cuando éste llegue a su final volveremos a comenzar con el primer sensor.


Bueno pues mi pregunta es... ¿Es muy difícil comenzar a realizar todo ésto para que acabe funcionando, me refiero a la utilización del protocolo SPI con un ADC externo y PIC y lo que se refiere al tema de comunicar dos pics con un ARDUINO?

Estoy comenzando primero de todo la configuración DEL PRIMER MICRO 16F877A para protocolo SPI y RS232 con el entorno MPLAB y compilador CCS. Es mi primera vez con ésto así que expondré el código para ver si voy comenzando por buen camino con las configuraciones.

Aún faltan muchas cosas pero quiero ir comenzando a repasarlo todo.


Muchas gracias y disculpen la extensión del tema.



#include <16F877A.h>

#FUSES NOWDT, XT, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG

//Configuración del puerto serie
#USE DELAY (clock = 20000000)
#USE rs232 (BAUD=4800,XMIT=PIN_C6,RCV=PIN_C7,BITS=8 )

//Configuración SPI
#USE setup_spi(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_16);


//Inicialización de variables y estados


void main () {

if (Flag_Micro1){

 switch (SENSOR) {

//El próximo sensor (con su ADC) a leer será el 2;
 SENSOR=SENSOR2;
 
//Escogeremos salida del canal de ADC1
 output_hight(PIN_AO1);
 output_hight(PIN_AO2);
 output_hight(PIN_AO3);
 


 case SENSOR1:

 


 break;

 case SENSOR2:

 break;

 case SENSOR3:


 break;

 case SENSOR4:

 SENSOR=SENSOR1;
 Flag_Micro1=0;

 break;  


« Última modificación: 11 de Marzo de 2014, 14:26:08 por Prototipe88 »

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re: Dudas con proyecto en CCS PIC16F877A
« Respuesta #1 en: 11 de Marzo de 2014, 14:25:15 »
pregunta

¿y no sería mejor usar el mismo uC para enviar la información serial al PC?

porque te tocaría programar 2 veces
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Dudas con proyecto en CCS PIC16F877A
« Respuesta #2 en: 11 de Marzo de 2014, 14:28:37 »
pregunta

¿y no sería mejor usar el mismo uC para enviar la información serial al PC?

porque te tocaría programar 2 veces


La cuestión es que necesito utilizar ARDUINO también... así que pensé que me iria bien para saber programarlo y tocarlo. Pero eso lo haré luego. Es digamos la parte intermedia de éste proyecto.

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Dudas con proyecto en CCS PIC16F877A
« Respuesta #3 en: 11 de Marzo de 2014, 19:29:01 »
Como todo ésto parece un poco largo. Iré posteando las preguntas que me vayan saliendo al investigar. Aquí va una.

Para que mi ADC (MCP3008) pueda ir haciendo las medidas de los 7 canales de los que dispone debo pasarle una trama de 4 bits formados según el datasheet del ADC por: BIT0 [Single/Diff], BIT1 [D2], BIT2 [D1], BIT3 [D0].


Si yo quiero seleccionar en mi ADC el Canal 0 y que la conversión sea Unipolar necesito pasarle los siguientes bits: 1 0 0 0. ¿Sería correcto pasarle desde mi PIC (utilizando el compilador CCS) la siguiente función? --> spi_write(0x08).  ¿El buffer de recepción SPI (tanto para el ADC como para el PIC son de 8bits?

Desconectado carlostecno

  • PIC10
  • *
  • Mensajes: 5
Re: Dudas con proyecto en CCS PIC16F877A
« Respuesta #4 en: 12 de Marzo de 2014, 08:50:28 »
amigos necesito una  ayuda   lo que pasas es que creo cualquier programa en picc y compilo y ejecuta bien pero voy a la carpeta donde guarde el archivo y no me crea el punto hex... ayuda

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Dudas con proyecto en CCS PIC16F877A
« Respuesta #5 en: 12 de Marzo de 2014, 08:59:26 »


Si yo quiero seleccionar en mi ADC el Canal 0 y que la conversión sea Unipolar necesito pasarle los siguientes bits: 1 0 0 0. ¿Sería correcto pasarle desde mi PIC (utilizando el compilador CCS) la siguiente función? --> spi_write(0x08).  ¿El buffer de recepción SPI (tanto para el ADC como para el PIC son de 8bits?

  Sí, el buffer es de 8 bits.

  Según leí con anterioridad piensas utilizar dos PIC para conectar cada ADC a un PIC. ¿No sería mejor conectar el mismo PIC a los dos ADC y cada ADC con su pin CS a un pin diferente del PIC? De esa forma según con que ADC quieras comunicarte, tendrás que activar el pin CS en cuestión.

  O también puedes utilizar el ADC interno del PIC. El 877 tiene 8 canales ADC.
« Última modificación: 12 de Marzo de 2014, 10:02:48 por AngelGris »
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Dudas con proyecto en CCS PIC16F877A
« Respuesta #6 en: 12 de Marzo de 2014, 10:21:24 »


Si yo quiero seleccionar en mi ADC el Canal 0 y que la conversión sea Unipolar necesito pasarle los siguientes bits: 1 0 0 0. ¿Sería correcto pasarle desde mi PIC (utilizando el compilador CCS) la siguiente función? --> spi_write(0x08).  ¿El buffer de recepción SPI (tanto para el ADC como para el PIC son de 8bits?

  Sí, el buffer es de 8 bits.

  Según leí con anterioridad piensas utilizar dos PIC para conectar cada ADC a un PIC. ¿No sería mejor conectar el mismo PIC a los dos ADC y cada ADC con su pin CS a un pin diferente del PIC? De esa forma según con que ADC quieras comunicarte, tendrás que activar el pin CS en cuestión.

  O también puedes utilizar el ADC interno del PIC. El 877 tiene 8 canales ADC.


Es muy buena idea. La idea del proyecto es aún flexible así que me parece genial que propongan cosas :). Bien en el caso que utilizáramos 2 ADC conectados al mismo PIC16F877A mediante SPI me surgen unas dudas.

1º- Para seleccionar el ADC que se quiera comenzar a analizar se utilizaría un pin diferente del PIC para cada CS (que éste es para darle la señal de comenzar a convertir el valor analógico a digital). Pero a la hora de guardar el valor obtenido en el registro SPI del PIC...se tendría que conectar las salidas de los ADC "Dout" al mismo registro SPI del PIC? [solo tenemos un registro SPI... creo]

2º- Sé como configurar el PIC para que sea master/slave y también para el clock de la comunicación SPI. Pero no me queda muy claro donde encontrar más información sobre los modos SPI para el compilador CCS. He mirado en el instruction reference CCS pero no explica las instrucciones para configurar el modo SPI y eso. Me podrías enviar algún link con información al respecto?

Gracias :)

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Dudas con proyecto en CCS PIC16F877A
« Respuesta #7 en: 12 de Marzo de 2014, 12:05:59 »
  Yo te recomiendo que te informes mejor acerca del funcionamiento del SPI.

La conexión es SDO(pic) a SDI(adc) y SDI(pic) a SDO(adc).
Si tienes que leer 10bits, necesitarás hacer dos lecturas consecutivas sobre el bus SPI, porque cada lectura es de 8 bits.
Cuando haces la lectura los 8 bits se almacenan en el buffer del SPI, tu deberás pasar del buffer a una variable.

  No sé como son las funciones en CCS, pero la idea básica puede ser la siguiente

Código: C
  1. variable_alta = read_spi();
  2. variable_baja = read_spi();

o bien puedes tener una variable de 16 bits y hacer algo así (suponiendo que se transmite la parte alta primero)

Código: C
  1. variable = read_spi() << 8;
  2. variable = variable + read_spi();

de esa manera, se lee la información y se la rota 8 bits para que ocupe el byte alto (en la primer línea) y luego se vuelve a leer el ADC para obtener el byte bajo.

  Así tendrías una variable por cada valor leído. O también puedes pensar en utilizar un array
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Dudas con proyecto en CCS PIC16F877A
« Respuesta #8 en: 12 de Marzo de 2014, 14:09:55 »
El problema está en que el datasheet del fabricante del ADC solo me da la información de unos pines llamados "Dout", "Din", "CLK"   y "CS" respecto a lo del SPI. ¿Supongo que son éstos pins los que debo utilizar para dicha comunicación no?. El datasheet no te lo puedo adjuntar porque pesa mucho pero te adjunto la especificación de pines que me proporciona el fabricante. Gracias por responder.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Dudas con proyecto en CCS PIC16F877A
« Respuesta #9 en: 12 de Marzo de 2014, 15:34:39 »
Perfecto...

SDO(pic) --> DataIn
SDI(pic)  --> DataOut
SCK(pic) --> CLK

(pic)pin que utilices para CS --> CS
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Dudas con proyecto en CCS PIC16F877A
« Respuesta #10 en: 12 de Marzo de 2014, 16:36:18 »
Perfecto...

SDO(pic) --> DataIn
SDI(pic)  --> DataOut
SCK(pic) --> CLK

(pic)pin que utilices para CS --> CS

Muchas gracias Angel ;) ésto me va quedando claro. Voy a seguir con más cosas de éste tema a ver.

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Dudas con proyecto en CCS PIC16F877A
« Respuesta #11 en: 16 de Marzo de 2014, 12:47:12 »
Hola, tengo otra pregunta respecto al pin de "CS" que se especifica en el protocolo SPI. En Arduino Due se me indica que tengo tres posibles pines para "SS" (4, 10 y 52 creo recordar). Es decir si quiero utilizar protocolo SPI con ésta placa de Arduino solo puedo conectar tres dispositivos como mucho? Gracias.


 

anything