Aqui dejo el mismo programa pero con la subrutina base de tiempos pasada a función.
AllDigital
TRISA = %00000111
TRISB = %00000000
'USO DE SUBRUTINAS
'"PARPADEO DE UN LED"
Dim flagparpadeo As Byte 'Activa el parpadeo del Led
flagparpadeo = 0 'Parpadeo del Led a Off
'MENU
Call tmrbase(1, 1, 0) 'Incializa base de tiempos 1
Call tmrbase(2, 1, 0) 'Incializa base de tiempos 2
Call tmrbase(3, 1, 0) 'Incializa base de tiempos 3
main: 'Rutina principal
If RA.0 = 1 Then flagparpadeo = 1 'Activa el parpadeo del Led
If RA.1 = 1 Then 'Para parpadeo y Led a On fijo
flagparpadeo = 0 'Parpadeo a Off
Gosub red 'Salto rutina control led a On
Endif
If RA.2 = 1 Then 'Reset al estado del Led
flagparpadeo = 0 'Para el parpadeo del Led
RB4 = 0 'Apaga el Led
Endif
If flagparpadeo = 1 Then Gosub parpadeo 'Salta a la rutina de control parpadeo Led
Call tmrbase(0, 0, 0) 'Actualiza las bases de tiempos
Goto main
End
'SUBRUTINAS
parpadeo: 'Parpadeo al 50%
If tmrbase.1 = 1 Then 'Control led a On
Toggle RB.4 'Led a On
Call tmrbase(1, 0, 5) 'Recarga la base de tiempos 1
Endif
Return
parpadeo1: 'Parpadeo led programable tiempo a On y Off independiente
Dim flag As Bit 'Marca el ciclo
If tmrbase.1 = 1 And flag = 0 Then 'Control led a On
RB.4 = 1 'Led a ON
Call tmrbase(1, 0, 3) 'Recarga base de tiempos 1
flag = 1 'Cambia de ciclo
Endif
If tmrbase.2 = 1 And flag = 1 Then 'Control led a Off
RB.4 = 0 'Led a Off
Call tmrbase(2, 0, 6) 'Recarga base de tiempos 2
flag = 0 'Cambia de ciclo
Endif
Return
red: 'Control Led a On fijo
RB.4 = 1 'Led a On
Return
'FUNCIONES
'Función que controla hasta 7 bases de tiempos
'Datos de entrada son los encerrados entre paréntesis
'Datos de salida los bit de la variable que da nombre a la función
'Se ponen antes del Main
'Call tmrbase(1, 1, 0) 'Incializa base de tiempos 1
'Call tmrbase(2, 1, 0) 'Incializa base de tiempos 2
'Call tmrbase(3, 1, 0) 'Incializa base de tiempos 3
'Actualiza las bases de tiempos, se tiene que repetir cada 10mSeg.
'Call tmrbase(0, 0, 0) 'Actualiza las bases de tiempos, deberia de ir en la rutina de interrupciones.
'Configuración general de las bases de tiempos
'Call tmrbase(x,y,z)
'x toma valores comprendidos entre 1 y 7, indica el numero de base que se quiere configurar
'y = 1 base parada, y = 0 base contando
'z tiempo que cuenta la base en mSeg x 10.
'Control del flujo de las rutinas del programa mediante los bit que componen la variable que da
'nombre a la función:
'tmrbase.x, x = al bit de control de la base de tiempos referida.
'If tmrbase.1 =1 then ----------------
'x=0 no se como base de tiempos, se usa para la actualización de los registros de las bases de tiempos creadas.
Function tmrbase(nbase As Byte, _onoff As Bit, base_tm As Word) As Byte 'Saltos aproximados de 10mSeg.
Dim basecont1 As Word 'Contadores
Dim basecont2 As Word
Dim basecont3 As Word
Dim base1_tm As Word 'Tiempo a contar
Dim base2_tm As Word
Dim base3_tm As Word
If nbase = 1 Then 'Configuración base tiempos 1
base1_tm = base_tm 'Carga base1 con el tiempo a contar
tmrbase.1 = _onoff 'Inicia=0, para=1
Endif
If nbase = 2 Then 'Configuración base tiempos 2
base2_tm = base_tm 'Carga base2 con el tiempo a contar
tmrbase.2 = _onoff 'Inicia=0, para=1
Endif
If nbase = 3 Then 'Configuración base tiempos 3
base3_tm = base_tm 'Carga base3 con el tiempo a contar
tmrbase.3 = _onoff 'Inicia=0, para=1
Endif
If tmrbase.1 = 0 Then 'Base timer 1
basecont1 = basecont1 + 1 'Incrementa contador base 1
If basecont1 > base1_tm Then 'Determina el estado de la base
tmrbase.1 = 1 'Base parada o termino de contar
basecont1 = 0 'Inicializa el contador de la base
Endif
Endif
If tmrbase.2 = 0 Then 'Base timer 2
basecont2 = basecont2 + 1 'Incrementa contador base 2
If basecont2 > base2_tm Then 'Determina el estado de la base
tmrbase.2 = 1 'Base parada o termino de contar
basecont2 = 0 'Inicializa el contador de la base
Endif
Endif
If tmrbase.3 = 0 Then 'Base timer 3
basecont3 = basecont3 + 1 'Incrementa contador base 3
If basecont3 > base3_tm Then 'Determina el estado de la base
tmrbase.3 = 1 'Base parada o termino de contar
basecont3 = 0 'Inicializa el contador de la base
Endif
Endif
WaitUs 9500 'Patron de la base de tiempos
Return