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?
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.