# 2 entradas anánalogicas (10 bits), output en 2 puertos para completar los 10 bits.



## jarm (Ene 9, 2012)

Hola amigos. 
Yo no soy muy nuevo en esto de la electrónica pero tengo poca experiencia en esto de los microcontroladores PIC, ojala y me puedan ayudar. 

Este proyecto lo estoy desarrollando con el PIC18f4550, estoy utilizando dos canales analógicos para testear dos señales analógicas /AN0, AN1), estas dos señales analógicas corresponden a voltaje y corriente, hago mis operaciones para sacar la corriente no activa, la cual esta almacenada en la variable  "salida".

Mi gran preguntota es: Si tengo mi ADC de 10 bits, tengo una buena resolución pero a la salida solo tengo 8 pines de salida por el puerto b ¿Como puedo tener una salida de 10 bits utilizando 2 puertos por ejemplo el port_b y port_d? Estoy utilizando el PIC C Compeler

Aquí les dejo mi programa para que le echen un ojo.
.

```
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "18f4550.h"                        //Libreria del microcontrolador
#fuses HSPLL,NOWDT,NOBROWNOUT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,MCLR,NOPBADEN,WRTB
#device adc = 10                           //# de bits del adc 2^10=1024
#use delay(clock=20000000)                 //Frecuencia de oscilacion
#build (reset=0x800, interrupt=0x808)
#org 0x000, 0x7ff {}


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void main ()
   {
     
      int16 v, i; 
      float vpico, ipico, vpr, ipr, div, prod, ina, potdos, volt, corr, salida;   //variables de ecuaciones 
   set_tris_b(0x00);                         //configuramos el puerto b como salidas
   
   setup_adc_ports(AN0_TO_AN1);              //configuramos el adc del pic con dos canales analogicos AN0 y AN1
   setup_adc(ADC_clock_internal);            //reloj interno
   
    
       for (;;)                              //bucle infinito
         {
         set_adc_channel(0);                 //lectura de la linea de voltaje NA0
         delay_us(10);                       //tiempo necesario para la conversion
        
         v = read_adc();                      //leemos AN0 y guardamos en v
         volt = 5*v/1024;                     //conversion a voltaje
         potdos = volt * volt;                //elevamos al cuadrado
         vpico = potdos / 0.707;              //voltaje pico de entrada
         vpr = vpico * 0.636;                 //Voltaje promedio
         
         set_adc_channel(1);                  //lectura de la corriente NA1
         delay_us(10);                        //tiempo necesario para la conversion
        
         i = read_adc();                      //leemos AN1 y guardamos en i
         corr = 5*i/1024;                     //Conversion a corriente
         ipico = i / 0.707;                   //corriente pico
         ipr = ipico * 0.636;                 //corriente promedio
        
         //EMPIEZA LAS FORMULAS PARA LA CORRIENTE NO-ACTIVA
         
         div = ipr / vpr;                       //DIVICION DE LA CORRIENTE RESPECTO A LA TENSION                
         prod = div * volt;                     //OBTENCION DE LA CORRIENTE ACTIVA
         ina = corr - prod;                     //OBTENCION DE LA CORRIENTE NO-ACTIVA
         salida = ina;                      //adaptamos a 8 bits del puerto_b 1024/8bits=128
         
         output_b(salida);                      //sacamos los bits  por el portB
        
         }
       
   }
```
Quiero la salida por el puerto b y d para después meterlo a un DAC de 10bits y poder ver la forma de onda resultante.
Agradezco su atención para leer este mensaje gracias


----------



## Scooter (Ene 9, 2012)

Divide y vencerás... dividir por dos quita el bit menos significativo, por cuatro los dos menos significativos, en el resto están esos bits.
O haz una máscara y toma por un lado unos bits y por otro los otros al gusto.


----------



## jarm (Ene 10, 2012)

OK créeme ya lo avía pensado pero no sé cómo llevarlo a cabo solo se me ocurre hacer esto en las ultimas líneas. 
Desplazar a la izquierda


         x<<=salida;
         output_b(x);                      //sacamos los 8 bits  por el portB
         y=salida;
        output_d;                       //dos bits restantes en portd

Tenx


----------



## Scooter (Ene 10, 2012)

Bueno, rotar es lo mismo que multiplicar o dividir por dos según hacia adonde se rote.


----------



## jarm (Ene 10, 2012)

Ya lo compile en PIC c compeler y aparentemente esta bien.
Entonces si están bien las últimas lineas? Para obtener 10 bits en los 2 puertos de salida.


----------



## tnxhawks (Oct 9, 2012)

Hola que tal, yo tengo una duda, lo que pasa es que siempre he trabajado con el canal 0 del pic 18f4550 pero ahora necesito trabajar con dos canales, pero para empezar quise configurar el adc para trabajar en el canal 1 y no he podido hacerlo funcionar utilizo Mplab, mis configuraciones son las siguientes:


```
void inicializar_ADC(void)
 {
	ADCON0=0B00001001;
	ADCON1=0B00001101;
	ADCON2=0X8E;
     }
int obtener_ADC2(void)
 {
	//ADCON0=0B00001001;	
 	ADCON0bits.GO=1;
	while(ADCON0bits.GO)
 	{
		valorADC2=(int)(ADRESH*256) + ADRESL; 
    	return valorADC2;
	}
 }
 }
```

despues en el main solo mando a la funcion obtener_ADC2(valorADC) y se lo guardo a una variable. no encuentro mi error, para utilizar el canal 0 solo cambio los bits del registro ADCON0 para seleccionar el canal.
Gracias por la ayuda!!


----------

