Autor Tema: Problema con el manejo de timers e interrupciones pic16f877A  (Leído 2449 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado bear68

  • PIC10
  • *
  • Mensajes: 3
Problema con el manejo de timers e interrupciones pic16f877A
« en: 14 de Marzo de 2012, 13:09:03 »
buenos dias soy novato con la programacion en Basic y en el utlimo perio de de mi carrera me asignaron un proyecto usando este lenguaje y algunos registros del los micros que no habia usando antes el proyecto conciste en elaborar un cronometro usando los timers internos del pic el cronometro se visualiza por medio de un display lcd de 16 x2 el cual ocupo en su totalidad ya que en este se necesitan marcar diferentes tiempos (tres cronometros) mi problema  es que como no se manejar en su totalidad los timers no se como pausar o interrumpir un cronometro para iniciar otro les agradeceria infinitamente su ayuda  :-/ :-/ :-/ les anexo el programa que tengo hasta el momento y una imagen de la simulacion en proteus estoy programando en pic basic pro.


Código: [Seleccionar]
   DEFINE LCD_DREG  PORTD    ' Indica que el Bus estará conectado en el Puerto D
    DEFINE LCD_BITS  4        ' El bus será de cuatro bits.
    DEFINE LCD_DBIT  4        ' Selección del Bit de inicio del puerto en el uC para el
                              ' bus de datos de la LCD
    DEFINE LCD_RSREG PORTD    ' Indica al uC que el pin "RS" estará en el Puerto D
    DEFINE LCD_RSBIT 2        ' "RS" estará conectado en RD2
    DEFINE LCD_EREG  PORTD    ' Indica al uC que el pin "E" estará en el Puerto D
    DEFINE LCD_EBIT  3        ' "E" estará conectado en RD3
 
    Define Osc 20             ' Define el Oscilador para un Cristal
                              ' de 20 Mhz.
                    
    TRISB = $FF               ' Configura el puerto B como entrada.
    TRISD = %00000011         ' Configura el puerto D como salida.
    TRISA = $00
    
    'variables subrutina reloj
    
    'total
    hora Var Byte   ' Declaración de la Variable "Dato" tipo Byte.
    minu Var Byte
    'mtto
    hora_2 VAR BYTE
    minu_2 var byte
    'setup
    minu_3 var byte
    seg_1 var byte
    'paro mtto
    pm var byte
    'paro set up
    ps var byte
    'paro mtto hora minuto
    hora_3 var byte
    minu_4 var byte
    'paro setup minuto seg
    minu_5 var byte
    seg_2 var byte
    
    tono var byte
    
    'variables del timer TIEMPO TOTAL
    
    Second   var     byte    
    Ticks    var     byte  
    
    'inicializacion de variables
    
    'total
    hora = 0
    minu = 0
    'mtto
    hora_2 = 0      
    minu_2 = 0
    'setup
    minu_3 = 0
    seg_1 = 0
    'paro mtto
    pm = 0
    'paro setup
    ps = 0
    'paro hora minuto
    hora_3 = 0
    minu_4 = 0
    'paro minuto seg
    minu_5 = 0
    seg_2 = 0
    
    tono = 1
    
    'variables de entrada
    symbol luz_roja = PORTB.1
    Symbol luz_verde = PORTB.2
    symbol luz_blanca = PORTB.3
    'Symbol start = PORTB.4
    Symbol mtto = PORTB.4
    Symbol setup = PORTB.5
    Symbol R_eeprom = PORTB.6
    Symbol cambio_turno = PORTB.7
    
    clear
    OPTION_REG = $57            'Configuracion del TMR0
    
    On Interrupt Goto TickInterrupt
    
    Lcdout $fe, 1   ' Limpia la pantalla
    
Inicio:
    
    Lcdout $fe,2,dec2 hora,":",dec2 minu," ",dec hora_2,":",dec2 minu_2," ",dec2 minu_3,":",dec2 seg_1
    
    'Lcdout
    
    Lcdout $fe,$C0,Dec2 pm," ",dec2 ps," ",dec hora_3,":",dec2 minu_4," ",dec2 minu_5,":",dec2 seg_2    
                                                

    'contador luz roja contador tiempo total                                          
    
    if luz_roja = 1 then
      TMR0 = 0
      INTCON = $A0  'instruccion para iniciar el contador
    endif
    
    if luz_verde = 1 then
      TMR0 = 0
      INTCON = $80   'instruccion para detener el contador interno      
    endif
    
    'llamado mtto
    
    if mtto = 1 and luz_roja = 1 then
      'INTCON = $80                  
      call radio        
      CALL cont_pm
    endif
    'llamado setup
    
    if SETUP = 1 and luz_roja = 1 then  
      'INTCON = $80
      call cont_ps
    endif
    
    'escribir eeprom
    if cambio_turno = 1 then
      INTCON = $80
      call guardar_ee
    endif
    
    'leer eeprom
    if R_eeprom = 1 then
      call leer_ee
    endif  
    
    
GoTo Inicio    ' Salta a la etiqueta "Inicio".
     disable                                              

    '**************************************************
    '*                 SUBRRUTINAS                    *
    '*                                                *
    '**************************************************

            ' RELOJ TIEMPO TOTAL '
            
TickInterrupt:  
      
       Ticks = Ticks + 1              ' Conteo de partes de segundo
    If Ticks < 61 Then ExitInterrupt  ' 61 ticks por segundo
                                      
      Ticks = 0
      Second = Second + 1
    If Second >= 60 Then
           Second = 0
            Minu = Minu + 1
    If Minu >= 60 Then
           Minu = 0
            hora = hora + 1
    if hora >= 99 then
           hora = 0
                
    endif    
    endif
    Endif
    
ExitInterrupt:
    INTCON.2 = 0    ' Reseteo del timer de interrupcion
    Resume
    ENABLE
    return
    
            'SUBRRUTINA ESCRIBIR EEPROM
guardar_ee:

    Disable
    
    Write 0, HORA
    Write 1, MINU
    Write 2, HORA_2
    Write 3, MINU_2
    Write 4, mINU_3
    Write 5, SEG_1
    Write 6, pm
    Write 7, ps
   ' Write 8, hora_3
   ' Write 9, minu_4
   ' Write 10, minu_5
   ' Write 11, seg_2
    
    Enable
    Return

            'SUBRRUTINA LEER EEPROM

leer_ee:

    Read 0, HORA
    Read 1, MINU
    Read 2, HORA_2
    Read 3, MINU_2
    Read 4, MINU_3
    Read 5, SEG_1
    Read 6, PM
    Read 7, PS
   ' Read 8, HORA_3
   ' Read 9, MINU_4
   ' Read 10, MINU_5
   ' Read 11, SEG_2
    
    Return  

    'subrrutinas contadores pm y ps    
 
cont_pm:
 
    pm = pm + 1    
    Pause 250                                              
    Return              
    
cont_ps:
    ps = ps + 1
    pause 250
    return  
    
radio:  'subrrutina llamado mtto

    'INTCON = $80
    PORTA.1 = %000001
    pause 500
    PORTA.1 = %000000
    pause 2500
    PORTA.1 = %000001
    pause 500
    PORTA.1 = %000000
    pause 2500
    PORTA.1 = %000001
    pause 500
    PORTA.1 = %000000    
    return

  
« Última modificación: 14 de Marzo de 2012, 21:12:04 por bear68 »


 

anything