TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: kukose en 08 de Marzo de 2011, 12:12:57

Título: Funcionamiento del MCP4921. Dudas
Publicado por: kukose en 08 de Marzo de 2011, 12:12:57
Hola a todos!!

Quiero realizar un conversor digital/analógico utilizando el MCP4921, pero a la hora de mirar la librería existente en el CCS C compiler no encuentro las funciones que utiliza para realizar la conversión digital-analógica.

Código: [Seleccionar]
//////////////// Driver for MCP4921 D/A Converter ///////////////////////
////                                                                 ////
////  init_dac()    Call this before using a MCP4921 DAC             ////
////                                                                 ////
////  write_dac( long int )   Writes command and 12 bit resolution   ////
////                          to the MCP4921 which converts it to a  ////
////                          voltage                                ////
////                          0-4095 input represents 0-vref V out.  ////
////                                                                 ////
/////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2003 Custom Computer Services         ////
//// This source code may only be used by licensed users of the CCS  ////
//// C compiler.  This source code may only be distributed to other  ////
//// licensed users of the CCS C compiler.  No other use,            ////
//// reproduction or distribution is permitted without written       ////
//// permission.  Derivative programs created using this software    ////
//// in object code form are not restricted in any way.              ////
/////////////////////////////////////////////////////////////////////////

#ifndef EEPROM_SELECT

#define DAC_CS     PIN_B0
#define DAC_CLK    PIN_B1
#define DAC_DI     PIN_B2
#define DAC_LDAC   PIN_B4

#endif

void init_dac()
{
   output_high(DAC_CS);
   output_high(DAC_LDAC);
   output_high(DAC_CLK);
   output_high(DAC_DI);
}

void write_dac(int16 data) {
   BYTE cmd[3];
   BYTE i;

   cmd[0]=data;
   cmd[1]=(data>>8);
   cmd[2]=0x03;                           
   
   output_high(DAC_LDAC);
   output_low(DAC_CLK);
   output_low(DAC_CS);

   for(i=0; i<=23; ++i)
   {
      if(i<4 || (i>7 && i<12))
         shift_left(cmd,3,0);
      else
      {
         output_bit(DAC_DI, shift_left(cmd,3,0));

         output_high(DAC_CLK);
         output_low(DAC_CLK);
      }
   }
   output_high(DAC_CS);

   output_low(DAC_LDAC);
   delay_us(10);
   
   output_HIGH(DAC_LDAC);
}

Entiendo que se inicializa con el init_dac y luego con el write_dac ¿cómo convierto un número?
Título: Re: Funcionamiento del MCP4921. Dudas
Publicado por: Suky en 08 de Marzo de 2011, 12:16:42
Primero debes inicializar el dispositivo con init_dac(), y luego para realizar la conversión envias el valor con write_dac(....)  :?


Saludos!
Título: Re: Funcionamiento del MCP4921. Dudas
Publicado por: kukose en 08 de Marzo de 2011, 12:24:52
Pero sin más? Pongo write_dac(4095) y ya me convierte ese número a cinco voltios en la salida?
Título: Re: Funcionamiento del MCP4921. Dudas
Publicado por: Suky en 08 de Marzo de 2011, 13:16:08
Pero sin más? Pongo write_dac(4095) y ya me convierte ese número a cinco voltios en la salida?

Sip.... Seguro debes controlar el PIN CS. Para más detalles lee el datasheet de MCP4921


Saludos!
Título: Re: Funcionamiento del MCP4921. Dudas
Publicado por: kukose en 08 de Marzo de 2011, 13:36:44
Pero sin más? Pongo write_dac(4095) y ya me convierte ese número a cinco voltios en la salida?

Sip.... Seguro debes controlar el PIN CS. Para más detalles lee el datasheet de MCP4921


Saludos!

OK muchas gracias amigo, me quería complicar la vida mas de lo que era.
Título: Re: Funcionamiento del MCP4921. Dudas
Publicado por: kukose en 23 de Marzo de 2011, 06:52:00
Después de varios dias sin tocar nada, he vuelto y me he puesto con el circuito. Pero mi problema es que en la salida nunca tengo tensión. He probado a meter los datos en binario con diferentes bits, he probado con decimal pero nunca hay nada en la salida (VOUTA).

He cambiado el SDI por SDO y he probado a cambiar todo ya. Se que es una cosa muy simple pero no consigo dar con el problema.

Gracias.
Título: Re: Funcionamiento del MCP4921. Dudas
Publicado por: Suky en 23 de Marzo de 2011, 10:18:52
Prodrias colocar un diagrama de lo que implementas, y el código para ver como utilizas la librería  ;-)


Saludos!
Título: Re: Funcionamiento del MCP4921. Dudas
Publicado por: kukose en 23 de Marzo de 2011, 11:59:28
(http://www.todopic.com.ar/foros/imgtiny/2ufvbl1.png)

Ahí dejo la simulacion de proteus

Código: [Seleccionar]
#include <18F4550.h>
#fuses INTHS
#use delay(internal=8Mhz)
#include <LCD_flexible2.c>
#include <mcp4921_PERSONAL.c>
long int value=001111;
//long int a;

//void display_data(long int data) ;
void main()
{
init_dac();
   lcd_init();//Inicializamos el LCD

   //output_LOW(DAC_CS);
   write_dac(value);
   delay_ms(500);
   //for(value<000001;value>010000;value++);
   write_dac(value);
   
   //lcd_putc('\f');                     
   //lcd_gotoxy(1,1);
   printf(lcd_putc,"dac=%Lu\n",value);       //entero sin signo
   //printf(lcd_putc,"analog=%Lu ",a);
   while(1);
}

La configuración de mi libreria personal es la siguiente:

#define DAC_CS     PIN_B0
#define DAC_CLK    PIN_B1
#define DAC_DI     PIN_B2
#define DAC_LDAC   PIN_B4


Y decir que utilizo la librería del MCP4921 y uso el MCP4822 pero he cambiuado el uno por el otro y nada.
Título: Re: Funcionamiento del MCP4921. Dudas
Publicado por: Suky en 23 de Marzo de 2011, 12:26:37
En la imagen se ve poco y nada  :tongue: Pero prueba haciendo correctamente el control sobre CS, o sea:

CS=0;
write...
CS=1;


Muchos dispositivos después del CS=1 realizan la conversión.


Saludos!
Título: Re: Funcionamiento del MCP4921. Dudas
Publicado por: kukose en 24 de Marzo de 2011, 14:25:39
En la imagen se ve poco y nada  :tongue: Pero prueba haciendo correctamente el control sobre CS, o sea:

CS=0;
write...
CS=1;


Muchos dispositivos después del CS=1 realizan la conversión.


Saludos!

Ni aún así. No logro entender cuál es mi fallo a no ser que esté metiendo mal los datos y me de una tensión de 0 ya que no hay nada que leer.
Si por lo menos saldrían unos milivoltios para ver que funciona la salida..
En la imagen tengo VOUTB a Vcc pero solo era por probar una cosa más.
Título: Re: Funcionamiento del MCP4921. Dudas
Publicado por: MGLSOFT en 24 de Marzo de 2011, 14:59:04
La imagen no concuerda con los pines que dices usar...
Estas seguro que es esa la imagen del proteus.
Porque no conectas pin a pin, sin usar terminales de bus, asi vemos bien como esta conectado??
Título: Re: Funcionamiento del MCP4921. Dudas
Publicado por: kukose en 24 de Marzo de 2011, 15:14:35
He estado cambiando cosas y no concordaba la imagen con los pines. Lo he conectado directamente y algo sale en el polímetro, aunque son milivoltios.

#define DAC_CS     PIN_A0
#define DAC_CLK    PIN_B1
#define DAC_DI     PIN_B0
#define DAC_LDAC   PIN_B4

(http://www.todopic.com.ar/foros/imgtiny/2v8kb4z.png)
Título: Re: Funcionamiento del MCP4921. Dudas
Publicado por: Suky en 24 de Marzo de 2011, 16:06:43
SDI del MCP va al SDO del micro. Si vas a utilizar RA0 asegúrate de configurar el módulo analógico y los comparadores.


Saludos!
Título: Re: Funcionamiento del MCP4921. Dudas
Publicado por: MGLSOFT en 24 de Marzo de 2011, 17:14:11
Asi funciona Ok !!

Esquema:

(http://)

Y el codigo es el siguiente:

Código: C++
  1. #include <18F4550.h>
  2. #fuses INTHS
  3. #use delay(internal=8Mhz)
  4.  
  5. #define LCD_ENABLE_PIN  PIN_D0                                    
  6. #define LCD_RS_PIN      PIN_D2                  
  7. #define LCD_RW_PIN      PIN_D1                        
  8. #define LCD_DATA4       PIN_D4                        
  9. #define LCD_DATA5       PIN_D5                        
  10. #define LCD_DATA6       PIN_D6                      
  11. #define LCD_DATA7       PIN_D7
  12.  
  13. #include <LCD.c>
  14. #include <mcp4921.c>
  15. int16 value=20;
  16. //long int a;
  17.  
  18. //void display_data(long int data) ;
  19. void main()
  20. {
  21. init_dac();
  22.    lcd_init();//Inicializamos el LCD
  23.  
  24.    //output_LOW(DAC_CS);
  25.    write_dac(value);
  26.    delay_ms(500);
  27.    
  28.    for(value=1;value<=4095;value++)
  29.    {
  30.       write_dac(value);
  31.       delay_ms(5);
  32.    }
  33.    
  34.    //lcd_putc('\f');                    
  35.    //lcd_gotoxy(1,1);
  36.    printf(lcd_putc,"dac=%Lu\n",value);       //entero sin signo
  37.    //printf(lcd_putc,"analog=%Lu ",a);
  38.    while(1);
  39. }
Título: Re: Funcionamiento del MCP4921. Dudas
Publicado por: MGLSOFT en 24 de Marzo de 2011, 17:15:36
Asi funciona Ok !!

Esquema:

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=34043.0;attach=15347;image)

Y el codigo es el siguiente:

Código: C++
  1. #include <18F4550.h>
  2. #fuses INTHS
  3. #use delay(internal=8Mhz)
  4.  
  5. #define LCD_ENABLE_PIN  PIN_D0                                    
  6. #define LCD_RS_PIN      PIN_D2                  
  7. #define LCD_RW_PIN      PIN_D1                        
  8. #define LCD_DATA4       PIN_D4                        
  9. #define LCD_DATA5       PIN_D5                        
  10. #define LCD_DATA6       PIN_D6                      
  11. #define LCD_DATA7       PIN_D7
  12.  
  13. #include <LCD.c>
  14. #include <mcp4921.c>
  15. int16 value=20;
  16. //long int a;
  17.  
  18. //void display_data(long int data) ;
  19. void main()
  20. {
  21. init_dac();
  22.    lcd_init();//Inicializamos el LCD
  23.  
  24.    //output_LOW(DAC_CS);
  25.    write_dac(value);
  26.    delay_ms(500);
  27.    
  28.    for(value=1;value<=4095;value++)
  29.    {
  30.       write_dac(value);
  31.       delay_ms(5);
  32.    }
  33.    
  34.    //lcd_putc('\f');                    
  35.    //lcd_gotoxy(1,1);
  36.    printf(lcd_putc,"dac=%Lu\n",value);       //entero sin signo
  37.    //printf(lcd_putc,"analog=%Lu ",a);
  38.    while(1);
  39. }
Título: Re: Funcionamiento del MCP4921. Dudas
Publicado por: edyorit en 15 de Octubre de 2012, 08:12:25
querido mglsoft quería saber donde se encuentra el módulo SPI en las bibliotecas proteus también quería saber si usted podría también archivos de origen pubblicarmi lcd.ce mcp4921.c

Estoy tratando de imitar a su propio proyecto, pero soy muy ignorante
¡muchas gracias
Título: Re: Funcionamiento del MCP4921. Dudas
Publicado por: edyorit en 15 de Octubre de 2012, 11:57:23
help me!!! thanks!
Título: Re: Funcionamiento del MCP4921. Dudas
Publicado por: fantaxmax en 15 de Octubre de 2012, 12:47:40
querido mglsoft quería saber donde se encuentra el módulo SPI en las bibliotecas proteus también quería saber si usted podría también archivos de origen pubblicarmi lcd.ce mcp4921.c

Estoy tratando de imitar a su propio proyecto, pero soy muy ignorante
¡muchas gracias

imagino que con modulo SPI te refieres al MCP si es ese en la barra de busqueda del proteus cuando vas a colocar un objeto ahi lo encuentras colocando MCR4921 y te va a aprecer, si con modulo SPI te refieres al debugger SPI lo encuentras en la columna izquerda en el icono que este encima de la linea y se llama Virtual instruments Mode

respecto a las librerias, las encuentras en la carpeta drivers de la instalacion del CCS.

Espero te ayude y Saluti!
Título: Re: Funcionamiento del MCP4921. Dudas
Publicado por: edyorit en 15 de Octubre de 2012, 13:03:49
querido mglsoft quería saber donde se encuentra el módulo SPI en las bibliotecas proteus también quería saber si usted podría también archivos de origen pubblicarmi lcd.ce mcp4921.c

Estoy tratando de imitar a su propio proyecto, pero soy muy ignorante
¡muchas gracias

imagino que con modulo SPI te refieres al MCP si es ese en la barra de busqueda del proteus cuando vas a colocar un objeto ahi lo encuentras colocando MCR4921 y te va a aprecer, si con modulo SPI te refieres al debugger SPI lo encuentras en la columna izquerda en el icono que este encima de la linea y se llama Virtual instruments Mode

respecto a las librerias, las encuentras en la carpeta drivers de la instalacion del CCS.

Espero te ayude y Saluti!



muchas gracias has sido muy amable! También puede usted darme una mano sobre el código fuente?
Título: Re: Funcionamiento del MCP4921. Dudas
Publicado por: edyorit en 15 de Octubre de 2012, 13:23:07
cuando inserto el código y el MCP4921 código que se encuentra al principio de esta discusión y compilar con MPLAB me sale este error:
provaconc1.c: 14: Error [1027] unable to locate 'mcp4921.c'

Me gustaría empezar diciendo que he puesto en el camino de la mcp4921.c archivo de proyecto y he añadido al archivo de proyecto con la función de complemento

¿Quién me puede ayudar? muchas gracias



Código: [Seleccionar]
#include <p18F4550.h>
#fuses INTHS
#use delay(internal=8Mhz)
 
#define LCD_ENABLE_PIN  PIN_D0                                   
#define LCD_RS_PIN      PIN_D2                   
#define LCD_RW_PIN      PIN_D1                       
#define LCD_DATA4       PIN_D4                         
#define LCD_DATA5       PIN_D5                         
#define LCD_DATA6       PIN_D6                       
#define LCD_DATA7       PIN_D7
 
//#include <LCD.c>
#include <mcp4921.c>
int16 value=20;
//long int a;
 
//void display_data(long int data) ;
void main()
{
init_dac();
   lcd_init();
 
   //output_LOW(DAC_CS);
   write_dac(value);
   delay_ms(500);
   
   for(value=1;value<=4095;value++)
   {
      write_dac(value);
      delay_ms(5);
   }
   
   //lcd_putc('\f');                     
   //lcd_gotoxy(1,1);
   printf(lcd_putc,"dac=%Lu\n",value);       
   //printf(lcd_putc,"analog=%Lu ",a);
   while(1);
}
Título: Re: Funcionamiento del MCP4921. Dudas
Publicado por: fantaxmax en 15 de Octubre de 2012, 13:47:40
Código: C
  1. #include <18F4550.h>//segun el codigo me parece que usas CCS entonces la cabecera es sin la p
  2. #fuses INTHS
  3. #use delay(clock=8M)
  4.  
  5. #define LCD_ENABLE_PIN  PIN_D0                                    
  6. #define LCD_RS_PIN      PIN_D2                  
  7. #define LCD_RW_PIN      PIN_D1                        
  8. #define LCD_DATA4       PIN_D4                        
  9. #define LCD_DATA5       PIN_D5                        
  10. #define LCD_DATA6       PIN_D6                      
  11. #define LCD_DATA7       PIN_D7
  12.  
  13. #include <LCD.c>
  14. #include <mcp4921.c> //si el archivo mcp4921 esta junto al archivo principal del codigo, osea este, debes cambiar los <> por ""
  15. int16 value=20;
  16. //long int a;
  17.  
  18. //void display_data(long int data) ;
  19. void main()
  20. {
  21. setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_PLL_OFF);//configuro el oscilador interno
  22. init_dac();
  23.    lcd_init();
  24.  
  25.    //output_LOW(DAC_CS);
  26.    write_dac(value);
  27.    delay_ms(500);
  28.    
  29.    for(value=1;value<=4095;value++)
  30.    {
  31.       write_dac(value);
  32.       delay_ms(5);
  33.    }
  34.    
  35.    //lcd_putc('\f');                    
  36.    //lcd_gotoxy(1,1);
  37.    printf(lcd_putc,"dac=%Lu\n",value);      
  38.    //printf(lcd_putc,"analog=%Lu ",a);
  39.    while(1);
  40. }

bueno con eso en el CCS no debieses tener problemas, si usas el mplab y en la configuracion del proyecto seleccionas como compilador el CCS sirve igual.

espero solucione tu problema

Saludos!
Título: Re: Funcionamiento del MCP4921. Dudas
Publicado por: edyorit en 15 de Octubre de 2012, 13:55:57
Gracias por su pronta respuesta y por su amabilidad
Hice lo que me sugirió y ahora digo:


Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "C:\Program Files (x86)\Microchip\mplabc18\v3.43\bin\mcc18-traditional.exe" +FH "provaconc1.c" +EXPORT +DF +LN +T +A +M -Z +Y=9
Error: unable to locate '+FH'
BUILD FAILED: Mon Oct 15 18:54:01 2012



¡muchas gracias
Título: Re: Funcionamiento del MCP4921. Dudas
Publicado por: fantaxmax en 15 de Octubre de 2012, 14:05:24
en el mplab estas usando el compilador C18, debes cambiarlo por CCS, ahora no recuerdo donde se hace, pero cuando creas un nuevo proyecto te da la opcion de elegir que compilador vas a usar, ahi debes seleccionar CCS o PICC o PCW no recuerdo que nombre sale, al seleccionar el CCS no vas a tener errores.

Saludos!
Título: Re: Funcionamiento del MCP4921. Dudas
Publicado por: edyorit en 28 de Octubre de 2012, 17:27:17
en el mplab estas usando el compilador C18, debes cambiarlo por CCS, ahora no recuerdo donde se hace, pero cuando creas un nuevo proyecto te da la opcion de elegir que compilador vas a usar, ahi debes seleccionar CCS o PICC o PCW no recuerdo que nombre sale, al seleccionar el CCS no vas a tener errores.

Saludos!

Querido fantaxmax puedo pedirte un favor, porque no puedo completar el archivo de arriba me aconsejas otro compilador? También me gustaría tener el expediente del originador donde sea posible dell'mcp4921
¡muchas gracias
Título: Re: Funcionamiento del MCP4921. Dudas
Publicado por: fantaxmax en 29 de Octubre de 2012, 14:59:22
aconsejarte otro compilador no podria porque he usado solamente el PCW o CCS, si no puedes compilar el programa prueba a abrir el PCW o CCS desde el menu inicio o el acceso directo que crea al momento de instalar, y usas la IDE propia del CCS, y no junto a MPLAB, abres el CCS y creas un nuevo archivo de codigo principal, y pegas el codigo que ya ha sido comentado con anterioridad aca, luego vas a la opcion compilar y debiese compilarlo sin problemas, pero basicamente no puedo recomendarte otros compiladores, ya que uso solamente CCS,  y de nombre conosco el C18, pero nada mas, lameto si no puedo ayudarte mas

Saludos!
Título: Re:Funcionamiento del MCP4921. Dudas
Publicado por: mariacontenis en 23 de Julio de 2018, 14:26:58
Amigos del foro, aquí e probado el code que suvieron y funciona al 100.

Código: C++
  1. .   include <mcp4921>
  2. int16 value=20;
  3. //long int a;
  4.  
  5. //void display_data(long int data) ;
  6. void main()
  7. {
  8. setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_PLL_OFF);//configuro el oscilador interno
  9. init_dac();
  10.    lcd_init();
  11.  
  12.    //output_LOW(DAC_CS);
  13.    write_dac(value);
  14.    delay_ms(500);
  15.    
  16.    for(value=1;value<=4095;value++)
  17.    {
  18.       write_dac(value);
  19.       delay_ms(5);
  20.    }
  21.    
  22.    //lcd_putc('\f');                    
  23.    //lcd_gotoxy(1,1);
  24.    printf(lcd_putc,"dac=%Lu\n",value);      
  25.    //printf(lcd_putc,"analog=%Lu ",a);
  26.    while(1);
  27. }

Si embargo quiero conectar dos o tresde estos DAC en un pic.

Me podéis orientar con esto...