Variar con el adc la velocidad de rotacion de los bit del puerto b

saludos alguien sabe mas bien este es lo que quiero hacer pero no se como o no se si se pueda

loque quiero hacer es que conectando un potenciometro al canal analogico adc de 877 pueda yo variarel tiempo de interrupcion del timer osea loq ue quiero es rotar un bit en el puerto b como un contador en anillo pero cada que rote el bit este ahi un sierto tiempo asta que se desborde el timer y asi que siga rotando el bit y con el conversor adc y potencimetro variar el tiempo que tarda el timer en desbordarse
he leido que se puede activar el adc y este convirtiendo sin el uso de las instrucciones. espero me hayan entendido.
 
Aquí te dejo el código.

Con un potenciometro contectado en el canal 0, podras regular la velocidad entre 13mS y 3'3 segundos la velocidad de rotación del puerto B.

Espero que te sirva.


Saludos.


Código:
#include <16F877.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES LVP                      //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD

#use delay(clock=20000000)


int lectura=0;          // Variable para el valor de la conversion ADC
int contador=0;
int valor_puerto=0;     // Valor que queremos sacar por el puerto B




#int_TIMER2
TIMER2_isr() 
{
   // El tiempo de rotación biene determinado por el valor del
   // TIMER2 * numero del contador
   
   // En este caso, el TIMER2, nos genera una intrrupción cada 13mS
   // por tanto -->  13mS * 77  = 1 segundo
   
   // El valor del contador será entre 0 y 255 (13mS hasta 3.31 Segundos)
   
contador++; 
   if (lectura==contador)
      {
            // Escoger solo uno de los dos segun la dirección de rotacion
         rotate_left(&valor_puerto,1);    // Rotacion a la izquierda
         //rotate_righ(&valor_puerto,1);    // Rotacion a la derecha
         
        contador=0;
      }

}



void main()
{

   setup_adc_ports(AN0);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_16,254,16);       // Int cada 13mS
   enable_interrupts(INT_TIMER2);
   enable_interrupts(GLOBAL);


   set_adc_channel(0);     // Selecionamos el canal 0 del ADC
   delay_us(10);


   while(1)
      {
         lectura = read_adc();
         output_b(valor_puerto);    // Actualizamos el puerto B
      }
}
 
Atrás
Arriba