Autor Tema: #int timer1 #int CCP2 y ADC para mover 8 Servos.  (Leído 2394 veces)

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

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 160
#int timer1 #int CCP2 y ADC para mover 8 Servos.
« en: 30 de Mayo de 2019, 09:38:20 »

Amigos, tengo esta parte de código que funciona para mover 8 servos de una manera sencilla y eficaz utilizando el setup_timer_1(T1_INTERNAL | T1_DIV_BY_1); y setup_ccp2(CCP_COMPARE_INT); (anexo imagen en proteus). En el código se muestra #define pos_servo 12500, de tal manera que 12550 es el valor para 2.5 ms y 2500 es para 0.5 ms (tiempos maximizo mínimos del servo).

Bien, pues ahora que quiero agregarle una función para que en la parte del CCP
Código: C++
  1. CCP_2 = ticks_tmr1 + pos_servo;
(linea 48 del código) pos_servo esa constante definida por el procesador la pueda yo controlar por el adc independientemente con un array de adc´s y pensando en que la linea 48 quede de la siguiente manera CCP_2 = ticks_tmr1 + adc_servo(); pero ni siquiera e podido hacer que me muestre la lectura del adc. tal parece que por las interrupciones no me permite mostrar ningún valor del adc se muestre.

pudieran darme alguna opinión.. O quizas no estoy desarrollando correctamente la funcion para la lectura de los ADC´s. Gracias...


Código: C++
  1. #include <16f877A.h>
  2.          #device ADC=10
  3.          #fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP,NOCPD,NODEBUG,NOWRT
  4.          #use delay(clock=20000000)                                                        
  5.          #byte porta=0xF05 #byte portb=0xF06 #byte portc=0xF07
  6.          #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, PARITY=N, BITS=8)
  7.          #use fast_io(a)
  8.          #use fast_io(b)
  9.          #use fast_io(c)
  10.          #priority timer1,ccp2                                                               // float const uS Tick = 0.2; Microsegundos por Tick del TMR1 a 20 Mhz
  11.          #define ticks_tmr1 53036                                                            // 65536-53036=12500 * 0,0002 = 2,5 milisegundos
  12.          #define pos_servo 12500                                                             // limite_max=12500, limite_min=2500                
  13.          
  14.          int servo=0,ch=0;                                                                        
  15.          short flag=FALSE;  
  16.          int puerto=6;
  17.          int16 valor_canal[8];
  18.          
  19.          #int_timer1
  20.          void timer1_isr()                                                                   // Se activa cada 2,5 ms
  21.          { flag=TRUE; set_timer1(ticks_tmr1); }                                              // 65536-53000=12536*0,0002 = 2,5 ms        
  22.          
  23.          #int_ccp2
  24.          void ccp2_isr()
  25.          { bit_clear(*puerto,servo); }                                                    
  26.          
  27.          void main(void)
  28.          {    
  29.          porta=0x00; portb=0x00; portc=0x00;                                                                                            
  30.          set_tris_a(0b11111111); set_tris_b(0b00000000); set_tris_c(0b00000000);
  31.          setup_adc_ports(ALL_ANALOG);
  32.          setup_adc(ADC_CLOCK_INTERNAL);
  33.          setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
  34.          setup_ccp2(CCP_COMPARE_INT);                                                        // Configura CCP2 en modo COMPARE
  35.          set_timer1(ticks_tmr1);    
  36.          enable_interrupts(int_timer1);                                                      // Int timer 1
  37.          enable_interrupts(int_ccp2);                                                        // Habilito la interrpción INT_CCP2
  38.          enable_interrupts(global);                                                          // Habilita interrupciones
  39.          
  40.          while (TRUE)
  41.          {
  42.          if(flag==TRUE)                                                                      // bandera para tmr1 para cada 2.5 ms  
  43.          {
  44.          if (++servo>=8) servo=0;
  45.          bit_set(*puerto,servo);                                                                            
  46.          CCP_2 = ticks_tmr1 + pos_servo;                                                     // Calculo posicion de los servos                
  47.          flag=FALSE;
  48.          }        
  49.          }        
  50.          }
  51.                  
  52.          void adc_servo()
  53.          {
  54.          for(ch=0;ch<=7;ch++)                          
  55.          {                                  
  56.          set_adc_channel(ch); delay_us(20);                                                                                
  57.          valor_canal[ch] = read_adc();
  58.          }
  59.          }
El señor es mi pastor,  nada me faltará.