Curso de programación de PIC en PICBasic Pro

hola alguien puede decirme como puedo hacer variar la velocidad de un motor de lavarropas con carbones o escobillas tipo universal con un pic , un opto , y un triac bt139 800V. Ya intente enviando a traves del opto moc3011 sin cruce por cero un pwm pero lo que hace esta mal no arranca suave, y lei tambien que se puede detectando el cruce por cero para disparar correctamente pero nose como puede detectar el pic el cruce por cero ?:confused:
 

Adjuntos

  • IMG0092A.jpg
    IMG0092A.jpg
    57.1 KB · Visitas: 18
Volthor, muchísimas gracias, apreciaría mucho tu ayuda en este tema, ya que quiero dejar completamente terminado el tema de interruptores para seguir estudiando lo demás, gracias :apreton:

saludos hola, cuantos efectos son los que desea proyectar, envieme un correo electronico y le envio el diagrama de flujo

adios
 
gracias amigo @volthor por las observaciones, lo de las palabras inadecuades me gustaria saber a cuales te refieres para corregirlo ya que me interesa mejorar todo lo relacionado a la programacion, he a vanzado de a paso por mi cuenta y con mucha ayuda de los amigos de foro, a lo mejor no he prestado mucha atencion a lo que me indicas...saludosss

PD: Aprovenchando un poco, me encuentro esta semana en Mexico DF por el centro comercial perisur, si alguien pudiera ayudarme a encontrar alguna tienda de electronica si hay alguna sercana ya que me gustaria aprovehar el viaje...Muchas Gracias
 
Hola Volthor, adjunto el archivo de lo que quiero hacer, saludos y gracias (y)

hola Kiyero:
listo realizado el archivo lo ejecute en mi simulador fisico de pic y funciona perfecto, si tiene alguna duda por favor digamela.
corra el archivo en pic basic pro y montelo en su simulador fisico.
en la parte del pulsador se repite para evitar que si se mantiene oprimido el boton no pase al siguiente.

de paso sirve como parte del tema en el foro

Código:
if boton1 = 0 Then ' presiona boton1
   pause 200
sensado1: 
         if boton1 = 0 then
          pause 200
          goto sensado1
         endif

Código:
'****************************************************************
'*  Name File: secuenciador.BAS                                     
'*  Author  : Kiyero                                            *
'*  Notice  : Copyright (c) 2012                                *
'*          : All Rights Reserved                               *
'*  Date    : 14/03/2012                                        *
'*  Version : 1.0  con pic 16f628A                              *
'*  Notes   : proyecto secuenciador en pic basic pro                                             
'*          :                                                   *
'****************************************************************

Define LOADER_USED 1
define osc4
define WDT_on
cmcon=7   
   TRISB = %00000000   
   TRISA = %111111
   
symbol boton1 = porta.0
inicio:
porta = %000000
portb = %00000000

menu:
if boton1 = 0 Then ' presiona boton1
   pause 200
sensado1: 
         if boton1 = 0 then
          pause 200
          goto sensado1
         endif
     goto efecto1
endif
goto menu
efecto1:
portb=%10000000
pause 1000
portb=%01000000
pause 1000
portb=%00100000
pause 1000
portb=%00010000
pause 1000
portb=%00001000
pause 1000
portb=%00000100
pause 1000
portb=%00000010
pause 1000
portb=%00000001
pause 1000
portb=%00000010
pause 1000 
portb=%00000100
pause 1000
portb=%00001000
pause 1000
portb=%00010000
pause 1000
portb=%00100000
pause 1000
portb=%01000000
pause 1000
portb=%10000000
pause 1000 
portb=%00000000

boton2: 
if boton1 = 0 Then ' presiona boton1
   pause 200
sensado2: 
         if boton1 = 0 then
          pause 200
          goto sensado2
         endif
     goto efecto2
endif
goto boton2 
efecto2:
portb=%10000001
pause 2000
portb=%01000010
pause 2000
portb=%00100100
pause 2000
portb=%00011000
pause 2000
portb=%00100100
pause 2000
portb=%01000010
pause 2000
portb=%10000001

boton3:  
if boton1 = 0 Then ' presiona boton1
   pause 200
sensado3: 
         if boton1 = 0 then
          pause 200
          goto sensado3
         endif
     goto efecto3
endif
goto boton3
efecto3:
portb=%11111111
pause 3000
portb=%00000000
pause 3000
boton4:  
if boton1 = 0 Then ' presiona boton1
   pause 200
sensado4: 
         if boton1 = 0 then
          pause 200
          goto sensado4
         endif
     goto efecto4
endif
goto boton4
efecto4:
portb=%10101010
pause 3000
portb=%01010101
pause 3000
boton5:  
if boton1 = 0 Then ' presiona boton1
   pause 200
sensado5: 
         if boton1 = 0 then
          pause 200
          goto sensado5
         endif
     goto efecto5
endif
goto boton5
efecto5:
portb=%00011000
pause 3000
portb=%01000010
pause 3000
portb=%10000001
pause 3000
portb=%00100100
pause 3000
boton6:  
if boton1 = 0 Then ' presiona boton1
   pause 200
sensado6: 
         if boton1 = 0 then
          pause 200
          goto sensado6
         endif
     goto efecto6
endif
goto boton6
efecto6:
portb=%10000000
pause 1000
portb=%00100000
pause 1000
portb=%00001000
pause 1000
portb=%00000010
pause 1000
portb=%00000001
pause 1000
portb=%00000100
pause 1000
portb=%00010000
pause 1000
portb=%01000000
pause 1000
goto menu
end
(y)
 
Última edición por un moderador:
Hola amigo, si es un motor a escobillas, con un pequeño arreglo al dimmer que esta en este mismo tema, podras controlarlo sin problema alguno.
No recuerdo si fue "completamente" sensurado :rolleyes: un aporte mio sobre como modificar el dimmer; Pero basicamente lo que tenes que hacer, como comente en su momento, es agregar una autoinduccion para proteger el triac y que este funcione bien.
Busca informacion de como se calcula la autoinduccion segun carga ;)... Si implementas SanGoogle, sumale el tag "prof.martintorres" y de seguro te va a llevar al video y el circuito que arme controlando un motor de 1/4 HP...
Salu2(y)

PD: Reimy, no te olvides de volver con un regalo para este amigo :D
 
hola amigos, les cuento que me ha entrado la curiosidad por saber como cargo un valor, por ejemplo 255 a una variable, utilizando un teclado matricial de 3x4. he estado revisando un poco el thread asi superficialmente, y no encontre... ¿alguien me da una idea de como hacerlo? la lectura del teclado ya la tengo y se como cargar el numero de tecla presionado en una variable, osea 1 digito pero no se como hacer lo anterior, osea 3 digitos o mas... saludosss ;)
 
hola Kiyero:
listo realizado el archivo lo ejecute en mi simulador fisico de pic y funciona perfecto, si tiene alguna duda por favor digamela.
corra el archivo en pic basic pro y montelo en su simulador fisico.
en la parte del pulsador se repite para evitar que si se mantiene oprimido el boton no pase al siguiente.

de paso sirve como parte del tema en el foro

Código:
if boton1 = 0 Then ' presiona boton1
   pause 200
sensado1: 
         if boton1 = 0 then
          pause 200
          goto sensado1
         endif

Código:
'****************************************************************
'*  Name File: secuenciador.BAS                                     
'*  Author  : Kiyero                                            *
'*  Notice  : Copyright (c) 2012                                *
'*          : All Rights Reserved                               *
'*  Date    : 14/03/2012                                        *
'*  Version : 1.0  con pic 16f628A                              *
'*  Notes   : proyecto secuenciador en pic basic pro                                             
'*          :                                                   *
'****************************************************************

Define LOADER_USED 1
define osc4
define WDT_on
cmcon=7   
   TRISB = %00000000   
   TRISA = %111111
   
symbol boton1 = porta.0
inicio:
porta = %000000
portb = %00000000

menu:
if boton1 = 0 Then ' presiona boton1
   pause 200
sensado1: 
         if boton1 = 0 then
          pause 200
          goto sensado1
         endif
     goto efecto1
endif
goto menu
efecto1:
portb=%10000000
pause 1000
portb=%01000000
pause 1000
portb=%00100000
pause 1000
portb=%00010000
pause 1000
portb=%00001000
pause 1000
portb=%00000100
pause 1000
portb=%00000010
pause 1000
portb=%00000001
pause 1000
portb=%00000010
pause 1000 
portb=%00000100
pause 1000
portb=%00001000
pause 1000
portb=%00010000
pause 1000
portb=%00100000
pause 1000
portb=%01000000
pause 1000
portb=%10000000
pause 1000 
portb=%00000000

boton2: 
if boton1 = 0 Then ' presiona boton1
   pause 200
sensado2: 
         if boton1 = 0 then
          pause 200
          goto sensado2
         endif
     goto efecto2
endif
goto boton2 
efecto2:
portb=%10000001
pause 2000
portb=%01000010
pause 2000
portb=%00100100
pause 2000
portb=%00011000
pause 2000
portb=%00100100
pause 2000
portb=%01000010
pause 2000
portb=%10000001

boton3:  
if boton1 = 0 Then ' presiona boton1
   pause 200
sensado3: 
         if boton1 = 0 then
          pause 200
          goto sensado3
         endif
     goto efecto3
endif
goto boton3
efecto3:
portb=%11111111
pause 3000
portb=%00000000
pause 3000
boton4:  
if boton1 = 0 Then ' presiona boton1
   pause 200
sensado4: 
         if boton1 = 0 then
          pause 200
          goto sensado4
         endif
     goto efecto4
endif
goto boton4
efecto4:
portb=%10101010
pause 3000
portb=%01010101
pause 3000
boton5:  
if boton1 = 0 Then ' presiona boton1
   pause 200
sensado5: 
         if boton1 = 0 then
          pause 200
          goto sensado5
         endif
     goto efecto5
endif
goto boton5
efecto5:
portb=%00011000
pause 3000
portb=%01000010
pause 3000
portb=%10000001
pause 3000
portb=%00100100
pause 3000
boton6:  
if boton1 = 0 Then ' presiona boton1
   pause 200
sensado6: 
         if boton1 = 0 then
          pause 200
          goto sensado6
         endif
     goto efecto6
endif
goto boton6
efecto6:
portb=%10000000
pause 1000
portb=%00100000
pause 1000
portb=%00001000
pause 1000
portb=%00000010
pause 1000
portb=%00000001
pause 1000
portb=%00000100
pause 1000
portb=%00010000
pause 1000
portb=%01000000
pause 1000
goto menu
end
(y)

Hola Volthor, probé el que me enviaste, pero al compilarlo me dá un error, (igual genera el archivo hex), lo simulo en proteus y se queda en el primer efecto, aún cuando vuelvo a presionar el pulsador, adjunto el .pbp y el .dsn, para que por favor lo observes (no sé si tal vez mi simulador está mal configurado), gracias, seguimos en contacto(y)
 

Adjuntos

  • Proyecto_secuenciador.zip
    14.6 KB · Visitas: 86
Hola Volthor, probé el que me enviaste, pero al compilarlo me dá un error, (igual genera el archivo hex), lo simulo en proteus y se queda en el primer efecto, aún cuando vuelvo a presionar el pulsador, adjunto el .pbp y el .dsn, para que por favor lo observes (no sé si tal vez mi simulador está mal configurado), gracias, seguimos en contacto(y)

saludos muy Buenos dias:
hola te comento que lo ejecute en mi simulador proteus y funciona perfecto, revisa la configuracion de tu simulador.
chao cualquier cosa comentelo
 
Hola alguien me propria ayudar, necesito saber como general un 3 pwm por software los cual en momentos van a funcionar al mismo tiempo, es para hacer una controladora rgb, ya se que de esto se hablo en varios temas pero como yo programo en PBP (pic basic pro) me gustaria poder hacerlo en ese lenguaje para después poder modificar y hacer los efectos que yo quiera
 
Hola alguien me propria ayudar, necesito saber como general un 3 pwm por software los cual en momentos van a funcionar al mismo tiempo, es para hacer una controladora rgb, ya se que de esto se hablo en varios temas pero como yo programo en PBP (pic basic pro) me gustaria poder hacerlo en ese lenguaje para después poder modificar y hacer los efectos que yo quiera
Me parece, bien no lo recuerdo, en este msimo tema hay uno o odos ejemplos... tendrias que pegarle una mirada... despues cuando llegue a casa, de ultimas, veo si lo encuentro yo o directamente subo el que encontre "yo" acá en el foro
 
...... despues cuando llegue a casa, de ultimas, veo si lo encuentro yo o directamente subo el que encontre "yo" acá en el foro
no encontre el que vi aca en el foro, pero te paso unpar de ejemplos que tenia dando vuelta:

Código:
DEFINE OSC 4
TRISB = %00000000     
TRISC = 0               
mode            var     byte
counterVar      var     word   
colorGoal       var     byte[3] 
currentColor    var     byte[3] 
colorCheck      var     byte 
x               var     byte    

maxCount        con     1
clear
high portc.0
pause 2000
low portc.0

main:
if countervar > maxcount then 
    countervar = 0              
    colorcheck = 0             
    for x = 0 to 3
        if currentcolor[x] = colorgoal[x] then 
            colorcheck = colorcheck + 1      
        endif                               
    next
    if colorcheck = 3 then 
        mode = mode + 1       
    else                   
        for x = 0 to 3   
            if currentcolor[x] < colorgoal[x] then
                currentcolor[x] = currentcolor[x] + 1
            else
                currentcolor[x] = currentcolor[x] - 1
            endif    
        next
    endif
else
    counterVar = countervar + 1
endif

select case mode//3 
    case 0          
        colorgoal[0] = 25
        colorgoal[1] = 200
        colorgoal[2] = 0
    case 1
        colorgoal[0] = 0
        colorgoal[1] = 250
        colorgoal[2] = 77
    case 2
        colorgoal[0] = 250
        colorgoal[1] = 0
        colorgoal[2] = 100
end select

pwm portc.0, currentcolor[0], 1     
pwm portc.1, currentcolor[1], 1
pwm portc.2, currentcolor[2], 1

goto main

Voy a seguir revolviendo en la PC de escritorio :) tengo un bolonqui :rolleyes: ya por lo menos se que en la notebook no esta :unsure:
 
Saludos amigos, por softwaret no hay manera de generar 3 PWM simultaneos, la unica manera es por hardware, hay dispositivos como el TLC5940 DRIVER PWM, tiene 16 canales PWM idependientes y se controla de forma serial.

Caracteristicas:
El TLC5940 es un controlador de PWM de 16 unidades con 12 bit de control del ciclo de trabajo (0 - 4095), 6 bits de control de límite de corriente (0 - 63), y una interfaz serial de conexión en cadena. Es muy útil para ampliar el número de salidas PWM disponibles.

Y por lo que vi no es costoso, seria bueno si se animan a realizar un codigo para este intetegrado me pongo a la orden para prestar mi apoyo en el codigo saludos
 
Hola gracias por la ayuda, pero estuve hablando con mi profe de micros en la faculta y salio esto un pwm echo con ciclos FOR el cual se puede hacer que acute sobre varia salidas a las ves este es el ejemplo:

Código:
CMCON=7
TRISB=0
ledr var portb.1  
ledg var portb.2
ledb var portb.3
portb=0
B VAR BYTE :I VAR BYTE  
B=0 


RGB:
 IF B=255 THEN             
  PAUSE 40      
  WHILE B<>0      
  pause 40
   B=B-1          
   FOR I=1 TO B   
    LEDR=1
    ledg=1
    ledb=1
    pauseus 150
   NEXT I
   
   FOR I=1 TO (255-B)
    LEDR=0
    ledg=0
    ledb=0
    pauseus 150 
   NEXT I
  WEND
   B=0   
 ELSE
 pause 40
   B=B+1
   FOR I=1 TO B
    LEDR=1
    ledg=1
    ledb=1
    pauseus 150
   NEXT I
   
   FOR I=1 TO (255-B)
    LEDR=0
    ledg=0
    ledb=0
    pauseus 150
   NEXT I
 ENDIF 
goto rgb

nota: esta echo para el 16f628a y hay que usar un oscilador externos de 20Mhz y cuando termine toda la controladora voy a subir con las simulaciones y algún video
 
Última edición:
bueno, no se si alguien habria leido mi pregunta anterior pero aqui les dejo la solucion que consegui. el montaje tiene un lcd 16x2 y un teclado matricial 4x3 con el que se igresa un valor a una variable. saludosss
Código:
@ DEVICE MCLR_On, INTRC_OSC, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
DEFINE OSC 4 
cmcon=7 ;cambiar a modo digital todo el puerto A
TRISA = 0 ;todo el puerto A es configurado como salidas


A VAR PORTB.0 ;nombres para los pines de las filas
B VAR PORTB.1
C VAR PORTB.2
D VAR PORTB.3


UNO VAR PORTB.4 ;nombres para los pines de las columnas
DOS VAR PORTB.5
TRES VAR PORTB.6
CUATRO VAR PORTB.7


BARRIDO:
LOW A ;hacer bajo la 1era fila
IF UNO = 0 THEN PORTA = 1 ;si la 1ra tecla es presionada sacar 1
IF DOS = 0 THEN PORTA = 2 ;si la 2da tecla es presionada sacar 2
IF TRES = 0 THEN PORTA = 3 ;si la 3ra tecla es presionada sacar 3
IF CUATRO = 0 THEN PORTA = 10 ;si la 4ta tecla es presionada sacar 10

HIGH A ;poner en alto la 1era fila
LOW B ;hacer bajo la 2da fila

IF UNO = 0 THEN PORTA = 4 ;si la 1ra tecla es presionada sacar 4
IF DOS = 0 THEN PORTA = 5 ; y así sucesivamente
IF TRES = 0 THEN PORTA = 6
IF CUATRO = 0 THEN PORTA = 11

HIGH B ;poner en alto la 2da fila
LOW C ;hacer bajo la 3ra fila

IF UNO = 0 THEN PORTA = 7
IF DOS = 0 THEN PORTA = 8
IF TRES = 0 THEN PORTA = 9
IF CUATRO = 0 THEN PORTA = 12

HIGH C ;poner en alto la 3ra fila
LOW D ;hacer bajo la 4ta fila

IF UNO = 0 THEN PORTA = 14
IF DOS = 0 THEN PORTA = 0
IF TRES = 0 THEN PORTA = 15
IF CUATRO = 0 THEN PORTA = 13

HIGH D ;poner en alto la 4ta fila
PAUSE 10 ;pausa de 10 milisegundos

GOTO BARRIDO ;continuar con el barrido de teclas
END
 

Adjuntos

  • var-one.rar
    32.1 KB · Visitas: 105
quien me puede ayudar....

resulta que necesito enviar un numero via serial para hacer un contador segun el dato entrante pero me veo con la situacion de que serin solo recibe un dato por ejemplo si envio 234 solo recibe el 2, me encontre con que la instruccion serin2 recibe mas datos pero no logro que me funcione ahora, es necesario escribir ese dato en memoria o a variable me almacena ese dato hasta que entre otro porfa ayuda....
 
Apreciados colegas estoy tratando de contar eventos y he utilizado el comando BUTTON de PICBasic 2.60 para detectar un evento en el pin RB7, de la siguiente forma:

LOOP:
BUTTON , PULSO , 1 , 255 , 20 , i , 0 , LOOP

pero cuando compilo me da el error (BAD EXPRESION)

Tambien con el comando LOOKUP me da BAD EXPRESION
ej
Lookup Digit,[$3F,$06$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],Patron

EL programa es el siguiente:
Código:
cont Var Byte                   'Cont es una variable cuenta eventos
Cont1 Var Byte                  'Cont1 es una variable cuenta hasta 125
Cont2 Var Byte                  'Cont2 es una variable cuenta hasta 5
Digit Var Byte                    'Digit es una variable tipo Byte
Patron Var Byte                 'Patron es una variable tipo Byte
Digit1 Var Byte                  'Digit1 Variable tipo Byte
Digit2 Var Byte                  'Digit2 Variable tipo Byte
PULSO Var PORTB.7            'Pulso de entrada cuenta de productos
i var byte                          'Variable tipo Byte
LedRojo Var PORTA.2           'Led Rojo Freno 
Rele1 var PORTA.4               'Rele1 es Puerto de Salida freno
'
'
'Rutina Principal

CMCON = 7                        'RA0 - RA3 son E/S Digitales           
TRISA = 0                          'Puerto A como salida
TRISB = $80                       'Puerto B como Salida  excepto bit 7
i = 0
'Habilitar interrupcion del TMRO
 '
INTCON = %00100000              'Habilitar Interrupcion de TMRO                    
OPTION_REG = %00000111        'Inicializa el Prescaler                  
TMR0 = 217                            'Cargar el registro TMRO  
on interrupt GOTO PROCESO      'salta a rutina de proceso
INTCON = %10100000              'Habilitar interrupciones          
CONT1 = 0                             'CONT1 = 0
Cont2 = 0                               'Cont2 = 0
'
'Revisar el puertoB.7 si llego pulso y esta alto
Loop:
    BUTTON , PULSO , 1 , 255 , 20 , i , 0 , loop 'Se chequea por un pulso de entr
    CONT1 = cont1 + 1             'Incrementa cont1 de 1 a 125
    Cont2 = Cont2 + 1              'Incrementa Cont de 1 hasta 5
    if Cont1 = 125  then freno1   'Chequea cuenta por 125
    if Cont2 = 5 then freno2       'Chequea por cuenta de 5
    goto Loop                          'Continua esperando un evento externo
    disable                              ' Se deshabilitan las otra interrupciones
'    
Freno1:                                 'Rutina de freno1 cuenta de 5
    Cont1 = 0                           'Limpia el contador 1
    high LedRojo                        ' 
    Rele1                                  'Prende Led Rojo indica freno act.
    if Pulso = 0  Then Freno1        'Retardo 5 Mseg
    Goto loop                             'Regresa a Loop 
'
Freno2:                                    'Rutina de Freno 2
    Cont2 = 0                             'Limpia el contador 2
    high LedRojo                   '
    Rele1                                   'Prende Led Rojo indica freno act.
    if Pulso = 0 then Freno2           'Retardo 5 Mseg
    Goto loop
'        
'Rutina de servicio de la interrupcion
                        
'        
PROCESO:                            'EL PROCESO A REALIZAR
'
    TMR0 = 217                      '
    Digit = Cont Dig 1              '
    Lookup Digit,[$3F,$06$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],Patron
    Patron = Patron ^ $FF           'Invertir bits de la variable Patron
    PORTB = Patron                    'Mostrar 10 digitos
    Digit2 = 0                             'Desactivar el digito 2
    Digit1 = 1                             'Activar el dijito 1
    Pause 5                               'Retardo 5 mseg
'
    Digit = Cont dig 0              '
    Lookup Digit,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],Patron
    Patron = Patron ^ $FF           'Invertir bits de la variable Patron
    Digit2 = 0                             'Desactivar el Digito 1
    PORTB = Patron                     'Mostrar el digito
    Digit2 = 1                             'Activar Digito 2
    Pausa 1                               'Esperar un mseg
'
    Intcon.2 = 0                         'Re-Habilitar la interrupcion del TMRO
    Resume                                'Regresar al programa principal
    Enable                                 'Habilitar Interrupciones
'
    End
 
Última edición por un moderador:
Hola...deberías hacerle caso al compilador en cuanto a las faltas de sintaxis que cometes...por otro lado no dices que PIC usas, ni pusiste los fusibles de programación ni definiste la velocidad del oscilador del mismo.
Así corregido te compilara sin error pero dudo que si no haces lo que te dije anteriormente funcione como corresponde.

Código:
cont Var Byte 'Cont es una variable cuenta eventos
Cont1 Var Byte 'Cont1 es una variable cuenta hasta 125
Cont2 Var Byte 'Cont2 es una variable cuenta hasta 5
Digit Var Byte 'Digit es una variable tipo Byte
Patron Var Byte 'Patron es una variable tipo Byte
Digit1 Var Byte 'Digit1 Variable tipo Byte
Digit2 Var Byte 'Digit2 Variable tipo Byte
PULSO Var PORTB.7 'Pulso de entrada cuenta de productos
i var byte 'Variable tipo Byte
LedRojo Var PORTA.2 'Led Rojo Freno
Rele1 var PORTA.4 'Rele1 es Puerto de Salida freno
'
'
'Rutina Principal

CMCON = 7 'RA0 - RA3 son E/S Digitales
TRISA = 0 'Puerto A como salida
TRISB = $80 'Puerto B como Salida excepto bit 7
i = 0
'Habilitar interrupcion del TMRO
'
INTCON = %00100000 'Habilitar Interrupcion de TMRO
OPTION_REG = %00000111 'Inicializa el Prescaler
TMR0 = 217 'Cargar el registro TMRO
on interrupt GOTO PROCESO 'salta a rutina de proceso
INTCON = %10100000 'Habilitar interrupciones
CONT1 = 0 'CONT1 = 0
Cont2 = 0 'Cont2 = 0
'
'Revisar el puertoB.7 si llego pulso y esta alto
Loop:
BUTTON  PULSO , 1 , 255 , 20 , i , 0 , loop 'Se chequea por un pulso de entr
CONT1 = cont1 + 1 'Incrementa cont1 de 1 a 125
Cont2 = Cont2 + 1 'Incrementa Cont de 1 hasta 5
if Cont1 = 125 then freno1 'Chequea cuenta por 125
if Cont2 = 5 then freno2 'Chequea por cuenta de 5
goto Loop 'Continua esperando un evento externo
disable ' Se deshabilitan las otra interrupciones
'
Freno1: 'Rutina de freno1 cuenta de 5
Cont1 = 0 'Limpia el contador 1
high LedRojo '
Rele1 = 1'Prende Led Rojo indica freno act.
if Pulso = 0 Then Freno1 'Retardo 5 Mseg
Goto loop 'Regresa a Loop
'
Freno2: 'Rutina de Freno 2
Cont2 = 0 'Limpia el contador 2
high LedRojo '
Rele1 = 1 'Prende Led Rojo indica freno act.
if Pulso = 0 then Freno2 'Retardo 5 Mseg
Goto loop
'
'Rutina de servicio de la interrupcion

'
PROCESO: 'EL PROCESO A REALIZAR
'
TMR0 = 217 '
Digit = Cont Dig 1 '
Lookup Digit,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],Patron
Patron = Patron ^ $FF 'Invertir bits de la variable Patron
PORTB = Patron 'Mostrar 10 digitos
Digit2 = 0 'Desactivar el digito 2
Digit1 = 1 'Activar el dijito 1
Pause 5 'Retardo 5 mseg
'
Digit = Cont dig 0 '
Lookup Digit,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],Patron
Patron = Patron ^ $FF 'Invertir bits de la variable Patron
Digit2 = 0 'Desactivar el Digito 1
PORTB = Patron 'Mostrar el digito
Digit2 = 1 'Activar Digito 2
Pause 1 'Esperar un mseg
'
Intcon.2 = 0 'Re-Habilitar la interrupcion del TMRO
Resume 'Regresar al programa principal
Enable 'Habilitar Interrupciones
'
End

Saludos.

Ric.
 
Atrás
Arriba