TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: Juanolo en 31 de Agosto de 2011, 09:34:00
-
Hola amigos!
Poco a poco voy haciendo el programa, pero necesito ayuda, en el siguiente post les pongo el ejemplo!
gracias de antemano
-
Hola amigos!
sigo continuando con el programa, y el TMR0 me lleva de cabeza! queria preguntarles si los siguientes calculos son correctos y les pongo el codigo del programa.
para ver si los valores que he utilizado son correctos para conseguir que me temporice cada 500 us que utilizando una variable contador y un IF cada vez que la variable contador llegue a 2000, realizo la accion y reseteo contador, es decir utilizo un multiplicado x2000 para que me ejecute (0,5ms X 2000 = 1000 ms = 1s) por tanto el digito cambiará cada segundo
Sigou un libro y me pone lo siguiente:
TMR0= 256 - (tiempo de desbordamiento)/(4 X periodo oscilador us X preescalador)
Utilizo un PIC 16F887 a 8MHz de XTAL por lo que tiene un periodo de 1/8000000 = 0,125 us y utilizo un preescalador de 1:8 con lo que el registro de OPTION_REG= $82
Despejando la ecuacion anterior TMR0= 256 - [500us /(4 X 0,125us X 8)] = 256 - [500us / 4]= 256 - 125 = 131 de valor de precarga en el TMR0
program CONTADORBCD
dim cnt as word
dim index as byte
dim digitos as byte[10]
SUB PROCEDURE DIGI
digitos[0]= $3F
digitos[1]= $06
digitos[2]= $5b
digitos[3]= $4F
digitos[4]= $66
digitos[5]= $6D
digitos[6]= $7D
digitos[7]= $07
digitos[8]= $7F
digitos[9]= $67
END SUB
SUB PROCEDURE interrupt
Inc(cnt)
TMR0= 131
INTCON= $20
end sub
main:
ANSEL= 0
ANSELH= 0
OPTION_REG = $82
TMR0= 131
INTCON= $A0
index= 0
cnt=0
PORTA= 0
TRISA= 0
PORTD= 0
TRISD= 0
PORTB= 0
TRISB= $FF
DIGI
PORTD=digitos[index]
PORTA.0= 1
WHILE TRUE
while PORTB.0= 0
if (cnt= 2000) then
index= index+1
if index = 10 then
index= 0
end if
cnt=0
PORTD=digitos[index]
end if
wend
WEND
end.
Ahora mi siguiente paso es multiplexar los displays para hacer un contador de 4 digitos que simule 99 minutos y 99 segundos. podeis indicarme un buen ejemplo en basic para poder hacerlo? ya que no entiendo exactamente como encender los displays y desplazar el digito cada vez que llega a 10.
saludos y gracias de antemano!
-
Lo del timer0 veo que asignas valores de 256 y ese numero está fuera de rango de una variable o registro (en este caso tmr0) que debe ser entre 0 y 255 y no 256 como tienes puesto. si asignas un valor 256 al tmr0 será lo mismo que asignarle cero.
Lo de multiplexar los displays utiliza un puerto completo de 8 bits para los 7 segmentos y el punto y de otro puerto distinto utiliza 4 bis para conectar 4 transistores npn o pnp segun uses displays de catodo común o anodo común y conecta cada cátodo o anodo común a cada transistor. La conexión de los transistores debe ser seguidor de emisor.
Conecta los 7 segmentos + el punto a cada bit del puerto elegido mediante resistencias limitadoras en el orden que quieras y hazte una tabla donde reflejes el estado que tiene que tener el puerto para que el display prenda los segmentos que necesitas en cada momento. Por ejemplo, para que aparezca un uno necesitas prender los segmentos b y c del display, si el b está al bit 1 y el c al bit 2 el puerto debe valer portx = 00000110, osea, portx = 3
Asi conocerás qué valor debes dar al puerto para que aparezca la figura que quieres.
Para multiplexar tienes ahora que seleccionar el display que mostrará la cifra mediante la activación del transistor comandado por el otro puerto. Si por ejemplo el display está conectado al portA bit 1 y quieres que aparezca un 1 en ese display la funcion sería:
Portx = 3 ; seteas portx para que el display muestre un 1
Porta.1 = 1 ; prendes el display 1 y será ese el que muestre ese 1.
Saludos.