Autor Tema: No logro Hacer Funcionar el TMR0 el 16Bit pero si en 8 Bit en pic 18F2550  (Leído 6754 veces)

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

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Hola amigos intento hacer funcionar el TMR0 de un 18F2550 en modo 16 bit hace el conteo el TMR0L pero no hace avanzar el tmr0H pero si funciona en modo de 8 Bit..................he probado con varios codigos que consegui y es lo mismo.......el mas sensillo que consegui es este y nada

;================================================
; Timer Interrupt Example
; timer.asm
; U.G. Wilson
; 11/21/2012

;================================================
; Configuration
   list        p=18F2520
   #include    P18F2520.INC

   CONFIG OSC       = INTIO67
   CONFIG WDT       = OFF
   CONFIG PBADEN    = OFF
   CONFIG MCLRE     = OFF
   CONFIG LVP       = OFF
   CONFIG DEBUG     = OFF

;================================================
; Variables and Start Point
   cblock 0020h
TMR0CNT            ; Holds TIMER0 overflow interrupt count.
   endc

   org    0000h           ; Start code at 0x0000
    goto    init            ;  ...

   org    0008h           ; Interrupt code at 0x0008
    goto    inthp           ;  ...

;================================================
; High Priority Interrupt Event
inthp:
    btfsc   INTCON, TMR0IF  ; Test TIMER0 Interrupt flag
    goto    intTMR0IF       ;  and goto correct code otherwise
    retfie                  ;  return.

intTMR0IF:
    decfsz  TMR0CNT         ; Decrement the overflow counter
    goto    intTMR0IF_Ret   ;  returning if not zero.

    movlw   0xF             ; Reset TIMER0 overflow counter
    movwf   TMR0CNT         ;  with value for 1 S.

    btg     PORTA, RA0      ; Toggle LED.

intTMR0IF_Ret:

    bcf     INTCON, TMR0IF  ; Clear TIMER0 interrupt flag.

    retfie                  ; Return from the interrupt.

;================================================
; Initial settings configuring
init:
    bcf     OSCCON, IRCF0   ; Set internal oscillator
    bsf     OSCCON, IRCF1   ;  frequency to 4 MHz.
    bsf     OSCCON, IRCF2   ;  ...

    movlw   0x0F            ; Disable all ADC
    setf    ADCON1          ;  and comparator.
    movlw   0x07            ;  ...
    movwf   CMCON           ;  ...

    clrf    PORTA           ; Initialize PORTA to
    clrf    LATA            ;  all digital outputs.
    clrf    TRISA           ;  ...

    bsf     RCON,    IPEN     ; Enable priority levels, and
    bsf     INTCON, GIEH    ;  high priority interrupts.

    bcf     INTCON, TMR0IF  ; Clear the TIMER0 interrupt
    bsf     INTCON, TMR0IE  ;  flag, and enable the
                            ;  TIMER0 Interrupt.

    movlw   0xF             ; Load TIMER0 overflow counter
    movwf   TMR0CNT         ;  with initial value for 1 S.

    movlw   b'10000000'     ; Configure and enable TIMER0.
    movwf   T0CON           ;  (See 11.0 TIMER0 Module
                            ;  in the datasheet for
                            ;  description of the bits
                            ;  set in this register.)

main:
    goto    main
    end

Por fa ayudenme..................y gracias
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:No logro Hacer Funcionar el TMR0 el 16Bit pero si en 8 Bit en pic 18F2550
« Respuesta #1 en: 23 de Marzo de 2016, 02:06:20 »
Hay varios problemas a resolver....

Y no solo lo del Timer. Ademas no es tu codigo por lo que parece y terminaste haciendo un copy/paste, y no funciona por que faltan varias cosas.

Código: [Seleccionar]
cblock 0020h
Un error traido de las anteriores modelos de PIC, es el usar 0x20 para el valor inicial de la memoria RAM, ya que el PIC18 posee todos sus SFR al final de la memoria de datos, Con lo cual podrias usar 0x00 sin ningun problema. Esto quiere decir que no conoces como esta conformada la memoria RAM o no leiste el datasheet del mismo.

Esto no es el problema que tenes del timer, pero es para remarcartelo.


Código: [Seleccionar]
    retfie                  ;  return.
    retfie                  ; Return from the interrupt.

Esto funciona por que en el Main no hay nada por suerte.  Si no estarias teniendo problemas, Ya que es necesario guardar el contexto es decir STATUS, W y BSR y luego reponerlo al salir de la interrupcion, por suerte los PIC18 cuando se ejecuta una interrupcion guarda estos valores por si solo. Ahora como vos tenes interrupcion de alta prioridad y baja prioridad, solo lo podes usar en el de alta. Para recuperar los valores guardados de STATUS, W y BSR debes usar:

 RETFIE, FAST

Recorda que unicamente es en la interrupcion de alta prioridad si es que lo tenes habilitado a ambas prioridades. Sino tenes que MOVFF mover los registros a unos registros de backup, en el datasheet esta explicado en la seccion de Interrupts.

Esto no es el problema que tenes del timer, pero es para remarcartelo.

----------------------------------------------------------------------------------------------

Ahora si el Timer....

A 4Mhz es igual a un Tcy  de 1us, preescaler 1:2 como tenes es decir cada cuenta es de 2us, 2^16 * 2us aproximademente igual a 2 segundos y no 1 segundo como dice el codigo. Para eso deberias desabilitar el preescaler.


Tambien no hay un valor claro de inicio, deberia darselo

Seguido de esto tenes que entender como es que funciona el Timer0 . TMR0H no es el valor ACTUAL/REAL de la parte alta del Timer0 ( Imaginate que la parte alta esta oculta al usuario ), sino que es una version "copia" de la misma.

Para darte una imagen mas clara:

Valor real del TMR0 = 0x10FE
TMR0L = 0xFE
TMR0H = cualquier cosa

Entonces de que sirve TMR0H ?, TMR0H se actualiza unicamente cuando lees TMR0L.

Es decir que si tenemos ese valor en el Timer0 ( 0x10FE ) y hacemos un

MOVF TMR0L, W

En W vamos a tener 0xFE y en TMR0H va a aparecer 0x10, Si continua y solo ves el TMR0L este va a pasar desde 0xFF a 0x00 pero TMR0H no va a modificarse hasta que no leas de nuevo a TMR0L.

Lo mismo ocurre en la escritura, Primero pones el valor en TMR0H y luego escribis en TMR0L, de esa forma cuando escribis en TMR0L , TMR0H se copia a la parte alta del Timer0.

Esto tiene un porque, Suponete que estas leyendo el valor del Timer0 y TMR0H es el valor REAL del Timer0:

MOVFF TMR0L, MyTm0L
MOVFF TMR0H, MyTm0H

Si en la primera instruccion teniamos 0x10FF , en nuestro registro MyTm0L voy a tener 0xFF, pero en MyTm0H voy a tener 0x11 , por que el timer continua avanzando. Entonces al hacer esa version "buffer" podes ver el valor del Timer completo en un solo instante.

Aso que si queres verlo en el simulador seria algo asi:

Código: ASM
  1. ;================================================
  2. ; Timer Interrupt Example
  3. ; timer.asm
  4. ; U.G. Wilson
  5. ; 11/21/2012
  6.  
  7. ;================================================
  8. ; Configuration
  9.    list        p=18F2520
  10.    #include    P18F2520.INC
  11.  
  12.    CONFIG OSC       = INTIO67
  13.    CONFIG WDT       = OFF
  14.    CONFIG PBADEN    = OFF
  15.    CONFIG MCLRE     = OFF
  16.    CONFIG LVP       = OFF
  17.    CONFIG DEBUG     = OFF
  18.  
  19. ;================================================
  20. ; Variables and Start Point
  21.    cblock 0000h
  22. TMR0CNT            ; Holds TIMER0 overflow interrupt count.
  23.    endc
  24.  
  25.    org    0000h           ; Start code at 0x0000
  26.     goto    init            ;  ...
  27.  
  28.    org    0008h           ; Interrupt code at 0x0008
  29.     goto    inthp           ;  ...
  30.  
  31. ;================================================
  32. ; High Priority Interrupt Event
  33. inthp:
  34.     btfsc   INTCON, TMR0IF  ; Test TIMER0 Interrupt flag
  35.     goto    intTMR0IF       ;  and goto correct code otherwise
  36.     retfie, fast                  ;  return.
  37.  
  38. intTMR0IF:
  39.     decfsz  TMR0CNT         ; Decrement the overflow counter
  40.     goto    intTMR0IF_Ret   ;  returning if not zero.
  41.  
  42.     movlw   0xF             ; Reset TIMER0 overflow counter
  43.     movwf   TMR0CNT         ;  with value for 1 S.
  44.  
  45.     btg     PORTA, RA0      ; Toggle LED.
  46.  
  47. intTMR0IF_Ret:
  48.  
  49.     bcf     INTCON, TMR0IF  ; Clear TIMER0 interrupt flag.
  50.  
  51.     retfie, fast                  ; Return from the interrupt.
  52.  
  53. ;================================================
  54. ; Initial settings configuring
  55. init:
  56.     bcf     OSCCON, IRCF0   ; Set internal oscillator
  57.     bsf     OSCCON, IRCF1   ;  frequency to 4 MHz.
  58.     bsf     OSCCON, IRCF2   ;  ...
  59.  
  60.     movlw   0x0F            ; Disable all ADC
  61.     setf    ADCON1          ;  and comparator.
  62.     movlw   0x07            ;  ...
  63.     movwf   CMCON           ;  ...
  64.  
  65.     clrf    PORTA           ; Initialize PORTA to
  66.     clrf    LATA            ;  all digital outputs.
  67.     clrf    TRISA           ;  ...
  68.  
  69.     bsf     RCON,    IPEN     ; Enable priority levels, and
  70.     bsf     INTCON, GIEH    ;  high priority interrupts.
  71.  
  72.     bcf     INTCON, TMR0IF  ; Clear the TIMER0 interrupt
  73.     bsf     INTCON, TMR0IE  ;  flag, and enable the
  74.                             ;  TIMER0 Interrupt.
  75.  
  76.     movlw   0xF             ; Load TIMER0 overflow counter
  77.     movwf   TMR0CNT         ;  with initial value for 1 S.
  78.  
  79.     movlw   b'10000000'     ; Configure and enable TIMER0.
  80.     movwf   T0CON           ;  (See 11.0 TIMER0 Module
  81.                             ;  in the datasheet for
  82.                             ;  description of the bits
  83.                             ;  set in this register.)
  84.  
  85. main:
  86.     MOVF TMR0L, W
  87.     goto    main
  88.     end

Cada ves que se ejecute el MOVF va a actualizar el TMR0H para que lo vos lo veas
« Última modificación: 23 de Marzo de 2016, 02:09:16 por KILLERJC »

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:No logro Hacer Funcionar el TMR0 el 16Bit pero si en 8 Bit en pic 18F2550
« Respuesta #2 en: 23 de Marzo de 2016, 13:07:51 »
Buensos dias amigo  KILLERJC.................Si estoy comenzando con estos pic 18F, solo que la informacion que consegui es muy imprecisa de hecho todos programas asi como ese que mostre aqui lo tome de una pagina que explicaba como usar el modo 16 bit........por eso decidi pedir ayuda a ustedes..........quisas es nostalgia jajajaja pero me siento mas comodo trabajado con el asm........y en asm no hay mucho informacion......................te agradesco la ayuda............cuanquier cosa solicitare mas ayuda.......mil gracias
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:No logro Hacer Funcionar el TMR0 el 16Bit pero si en 8 Bit en pic 18F2550
« Respuesta #3 en: 23 de Marzo de 2016, 13:12:24 »
Para trabajar con ASM lo mejor es el datasheet del micro, incluso te dice paso a paso como configurar algunos modulos. Y tambien hablan sobre el funcionamiento del micro, el cual para programar en ASM tenes que tenerlo claro.

En especial hay bastantes cambios desde la arquitectura de los PIC12/16 a los PIC18

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:No logro Hacer Funcionar el TMR0 el 16Bit pero si en 8 Bit en pic 18F2550
« Respuesta #4 en: 28 de Marzo de 2016, 14:13:35 »
Si amigo pero hay que no veo las cosas tan claro pero meayudo muchisimo tu ejemplo........trato dehacer funcionar latransmision serial y no logro que funcione bien creo que lo logro sincronizarlo.....pues el dato recibido no es el mismo que envio leo y segun creo hago todobien pero no funciona me ayudar porfa??

; *************************************************

   LIST P=18F2520            ; Directiva para definir el procesador
   #include <P18F2520.INC>      ; Definicion de SFRs para el procesador

; *************************************************
; Bits de Configuracion
; Microchip ha cambiado el formato para definir los bits de configuracion, por favor
; revisar el archivo P18F4550.INC para informacion adicional de la notacion
; Abajo hay algunos ejemplos

; ********   Configuracion del Oscilador   **********
   CONFIG OSC      = INTIO67
   CONFIG WDT      = OFF
   CONFIG PBADEN   = OFF
   CONFIG MCLRE    = OFF
   CONFIG LVP      = OFF
   CONFIG DEBUG    = OFF
; *********   Otros bits de configuracion   **********
   CONFIG   PWRT = ON               ; PWRT habilitado   
; *********   Bits de proteccion   ******************
   CONFIG   CP0   = OFF               ; los bloques del codigo de programa
   CONFIG   CP1   = OFF               ; no estan protegidos
   CONFIG   CP2   = OFF
   CONFIG   CP3   = OFF
   CONFIG   CPB   = OFF               ; Sector Boot no esta protegido
   CONFIG   CPD   = OFF               ; La EEPROM no esta protegida
; *************************************************
; Definicion de variables
; Estas variables son necesarias solo si las interrupciones de baja prioridad son usadas.
; Mas variables podrian se necesarias para almacenar otros SFRs usados en las rutinas de
; interrupcion.

   CBLOCK   0x20
   DatoRx      
   ENDC   

; *************************************************
; Vector de Reset.

   ORG      0x0000
   bra      Inicio                  ; Se va al inicio del codigo principal

; *************************************************
; Vector de interrupcion de alta prioridad

   ORG      0x0008
   bra      Inter                  ;
                           ;
; *************************************************
;

Inter:
; ********* El codigo de la interrupcion de baja prioridad va aqui ***
   btfsc   PIR1,RCIF               ; No => interupcion de recepcion?
   bra      Int_Rx                  ; Si => vamos a IntRx
   Retfie   FAST                  

; *************************************************

Int_Rx:

   movff   STATUS,   STATUS_TEMP         ; Salva el registro STATUS
   movff   WREG,   WREG_TEMP         ; Salva el registro de trabajo
   movff   BSR,   BSR_TEMP         ; Salva el registro BSR
   bcf      PIR1,      RCIF
   movf   RCREG,      W,.0          ; Guardamos el caracter
   movwf   DatoRx
   movwf   PORTB
   btfsc    Ban_CD         ; Se Verifica el estado para indicar que
   Retfie       FAST
 
; *************************************************
; Comienzo del programa principal

Inicio:

   bsf     OSCCON, IRCF0      ; Seleccion de reloj
    bsf     OSCCON, IRCF1      ; Interno de 8 MHz.
    bsf     OSCCON, IRCF2      ;  ...

   movlw   B'00001111'
   movwf   ADCON1,.0         ; Todos los pines como I/O digitales
                        ; NO ES NECESARIO MODIFICAR LOS REGISTROS
                        ; TRIS (estan todos en 1)
; *********   Configuracion del EUSART  ************

   clrf    PORTA              ; Initializa PORTA a
    clrf    LATA               ; todas como salida.
    clrf    TRISA              ;  ...
   clrf    PORTB              ; Initializa PORTB a
    clrf    LATB               ; todas como salida.
    clrf    TRISB              ;  ...

   movlw   D'0'            ; Cargamos los registros SPBRGH:SPBRG con los
   movwf   SPBRGH,.0         ; valores de la tabla 1 para la velocidad deseada
   movlw   D'25'
   movwf   SPBRG,.0

   movlw   B'10010000'         ; Habilitamos el puerto seria (Bit 7), modo 8 bits
   movwf   RCSTA            ;(bit 6), y habilitamos el receptor (Bit 4).

   bsf      PIE1,   RCIE,.0      ; Habilitamos la interrupcion de recepcion
   bsf      INTCON,   GIE
   bsf      INTCON,   PEIE,.0      ; Habilitamos las interrupciones para los perifericos
   
Espera:
   bra      Espera

; *************************************************

      END               
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:No logro Hacer Funcionar el TMR0 el 16Bit pero si en 8 Bit en pic 18F2550
« Respuesta #5 en: 28 de Marzo de 2016, 14:15:00 »
Laideaesque reciba en 19200 pero los datos losrecibe mal....................gracias de antemano
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:No logro Hacer Funcionar el TMR0 el 16Bit pero si en 8 Bit en pic 18F2550
« Respuesta #6 en: 28 de Marzo de 2016, 18:51:16 »
OK un par de cosas.

Nuevamente:

Citar
   CBLOCK   0x20

Estamos con un PIC18 y podes empezar desde 0x00

Citar
movf   RCREG,      W,.0

Si vas a usar el ACCESS/ BANKED, simplemente usa las palabras y no .0, aunque por ahora simplemente lo podes omitir, que si lo omitis utiliza el ACCESS.

Citar
movff   STATUS,   STATUS_TEMP         ; Salva el registro STATUS
   movff   WREG,   WREG_TEMP         ; Salva el registro de trabajo
   movff   BSR,   BSR_TEMP         ; Salva el registro BSR

Eso esta por demas, al realizar solo una interrupcion de alta prioridad.

Citar
   btfsc    Ban_CD         ; Se Verifica el estado para indicar que
   Retfie       FAST

Ese BTFSC permitiria que vuelva a ejecutarse todo lo de la configuracion. es decir "inicio" lo cula es incorrecto.

Citar
bcf      PIR1,      RCIF
Al leer RCREG se limpia

Para tener 19200 baudios tenes que tener:

Citar
  movlw   D'0'            ; Cargamos los registros SPBRGH:SPBRG con los
   movwf   SPBRGH,.0         ; valores de la tabla 1 para la velocidad deseada
   movlw   D'25'
   movwf   SPBRG,.0

25 en el BGR y tener activado el bit BGRH, no se usa el registro SPBRGH a no ser que actives el bit BGR16.


....

Código: ASM
  1. ; *************************************************
  2.  
  3.    LIST P=18F2520            ; Directiva para definir el procesador
  4.    #include <P18F2520.INC>      ; Definicion de SFRs para el procesador
  5.  
  6. ; *************************************************
  7. ; Bits de Configuracion
  8. ; Microchip ha cambiado el formato para definir los bits de configuracion, por favor
  9. ; revisar el archivo P18F4550.INC para informacion adicional de la notacion
  10. ; Abajo hay algunos ejemplos
  11.  
  12. ; ********   Configuracion del Oscilador   **********
  13.    CONFIG OSC      = INTIO67
  14.    CONFIG WDT      = OFF
  15.    CONFIG PBADEN   = OFF
  16.    CONFIG MCLRE    = OFF
  17.    CONFIG LVP      = OFF
  18.    CONFIG DEBUG    = OFF
  19. ; *********   Otros bits de configuracion   **********
  20.    CONFIG   PWRT = ON               ; PWRT habilitado  
  21. ; *********   Bits de proteccion   ******************
  22.    CONFIG   CP0   = OFF               ; los bloques del codigo de programa
  23.    CONFIG   CP1   = OFF               ; no estan protegidos
  24.    CONFIG   CP2   = OFF
  25.    CONFIG   CP3   = OFF
  26.    CONFIG   CPB   = OFF               ; Sector Boot no esta protegido
  27.    CONFIG   CPD   = OFF               ; La EEPROM no esta protegida
  28. ; *************************************************
  29. ; Definicion de variables
  30. ; Estas variables son necesarias solo si las interrupciones de baja prioridad son usadas.
  31. ; Mas variables podrian se necesarias para almacenar otros SFRs usados en las rutinas de
  32. ; interrupcion.
  33.  
  34.    CBLOCK   0x00
  35.    DatoRx      
  36.    ENDC  
  37.  
  38. ; *************************************************
  39. ; Vector de Reset.
  40.  
  41.    ORG      0x0000
  42.    bra      Inicio                  ; Se va al inicio del codigo principal
  43.  
  44. ; *************************************************
  45. ; Vector de interrupcion de alta prioridad
  46.  
  47.    ORG      0x0008
  48.    bra      Inter                  ;
  49.                            ;
  50. ; *************************************************
  51. ;
  52.  
  53. Inter:
  54. ; ********* El codigo de la interrupcion de baja prioridad va aqui ***
  55.  
  56.         btfss   PIR1,RCIF               ; No => interupcion de recepcion?
  57.         RETFIE, FAST                  
  58.         movf    RCREG, W          ; Guardamos el caracter
  59.         movwf   DatoRx
  60.         movwf   PORTB
  61.         RETFIE, FAST
  62.  
  63. ; *************************************************
  64. ; Comienzo del programa principal
  65.  
  66. Inicio:
  67.  
  68.         bsf     OSCCON, IRCF0           ; Seleccion de reloj
  69.         bsf     OSCCON, IRCF1           ; Interno de 8 MHz.
  70.         bsf     OSCCON, IRCF2           ;  ...
  71.  
  72.         movlw   B'00001111'
  73.         movwf   ADCON1                  ; Todos los pines como I/O digitales
  74.  
  75. ; *********   Configuracion del EUSART  ************
  76.  
  77.         clrf    PORTA              ; Initializa PORTA a
  78.         clrf    LATA               ; todas como salida.
  79.         clrf    TRISA              ;  ...
  80.         clrf    PORTB              ; Initializa PORTB a
  81.         clrf    LATB               ; todas como salida.
  82.         clrf    TRISB              ;  ...
  83.  
  84.         movlw   D'0'            ; Cargamos los registros SPBRGH:SPBRG con los
  85.         movwf   SPBRGH          ; valores de la tabla 1 para la velocidad deseada
  86.         movlw   D'25'
  87.         movwf   SPBRG
  88.  
  89.         BSF     TXSTA, BRGH     ; Activo alta velocidad
  90.  
  91.         movlw   B'10010000'     ; Habilitamos el puerto seria (Bit 7), modo 8 bits
  92.         movwf   RCSTA           ;(bit 6), y habilitamos el receptor (Bit 4).
  93.  
  94.         bsf     PIE1, RCIE      ; Habilitamos la interrupcion de recepcion
  95.         bsf     INTCON, GIE
  96.         bsf     INTCON, PEIE    ; Habilitamos las interrupciones para los perifericos
  97.    
  98. Espera:
  99.         bra      Espera
  100.  
  101. ; *************************************************
  102.  
  103.       END

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:No logro Hacer Funcionar el TMR0 el 16Bit pero si en 8 Bit en pic 18F2550
« Respuesta #7 en: 28 de Marzo de 2016, 22:40:47 »
Gracias De nuevo................es queno consigo informacion para programar estos pic en asm consigo mas que todo el C, estoy dando mis primeros pasos con los 18F............veo que tendreque emigrar al C, me recomiendas donde leer para escribir asm paraestos PIC, me siento mas comodo con el asm............pues para los 12F y 16F, escribi mis librerias, asi tengo unaprogramacion mas ordenada y escribo los programas mas rapido pues llamo las librerias solo escribia el programa que integraba todas estas librerias que usaba................disculpa tantos errores juntos.................graciaspor los consejos y la ayuda
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:No logro Hacer Funcionar el TMR0 el 16Bit pero si en 8 Bit en pic 18F2550
« Respuesta #8 en: 28 de Marzo de 2016, 23:20:54 »
Lo unico que necesitas para programar en ASM, es conocer el micro y conocer sus funciones. Es decir necesitas leer el datasheet del microcontrolador, Si programabas PIC16 vas a encontrar muchas diferencias entre uno y otro con respecto a la arquitectura. Lo demas es pura logica. E intentar usar las instrucciones que posee el micro.

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:No logro Hacer Funcionar el TMR0 el 16Bit pero si en 8 Bit en pic 18F2550
« Respuesta #9 en: 29 de Marzo de 2016, 02:04:01 »
si pero hay detalles de sintaxis, de programacion que no aparecen, lo que aprendi de hacer librerias y otras cosas cosas no salian en esos manuales, sino de libros, donde escribian programas y explicaban algunos detalles propios de programacion despues de eso avance...........y es lo que quiero conocer las sintaxis, pues leyendo programas sensillos fue que vi lo facil de hacer parpadear un led con estos pic..................y los manuales no lo explican pues estos manuales explicanlos registros, como usarlos, pero no explican detalles de programacion
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:No logro Hacer Funcionar el TMR0 el 16Bit pero si en 8 Bit en pic 18F2550
« Respuesta #10 en: 29 de Marzo de 2016, 06:33:19 »
Tu sintaxis la sacas del propio datasheet:

MOVF  f,d,a
MOVFF  fs,fd
CALL  k,s

Es decir en el set de instrucciones tenes tu sintaxis, como funcionan cada una esta explicado mas adelante de las tablas de instrucciones, los problemas que tenes vos hasta ahora incluyeron:

- No conocer donde comienza la memoria de datos, por eso usas 0x20 y no 0x00, es decir no conoces como esta formada la memoria de datos y no conoces las formas de acceso al mismo. Explicado en el datasheet. O tal ves tenes un conocimiento vago de lo que es CBLOCK

- No aplicaste antes lo de guardar el contexto en una interrupcion, algo explicado en el datasheet e incluso te da el codigo, ademas en el datasheet dice que cuando entra una interrupcion se guardan y que podes recuperarlo con RETFIE, FAST. Y que si estas usando las prioridades en el unico que lo podes usar es en el de alta prioridad. Todo esta en el datasheet asi como te lo dije. ( Aunque bueno este era el codigo copiado )

- La explicacion del timer, esta en el datasheet y ahi dice claramente cuando se actualiza. Yo lo lei de ahi y lo traje aca.

- Intentaste implementar el guardar el contexto de la interrupcion a medias. Como que desconociendo que hace el RETFIE, FAST y que por ahi te lleva a dudar de si estas interiorizado con las interrupciones.

- Tenias una tabla en el datasheet para 19200 baudios y arriba decia que era para BGRH = 1, tambien esta explicado para que sirve este bit, y las formulas que dan.

- Lo del registro RCREG que limpia el flag, tambien esta explicado en el modulo de la UART en el datasheet.

- Finalmente esto:
Citar
   btfsc    Ban_CD         ; Se Verifica el estado para indicar que
   Retfie       FAST

Implica que no conoces las instrucciones, o no conoces como es el flujo de programa cuando una interrupcion, ya que si eso saltaba jamas se iba a ejecutar un RETFIE, y encima es como si se reseteara el micro. ASM es muy simple, es una instruccion tras otra. Y tenes que seguir esa logica.

Resumiendo, tus mayores problemas fueron por no conocer el micro al no leer el datasheet. Luego tenes este ultimo problema que puede haber sido por desconocimiento de como funciona una interrupcion.

Lo que si podes aprender de libros/ejemplos muchas veces es nuevos metodos para hacer ciertas cosas, por ejemplo usar tablas en flash, leerlas, Saltos computados, y miles mas.
Pero hasta ahora lo que te enfrentaste es conocimiento del datasheet y que hacen las funciones, lo cual si no las conoces todas tenes que pensar que queres hacer y fijarte cual se adapta mejor para lo que pensar hacer.

Gracias De nuevo................es queno consigo informacion para programar estos pic en asm consigo mas que todo el C, estoy dando mis primeros pasos con los 18F............veo que tendreque emigrar al C

Tenes que notar una diferencia, ASM te lleva muchas lineas para hacer tal ves algo simple, pero con gran ingenio podes sacarle todo el jugo al micro, creo que muy pocas veces te vas a enfrentar con poca flash, ademas presenta 2 problemas grandes:

- Portabilidad, se puede salvar un poco dentro de la familia de micro.
- Conocimiento del micro

Es necesario conocer a fondo el micro, instrucciones, como se manejan, ciclos, cuanto ocupan, etc. Y cuando queres pasar algo de PIC16 a PIC18 es un poco de problema, ya que tenes que cambiar direcciones, formas de acceso etc.

C por el contrario hace algunas cosas faciles, te abstrae de otras, ocupa mas espacio, pero es todo un lenguaje nuevo. Y me refiero a TODO un lenguaje nuevo. Cuesta al comienzo pero rinde frutos. Lo bueno es que si diseñaste por ejemplo un codigo para algo que es enteramente C (ningun funcion rara del compilador), podes llevarlo a cualquier micro por mas que no sea de Microchip y te va a funcionar (siempre tomando unos recaudos suficentes de no incluir nada pertenecientes al micro ). Y no necesitas preocuparte por si la memoria esta dividida en bancos, donde ubicar las variables etc. Eso lo hace el compilador. Ejemplo creo una variable y le quiero asignar un valor 10.

variable = 10;

En cambio en ASM tengo que pensar que primero tengo que cargar W con 10 para poder llevar ese 10 al registro, y ademas tengo que pensar donde esta ubicado, es decir en que banco. Y ni hablar de los saltos.

EDIT:

La mayoria de las cosas que te dije es por que lei el datasheet. Intentando saber como es que lo hace.
Incluso a preguntas que haces vos o hacen otros, tengo que releerlo por que no me acuerdo.

Y agradece que no te metiste con PIC24/dsPIC en ASM por que ahi cambia mucho mas.
« Última modificación: 29 de Marzo de 2016, 06:43:22 por KILLERJC »

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:No logro Hacer Funcionar el TMR0 el 16Bit pero si en 8 Bit en pic 18F2550
« Respuesta #11 en: 31 de Marzo de 2016, 03:47:48 »
He estado leyendo mas amigo, y tengouna inquietud, quiero que el PIC trabajo con un cristal de 20 Mhz y el TMR0 reciba un Señal de 32 Khz, la pregunta es no puede generar esta señal con el pic??.............pues por lo que entendi en el Data Shet solo se genera cuando se usa el Reloj interno del PIC o colocando un cristal secundario de 32 Khz T1so y T1osi
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:No logro Hacer Funcionar el TMR0 el 16Bit pero si en 8 Bit en pic 18F2550
« Respuesta #12 en: 31 de Marzo de 2016, 05:18:02 »
El PIC lo podes trabajar con el cristal de 20Mhz y tratar de crear lo mismo o parecido, el tema es ¿para que necesitas la señal esa de 32Khz?, si lo es para tiempos muy exactos mejor es alimentar al timer1 con un cristal o oscilador externo de 32768Hz. Ahora si no te importa demasiado la variacion podes hacerlo con el cristal de 20Mhz sin problemas. Me refiero a que si por ejemplo en 30 min contando con el timer tengas un error de 30 segundos no es importante.

El timer1 en si es un contador. Lo que puede contar son:

- Pulsos provenientes del oscilador principal ( tu cristal de 20Mhz )
- Pulsos externos, estos pulsos externos pueden ser simplemente pulsos ( de botones,etc o un oscilador externo) o tambien como posee un oscilador podes usar ese cristal de 32Khz, y asi inyectar esa señal como si fueran pulsos.

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:No logro Hacer Funcionar el TMR0 el 16Bit pero si en 8 Bit en pic 18F2550
« Respuesta #13 en: 31 de Marzo de 2016, 09:59:52 »
no necesito muchas presicion la idea es generar con los 32Khz trende pulsos desde 10 Hz hasta 3500........por eso preguntaba si el pic puede generar esa señal........es la rason de i pregunta
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:No logro Hacer Funcionar el TMR0 el 16Bit pero si en 8 Bit en pic 18F2550
« Respuesta #14 en: 31 de Marzo de 2016, 10:02:59 »
Pense usar otro Timer..........ya sea elTMR0, o el TMR3......pero antes qusisera saber si sepuede hacer loquepregunte....
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela


 

anything