Autor Tema: Problema con Interrupcion en TMR0  (Leído 6665 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Problema con Interrupcion en TMR0
« Respuesta #15 en: 13 de Septiembre de 2012, 13:27:20 »
Para comparar dos variables las restas y despues si son iguales se pone a 1 STATUS,Z, si quieres saber si una es mayor que otra tienes que chequear STATUS,C o STATUS,DC, aqui no estoy seguro  :lol: prueba en el MPLAB que FLAG se te pone a 1 al ser el resultado negativo es uno de esos dos que son los BITS 0 y 1 de STATUS.

MOVF   VARIABLE_1
SUBWF  VARIABLE_2
BTFSS   STATUS,Z
GOTO  NO_IGUALES
GOTO   IGUALES

Si VARIABLE_1 es menor el resultado sera negativo y se pondran a 1 (creo, esto compruebalo con el simulador) C o DC.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Problema con Interrupcion en TMR0
« Respuesta #16 en: 13 de Septiembre de 2012, 13:34:40 »
Gracias tapi8 tan atento como siempre, precisamente el lo que estaba intentando pero se ve que hago la cuenta de ticks erronea, ahora debo acompañar a mi hijo a por los libros de FP y luego me pongo con ello.

Saludos!
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Problema con Interrupcion en TMR0
« Respuesta #17 en: 13 de Septiembre de 2012, 15:55:45 »
Si es para hacer una cuenta hasta un numero determinado, por ejemplo si quieres saber si un contador llego a 50:


INCF  CONTADOR,1
MOVLW  .50                ;con cambiar este numero contara hasta el que quieras
SUBWF    CONTADOR,0    ; restamos y guardamos resultado en W
BTFSS    STATUS,Z        ; miramos si el resultado es 0
GOTO   NO_CERO         ; el flag esta a 0 por lo tanto el resultado NO fue 0
CLRF    CONTADOR      ;fue 0, llego a 50, borramos contador para siguiente cuenta
GOTO   ES_CERO         ;o sigue aqui el programa con lo que tenga que hacer

Esta sin depurar, aunque no creo que tenga muchos errores, compruebalo, no es la primera vez que en 7 lineas cometo 10 fallos  :lol: :lol:

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Problema con Interrupcion en TMR0
« Respuesta #18 en: 13 de Septiembre de 2012, 17:38:19 »
De nuevo gracias por tomarte la molestia de darme una solucion, voy a mirar como lo monto, la idea es dentro de los 20ms poner en alto el pin un numero determinado de milisegundos para luego ponerlo de nuevo a 0 hasta los 20ms.
PD: No me digas la solucion si no me funciona te pregunto.

Un saludo y gracias de nuevo.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Problema con Interrupcion en TMR0
« Respuesta #19 en: 18 de Septiembre de 2012, 17:24:46 »
 :8} :8} No doy pie con bola, tengo esto:
Código: [Seleccionar]
loop         btfss FlagRTCC,0 ; Revisamos si el bit 0 de la variable FlagRTCC vale 1.-
goto loop ; No, repetimos.-
bcf FlagRTCC,0 ; Si, ponemos la variable a 0.-
bsf PORTA,Servo ; Ponemos a 1 el bit 0 de la Puerta A.- (HASTA AQUI 20ms)
movlw .100
movwf TMR0
call LeerTMR0 ; Llamamos a la funcion para leer TMR0.-
; incf ValorTMR0
; movlw .112
; subwf ValorTMR0,0
; btfss STATUS,Z
; goto $-4
; bcf         PORTA,Servo
goto loop

;------------------------------------------------------------------------------
; FUNCIONES
;------------------------------------------------------------------------------
LeerTMR0
movf TMR0,W
movwf ValorTMR0
return

END ; Fin del codigo.-
Pero necesito leer constantemente el TMR0 para saber cuando a llegado a .112 y asi poner a cero PORTA,Servo, para luego dejar de leer el TMR0 y que el TMR0 siga contando hasta desbordarse, y asi sucesivamente.

Gracias.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Problema con Interrupcion en TMR0
« Respuesta #20 en: 19 de Septiembre de 2012, 06:04:20 »
No Miquel, asi es muy complicado, quieres contar 1.5ms ¿verdad?, que es el tiempo que quieres que este en alto


Código: [Seleccionar]


ACTIVAR_SERVO
                   bsf     PORTA,Servo ; Ponemos a 1 el bit 0 de la Puerta A.- (HASTA AQUI 20ms)
movlw .100
movwf TMR0
call DEMORA  ;llamamos DEMORA de 1.5ms
                  bcf PORTA,Servo ; Ponemos a 0 el bit 0 de la Puerta A
                 ;aqui puedes hacer todo lo que quieras, ya que tienes mucho tiempo
                ;hasta que se desborde el TIMER
                 btfss                        INTCON,T0IF
                 goto                        $-1                        ;no desbordo, esperamos
                 goto                       ACTIVAR_SERVO      ;ya desbordo, repetimos, ya que al servo hay que enviarle    
                                                                                  ;pulsos constantemente              

DEMORA  movlw     .249      ; 1 set numero de repeticion
        movwf     PDel0     ; 1 |
PLoop0  clrwdt              ; 1 clear watchdog
PDelL1  goto PDelL2         ; 2 ciclos delay
PDelL2  
        decfsz    PDel0, 1  ; 1 + (1) es el tiempo 0  ?
        goto      PLoop0    ; 2 no, loop
        clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Problema con Interrupcion en TMR0
« Respuesta #21 en: 19 de Septiembre de 2012, 06:59:12 »
Gracias tapi8, esta solucion la habia pensado pero no me sirve porque tendria que crear demoras para cada posicion del servo, de todas formas me ha venido a la cabeza otra posible solucion, en cuanto pueda la probare y os cuento.

Saludos!
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Problema con Interrupcion en TMR0
« Respuesta #22 en: 19 de Septiembre de 2012, 07:20:51 »
No, no es necesario, si los vas a mover de 10 en 10º, por ejemplo, haces una para esos grados y la llamas las veces que necesites, mas una de 0.5ms que la llamaras al principio, ya que 0.5ms es 0º o -90º segun como le llames.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Problema con Interrupcion en TMR0
« Respuesta #23 en: 19 de Septiembre de 2012, 15:41:17 »
Gracias tapi8, voy a estudiar tu propuesta a parte de la idea que tengo en mente.

Saludos!
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado josesu92

  • PIC10
  • *
  • Mensajes: 4
Re: Problema con Interrupcion en TMR0
« Respuesta #24 en: 21 de Septiembre de 2012, 14:17:50 »
pues bien estoy inicializando en la programacion pic en asm.... el problema radica es que mi rpofesor de esta materia es muy malo... y necesito arreglar un codigo; ya e entendido gran parte de este pero hay unos q no tengo ni la menor idea miren es esto!!!!!

MOVLF24   MACRO MESS TBLPTRU TBLPTRH TBLPTRL
      MOVLW MESS >>.16
      MOVWF TBLPTRU
      MOVLW MESS >>.8
      MOVWF TBLPTRH
      MOVLW MESS &0XFF
      MOVWF TBLPTRL
      ENDM

MESS:  data  0xb0a4,0xf9c0,0X8888
   org MESS+VIDEOBSIZE
LOADMESSAGE:            ;CARGA VIDEO BUF CON MENSAJE LITERAL GUARDADO EN FLASH

      MOVLF24 MESS TBLPTRU TBLPTRH TBLPTRL   ;MACRO   
     
      MOVLF16   VIDE0 FSRH FSRL            ;MACRO




mi pregunta q es esa libreria macro y tambien la parte de " MESS:  data  0xb0a4,0xf9c0,0X8888  //   org MESS+VIDEOBSIZE


aclaro que este es un trozo del codigo

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re: Problema con Interrupcion en TMR0
« Respuesta #25 en: 21 de Septiembre de 2012, 14:28:21 »
En segundo lugar no repetir los mensajes en distintas partes del foro.
Asi que vuelve a leer las reglas del foro.
Ademas ésta respuesta debe ser borrada por algun moderador ya que no tiene nada que ver la consulta con el tema del titulo, al menos desde mi punto de vista.
Todos los días se aprende algo nuevo.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Problema con Interrupcion en TMR0
« Respuesta #26 en: 21 de Septiembre de 2012, 15:54:09 »
Citar
Ademas ésta respuesta debe ser borrada por algun moderador ya que no tiene nada que ver la consulta con el tema del titulo, al menos desde mi punto de vista.

Totalmente de acuerdo Fer, aunque quien inicio el hilo fue Miquel...creo que ese mensaje no pinta nada aqui.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Problema con Interrupcion en TMR0
« Respuesta #27 en: 21 de Septiembre de 2012, 16:50:29 »
Hola de nuevo, estoy jugando con esta parte de codigo:
Código: [Seleccionar]
LeerTMR0
movf TMR0,W
movwf ValorTMR0
clrw
movlw .112
subwf ValorTMR0
btfss STATUS,Z
goto $-6
return
pero me encuentro con que en la variable ValorTMR0 se carga el valor que le da la gana, y no acierto a ver el porque, ya que estoy borrando el valor del registro W precisamente para evitar este error, o eso creia.

Saludos!
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Problema con Interrupcion en TMR0
« Respuesta #28 en: 21 de Septiembre de 2012, 17:55:38 »
Este es el codigo completo:
Código: [Seleccionar]
;******************************************************************************************************
; FileName:PWMServo_v1.0.asm
;******************************************************************************************************

;------------------------------------------------------------------------------
; PROCESSOR DECLARATION
;------------------------------------------------------------------------------
list p = PIC16F873A ; Seleccionar procesador.-
#include "P16F873A.inc" ; Incluir archivo P16F873A.inc

;------------------------------------------------------------------------------
;
; CONFIGURATION WORD SETUP
;
; The 'CONFIG' directive is used to embed the configuration word within the
; .asm file. The lables following the directive are located in the respective
; .inc file.  See the data sheet for additional information on configuration
; word settings.
;
;------------------------------------------------------------------------------
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF

ERRORLEVEL -302
;------------------------------------------------------------------------------

;------------------------------------------------------------------------------
; VARIABLES
;------------------------------------------------------------------------------
CBLOCK H'20'
FlagRTCC ; Variable usada para avisarnos que han pasado 20ms.-
ValorTMR0 ; Variable usada para guardar el valor leido del TMR0.-
ENDC;
;------------------------------------------------------------------------------

;------------------------------------------------------------------------------
; CONSTANTES
;------------------------------------------------------------------------------
Servo equ 0 ; Definimos Servo como el bit 0 de un registro, en este caso PORTA.-

;------------------------------------------------------------------------------
; RESET VECTOR
;------------------------------------------------------------------------------
RESET         ORG         H'00' ; Aqui comienza el micro.-
  GOTO Inicio ; Salto a Inicio de mi programa.-
ORG H'04' ; Salta al vector de Interrupcion.-
GOTO ISR
ORG H'05' ; Origen del codigo de programa.-

;------------------------------------------------------------------------------
; VECTOR DE INTERRUPCION
;------------------------------------------------------------------------------

ISR ;**** Atendemos la Interrupcion.-
btfss INTCON,T0IF
goto loop
bcf INTCON,T0IF
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
bsf FlagRTCC,0
retfie

;------------------------------------------------------------------------------
; MAIN PROGRAM
;------------------------------------------------------------------------------
Inicio    ;**** Configuracion de Puertos ****
bcf STATUS,RP0
bcf STATUS,RP1 ; Bank 0.-
clrf PORTA ; Limpiamos PORTA.-
clrf TMR0 ; Limpiamos TMR0.-
clrf INTCON ; Desactivamos interrupciones y limpiamos T0IF.-
bsf STATUS,RP0 ; Bank 1.-
movlw 0x06
movwf ADCON1 ; I/O digitales.-
movlw b'00000000'
movwf TRISA ; RA<0:7> output.-
movlw b'10000110'
movwf OPTION_REG
bcf STATUS,RP0 ; Bank 0.-
movlw .100 ; Cargamos TMR0 el valor 100 en decimal.-
movwf TMR0
bsf INTCON,T0IE ; Habilitamos interrupcion TMR0.-
bsf INTCON,GIE ; Habilitamos todas las interrupciones.-

loop         btfss FlagRTCC,0 ; Revisamos si el bit 0 de la variable FlagRTCC vale 1.-
goto loop ; No, repetimos.-
bcf FlagRTCC,0 ; Si, ponemos la variable a 0.-
bsf PORTA,Servo ; Ponemos a 1 el bit 0 de la Puerta A.- (HASTA AQUI 20ms)
movlw .100
movwf TMR0
call LeerTMR0 ; Llamamos a la funcion para leer TMR0.-
bcf PORTA,Servo ; Ponemos a 0 el bit 0 de la Puerta A.-
goto loop

;------------------------------------------------------------------------------
; FUNCIONES
;------------------------------------------------------------------------------
LeerTMR0
movf TMR0,W
movwf ValorTMR0
clrw
movlw .112
subwf ValorTMR0
btfss STATUS,Z
goto $-6
return

END ; Fin del codigo.-
Lo bueno es que funciona en la vida real, pero con el error comentado en el post anterior el cual me gustaria darle solucion, ahora voy a intentar variar el valor de la variable con un potenciometro a traves del ADC.
Pero esto sera en un apartado diferente para no mezclar una cosa con otra.

Gracias a tapi8 por la ayuda aportada.
Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Problema con Interrupcion en TMR0
« Respuesta #29 en: 22 de Septiembre de 2012, 05:39:57 »

Citar
movf       TMR0,W
          movwf       ValorTMR0

Aqui lo que estas es leyendo el TIMER0 y este esta variando constantemente, segun en el preescaler que lo tengas, lo cargas en el reg ValorTMR0 y despues compruebas si llego a 112, bien, tendria que funcionar, despues para cada posicion del servo solo tendrias que variar ese valor de 112,

Citar
Lo bueno es que funciona en la vida real, pero con el error comentado en el post anterior el cual me gustaria darle solucion, ahora voy a intentar variar el valor de la variable con un potenciometro a traves del ADC.

Si te funciona en la realidad perfecto, como ya te comento antes no tienes ningun error, es que tiene que ir variando, desde 100 que es el numero con que lo cargas hasta 112 primero y hasta desbordar despues, para completar los 20ms.

¿Es para un servo solo? ¿O son varios en distintas posiciones?

En el ISR mejor guardar los reg. W y STATUS, y restaurarlos al terminar la interrupcion.


 

anything