Autor Tema: Problema con el manejo de timers e interrupciones pic16f877A  (Leído 1738 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: 13 de Marzo de 2012, 18:00:58 »
Buenas tardes amigos del foro tengo poca experiencia con el uso de los timers e interrupciones de los micros
estoy cursando la parte final de mi carrera y como proyecto se me asigno elaborar con un pic y lenguaje basic
un reloj con un display lcd de 16 x 2 en el cual deben de aparecer 6 tableros mi problema es que no se como
puedo utilizar los timers para poder crear tres relojes pues necesito desplegar en 3 de los tableros cronometros
independiantes por el momento soslo he podido hacer uno con el uso del timer 1 les agradeceria mucho si me
pudieran ayudar les adjunto imagen de mi simulacion y mi programa :)


 
    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

    End


 

anything