⚡ Descuentos en cursos en video - Lleva tu aprendizaje técnico al siguiente nivel y aprovecha precios especiales antes de que termine la oferta. 🔥 Aprovechar oferta ahora 🔥
Microcontroladores y sistemas digitales

RELOJ con 16f877a, 4MHz, TMR2

nocx
nocx
1.104
hace 18 años
hace 18 años
Hola colegas, tengo un pequeño inconveniente,,, estoy diseñando un sistema de control de potencia, al cual pretendo incorporarle un reloj interno. estoy usando el TMR2 para contar los pulsos, y como referencia del clock uso FOSC de 4MHz... segun los calculos, cada intruccion simple en el PIC tiene un retardo de 1uS. por tanto tengo la siguiente configuracion... Prescaler - 1:16 Postscaler - 1:5 PR2 - 50 con lo anterior, se debiera generar una interrupcion cada 4mS... con esta interrupcion estoy incrementando un "Segundo" contador, el cual llega hasta 250(decimal). Bien, cada vez ke se revalsa el contador anterior incremento el contador de SEGUNDOS. pues con cada revalse tengo 1000000uS, equivalente a 1 segundo... segun mis calculos esto deberia funcionar y depender e la frecuencia del oscilador ( un crystal de 4MHz)... PERO NO!!.... estoy simulando el sistema en Proteus, y los segundos son mas largos... por tanto el reloj avanza mas lento... Tambien lo implemente en el circuito fisicamente, para descartar si era problema de simulacion en proteus, pero existe el mismo problema... Portanto, tambien se descarta que sea problema de la tolerancia del crystal.. hay algun detalle que se me este pasando??... les adjunto el codigo assembler... [code:1:7dd1372621] org 4 bcf INTCON,GIE btfss PIR1,1 ;revisa si la int fue por TMR2=PR2=250=4mS goto FINT incf CONT01 movlw .250 subwf CONT01,W btfss STATUS,Z goto NADA1 incf SEG ;SI, incrementa el segundero incf SEG1 incf SEG2 clrf CONT01 btfss LED goto LEDON bcf LED goto NADA1 LEDON bsf LED NADA1 movlw .60 subwf SEG,W btfss STATUS,Z goto NADA2 incf MIN clrf SEG NADA2 movlw .60 subwf MIN,W btfss STATUS,Z goto NADA3 incf HOUR clrf MIN NADA3 movlw .24 subwf HOUR,W btfss STATUS,Z goto NADA4 clrf HOUR NADA4 goto FINT FINT bcf PIR1,1 ;borra indicador de int por TMR2=PR2 bsf INTCON,GIE ;habilita las interrupciones retfie CONFI bsf STATUS,5 bcf STATUS,6 ;banco 1 clrf TRISB ;PORTB salida -- Datos LCD clrf TRISD ;PORTD salida -- Control LCD clrf TRISE ;PORTE salida -- sin uso movlw 0xff movwf TRISA ;PORTA entrada -- Botones movlw b'10000000' movwf TRISC ;PORTC <C7:C6>RX:TX, <C5:C0> movlw b'00000111' movwf OPTION_REG ;Timer 0 ascendente cada 256 ciclos movlw b'01000000' movwf INTCON ;Interrupciones perifericas movlw .25 movwf SPBRG ;9,6k con 4MHz movlw b'00100100' movwf TXSTA ;hab tx, 8bit, asyn, hspeed, TSR full movlw b'111' movwf ADCON1 ;todos los pines digitales movlw .50 movwf PR2 movlw b'10' movwf PIE1 ;interrupcion por TIMER2=PR2 bcf STATUS,5 ;banco 0 clrf HOUR clrf MIN clrf SEG clrf CONT01 clrf PORTA clrf PORTB clrf PORTC clrf PORTD clrf PORTE movlw b'00110011' movwf T1CON ;hab TIMER 1, external clock RC0 movlw b'00101111' movwf T2CON ;hab TIMER 2, pres1:16, posts1:5 clrf SEG2 clrf SEG1 clrf SSPCON movlw b'10010000' movwf RCSTA ;hab serial async, 8 bit .... resto del programa... [/code:1:7dd1372621] a ver si me exan una mano...
mammuky
mammuky
640
hace 18 años
hace 18 años
Ok. 1)-Yo creo que esto tiene que ir en la seccion de pics ya que estas consultando exclusivamente algo referido a el y no al diseño. 2)-Porciones de codigo son dificiles de decir si estan bien o no ya que tu falla por ahi y digo solo por ahi radica en otro lugar.- 3) Como se que por ej "CONT01" esta bien declarado en una seccion anterior de tu codigo.- 4)- Donde esta tu declaracion de mem y llamada a la rutina ppal? Debo suponer que es CONFI! Saludos.-
mammuky
mammuky
640
hace 18 años
hace 18 años
Ok. 1)-La frecuencia de entrada que tiene tu TIMER2 no es [color=red:e2509b45a9]FOSC(4Mhz)[/color:e2509b45a9] sino que es [color=blue:e2509b45a9]FOSC/4 [/color:e2509b45a9]o sea trabajando a 4Mhz es 1Mhz.- 2)-Por lo tanto se te incrementa a dicha frecuencia dividida tu preescalador.- 3)-El postescalador divide la frecuencia con que ocurre la activacion del timer, es decir si es 1/1 se activara cada vez que se reinicie el timer y si por ej es 1/16 se te va a activar cada 16 reinicios del timer.- Bue espero que se entienda revisa tu codigo que el problema esta ahi.- Suerte.-
nocx
nocx
1.104
hace 18 años
hace 18 años
claramente mi hermano!.... tengo un FOSC de 4MHz... la entrada al TMR2 es 1MHz... el prescaler es 1:16, postscaler=1:5, PR2=50(dec), y el CONT01=250(dec) si calculamos es 1uS*16*5*50*250=1000000uS=1Seg... porke no funciona? he ido mas alla!...y genere un programa nuevo, donde solo configure el TMR2, el ppal es LOOP nop goto LOOP end aun asi no funciona...por tanto el problema no va por el codigo principal. sino insisto, por los calculos... ke segun yo estaban correctos, pero el PIC me dice lo contrario... HELP ME!!... jejejeje gracias saludos!
mammuky
mammuky
640
hace 18 años
hace 18 años
Ok. No no nop.- Tu ciclo de instruccion del Tmr no es 1uS ya que si es 1Mhz tenes: (1/1Mhz)*4=4uS entonces---> ---->4uS*16*5*50*250=4 segundosssss!!!!! Ta claro? Por eso te puese en lo anterior que el tmr tiene la frecuencia de reloj dividida por 4. Bue espero que te funcione modificalo y simulalo en proteus y contame. Suerte!!!
nocx
nocx
1.104
hace 18 años
hace 18 años
mmmmm... tengo un crystal de 4MHz... la entrada al TMR2 es FOSC/4 si FOSC es 4Mhz lo dividimos por 4, queda en 1 MHz aplicamos reciproco... ke seria 1/1MHz = 1uS 1uS*16*5*50*250=1segundo... ahora, si fuese como tu dices... deberia avanzar el segundero cada cuatro segundos... y tampoco es tan lento... mas bien, dura unos 1,5seg (al ojo)... gracias nuevamente... ke paciencia!!! ;).... PD: pk no puedo valorar??... saludos
nocx
nocx
1.104
hace 18 años
hace 18 años
En realidad, me ekivoke de seccion en el foro.... sorry... bueno solo pegue esta parte del codigo, pues lo demas está sin problemas.... el contador CONT01, está definido, anteriormente... de no ser asi, tendria problemas de compilación no de funcionamiento... el programa parte con org 0 goto CONFI org 4 ... el resto no lo pegue, pues está demas... mi consulta va referida especificamente al calculo de los ciclos... pues los que yo hice deberian funcionar, y no lo hacen... el resto del ppal, esta corriendo sin problemas, y no hay detalle en el... pues estoy trabajando por interrupciones... el resto son codigos de transmision USART, I2C, read/save E2PROM y un par de menus LCD.... necesito calcular el prescaler, postscaler, PR2 y el contador auxiliar (CONT01), para obtener 1 segundo... con un crystal de 4MHz.. gracias, por la pronta respuesta... saludos...
mammuky
mammuky
640
hace 18 años
hace 18 años
Ok. Pero te estas olvidando que las instrucciones se ejecutan cada cuatro ciclos de reloj, por eso el 4!. Yo lo calcule con los datos que me distes vos. Ahora veo si escribo una rutina y la subo.- Saludos.-
nocx
nocx
1.104
hace 18 años
hace 18 años
pues claro!! el oscilador es de 4MHz, portanto el periodo es de 250nS, lo multiplicamos por 4 y queda en 1uS... [code:1:74f9c3ae7e]All instructions are executed within one single instruction cycle, unless a conditional test is true or the program counter is changed as a result of an instruction. In this case, the execution takes two instruction cycles with the second cycle executed as a NOP. One instruction cycle consists of four oscillator periods. Thus, for an oscillator frequency of 4 MHz, the normal instruction execution time is 1 ms. If a conditional test is true or the program counter is changed as a result of an instruction, the instruction execution time is 2 ms. [/code:1:74f9c3ae7e] he intentado igualar el reloj asi comparandolo visualmente con otro reloj... i me he dado cuenta que si al CON01 le doy un valor de 204(dec)... anda a una velocidad visualmente igual... ahora claro, deberia dejarlo asi un par de semanas para ver si se atrasa o adelanta... weno si considero ese nuevo valor... seria 1uS*16*5*50*204= 816mS... :S creo ke me estoy desdesperando!!... gracias nuevamente!.. saludos
mammuky
mammuky
640
hace 18 años
hace 18 años
Ok. [color=red:ab8931652f]Si si lei mal pense que tu entrada de clk era de 1MHZ por eso lo del 4 olvidalo!!! (hay veces que no leo bien y me hago cargo jajajaja) .-[/color:ab8931652f] proba lo siguiente: [code:1:ab8931652f] CLRF T2CON CLRF TMR2 CLRF INTCON BSF STATUS,RP0 CLRF PIE1 BCF STATUS,RP0 CLRF PIR1 MOVLW XX ; XX-->VALOR DE TU POST Y PRE ESCALADOR MOVWF T2CON BSF T2CON, TMR2ON DESBORDE: BTFSS PIR1, TMR2IF GOTO DESBORDE incf . . .[/code:1:ab8931652f] Es mas o menos parecido al tuyo, pero tambien fijate que despues del salto de la comparacion perdes "tiempo" en comparar si es igual incrementar contadores del display, etc.- Calcula cuanto tiempo perdes en esto y restalo al CON01 por eso poniendo un valor menor en el abtenes mejor resultado.-
nocx
nocx
1.104
hace 18 años
hace 18 años
emmmm. bueno te comento... probe con tu idea, pero sigue igual.... ahora he hecho un cambio, utilizando el prescaler como 1:1 y postscaler como 1:1 con un PR2 de 200(dec) incremente un CONT01, que tambien llega hasta 200. en cada rebalse de CONT01, incremento un segundo contador CONT02 que llega hasta 25... por tanto, el calculo seria así... 1uS*1*1*200*200*25=1S **con lo anterior he logrado mayor precision, pero no asi la perfeccion... ahora hice lo siguiente... baje el valor del CONT01 a 199... y con esto, llevo 20min de funcionamiento sin problemas... veré como sigue hasta mañana... la explicacion??...no la tengo.. pero funciona!..hasta ahora! ....jejje saludos te adjunto el codigo [code:1:4ab1ac91b1] include p16f877a.inc CONT01 equ 0x20 SEG equ 0x21 MIN equ 0x22 HOUR equ 0x23 CONT02 equ 0x24 #define LED PORTD,2 org 0 bcf STATUS,RP0 bcf STATUS,RP1 CLRF T2CON CLRF TMR2 CLRF INTCON BSF STATUS,RP0 movlw .200 movwf PR2 clrf TRISD CLRF PIE1 BCF STATUS,RP0 CLRF PIR1 MOVLW b'00000100' ; XX-->VALOR DE TU POST Y PRE ESCALADOR MOVWF T2CON DESBORDE: BTFSS PIR1, TMR2IF GOTO DESBORDE incf CONT01 movlw .199 subwf CONT01,W btfss STATUS,Z goto NADA1 clrf CONT01 incf CONT02 movlw .25 subwf CONT02,W btfss STATUS,Z goto NADA1 clrf CONT02 btfss LED goto LEDON bcf LED goto NADA1 LEDON bsf LED NADA1 bcf PIR1,1 ;borra indicador de int por TMR2=PR2 goto DESBORDE end [/code:1:4ab1ac91b1] enseguida hare las pruebas utilizando el TMR0... la verda ya estoy jugando al ACHUNTE!... si resulta, lo dejo.... jejeje gracias men!!... saludos
mammuky
mammuky
640
hace 18 años
hace 18 años
Ok. Mira mira para mayor presicion si queres usar un reloj tenes dos opciones: 1)- Utilizar un cristal de 1.84320 Mhz y usas el tmr y esto te da clavado 1s ( yo lo use para hacer un reloj) y tenes un error aproximadado de 1 a 1.3 segundos al año.O tb podes usar uno de 32.768 Khz.- 2)-Usas algun chip tipo PCF8583 ( y con esto podes implementar tambien los dias de la semana los años el mes,etc) y quedaria muy lindo con tu display.- Otra cosa fijate simulando en proteus, escribite un prog solo del tmr y usas el Counter Timer de proteus y lo pones para que cuente segundos, entonces cuando tu prog genere ese segundo apagas este contador y te fijas cuanto marca. Bue espero que se entienda lo que quise decir.- Ahh Otra cosa mas los calculos estan bien pero te hago una pregunta: Desde que detectaste el segundo cuanto tiempo tardas en formatear variables para mandarselas al display o ejecutar otras tareas? por eso vuelvo a repetir que este tiempo que tardas se lo tenes que restar al valor que vos cargas en CONT0, ya que en el codigo yo veo que despues que chequeaste que paso un segundo hay otras instrucciones y esto se te suma al segundo contado( me explico?).- Por ej si esta es la rutina donde chequeo el seg: Un_seg? BTFSS UN_SEG <---------aca chueque si paso un seg GOTO Un_seg? <--------- no paso sigo intentando Movlw 0x00 <---------- la instrucciones son a modo de ej nop <--------- Clrf Puertoa <--------- aca ya tengo 1s +3 instrucciones +1 del salto Bue espero que se entienda.- Saludos.-
Reparaciones similares solucionadas

¿Conoces una solución?

¡Aprende a reparar con estos cursos YoReparo!

4.93
(14)

Curso Reparación de Equipos de Audio de Alta Fidelidad

Maximiliano Resch
$ 60 USD
$ 20 USD
4.25
(8)

Reparación de Placa Main TV LED con el Ing. Picerno

Ing. Alberto H. Picerno
$ 40 USD
$ 20 USD
4.87
(15)

Curso Diseño de Amplificadores de Máxima Fidelidad

Maximiliano Resch
$ 29 USD
$ 13 USD
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos?
Regístrate gratis