Autor Tema: Problema con interrupciones y delays  (Leído 1519 veces)

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

Desconectado seinkraft

  • PIC10
  • *
  • Mensajes: 11
Problema con interrupciones y delays
« en: 24 de Septiembre de 2012, 19:52:52 »
Buenas a todos.

Estoy armando un reloj con tubos nixie y un pic 16F876A pero estoy teniendo un problema... atrasa 10 minutos por dia. Por lo que supongo que es debido a los delays generados para actualizar los ánodos de los tubos pero son necesarios si o si sino no llegan a activarse o se superponen los números por el tiempo que tarda el gas en salir de excitación.

Estoy utilizando un clock de 8Mhz. Por cierto utilizo el puerto B para actualizar los anodos y multiplezar los catodos. B0 a B3 actualiza los numeros y B4 a B7 multiplexa los cátodos.

Me pueden dar una mano por favor?

Código: [Seleccionar]
program Clock     

dim cnt as byte

dim ss,mm,hh as byte

dim DD0,DD1,DD2,DD3 as byte
' Declarations section
sub procedure clearAnodes()
    PORTB.4 = 0
    PORTB.5 = 0
    PORTB.6 = 0
    PORTB.7 = 0
    delay_us(250)
end sub

sub procedure clock
    ss = ss + 1

    if ss = 60 then
       ss = 0
       mm = mm + 1
    end if

    if mm = 60 then
       mm = 0
       hh = hh + 1
    end if

    if hh = 24 then
       hh = 0
    end if
end sub

sub procedure intToBcd(dim n as byte, dim PIN as byte)
    select case n
        case 0
            PORTB.0 = 0
            PORTB.1 = 0
            PORTB.2 = 0
            PORTB.3 = 0
        case 1
            PORTB.0 = 1
            PORTB.1 = 0
            PORTB.2 = 0
            PORTB.3 = 0
        case 2
            PORTB.0 = 0
            PORTB.1 = 1
            PORTB.2 = 0
            PORTB.3 = 0
        case 3
            PORTB.0 = 1
            PORTB.1 = 1
            PORTB.2 = 0
            PORTB.3 = 0
        case 4
            PORTB.0 = 0
            PORTB.1 = 0
            PORTB.2 = 1
            PORTB.3 = 0
        case 5
            PORTB.0 = 1
            PORTB.1 = 0
            PORTB.2 = 1
            PORTB.3 = 0
        case 6
            PORTB.0 = 0
            PORTB.1 = 1
            PORTB.2 = 1
            PORTB.3 = 0
        case 7
            PORTB.0 = 1
            PORTB.1 = 1
            PORTB.2 = 1
            PORTB.3 = 0
        case 8
            PORTB.0 = 0
            PORTB.1 = 0
            PORTB.2 = 0
            PORTB.3 = 1
        case 9
            PORTB.0 = 1
            PORTB.1 = 0
            PORTB.2 = 0
            PORTB.3 = 1
    end select
    PORTB.PIN = 1
end sub               

sub procedure interrupt
    if PIR1.TMR2IF then     
        inc(cnt)
        PIR1.TMR2IF = 0         
        TMR2 = 0               
    end if
end sub                 

main:                   

ADCON0 = 0x00
    ADCON1 = 0x0F                         
    CMCON  = 0x07                             

    TRISA = 0xFF
    TRISB = 0x00
    TRISC = 0x00

    PORTB = 0x00
    PORTC = 0x00

    T2CON = 0xFF           
    TMR2 = 0               
    PIE1.TMR2IE = 1       
    INTCON = 0xC0           

    ss = 0
    mm = 0
    hh = 0

    while 1               

        if cnt > 30 then     
            clock           
            cnt = 0           
        end if
 
        DD0 = ss mod 10  'Extract Ones Digit
        intToBcd(DD0,4)

        delay_ms(1)
        clearAnodes

        DD1 = (ss/10) mod 10 'Extract Tens Digit
        intToBcd(DD1,5)

        delay_ms(1)
        clearAnodes

        DD2 = mm mod 10 'Extract Ones Digit
        intToBcd(DD2,6)

        delay_ms(1)
        clearAnodes

        DD3 = (mm/10) mod 10  'Extract Tens Digit
        intToBcd(DD3,7)

        delay_ms(1)
        clearAnodes
    wend

end.