TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: ammm 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:
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
-
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.
-
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
-
Hola
Me parece que no has definido ADC_SAMPLEUS
Te podemos ayudar mejor si pegas tu codigo.
Saludos
-
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
-
Perdon una rutina de comparacion de 16 BIT....asi uso todo el adc y tengo mas presicion
-
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
-
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??