Autor Tema: Control de servo con potenciometro y 12f675  (Leído 7855 veces)

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

Desconectado ammm

  • PIC10
  • *
  • Mensajes: 1
Control de servo con potenciometro y 12f675
« en: 24 de Mayo de 2009, 18:45:03 »
Hola a todos! Lo primero presentarme. Me llamo Alvaro , y os escribo desde España. Siempre me ha llamado la atencion el tema de la programacion de pic, pero nunca me habia atrevido con ello. Hasta ahora, que por casualidad he dado con el pic basic pro, y se parece mucho al turbopascal que me enseñaron en primero de carrera. Bueno, a lo que vamos, que este es mi primer mensaje, y ya es para pediros ayuda.
Quiero controlar un servo de tal manera que al encender el microcontrolador, me haga un recorrido completo de arriba a abajo, y despues se situe en la posicion que le indique un potenciometro(seguramente termine siendo un sensor hall effect).
El tema es que he encontrado un programa que mueve un servo de arriba a abajo ininterrumpidamente pero para un 12f629 (en la pagina matpic), y otro programa que movia un servo con un potenciometro pero para un pic mas grande.
Buscando informacion acerca de los comandos adapte el programa al 12f675 (elegi este por que tiene entradas analogicas, y para leer el ptenciometro entiendo que es necesario).
Este es el programa que he realizado:
Citar
Define  ADC_BITS        10   
Define  ADC_CLOCK       4   
Define  ADC_SAMPLEUS    50   

pos     var     word      ' Servo position
servo1  var     gpio.0      ' Alias servo pin
c       var     byte

    TRISIO= %111000
    GPIO = 0      ' Set GPIO low
    ADCON0 = %1000010   '
    ANSEL= %000010      ' gpio1 analogica
inicio:
pulsout servo1, pos
GOSUB Chequeo
gosub mainloop
chequeo:
for pos=250 to 50 step -1
    pulsout servo1,pos
    pause 10
next
for pos=50 to 250 step 1
    pulsout servo1,pos
    pause 10
next
mainloop: ADCIN 1, c      ' Recogew el valor de la entrada analogica en c

        pos=((c*200)/255)+50  ' Opera c para conseguir pos
        pulsout servo1, pos   ' Pulso por gpio.0 de amplitud pos

        Pause 16      ' Servo update rate about 60Hz

        Goto mainloop   ' Repetir indefinidamente

        End

Bueno, el problema viene cuando lo llevo al proteus, que no soy capaz de que haga nada. no hace ni el chequeo(el subir y bajar que tiene que hacer al principio). A la desesperada he compilado para el 12f675 el programa que tenia para el 12f629 que subia y bajaba indefinidamente, y tampoco hace nada. Tengo el pin de gpio3 a 5v como tengo entendido. Segun lo que entiendo en el datasheet del 12f675 tengo bien definidos los ansel y adcon. Laoperacion que realiza es por que quiero que la salida sea el servo abajo del todo cuuando el potenciometro este abajo del todo, y arriba cuando este arriba del todo, y segun tengo entendido el ADCIN lee un valor entre 0 y 5v y lo interpreta como uno entre 0 y 255, no?
El programa que hace que el servo suba y baje indefinidamente en el 12f629, lo modelo en el proteus, y corre sin problemas, asi que no se que puede pasar

Lo siento por el parrafo
Muchiimas gracias por adelantado
Alvaro

Desconectado Veguepic

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2119
Re: Control de servo con potenciometro y 12f675
« Respuesta #1 en: 25 de Mayo de 2009, 23:21:38 »
Hola Alvaro:

Bienvenido al foro, veo tu programa y creo que ya estas queriendo correr sin caminar.

Te recomiendo que primero te familiarices mas con el PBP, dale una mirada a este link que hay ejemplos como para aprender lo que necesitas

http://www.todopic.com.ar/foros/index.php?topic=3613.0

La idea del foro es que te ayudemos a que tu lo hagas.

Saludos

Hugo

PS

Tambien debes saber que los servos analogicos necesitan de un pulso entre 1 a 2 ms para ir de un lado a otro y este pulso se debe repetir cada 20 ms, cosa que no hace tu programa.
« Última modificación: 26 de Mayo de 2009, 15:31:04 por Veguepic »
“Si la gente es buena sólo porque temen al castigo y porque esperan una recompensa, entonces verdaderamente somos un grupo lastimoso." Albert Einstein.

Saludos desde Lima , Peru    -    Hugo

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re: Control de servo con potenciometro y 12f675
« Respuesta #2 en: 23 de Marzo de 2010, 02:38:19 »
Amigo estoy trabajando con el pic 12F675 para que funcione como un comaparador de los valores medidos y unos valores previamente almacenados y el proteus me da este mensaje.

(PC12ADC) PC=0x0037 ADC conversion starter before 'wait' time have expired following previus conversion U1       0.000027000s

El ADC hace una conversion y aunque el programa siga corriendo no hace mas captura de valores

uso el proteus 7.4 SP3

Espero me ayuden
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado Veguepic

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2119
Re: Control de servo con potenciometro y 12f675
« Respuesta #3 en: 23 de Marzo de 2010, 14:11:24 »
Hola

Me parece que no has definido  ADC_SAMPLEUS

Te podemos ayudar mejor si pegas tu codigo.

Saludos
“Si la gente es buena sólo porque temen al castigo y porque esperan una recompensa, entonces verdaderamente somos un grupo lastimoso." Albert Einstein.

Saludos desde Lima , Peru    -    Hugo

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re: Control de servo con potenciometro y 12f675
« Respuesta #4 en: 23 de Marzo de 2010, 23:24:27 »
ok amigo........el codigo es el siguiente..................la novedad del codigo.bueno al menos para mi fue que escribi una rutina de 16 BIT

; ----------------------------------------------------------
;   COMPARADOR TIPO VENTANA DE VALORES ANALOGICOS
; ---------------------------------------------------------- 
   list      p=12f675   
   #include "p12f675.inc" 

   errorlevel -302    

   __CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
; -----------------------------------------------------------------
;    defines
; -----------------------------------------------------------------
      #define LEDR 5
   #define LEDA 4
   #define LEDV 2
; -----------------------------------------------------------------
;    variables
; -----------------------------------------------------------------
      cblock   0x20
   ADC_al
      ADC_ba
   Vs_al
   Vs_ba
   Vi_al
   Vi_ba
   Sup
   Inf
   Bit
   Tem
      endc
; ------------------------------------------------------------------
;    initialisacion
; ------------------------------------------------------------------
      org      0
     banksel ANSEL
      movlw   11h          ;AN0 as analog input,conversion clock Fosc/8
      movwf   ANSEL

      bankseL CMCON
      movlw   07h            ;comparators off
      movwf   CMCON

      movlw   0x80         ;ADC on, right justified
      movwf   ADCON0

      banksel TRISIO
      movlw   B'00000001'    ;LED output GPIO5 (pin 2), AN0 input GPIO0 (pin 7) 00001111
      movwf   TRISIO
   
   movlw   0x01         
      movwf   Vs_al
   movlw   0x00       
      movwf   Vs_ba

   movlw   0x00         
      movwf   Vi_al
   movlw   0xFF       
      movwf   Vi_ba

   goto   Ciclo
; ------------------------------------------------------------------
;    macro definitions
; ------------------------------------------------------------------
Comp:

   movf   Sup,   W
      subwf   ADC_al,   W

      btfss   STATUS,   C
      goto    a_menor_b
   movf   Inf,   W
      subwf   ADC_ba,   W

   btfss   STATUS,   C
      goto    a_menor_b
   
a_may_igu_b:
   bsf      Bit,   1
   goto   Salir

a_menor_b:
   bcf      Bit,   1
Salir:
   return
; -----------------------------------------------------------------------
;    main program loop
; -----------------------------------------------------------------------
Ciclo:
      call      Leer_ADC         ;read ADC
      ;banksel GPIO
   
   movf   Vs_al,   W
   movwf   Sup
   movf   Vs_ba,   W
   movwf   Inf
   call   Comp
 
   btfsc   Bit,   1
   goto   Led_a

   movf   Vi_al,   W
   movwf   Sup
   movf   Vi_ba,   W
   movwf   Inf
   call   Comp

   btfss   Bit,   1
   goto   Led_a

   bcf      GPIO,   LEDR
   goto   Ciclo   

Led_a:
   bsf      GPIO,   LEDR
   goto   Ciclo
; ---------------------------------------------------------------------
;    Captura de valores analogicos con el ADC de 10 BIT
; ---------------------------------------------------------------------
Leer_ADC:
   

      banksel ADCON0
   movlw   0x81            ;ADC on, right justified
      movwf   ADCON0
      bsf        ADCON0,   1      ;start conversion

   call   Temp   
      btfss     PIR1,   ADIF
      goto     $-1            ;wait for ADC to finish
      movf    ADRESH, W      ;get high byte
      movwf   ADC_al
      banksel ADRESL
      movf    ADRESL, W      ;get low byte
      movwf   ADC_ba
      banksel PIR1
      bcf        PIR1,   ADIF   ;clear conversion flag
      return
; ----------------------------------------------------------------------
Temp:
   movlw   .30       
      movwf   Tem
   decfsz   Tem,   F
   goto   $-1
   Return
   end
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re: Control de servo con potenciometro y 12f675
« Respuesta #5 en: 23 de Marzo de 2010, 23:27:37 »
Perdon una rutina de comparacion de 16 BIT....asi uso todo el adc y tengo mas presicion
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado Veguepic

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2119
Re: Control de servo con potenciometro y 12f675
« Respuesta #6 en: 24 de Marzo de 2010, 02:33:07 »
Hola

Creo que hay una confusion, cuando posteaste en este hilo di por supuesto que estabas usando PBP, ahora que veo tu codigo esta en ASM, la verdad estoy bastante oxidado en el tema.

Veo que haces la espera a terminar la conversion testeando la interrupcion en PIR, eso no lo he usado pero me parece que ahi esta tu problema, pues proteus te indica que haces una nueva lectura antes que termine la conversion anterior. Particularmente prefiero utilizar el bit 1 (go) de ADCON0 para saber si termino la conversion.

Saludos
“Si la gente es buena sólo porque temen al castigo y porque esperan una recompensa, entonces verdaderamente somos un grupo lastimoso." Albert Einstein.

Saludos desde Lima , Peru    -    Hugo

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re: Control de servo con potenciometro y 12f675
« Respuesta #7 en: 24 de Marzo de 2010, 10:31:15 »
anoche despues que envie el programa, me di cuenta de eso, uso una interrupcion, pero no la activo, cambie para usar GO/DONE pero no se que paso................no funciono, tienes una rutina por alli para hacer funcionar el ADC??
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela