desktop

Curso de programación de PIC en PICBasic Pro

Hola buenas tardes
Primero que nada una gran felicitación a todos los compañeros del foro, por compartir y ayudar a mantener este gran foro.
quiero hacer un contador de 2 Display 7 segmentos con la posibilidad de añadir hasta otros 2 mas pero con 2 ahorita seria bueno para un modo de aprendizaje.
el asunto es que no lo quiero hacer el Pic16F628A directo al display 7 segmentos
Forma_01.jpg


Tampoco con un decodificador 7447
Forma_02.jpg


la Forma que me gustaría hacerlo es con un Conversor Serial Paralelo 74HC164
Forma_03.jpg


de esa manera solo necesitamos usar 2 pines del Microcontrolador.
Por Favor si alguien me pudiera orienta o ayudar se lo agradeceria de todo corazon
Mientras yo sigo investigando mas a fondo
Gracias y seguimos en contacto
 
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
 
Última edición por un moderador:
Hola isaiasjes...
Si no te quieres complicar con mas integrados fuera del PIC, puedes utilizar el PUERTOB para manejar los siete segmentos de los display y el pin restante lo utilizas como entrada de pulsos y lo haces multiplexado (un display por cada pin del PUERTOA) con lo que puedes manejar 5 display en forma normal u ocho con el oscilador interno:cool:
 
Hola alejo278!!
muchas gracias por tu recomendación!!
el punto es que me gustaria hacerlo de la forma que te comento anteriormente mas que nada para ampliar los conocimientos y tener diversas opciones.
la forma del Conversor Serial Paralelo 74HC164 se me hace un buen reto para lograr
 
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. (y)

Suerte.
 

Adjuntos

  • 16F628A & 74LS164 Sample.rar
    16.8 KB · Visitas: 310
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.

Excelente D@rkbytes!!!
es lo que pretendo hacer lo mismo pero en picbasicpro!!
con los tips que me proporcionaste voy a hacer un Código haber que tal me va!!!
los avances los voy ir Posteando
Gracias y seguimos en contacto.
 
Buenas noches!!
Aquí las primeras pruebas que hice para aprender y conocer la Función (shiftout)
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
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

ahora el segundo paso es añadir 2 0 3 display más para agregar los botones , y usar la funciones DIG, LookUp
les dejo la Simulación funcionando.
Gracias y Seguimos en contacto.

Segundo Ejemplo Usando LookUp Código:
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
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

como verán el Código se redujo bastante y también la memoria así que recomiendo el segundo.
Seguimos trabajando ahora para hacerlo con 3 a 4 dígitos ya cada ves mas Cerca del objetivo. :D
Saludos y seguimos en contacto.
dejo la Simulación y 2 Archivos para que lo puedan probar y editar.
 

Adjuntos

  • Display-7-Seg-2-vias.zip
    11.3 KB · Visitas: 222
Última edición:
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

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.
 

Adjuntos

  • ServoP.zip
    8.4 KB · Visitas: 91
Última edición:
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.

Excelente gracias por tu ayuda (y)
 
Buenas tardes!!
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.
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 = %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
Forma_final.jpg

aqui ´les dejo la simulacion y los archivos para que lo puedan modificar
Gracias y seguimos en contacto
 

Adjuntos

  • 3-Display-7-Seg.zip
    18.9 KB · Visitas: 223
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.
Felicidades!!, desde que vi tus primeras pruebas supe que lo lograrías. :aplauso:
Bien, como ya lo pudiste hacer, entonces ahora puedo subir mi programa.
Notarás que la programación es diferente y más simplificada para llegar al mismo objetivo.

Suerte.
 

Adjuntos

  • 16F628A Contador 0-999 74XS164.rar
    20.6 KB · Visitas: 286
Última edición:
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.

hola isaiasjea hoy tuve la oportunidad de probar el código que me revisaste pero igualmente siguen sin funcionarme los servos hasta creí que estaban malos pero los probé con un 555 y funcionan perfectamente no logro encontrar por que me estará fallando este código por fa ayúdame:(
ó si puedes sugiereme otro código que haga lo mismo...gracias...
 
estará fallando este código por fa ayúdame

Buenas Dias ferdy575
lo que pasa es que te esta faltando el tren de pulsos para que lo puedas posicionar.
Motor_Servo_posiciones.gif


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
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
te dejo la simulacion y los archivos para que los pruebes
este codigo esta probado en un PIC16F628A real y trabaja sin problemas.
Saludos y seguimos en contacto.
 

Adjuntos

  • Servo-01.zip
    14.3 KB · Visitas: 115
Última edición:
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

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
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
te dejo la simulacion y los archivos para que los pruebes
este codigo esta probado en un PIC16F628A real y trabaja sin problemas.
Saludos y seguimos en contacto.

excelente funciona perfectamente y agradezco mucho tu colaboración:aplauso:
 
Hola a todos,

agregando al contador de isaiasjea la interrupción externa b0 y desborde por timer1, junto a un pequeña modificación en la simulación en proteus, es posible convertir el contador en una especie de velocímetro o cuentavueltas segun se necesite, en la simulación parece funcionar pero publico la modificación a ver que opinan ustedes.

Código:
;*******************************************************************************
; 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
 
Última edición:
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...
 
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...

Hola mira el datasheet de este pic no tiene oscilador interno.
 
Atrás
Arriba