Autor Tema: continuamos con el programa (TMR0)  (Leído 2187 veces)

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

Desconectado Juanolo

  • PIC10
  • *
  • Mensajes: 10
continuamos con el programa (TMR0)
« 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
« Última modificación: 06 de Septiembre de 2011, 07:28:03 por Juanolo »

Desconectado Juanolo

  • PIC10
  • *
  • Mensajes: 10
continuamos con el programa (TMR0)
« Respuesta #1 en: 05 de Septiembre de 2011, 11:36:22 »
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

Código: [Seleccionar]
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!
« Última modificación: 06 de Septiembre de 2011, 07:27:03 por Juanolo »

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re: continuamos con el programa (TMR0)
« Respuesta #2 en: 17 de Enero de 2012, 11:13:19 »
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.