Define CONF_WORD = 0x31c4
Define CLOCK_FREQUENCY = 4
'********************************************************************************
'NOMBRE: 12F675 Mini-EBasic Trabajando con Servos 1
'MICRO: PIC12F675, 4Mhz Interno
'DESCRIPCION: Circuito para hacer practicas con PWM, ADC, RS232 y ICSP
'FECHA/AUTOR: By COS, 09/07, 16/10
'Version 1.0
'Puerto RS232 optoacoplado para depuracion y muestra de datos
'Programacion del microcontrolador en placa (ICSP)
'********************************************************************************
'Define SEROUT_DELAYUS = 0
'************* Configuracion modulos generales (E/S) *********
CMCON = 0x07 'comparator off
VRCON = 0x00 'vref off, comparador
ANSEL = %00010100 'fosc/8 (4Mhz=2uSeg.), an2 en mode analogico, resto de pin digitales
ADCON0 = %00001001 'adc a 8bit, vdd reference, adc On
OSCCAL = 68 'calibracion del oscilador interno
TRISIO = 0xff 'tri-state pins, entradas
TRISIO.4 = 0 'GP4 pin, como salida, Tx puerto serie
TRISIO.5 = 0 'GP5 pin, como salida, Control del servomotor
GPIO.5 = 0 'valor inicial a cero
'*********************Configuracion del Timer1*****************************
T1CON.TMR1CS = 0 'bit de seleccion de reloj para el timer1, interno Fosc/4
T1CON.T1CKPS0 = 0 'bit de seleccion del prescaler para el reloj del timer1
T1CON.T1CKPS1 = 0 'bit de seleccion del prescaler para el reloj del timer1
TMR1H = 0xff 'carga el byte alto del registro del tiemr1 (1mSeg)
TMR1L = 0x9c 'carga el byte bajo del registro del timer1 (1mSeg)
'INTCON.T1IE = 1 'bit de habilitacion de interrupcion de TMR1 por rebose
T1CON.TMR1ON = 1 'bit de habilitacion del temporizador timer1
'PIE1.TMR1IE = 1 'activa la interrupcion del timer1
'*********************Habilitacion****************************************
'INTCON.PEIE = 1 'habilitacion de interrupciones de perifericos
'Enable 'intcon.GIE = 1, habilita las interrupciones generales
'************* Rutina del programa ***************************************
'----Definiciones
'--- Variables
Dim outon As Word
Dim n As Word
main:
For n = 0 To 75 'Posicion inicial
Call servo(400, 5)
Next n
For outon = 400 To 2250 Step 5 'De un extremo al otro
Call servo(outon, 5)
Next outon
For outon = 2250 To 400 Step -10 'De un extremo al otro
Call servo(outon, 5)
Next outon
For outon = 400 To 2250 Step 50 'De un extremo al otro
Call servo(outon, 5)
Next outon
While n = n 'Servo parado manteniendo la ultima posicion
Call servo(outon, 5)
Wend
Goto main
End
'Mi función para controlar Servos Futaba S3003
'x = Posición del servo
'pin = pin de la senal de control del servo
'Máximo izquierda 2250, minimo derecha 400
'20000uSeg. para servos de 50Hz
Proc servo(x As Word, pin As Byte)
Const periodo = 20000 'Periodo en uSeg. para servos de 50Hz
Dim outoff As Word 'Variable local
outoff = periodo - x 'Calculo de la senal a Off
If x < 400 Then x = 400 'Máximo derecha
If x > 2250 Then x = 2250 'Máximo izquierda
If pin = 0 Then GPIO.0 = 1 '*/ Seleccina pin de control
If pin = 1 Then GPIO.1 = 1
If pin = 2 Then GPIO.2 = 1
If pin = 4 Then GPIO.4 = 1
If pin = 5 Then GPIO.5 = 1 '*/
WaitUs x 'Senal de control a On
If pin = 0 Then GPIO.0 = 0 '*/ Selecciona pin de control
If pin = 1 Then GPIO.1 = 0
If pin = 2 Then GPIO.2 = 0
If pin = 4 Then GPIO.4 = 0
If pin = 5 Then GPIO.5 = 0 '*/
WaitUs outoff 'Senal de control a Off
End Proc