Autor Tema: conversor a 10 bit  (Leído 7240 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: conversor a 10 bit
« Respuesta #15 en: 25 de Septiembre de 2008, 18:57:44 »
Efectivamente Micro23, el 16C73A no posee ADC a 10 bits, tiene maximo 8.

Para evitar esos inconvenientes ( o porque ya estoy acostumbrado realmente al entorno del MPLAB IDE ) yo configuro el proyecto desde el MPLAB IDE y compilo con CCS ( hay que instalar un plugin ).

Si quieres que incluya el 16F873A, debes colocar #include <16F873A.h>, ya que si tu seleccionas al 16F873A pero le das #include<16C73A.h>, pues logicamente el compilador asignara el archivo de cabecera correspondiente a ese microcontrolador.

Saludos
El papel lo aguanta todo

Desconectado Micro23

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 226
Re: conversor a 10 bit
« Respuesta #16 en: 25 de Septiembre de 2008, 19:41:26 »
Hola denuevo.
Diego que version del compilador estas usando? yo tengo la 4.057 y si en el wizard pongo 16f876a me incluye ese dispositivo y no el que decis.
Saludos
El pesimista se queja del viento
El optimista espera que cambie
El realista ajusta las velas

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: conversor a 10 bit
« Respuesta #17 en: 26 de Septiembre de 2008, 10:59:15 »
MLO, Micro23, hola de nuevo
la versión que tengo del CCS es la 3.149, veo que está muy desactualizada.
el proyecto lo creo utilizando wizard.
Pero MLO, veo que utilizas el MPLAB IDE, yo he trabajado durante mucho tiempo el
MPLAB IDE, lo manejo bien porque siempre he trabajado en assembler, solo ahora quiero
intruducirme en C, tengo instalada la versión 8.1 del Mplab, esta según tengo entendido trae
el plugin "Hi-tech". utilizo el PWC porque en unos tuitoriales que conseguí sugerían
este soft-ware; pero que más quisiera yo que trabajar en MPLAB IDE con todas sus
propiedades de depuración y demás.
Por lo que te entiendo acá, puedo utilizar el Mplab IDE para crear y editar el
codigo, crear el proyecto, y debo compilar con PCW, y luego depurar en Mplab ?
me puedes aclarar un poco ?

gracias


Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: conversor a 10 bit
« Respuesta #18 en: 26 de Septiembre de 2008, 11:31:46 »
MLO, micro23, como les dije anteriormente mi propósito es introducirme en C debido
a las ventajas que ofrece este lenguaje.
mi metodología de aprendizaje es resolver con C las aplicaciones básicas del PIC
llevo una semana trabajanco con C y creo que ya he avanzado algo.
les comparto el siguiente codigo de un conversor AD con paramteros programables
de setpoint y un visualizador de 4 digitos. lo hesimulado eh proteus y funciona perfecto.

hasta pronto.

#include <16c73A.h>
#device adc=10
#use delay(clock=4000000)
#fuses XT,PUT,BROWNOUT,NOWDT

#byte   porta=5      //Definicion de variables del pic
#byte   portb=6
#byte   portc=7
#byte   t1con=0x10
#byte   adcon0=0x1f
#byte   adcon1=0x9f
#byte   adresl=0x9e
#byte   adresh=0x1e

#define   q1   porta,1   //Definicion de bits
#define   q2   porta,2
#define   q3   porta,3
#define   q4   porta,4
#define   salida   porta,5
#define ad_ini   adcon0,2

int   unid,dece,cent,u_mil;   //Definicion de variables
int respaldo;            //Variable de 8 bit
int16 set_point;         //Variable de 16 bit
int16 valor_ad;
int16 respaldo16;
int32 respaldo32;         //Variable de 32 bit
short int   ban_osc;      //Variables de 1 bit
Short int   ban_hab;
Short int   ban_05seg;
short int   ban_tec1;
short int   ban_tec2;
short int   ban_tec3;
short int   ban_tec4;
short int   ban_tec5;
short int   ban_tec6;
short int   ban_tec7;
short int   ban_tec8;
short int   ban_tec9;
short int   ban_tec10;
short int   ban_tec11;
short int   ban_tec12;
short int   ban_tec13;
short int   ban_tec14;
short int   ban_tec15;
short int   ban_tec16;

byte const segmentos[11]={0b00111111,   //Definicion de variables constantes
                     0b00000110,   //o tablas por medio de una matriz
                     0b01011011,
                     0b01001111,
                     0b01100110,
                     0b01101101,
                     0b01111101,
                     0b00100111,
                     0b01111111,
                     0b01101111,
                     0b01000000};

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
#int_timer1               //Vector de interrupcion por desbordamiento del
void interrupcion_tmr1()   //timer 1
{
   set_timer1(3036);      //Se carga el timer 1 con valor
///////////////////////////////////////

   ban_05seg=1;
}
///////////////////////////////////////////////////////////////////////////////
void bcd_bin()   //Rutina de conversión bcd a binario de 16 bit
{
respaldo16=0;   //Cuando una operación genere carry se recomienda anteponer
            //la sentencia (int16)
respaldo16=(int16)u_mil*1000+(int16)cent*100+(int16)dece*10+unid;
set_point=respaldo16;

}
///////////////////////////////////////////////////////////////////////////////
void bin_bcd()   //Rutina de conversión binario 16 bit a decima 4 digitos
{
u_mil=0;
cent=0;
dece=0;
unid=0;

if(ban_hab==1)
   {
   respaldo16=set_point;
   }
else
   {
   respaldo16=valor_ad;
   }

u_mil=respaldo16/1000;
respaldo16=respaldo16%1000;      //El símbolo % se utiliza para que deje en la
                        //variable el residuo de la operacion
cent=respaldo16/100;         //respaldo16/1000
respaldo16=respaldo16%100;

dece=respaldo16/10;
respaldo16=respaldo16%10;

unid=respaldo16;
}
///////////////////////////////////////////////////////////////////////////////
void rotar()   //Rutina que desplaza los dígitos en el display
{            //cuando se presiona una tecla
u_mil=cent;
cent=dece;
dece=unid;
unid=respaldo;

bcd_bin();
}
///////////////////////////////////////////////////////////////////////////////
void display()   //Rutina general del display
{
bin_bcd();

portc=(segmentos[unid]);
if(ban_osc!=1)
   {bit_set(q4);}
delay_ms(1);
bit_clear(q4);

portc=(segmentos[dece]);
if(ban_osc!=1)
   {bit_set(q3);}
delay_ms(1);
bit_clear(q3);

portc=(segmentos[cent]);
if(ban_osc!=1)
   {bit_set(q2);}
delay_ms(1);
bit_clear(q2);

portc=(segmentos[u_mil]);
if(ban_osc!=1)
   {bit_set(q1);}
delay_ms(1);
bit_clear(q1);
}
///////////////////////////////////////////////////////////////////////////////
void teclado()      //Rutina general de teclado
{
portb=(0x0f);
   bit_clear(portb,0);
   delay_us(100);
//////////////////
   if(ban_hab==1)
      {
      if((bit_test(portb,7)==0)&&(ban_tec1==0))
         {
         ban_tec1=1;
         respaldo = 1;
         rotar();
         }
      if(bit_test(portb,7)==1)
         {
         ban_tec1=0;
         }
      }
//////////////////
   if(ban_hab==1)
      {
      if((bit_test(portb,6)==0)&&(ban_tec2==0))
         {
         ban_tec2=1;
         respaldo = 2;
         rotar();
         }
      if(bit_test(portb,6)==1)
         {
         ban_tec2=0;
         }
      }
//////////////////
   if(ban_hab==1)
      {
      if((bit_test(portb,5)==0)&&(ban_tec3==0))
         {
         ban_tec3=1;
         respaldo = 3;
         rotar();
         }
      if(bit_test(portb,5)==1)
         {
         ban_tec3=0;
         }
      }
//////////////////
   if(ban_hab==1)
      {
      if((bit_test(portb,4)==0)&&(ban_tec4==0))
         {
         ban_tec4=1;
         respaldo = 4;
         rotar();
         }
      if(bit_test(portb,4)==1)
         {
         ban_tec4=0;
         }
      }

   bit_set(portb,0);
   bit_clear(portb,1);
   delay_us(100);
//////////////////
   if(ban_hab==1)
      {
      if((bit_test(portb,7)==0)&&(ban_tec5==0))
         {
         ban_tec5=1;
         respaldo = 5;
         rotar();
         }
      if(bit_test(portb,7)==1)
         {
         ban_tec5=0;
         }
      }
//////////////////
   if(ban_hab==1)
      {
      if((bit_test(portb,6)==0)&&(ban_tec6==0))
         {
         ban_tec6=1;
         respaldo = 6;
         rotar();
         }
      if(bit_test(portb,6)==1)
         {
         ban_tec6=0;
         }
      }
//////////////////
   if(ban_hab==1)
      {
      if((bit_test(portb,5)==0)&&(ban_tec7==0))
         {
         ban_tec7=1;
         respaldo = 7;
         rotar();
         }
      if(bit_test(portb,5)==1)
         {
         ban_tec7=0;
         }
      }
//////////////////
   if(ban_hab==1)
      {
      if((bit_test(portb,4)==0)&&(ban_tec8==0))
         {
         ban_tec8=1;
         respaldo = 8;
         rotar();
         }
      if(bit_test(portb,4)==1)
         {
         ban_tec8=0;
         }
      }

   bit_set(portb,1);
   bit_clear(portb,2);
   delay_us(100);
//////////////////
   if(ban_hab==1)
      {
      if((bit_test(portb,7)==0)&&(ban_tec9==0))
         {
         ban_tec9=1;
         respaldo = 9;
         rotar();
         }
      if(bit_test(portb,7)==1)
         {
         ban_tec9=0;
         }
      }
//////////////////
   if(ban_hab==1)
      {
      if((bit_test(portb,6)==0)&&(ban_tec10==0))
         {
         ban_tec10=1;
         respaldo = 0;
         rotar();
         }
      if(bit_test(portb,6)==1)
         {
         ban_tec10=0;
         }
      }
//////////////////
   if(ban_hab==1)
      {
      if((bit_test(portb,5)==0)&&(ban_tec11==0))
         {
         set_point=0;
         }
      if(bit_test(portb,5)==1)
         {
         ban_tec11=0;
         }
      }
//////////////////
      if((bit_test(portb,4)==0)&&(ban_tec12==0))
         {
         ban_tec12=1;

         if(ban_hab==1)
            {
            ban_hab=0;
            ban_osc=0;
            }
         else
            {
            ban_hab=1;
            ban_osc=1;
            }
         }
      if(bit_test(portb,4)==1)
         {
         ban_tec12=0;
         }
   bit_set(portb,2);
}
///////////////////////////////////////////////////////////////////////////////
void osc_display()         //Rutina que alterna la bandera que hace oscilar
{                     //el display
   if(ban_hab==1)
      {
      if(ban_osc==1)
         {
         ban_osc=0;
         }
      else
         {
         ban_osc=1;
         }
      }
}
///////////////////////////////////////////////////////////////////////////////
void conversion_ad()
{
//set_adc_channel(0);
//delay_us(10);
//valor_ad = read_adc();

bit_set(ad_ini);   //Se da inicio a la conversion
while(ad_ini==1);   //Se espera a que finalice la conversion

valor_ad=((int16)adresh*256)+adresl;   //Se suma los productos de los registos
                              //adresh y adresl en una sola variable
respaldo32=((int32)valor_ad*100)/1023;   //Se entrega el valor en porcentaje
valor_ad=respaldo32;
///////////////////////////////////////
if(valor_ad>=set_point)   //Si valor_ad es mayor que set ponit activa la salida
   {bit_set(salida);}
else
   {bit_clear(salida);}//De lo contrario la apaga

}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

#zero_ram   //Borrado de la memoria ram

main()      //Rutina principal
{
set_tris_a(0b000001);      //Configuracion de entradas y salidas del puerto A
set_tris_b(0b11110000);      //Configuracion de entradas y salidas del puerto B
set_tris_c(0b00000000);      //Configuracion de entradas y salidas del puerto C
port_b_pullups(true);      //Habilitación de las resistencias pull-ups
t1con=(0b00110101);         //Configuracion del tmr1
adcon0=0x01;
adcon1=0x8e;

enable_interrupts(global);   //Habilitación de todas las interrupciones
enable_interrupts(int_timer1); //Habilitación de la interrupción del Tmr1

porta=0;   //Porta inicia en 0
portb=0;   //Portb inicia en 0
portc=0;   //Portc inicia en 0

set_point=25;

while(true)      //Rutina general
   {
   teclado();
   display();
   conversion_ad();

   if(ban_05seg==1)
      {
      ban_05seg=0;
      osc_display();
      }
   }
}
///////////////////////////////////////////////////////////////////////////////



Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: conversor a 10 bit
« Respuesta #19 en: 26 de Septiembre de 2008, 12:15:19 »
Hola.

Gracias por compartir tu codigo, de seguro le ha de ser util a alguien.

Diego, uno puede usar el MPLAB como entorno IDE, tan solo es necesario instalar el plugin (la version 8.1 ya debe tenerlo). Para crear un proyecto seleccionando el compilador CCS debes hacer lo siguiente:

1. Ve a Project/Project Wizard
2. Selecciona el micro a utilizar
3. Selecciona el compilador (En Active toolsuite busca el CCS)
4. Selecciona el nombre del proyecto y la ruta del directorio donde lo vas a guardar
5. Adiciona el codigo del programa principal (si lo tienes). Si no lo tienes, dale siguiente y cliqueas en New File, guardas como .c y adicionas el archivo creado en Source Files.

Y listo, puedes usar el entorno del MPLAB IDE compilando con el CCS.

Saludos
El papel lo aguanta todo

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: conversor a 10 bit
« Respuesta #20 en: 26 de Septiembre de 2008, 16:57:48 »
MLO, ya hice lo que me indicaste respecto al mplab: creo proyecto, selcciono lenguaje, al compilar me abre el pcw, luego compilo en PCW y este me abre el compilador CCS; pero aparece este mensaje también.
"Exceptio EInOutError in module PCM,DLL at 000C1BF4"

gracias

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: conversor a 10 bit
« Respuesta #21 en: 26 de Septiembre de 2008, 18:39:12 »
MLO, ya hice lo que me indicaste respecto al mplab: creo proyecto, selcciono lenguaje, al compilar me abre el pcw, luego compilo en PCW y este me abre el compilador CCS; pero aparece este mensaje también.
"Exceptio EInOutError in module PCM,DLL at 000C1BF4"

gracias

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: conversor a 10 bit
« Respuesta #22 en: 26 de Septiembre de 2008, 18:45:02 »
Hola.

Instala el plugin para el CCS, es mejor estar seguros de que si lo tienes, una vez instalado revisa que este activa la ruta del compilador.


saludos
El papel lo aguanta todo

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: conversor a 10 bit
« Respuesta #23 en: 27 de Septiembre de 2008, 09:28:43 »
Hola MLO, al abrir la ventana que me indicas en la imagen me aparece exactamente lo mismo
que le en la tuya, cuando presiona F10 para compilar automáticamente abre el PCW, luego
intento compilar en PCW con F9, trata de iniciar pero aparece este error
"Exceptio EInOutError in module PCM,DLL at 000C1BF4"

gracias.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: conversor a 10 bit
« Respuesta #24 en: 27 de Septiembre de 2008, 11:42:01 »
Hola.

Que sistema operativo tienes? WinXP o WinVista?

El papel lo aguanta todo

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: conversor a 10 bit
« Respuesta #25 en: 27 de Septiembre de 2008, 14:51:30 »
MLO, tengo instalado windows XP

gracias

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: conversor a 10 bit
« Respuesta #26 en: 27 de Septiembre de 2008, 15:53:42 »
... cuando presiona F10 para compilar automáticamente abre el PCW, luego
intento compilar en PCW con F9...

No entiendo porque tienes que darle primero F10 y luego F9  :z)

Alguna vez has llegado a la siguiente figura?


A que te refieres que abre el PCW???

saludos
El papel lo aguanta todo

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: conversor a 10 bit
« Respuesta #27 en: 29 de Septiembre de 2008, 09:28:31 »
Hola de nuevo MLO, yo abro un archivo de c en Mplab creo proyecto y todo lo demás, luego intento compilarlo ahí mismo (en Mplab, esto se logra presioando la tecla F10), en ese momento se abre automaticamente PCW, y carga el archivo de c que tengo abierto en Mplab, luego intento compilar desde el PCW, (F9 es la tecla de acceso rápido); pero veo que tienes la versión 4 de PCW y yo tengo la 3.14, eso no influirá ?
Gracias

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: conversor a 10 bit
« Respuesta #28 en: 29 de Septiembre de 2008, 12:16:27 »
Hola.

No creo que la version tenga algo que ver. Aun no entiendo a que te refieres que te "abre" el PCW  :lol: ... te refieres a que te abre el IDE del CCS?? porque normalmente yo le doy click al boton de Buid All para comilar y ya, me muestra la ventanita que postee en mi mensaje anterior.

Saludos
El papel lo aguanta todo

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: conversor a 10 bit
« Respuesta #29 en: 29 de Septiembre de 2008, 13:10:28 »
MLO, si efectivamente abre el PCW cuando le doy la opcion build all; pero MLO, no te quiero quitar mas tiempo con esto ya me has ayudado demasiado. una ultima pregunta cuando en una operacion de resta cuando me da un numero negativo como lo puedo identificar, pues en assembler yo preguntaba por el carry y si este era cero la cifra es negativa y le hacia complemento a 2
pero en C tengo dudas

gracias.


 

anything