Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature currently requires accessing the site using the built-in Safari browser.
'****************************************************************
'* Name : control servo *
'* Notes : con 16f628a *
'* Mode : con pulsadores *
'****************************************************************
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT
@ DEVICE pic16F628A, WDT_ON
centro VAR BYTE
derecha var porta.0
izquierda var porta.1
centrar var porta.2
salida var portb.1
trisb=0
PORTB=0
centro=150 'inicio variable en 150
inicio:
pulsout salida,centro
gosub pulsadores
goto inicio
pulsadores:
if centrar=0 then gosub centrado
if derecha=0 then gosub DER
if izquierda=0 then gosub IZQ
return
centrado:
pause 100
centro=150
return
DER:
pause 100
centro=centro+1
return
IZQ:
pause 100
centro=centro-1
return
end
No es nada complicado, yo lo hice en ensamblador y no es difícil.la forma del Conversor Serial Paralelo 74HC164 se me hace un buen reto para lograr
No es nada complicado, yo lo hice en ensamblador y no es difícil.
Y con las funciones predeterminadas de PBP es aún más fácil de hacerlo.
Las palabras clave para lograrlo en PICBasic, son:
DIG, LookUp y ShiftOut
Con DIG obtienes las unidades, decenas, centenas etc.
Con LookUp conviertes el resultado de DIG a código de 7 segmentos.
Y con ShiftOut envías los datos hacia los registros de desplazamiento.
Inténtalo no tiene complicaciones.
Suerte.
'*******************************************************************************
' DEFINICIÓN DE FUSES Y OSILADOR
@ device pic16F628A, intrc_osc, pwrt_on, wdt_off, mclr_off, lvp_off, protect_off
DEFINE OSC 4
'*******************************************************************************
CMCON = 7 'Comparadores Apagados
TRISB = 0 'Puerto B Como Salidas
PORTB = 0 'Limpiamos el Puerto B
'*******************************************************************************
CLOCK VAR PORTB.0 'PORTB.0 con el nombre CLOCK
DATO_0 VAR PORTB.1 'PORTB.1 con el nombre DATA_0
'*******************************************************************************
CLOCK=1 'Valor 1 para inicio del display
'*******************************************************************************
INICIO: 'Etiqueta de inicio
shiftout DATO_0,CLOCK,0,[252] 'Enviando el Numero 0
PAUSE 500 'Espera de 500 milisegundos
shiftout DATO_0,CLOCK,0,[96] 'Enviando el Numero 1
PAUSE 500 'Espera de 500 milisegundos
shiftout DATO_0,CLOCK,0,[218] 'Enviando el Numero 2
PAUSE 500 'Espera de 500 milisegundos
shiftout DATO_0,CLOCK,0,[242] 'Enviando el Numero 3
PAUSE 500 'Espera de 500 milisegundos
shiftout DATO_0,CLOCK,0,[102] 'Enviando el Numero 4
PAUSE 500 'Espera de 500 milisegundos
shiftout DATO_0,CLOCK,0,[182] 'Enviando el Numero 5
PAUSE 500 'Espera de 500 milisegundos
shiftout DATO_0,CLOCK,0,[190] 'Enviando el Numero 6
PAUSE 500 'Espera de 500 milisegundos
shiftout DATO_0,CLOCK,0,[224] 'Enviando el Numero 7
PAUSE 500 'Espera de 500 milisegundos
shiftout DATO_0,CLOCK,0,[254] 'Enviando el Numero 8
PAUSE 500 'Espera de 500 milisegundos
shiftout DATO_0,CLOCK,0,[246] 'Enviando el Numero 9
PAUSE 500 'Espera de 500 milisegundos
GOTO INICIO 'Regresar a la etiqueta inicio
END 'Fin del Programa
'*******************************************************************************
' DEFINICIÓN DE FUSES Y OSILADOR
@ device pic16F628A, intrc_osc, pwrt_on, wdt_off, mclr_off, lvp_off, protect_off
DEFINE OSC 4
'*******************************************************************************
CMCON = 7 'Comparadores Apagados
TRISB = 0 'Puerto B Como Salidas
PORTB = 0 'Limpiamos el Puerto B
'*******************************************************************************
CLOCK VAR PORTB.0 'PORTB.0 con el nombre CLOCK
DATO_0 VAR PORTB.1 'PORTB.1 con el nombre DATA_0
dir var byte
dato var byte
'*******************************************************************************
CLOCK=1 'Valor 1 para inicio del display
'*******************************************************************************
prog:
FOR dir=0 TO 9 'para repeticiones de 0 a 9
LOOKUP dir,[252,96,218,242,102,182,190,224,254,246],dato 'toma uno por uno cada
'valor de la tabla constante y lo guarda en la variable dato
shiftout DATO_0,CLOCK,0,[dato] 'Enviando el Numero Segun el valor del conteo
pause 500 'Espera de 500 milisegundos
next dir 'Seguir con el conteo de la variable
goto prog 'Regresar a la etiqueta inicio
end 'Fin del Programa
hola a todos, ando realizando pruebas para trabajar con servos pues me quiero hacer un brazo y empece con este programita pero no se que me que me quedo mal, al probarlo en el proteus funciona de maravilla pero al probarlo en el protoboard el servo solo hace ruidos y no avanza, alguien que me le de una miradita a ver que está mal por favor...
este es el código:
Código:'**************************************************************** '* Name : control servo * '* Notes : con 16f628a * '* Mode : con pulsadores * '**************************************************************** @ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT @ DEVICE pic16F628A, WDT_ON centro VAR BYTE derecha var porta.0 izquierda var porta.1 centrar var porta.2 salida var portb.1 trisb=0 PORTB=0 centro=150 'inicio variable en 150 inicio: pulsout salida,centro gosub pulsadores goto inicio pulsadores: if centrar=0 then gosub centrado if derecha=0 then gosub DER if izquierda=0 then gosub IZQ return centrado: pause 100 centro=150 return DER: pause 100 centro=centro+1 return IZQ: pause 100 centro=centro-1 return end
'*******************************************************************************
' DEFINICIÓN DE FUSES Y OSILADOR
@ device pic16F628A, intrc_osc, pwrt_on, wdt_off, mclr_off, lvp_off, protect_off
DEFINE OSC 4
'*******************************************************************************
CMCON = 7 'Comparadores Apagados
TRISA = %00000111 'Puerto RA0,RA1,RA2 Entradas Digitales
TRISB = 0 'Puerto B Como Salidas
PORTA = 0 'Limpiamos el Puerto A
PORTB = 0 'Limpiamos el Puerto B
'*******************************************************************************
derecha var porta.0
izquierda var porta.1
centrar var porta.2
salida var portb.1
centro var byte
'*******************************************************************************
centro=150 'inicio variable en 150
'*******************************************************************************
inicio:
pulsout salida,centro
gosub pulsadores
goto inicio
pulsadores:
if centrar=0 then gosub centrado
if derecha=0 then gosub DER
if izquierda=0 then gosub IZQ
return
centrado:
pause 100
centro=150
return
DER:
pause 100
centro=centro+1
return
IZQ:
pause 100
centro=centro-1
return
end
Buenas Noches ferdy575!!
ya cheque tu Código y tenias algunas cosas que te faltaron como asignar los RA0,RA1,RA2 entradas
ya modifique el Código para que pruebes en el simulador y posteriormente grabando en el PIC16F628A:
Código:'******************************************************************************* ' DEFINICIÓN DE FUSES Y OSILADOR @ device pic16F628A, intrc_osc, pwrt_on, wdt_off, mclr_off, lvp_off, protect_off DEFINE OSC 4 '******************************************************************************* CMCON = 7 'Comparadores Apagados TRISA = %00000111 'Puerto RA0,RA1,RA2 Entradas Digitales TRISB = 0 'Puerto B Como Salidas PORTA = 0 'Limpiamos el Puerto A PORTB = 0 'Limpiamos el Puerto B '******************************************************************************* derecha var porta.0 izquierda var porta.1 centrar var porta.2 salida var portb.1 centro var byte '******************************************************************************* centro=150 'inicio variable en 150 '******************************************************************************* inicio: pulsout salida,centro gosub pulsadores goto inicio pulsadores: if centrar=0 then gosub centrado if derecha=0 then gosub DER if izquierda=0 then gosub IZQ return centrado: pause 100 centro=150 return DER: pause 100 centro=centro+1 return IZQ: pause 100 centro=centro-1 return end
Saludos y seguimos en contacto.
'*******************************************************************************
' DEFINICIÓN DE FUSES Y OSILADOR
@ device pic16F628A, intrc_osc, pwrt_on, wdt_off, mclr_off, lvp_off, protect_off
DEFINE OSC 4
'*******************************************************************************
CMCON = 7 'Comparadores Apagados
TRISA = %00000011 'Puerto RA0 RA1 Como Salidas
TRISB = 0 'Puerto B Como Salidas
PORTA = 0 'Limpiamos el Puerto A
PORTB = 0 'Limpiamos el Puerto B
'*******************************************************************************
CLOCK VAR PORTB.0 'PORTB.0 con el nombre CLOCK
DATO_0 VAR PORTB.1 'PORTB.1 con el nombre DATA_0
BANDERA VAR BIT 'Variable Bandera
CONTEO VAR word 'Variable Conteo
UNIDAD var byte 'Variable Unidad
DECENA var byte 'Variable Decena
CENTENA var byte 'Variable Centena
'*******************************************************************************
CONTEO = 0 'Limpiamos la variable
unidad = 0 'Limpiamos la variable
decena = 0 'Limpiamos la variable
centena = 0 'Limpiamos la variable
shiftout DATO_0,CLOCK,0,[252,252,252] 'Enceramos los Display
'*******************************************************************************
INICIO: 'Etiqueta de inicio
if PORTA.1 = 0 THEN SUMAR 'Si apretamos el boton incrementar
if PORTA.0 = 0 THEN Restar 'Si apretamos el boton decrementar
BANDERA = 0 'Enceramos la variable Bandera
GOTO INICIO 'regresamos a la etiqueta inicio
'*******************************************************************************
SUMAR: 'Etiqueta Sumar
IF BANDERA = 1 THEN GOTO INICIO 'Si la variable Bandera tiene un valor 1
BANDERA = 1 'le cargamos la variable Bandera valor 1
CONTEO = CONTEO+1 'El valor de la variable conteo + 1
if conteo > 999 then conteo = 0 'Si Conteo es mayora a 999 conteo sera 0
unidad = conteo dig 0 'unidad tomara el primer digito de conteo
decena = conteo dig 1 'decena tomara el segundo digito de conteo
centena= conteo dig 2 'centena tomara el tercer digito de conteo
goto ENVIAR 'ir a la etiqueta enviar
'*******************************************************************************
RESTAR: 'Etiqueta Restar
IF BANDERA = 1 THEN GOTO INICIO 'Si la variable Bandera tiene un valor 1
BANDERA = 1 'le cargamos la variable Bandera valor 1
if conteo = 0 then conteo = 1000 'si conteo es igual a 0 conteo sera 1000
CONTEO = CONTEO-1 'El valor de la variable conteo - 1
unidad = conteo dig 0 'unidad tomara el primer digito de conteo
decena = conteo dig 1 'decena tomara el segundo digito de conteo
centena= conteo dig 2 'centena tomara el tercer digito de conteo
goto enviar 'ir a la etiqueta enviar
'*******************************************************************************
ENVIAR: 'Etiqueta Enviar
if unidad = 0 then unidad = 252 'Si unidad es 0 unidad sera 252
if unidad = 1 then unidad = 96 'Si unidad es 1 unidad sera 96
if unidad = 2 then unidad = 218 'Si unidad es 2 unidad sera 218
if unidad = 3 then unidad = 242 'Si unidad es 3 unidad sera 242
if unidad = 4 then unidad = 102 'Si unidad es 4 unidad sera 102
if unidad = 5 then unidad = 182 'Si unidad es 5 unidad sera 182
if unidad = 6 then unidad = 190 'Si unidad es 6 unidad sera 190
if unidad = 7 then unidad = 224 'Si unidad es 7 unidad sera 224
if unidad = 8 then unidad = 254 'Si unidad es 8 unidad sera 254
if unidad = 9 then unidad = 246 'Si unidad es 9 unidad sera 246
'*******************************************************************************
if decena = 0 then decena = 252 'Si decena es 0 decena sera 252
if decena = 1 then decena = 96 'Si decena es 1 decena sera 96
if decena = 2 then decena = 218 'Si decena es 2 decena sera 218
if decena = 3 then decena = 242 'Si decena es 3 decena sera 242
if decena = 4 then decena = 102 'Si decena es 4 decena sera 102
if decena = 5 then decena = 182 'Si decena es 5 decena sera 182
if decena = 6 then decena = 190 'Si decena es 6 decena sera 190
if decena = 7 then decena = 224 'Si decena es 7 decena sera 224
if decena = 8 then decena = 254 'Si decena es 8 decena sera 254
if decena = 9 then decena = 246 'Si decena es 9 decena sera 246
'*******************************************************************************
if centena = 0 then centena = 252 'Si centena es 0 centena sera 252
if centena = 1 then centena = 96 'Si centena es 1 centena sera 96
if centena = 2 then centena = 218 'Si centena es 2 centena sera 218
if centena = 3 then centena = 242 'Si centena es 3 centena sera 242
if centena = 4 then centena = 102 'Si centena es 4 centena sera 102
if centena = 5 then centena = 182 'Si centena es 5 centena sera 182
if centena = 6 then centena = 190 'Si centena es 6 centena sera 190
if centena = 7 then centena = 224 'Si centena es 7 centena sera 224
if centena = 8 then centena = 254 'Si centena es 8 centena sera 254
if centena = 9 then centena = 246 'Si centena es 9 centena sera 246
shiftout DATO_0,CLOCK,0,[unidad,decena,centena] 'Enviando Numero de la variables
goto inicio 'ir a la etiqueta inicio
END 'Fin
Felicidades!!, desde que vi tus primeras pruebas supe que lo lograrías.Finalmente termine el contador de 3 display 7 segmentos controlados por 1 PIC16F628A y 3 74LS164 o 74hc164 y 2 botones uno Incremental y el otro decremental.
Excelente D@rkbytes!!!Notarás que la programación es diferente y más simplificada para llegar al mismo objetivo.
Buenas Noches ferdy575!!
ya cheque tu Código y tenias algunas cosas que te faltaron como asignar los RA0,RA1,RA2 entradas
ya modifique el Código para que pruebes en el simulador y posteriormente grabando en el PIC16F628A:
Código:'******************************************************************************* ' DEFINICIÓN DE FUSES Y OSILADOR @ device pic16F628A, intrc_osc, pwrt_on, wdt_off, mclr_off, lvp_off, protect_off DEFINE OSC 4 '******************************************************************************* CMCON = 7 'Comparadores Apagados TRISA = %00000111 'Puerto RA0,RA1,RA2 Entradas Digitales TRISB = 0 'Puerto B Como Salidas PORTA = 0 'Limpiamos el Puerto A PORTB = 0 'Limpiamos el Puerto B '******************************************************************************* derecha var porta.0 izquierda var porta.1 centrar var porta.2 salida var portb.1 centro var byte '******************************************************************************* centro=150 'inicio variable en 150 '******************************************************************************* inicio: pulsout salida,centro gosub pulsadores goto inicio pulsadores: if centrar=0 then gosub centrado if derecha=0 then gosub DER if izquierda=0 then gosub IZQ return centrado: pause 100 centro=150 return DER: pause 100 centro=centro+1 return IZQ: pause 100 centro=centro-1 return end
Saludos y seguimos en contacto.
estará fallando este código por fa ayúdame
'*******************************************************************************
' DEFINICIÓN DE FUSES Y OSILADOR
@ device pic16F628A, intrc_osc, pwrt_on, wdt_off, mclr_off, lvp_off, protect_off
DEFINE OSC 4
'*******************************************************************************
CMCON = 7 'Comparadores Apagados
TRISB = %00000110
PORTB = 0
'*******************************************************************************
Control var portb.0
incrementar var portb.1
disminuir var portb.2
x var byte
r var byte
x = 150
inicio:
pulsout control,x
gosub timer
goto inicio
timer:
if incrementar = 0 then gosub mas
if disminuir = 0 then gosub menos
return
mas:
pause 10
x=x+1
if x > 250 then x = 250
return
menos:
pause 10
x=x-1
if x < 50 then x = 50
return
end
Buenas Dias ferdy575
lo que pasa es que te esta faltando el tren de pulsos para que lo puedas posicionar.
http://s5.postimage.org/8n87mq7gn/Motor_Servo_posiciones.gif
te dejo la simulacion y los archivos para que los pruebesCódigo:'******************************************************************************* ' DEFINICIÓN DE FUSES Y OSILADOR @ device pic16F628A, intrc_osc, pwrt_on, wdt_off, mclr_off, lvp_off, protect_off DEFINE OSC 4 '******************************************************************************* CMCON = 7 'Comparadores Apagados TRISB = %00000110 PORTB = 0 '******************************************************************************* Control var portb.0 incrementar var portb.1 disminuir var portb.2 x var byte r var byte x = 150 inicio: pulsout control,x gosub timer goto inicio timer: if incrementar = 0 then gosub mas if disminuir = 0 then gosub menos return mas: pause 10 x=x+1 if x > 250 then x = 250 return menos: pause 10 x=x-1 if x < 50 then x = 50 return end
este codigo esta probado en un PIC16F628A real y trabaja sin problemas.
Saludos y seguimos en contacto.
Un placer poderte ayudar!!excelente funciona perfectamente y agradezco mucho tu colaboración
;*******************************************************************************
; Programa: Contador.pbp
; Versión: 1.0
; VELOCIMETRO en base a Contador de 3 digitos y displays de 7 segmentos (0-999)
; controlando 3 74XS164 de D@rkbytes
;*******************************************************************************
@ DEVICE PIC16F628a ; Microcontrolador utilizado
; Palabra de configuración
@ DEVICE INTRC_OSC_NOCLKOUT,WDT_OFF,PWRT_ON,BOD_OFF,LVP_OFF
;*******************************************************************************
DEFINE OSC 4 ; Definir que se trabajará con 4MHz.
Include "MODEDEFS.BAS" ; Incluir definiciones del modo serial
CMCON = 7 ; Comparadores analógicos OFF
TRISA = %11111100
PORTA = TRISA
TRISB = %00000001
PORTB = 0
; Nombres para los pines
Symbol SCL_Pin = PORTA.0
Symbol SDA_Pin = PORTA.1
Symbol T1CKPS1 = T1CON.5 'Preescaler para timer1
Symbol T1CKPS0 = T1CON.4 'Preescaler para timer1
Symbol T1OSCEN = T1CON.3 'Bit de habilitación del Oscilador
Symbol TMR1CS = T1CON.1 'Bit selección clock de trabajo (1=clock externo por portc.0, 0=clock interno)
Symbol TMR1ON = T1CON.0 'Bit de habilitación para el timer1 (1=On, 0=Off)
Symbol TMR1IE = PIE1.0 'interrupción por timer1
Symbol TMR1IF = PIR1.0 'bandera desborde tmr1
Symbol GIE = INTCON.7
Symbol PEIE = INTCON.6
Symbol INTE = INTCON.4
Symbol INTF = INTCON.1
Symbol INTEDG = OPTION_REG.6
Symbol LED3 = PORTB.3
;----
; Declaración de variables
KILOMETRAJE VAR WORD
Counter VAR Word
Dsp1 VAR Byte
Dsp2 VAR Byte
Dsp3 VAR Byte
Index VAR Byte
;{{{{{
; Declaración de variables
T VAR Byte
X VAR Byte
TIMER1 VAR Word
PRECARGA VAR Word
INTB0 VAR Byte
;}}}}
PRECARGA=40536 ' Valor obtenido con la calculadora RRPicTimerCalculator para que salte el timer1 cada 100ms
TMR1H=PRECARGA.HighByte ' Precargamos el timer1 inicialmente
TMR1L=PRECARGA.LowByte
On Interrupt GoTo interrupcion ' En caso de interrupción ir a subrutina interrupción
INTCON=%10010000 ' el bit 7 habilita las interrupciones en general
' El bit 4 habilita la interrupción B.0
T1CON=%00001101 ' Timer1 on, incremento por Osc interno
Clear ; Inicializar variables a 0 (Limpiar RAM)
; Mandar ceros en formato 7 segmentos a los registros de desplazamiento.
ShiftOut SDA_Pin,SCL_Pin,LSBFIRST,[$FC,$FC,$FC]
MainProgram:
Gosub Tabla ; Ir a las tablas de conversión
GoTo MainProgram
interrupcion:
If INTF=1 Then INTB0=INTB0+1 ' Contamos los giros que da la rueda
INTE=1 ' Habilitar la interrupción nuevamente
INTF=0 'Borrar la bandera de int B.0
Resume ' Retorna al programa donde ocurrió la interrupción
Enable ' Habilita las interrupciones después del handler
END
Tabla:
; Subrutina de conversión para código de 7 segmentos cátodo común.
Index = Counter DIG 0 ; Tomamos las unidades
LookUp Index,[$FC,$60,$DA,$F2,$66,$B6,$BE,$E0,$FE,$F6],Dsp1
Index = Counter DIG 1 ; Tomamos las decenas
LookUp Index,[$FC,$60,$DA,$F2,$66,$B6,$BE,$E0,$FE,$F6],Dsp2
Index = Counter DIG 2 ; Tomamos la centenas
LookUp Index,[$FC,$60,$DA,$F2,$66,$B6,$BE,$E0,$FE,$F6],Dsp3
; Mandamos los datos hacia los registros de desplazamiento.
ShiftOut SDA_Pin,SCL_Pin,LSBFIRST,[Dsp1,Dsp2,Dsp3]
Return
hola buenos dias, espero puedan solucionar mi duda, a todos los integrantes del foro les pido ayuda respecto al funcionamiento de un sensor IR sharp 2Y0A21 analogico para poderlo manipular por medio de un microcontrolador 16f877A programado en picbasic pro, y tambien como configurar este pic para utilizar el oscilador interno, es para un proyecto de robotica de competencia, muchas gracias...