Autor Tema: Ejemplos PIC18F4550  (Leído 51652 veces)

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

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 603
Ejemplos PIC18F4550
« en: 07 de Agosto de 2008, 23:27:57 »
He comenzado a usar este microcontrolador y para aprender un poco mas de las nuevas cosas que trae la arquitectura he decidido realizar algunos programas en ensamblador. por el momento solo llevo dos probados en el Proteus y en un protoboard, y los coloco a continuacion a disposicion del foro

Parpadea.asm

Este programa simplemente realiza un parpadeo de 1 segundo de todos los pines del microcontrolador, para este programa uso el oscilador interno configurado a 4 MHz , y deshabilito el MCLR, (pero este puede  usarse solo como entrada ).

Código: ASM
  1. ;******************************************************************************
  2. ;                                                                             *
  3. ;   Nombre:     parpadea.asm
  4. ;   Fecha:              30-07-2008
  5. ;   Version:    V1.00
  6. ;                                                                             *
  7. ;   Autor:              Sander
  8. ;   Empresa:
  9. ;                                                                             *
  10. ;******************************************************************************
  11. ;                                                                             *
  12. ;   Archivos Requeridos:         P18F4550.INC
  13. ;                                                                             *
  14. ;******************************************************************************
  15. ;       Notas:Este programa implementa rutinas de retardos de 1 ms, 1 seg
  16. ;       para asi poder realizar un parpadeo de 1 seg de todos los pines del
  17. ;       PIC18F4550, estas rutinas estan hechas para un oscilador de 4 MHz
  18. ;******************************************************************************
  19.  
  20.         LIST P=18F4550          ;Directiva para definir el procesador
  21.         #include <P18F4550.INC> ;Definicion de SFRs para el procesador
  22.  
  23. ;******************************************************************************
  24. ;Bits de Configuracion
  25. ;Microchip ha cambiado el formato para definir los bits de configuracion, por favor
  26. ;revisar el archivo P18F4550.INC para informacion adicional de la notacion
  27. ;Abajo hay algunos ejemplos
  28.  
  29. ;********       Configuracion del Oscilador     **********
  30.         CONFIG  FOSC = INTOSCIO_EC        ;Osc interno, RA6 como pin, USB usa Osc EC
  31. ;********       Otros bits de configuracion     **********
  32.         CONFIG  PWRT = ON                                       ;PWRT habilitado
  33.         CONFIG  BOR  = OFF                                      ;Brown out reset deshabilitado
  34.         CONFIG  WDT      = OFF                                  ;Watchdog deshabilitado
  35.         CONFIG     MCLRE = OFF                                  ;MCLR como entrada
  36.         CONFIG  PBADEN = ON                                     ;Todos los pines como entradas analogicas
  37.         CONFIG  LVP     = OFF                                   ;Programacion en bajo voltaje apagado
  38. ;*********      Bits de proteccion      ******************
  39.         CONFIG  CP0     = OFF                                   ;los bloques del codigo de programa
  40.         CONFIG  CP1     = OFF                                   ;no estan protegidos
  41.         CONFIG  CP2     = OFF
  42.         CONFIG  CP3     = OFF
  43.         CONFIG  CPB     = OFF                                   ;Sector Boot no esta protegido
  44.         CONFIG  CPD     = OFF                                   ;La EEPROM no esta protegida
  45.  
  46.  
  47. ;******************************************************************************
  48. ; Definicion de variables
  49. ; Estas variables son necesarias solo si las interrupciones de baja prioridad son usadas.
  50. ; Mas variables podrian se necesarias para almacenar otros SFRs usados en las rutinas de
  51. ; interrupcion.
  52.  
  53.                 CBLOCK  0x080
  54.                 WREG_TEMP               ;variable usada para salvar contexto
  55.                 STATUS_TEMP             ;variable usada para salvar contexto
  56.                 BSR_TEMP                ;variable usada para salvar contexto
  57.                 ENDC
  58.  
  59.                 CBLOCK  0x000   ;Variables en la ACCESS RAM (Banco 0) max 96 bytes
  60.                 Cantms:2                ;variable para generar hasta 65535 ms
  61.                 CantSeg                 ;Variable para producir retardos de hasta 255 seg
  62.                 ENDC
  63.  
  64. ;******************************************************************************
  65. ;Datos de la EEPROM
  66. ;Los Datos a ser programados en la  EEPROM son definidos aqui
  67.  
  68.                 ORG     0xf00000
  69.  
  70.                 DE      "Test Data",0,1,2,3,4,5
  71.  
  72. ;******************************************************************************
  73. ; Vector de Reset.
  74. ; Este codigo comenzara a ejecutarse cuando suceda un reset
  75.  
  76.                 ORG     0x0000
  77.  
  78.                 goto    Main            ;Se va al inicio del codigo principal
  79.  
  80. ;******************************************************************************
  81. ; Vector de interrupcion de alta prioridad
  82. ; Este codigo comenzara a ejecutarse cuando una interrupcion de alta prioridad ocurra
  83. ; o cuando cualquier interrupcion ocurra si es que las prioridades de las interrupciones
  84. ; no estan habilitadas
  85.  
  86.                 ORG     0x0008
  87.  
  88.                 bra     HighInt                                         ;Va a la rutina de interrupcion de alta prioridad
  89.  
  90. ;******************************************************************************
  91. ; Vector de interrupcion de baja prioridad y rutina
  92. ; Este codigo comenzara a ejecutrase cuando una interrupcion de baja prioridad ocurra
  93. ; Este codigo puede ser eliminado si las interrupciones de baja prioridad no son usadas
  94.  
  95.                 ORG     0x0018
  96.  
  97.                 movff   STATUS,STATUS_TEMP              ;Salva el registro STATUS
  98.                 movff   WREG,WREG_TEMP                  ;Salva el registro de trabajo
  99.                 movff   BSR,BSR_TEMP                    ;Salva el registro BSR
  100.  
  101. ;       *** El codigo de la interrupcion de baja prioridad va aqui ***
  102.  
  103.  
  104.                 movff   BSR_TEMP,BSR                    ;recupera el registro BSR
  105.                 movff   WREG_TEMP,WREG                  ;recupera el registro de trabajo
  106.                 movff   STATUS_TEMP,STATUS              ;recupera el registro STATUS
  107.                 retfie
  108.  
  109. ;******************************************************************************
  110. ; Rutina de interrupcion de alta prioridad
  111. ; El codigo para la rutina de interrupcion de alta prioridad es colocado aqui para
  112. ; evitar conflictos con el vector de interrupciones de baja prioridad
  113.  
  114. HighInt:
  115.  
  116. ;       *** El codigo para las interrupciones de alta prioridad va aqui ***
  117.  
  118.  
  119.                 retfie  FAST
  120.  
  121. ;******************************************************************************
  122. ; Comienzo del programa principal
  123. ; El codigo del programa principal es colocado aqui
  124.  
  125. Main:
  126.  
  127. ;       *** EL codigo principal va aqui ***
  128.  
  129. ;*******************    Inicializamos perifericos       ***************************
  130.  
  131.         movlw   B'01100000'                             ;Ajustamos el oscilador interno a 4 MHz
  132.         movwf   OSCCON,.0                              
  133.         movlw   B'00001111'
  134.         movwf   ADCON1,.0                               ;Todos los pines como I/O digitales
  135.         clrf    TRISA,.0
  136.         clrf    TRISB,.0
  137.         clrf    TRISC,.0
  138.         clrf    TRISD,.0
  139.         clrf    TRISE,.0                                ;Todos los pines como salida
  140.  
  141. MainP0
  142.         setf    LATA,.0
  143.         setf    LATB,.0
  144.         setf    LATC,.0
  145.         setf    LATD,.0
  146.         setf    LATE,.0                                 ;Ponemos los puertos en 1
  147.         movlw   .1
  148.         movwf   CantSeg,.0
  149.         rcall   RetardoSeg                              ;esperamos 1 seg
  150.         clrf    LATA,.0
  151.         clrf    LATB,.0
  152.         clrf    LATC,.0
  153.         clrf    LATD,.0
  154.         clrf    LATE,.0                                 ;ponemos los puertos en 0
  155.         movlw   .1
  156.         movwf   CantSeg,.0
  157.         rcall   RetardoSeg                              ;esperamos 1 seg
  158.         bra             MainP0                                  ;Saltamos para continuar con el ciclo
  159.  
  160. ;****************************   RetardoSeg      **********************************
  161. ;       RetardoSeg      Realiza una espera de la cantidad de segundos indicados
  162. ;                               mediante la variable CantSeg. CantSeg es de 8 bits
  163. ;*****************************************************************************
  164. RetardoSeg
  165.         movf    CantSeg,W,.0
  166.         btfsc   STATUS,Z                                ;CantSeg == 0?
  167.         return                                                  ;Si => retornamos
  168.         movlw   0x03                                    ;No => hacemos Cantms = 1000
  169.         movwf   Cantms+1,.0
  170.         movlw   0xE8
  171.         movwf   Cantms,.0
  172.         rcall   Retardo_ms                              ;realizamos un retardo de 1000 ms
  173.         decf    CantSeg,F,.0                    ;CantSeg --,
  174.         bra             RetardoSeg                              ;Continuamos con el ciclo
  175. ;*****************************************************************************
  176.  
  177. ;****************************   Retardo_ms      **********************************
  178. ;       Retardo_ms      Realiza un retardo de la cantidad de milisegundos indicados
  179. ;                               mediante Cantms y Cantms+1, Cantms y Cantms+1 son tratados como
  180. ;       variables de 16 bits.
  181. ;*****************************************************************************
  182. Retardo_ms
  183.         rcall   Retardo1ms                              ;realizamos un retardo de 1 ms
  184.         decfsz  Cantms,F,.0                             ;Cantms --, Cantms == 0
  185.         bra             Retardo_ms                              ;no => vamos a Retardo_ms
  186.         movf    Cantms+1,W,.0                   ;
  187.         btfsc   STATUS,Z                                ;Cantms+1 == 0?
  188.         return                                                  ;Si => retornamos
  189.         decf    Cantms+1,F,.0                   ;No => decrementamos
  190.         bra             Retardo_ms                              ;Continuamos con el ciclo      
  191. ;*****************************************************************************
  192.  
  193. ;****************************   Retardo1ms      **********************************
  194. ;       Retardo1ms      realiza una espera de 1 ms decrementado W 249 veces en un ciclo
  195. ;                               que ocupa 4 us
  196. ;*****************************************************************************
  197. Retardo1ms
  198.         movlw           .249
  199. Retardo1msP0
  200.         addlw   0xFF                                    ;W--
  201.         btfss   STATUS,Z,.0                             ;W == 0?
  202.         bra             Retardo1msP0                    ;No => seguimos esperando
  203.         return                                                  ;Si => ya paso 1 ms    
  204. ;*****************************************************************************
  205.  
  206.  
  207. ;******************************************************************************
  208.  
  209.  
  210.                 END                     ;Directiva fin del programa

Notas

  • En la version de proteus que tengo (7.2 SP0) por algun motivo toma al pin RA4 como si tuviera salida de colector abierto por lo que se necesita colocarle una resistencia de PULL-UP para que se simule ese pin correctamente, en la hoja de datos no dice que este pin sea de colector abierto,  y como es de esperarse la prueba en protoboard le da la razon a la hoja de datos
  • En la primer programa que hice no me preocupe del bit de configuracion LVP (que por defecto esta activado), y  el circuito no funcionaba bien en el protoboard, luego de varios dolores de cabeza y revisando con mas detenimiento la hoja de datos lei que si no se piensa usar el modo de programacion en bajo voltaje (LVP) se debe colocar el pin RB5 a tierra mediante una resistencia, una vez hecho esto el circuito funciono como se esperaba, y como puede verse ahora en el codigo fuente LVP = OFF

Saludos
La electronica es el arte de manipular señales electricas que transportan información
Jan Davidse

Visita mi blog

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 603
Re: Ejemplos PIC18F4550
« Respuesta #1 en: 07 de Agosto de 2008, 23:44:25 »
Disp7Seg.asm

En este ejemplo se visualiza en un display de 7 segmentos un conteo de 0 a 9, en un ciclo infinito. El display debe ser de anodo comun y debe estar conectado al PORT D, hice este ejemplo para probar el manejo de tablas en los PIC18.

Código: ASM
  1. ;******************************************************************************
  2. ;                                                                             *
  3. ;   Nombre:             Disp7seg.asm
  4. ;   Fecha:              31/07/2008
  5. ;   Version:    v1.00
  6. ;                                                                             *
  7. ;   Autor:              Sander
  8. ;   Empresa:
  9. ;                                                                             *
  10. ;******************************************************************************
  11. ;                                                                             *
  12. ;   Archivos Requeridos:         P18F4550.INC
  13. ;                                                                             *
  14. ;******************************************************************************
  15. ;       Notas:  El programa realiza un conteo de 0 - 9 dentro de un ciclo infinito,
  16. ;                       visualiza los valores en un display de 7 segmentos conectado al                
  17. ;       puerto D, el incremento del display se lo realiza cada segundo.
  18. ;
  19. ;       Para realizar los retardos se usaran las rutinas de retardo del proyecto
  20. ;       parpadea, para convertir el valor BCD que cuenta se implementara una tabla  
  21. ;       en la memoria de programa usando la directiva DB
  22. ;
  23. ;       El display que se usara sera de anodo comun , y tendra la siguiente conexion
  24. ;       con el Puerto D
  25. ;
  26. ;                                                         _Vdd_
  27. ;                                                               |
  28. ;                                       ____________|_
  29. ;                                  |                      |
  30. ;               A(RD0)  -->|   AAAAAAA    |
  31. ;               B(RD1)  -->|  F           B       |    
  32. ;               C(RD2)  -->|  F           B       |
  33. ;               D(RD3)  -->|  F           B       |
  34. ;                                  |   GGGGGG     |
  35. ;               E(RD4)  -->|  E       C   |
  36. ;               F(RD5)  -->|  E           C   |
  37. ;               G(RD6)  -->|  E           C   |
  38. ;               DP(RD7) -->|   DDDDDDD  DP|
  39. ;                                  |______________|    
  40. ;
  41. ;******************************************************************************
  42.  
  43.         LIST P=18F4550                          ;Directiva para definir el procesador
  44.         #include <P18F4550.INC>         ;Definicion de SFRs para el procesador
  45.  
  46. ;******************************************************************************
  47. ;Bits de Configuracion
  48. ;Microchip ha cambiado el formato para definir los bits de configuracion, por favor
  49. ;revisar el archivo P18F4550.INC para informacion adicional de la notacion
  50. ;Abajo hay algunos ejemplos
  51.  
  52. ;********       Configuracion del Oscilador     **********
  53.     CONFIG      FOSC = INTOSCIO_EC         ;Osc interno, RA6 como pin, USB usa Osc EC
  54. ;********       Otros bits de configuracion     **********
  55.         CONFIG  PWRT = ON                                       ;PWRT habilitado
  56.         CONFIG  BOR  = OFF                                      ;Brown out resete deshabilitado
  57.         CONFIG  WDT      = OFF                                  ;Watch dog deshabilitado       
  58.         CONFIG  MCLRE = OFF                                     ;MCLR como entrada
  59.         CONFIG  PBADEN = ON                                     ;Todos los pines como entradas analogicas
  60.         CONFIG  LVP     = OFF                                   ;Programacion en bajo voltaje apagado
  61. ;*********      Bits de proteccion      ******************
  62.         CONFIG  CP0     = OFF                                   ;los bloques del codigo de programa
  63.         CONFIG  CP1     = OFF                                   ;no estan protegidos
  64.         CONFIG  CP2     = OFF
  65.         CONFIG  CP3     = OFF
  66.         CONFIG  CPB     = OFF                                   ;Sector Boot no esta protegido
  67.         CONFIG  CPD     = OFF                                   ;La EEPROM no esta protegida
  68. ;******************************************************************************
  69. ; Definicion de variables
  70. ; Estas variables son necesarias solo si las interrupciones de baja prioridad son usadas.
  71. ; Mas variables podrian se necesarias para almacenar otros SFRs usados en las rutinas de
  72. ; interrupcion.
  73.  
  74.                 CBLOCK  0x080
  75.                 WREG_TEMP               ;variable usada para salvar contexto
  76.                 STATUS_TEMP             ;variable usada para salvar contexto
  77.                 BSR_TEMP                ;variable usada para salvar contexto
  78.                 ENDC
  79.  
  80.                 CBLOCK  0x000   ;Variables en la ACCESS RAM (Banco 0) max 96 bytes
  81.                 Cantms:2                ;variable para generar hasta 65535 ms
  82.                 CantSeg                 ;Variable para producir retardos de hasta 255 seg
  83.                 Cont                    ;Variable para realizar el conteo
  84.                 TablaOffs               ;Para movernos por la tabla
  85.                 ENDC
  86.  
  87. ;******************************************************************************
  88. ;Datos de la EEPROM
  89. ;Los Datos a ser programados en la  EEPROM son definidos aqui
  90.  
  91.                 ORG     0xf00000
  92.  
  93.                 DE      "Test Data",0,1,2,3,4,5
  94.  
  95. ;******************************************************************************
  96. ; Vector de Reset.
  97. ; Este codigo comenzara a ejecutarse cuando suceda un reset
  98.  
  99.                 ORG     0x0000
  100.  
  101.                 goto    Main            ;Se va al inicio del codigo principal
  102.  
  103. ;******************************************************************************
  104. ; Vector de interrupcion de alta prioridad
  105. ; Este codigo comenzara a ejecutarse cuando una interrupcion de alta prioridad ocurra
  106. ; o cuando cualquier interrupcion ocurra si es que las prioridades de las interrupciones
  107. ; no estan habilitadas
  108.  
  109.                 ORG     0x0008
  110.  
  111.                 bra     HighInt                                         ;Va a la rutina de interrupcion de alta prioridad
  112.  
  113. ;******************************************************************************
  114. ; Vector de interrupcion de baja prioridad y rutina
  115. ; Este codigo comenzara a ejecutrase cuando una interrupcion de baja prioridad ocurra
  116. ; Este codigo puede ser eliminado si las interrupciones de baja prioridad no son usadas
  117.  
  118.                 ORG     0x0018
  119.  
  120.                 movff   STATUS,STATUS_TEMP              ;Salva el registro STATUS
  121.                 movff   WREG,WREG_TEMP                  ;Salva el registro de trabajo
  122.                 movff   BSR,BSR_TEMP                    ;Salva el registro BSR
  123.  
  124. ;       *** El codigo de la interrupcion de baja prioridad va aqui ***
  125.  
  126.  
  127.                 movff   BSR_TEMP,BSR                    ;recupera el registro BSR
  128.                 movff   WREG_TEMP,WREG                  ;recupera el registro de trabajo
  129.                 movff   STATUS_TEMP,STATUS              ;recupera el registro STATUS
  130.                 retfie
  131.  
  132. ;******************************************************************************
  133. ; Rutina de interrupcion de alta prioridad
  134. ; El codigo para la rutina de interrupcion de alta prioridad es colocado aqui para
  135. ; evitar conflictos con el vector de interrupciones de baja prioridad
  136.  
  137. HighInt:
  138.  
  139. ;       *** El codigo para las interrupciones de alta prioridad va aqui ***
  140.  
  141.                 retfie  FAST
  142.  
  143. ;******************************************************************************
  144. ; Comienzo del programa principal
  145. ; El codigo del programa principal es colocado aqui
  146.  
  147. Main:
  148. ;       *** EL codigo principal va aqui ***
  149.  
  150. ;********************   Inicializacion de perifericos   *********************
  151.         movlw   B'01100000'
  152.         movwf   OSCCON                                  ;Ajustamos el oscilador interno a 4 MHz
  153.         movlw   B'00001111'
  154.         movwf   ADCON1,.0                               ;Todos los pines como I/O digitales
  155.        
  156.         clrf    TRISD,.0                                ;Puerto D como salida
  157.                                                                         ;Los demas se quedan como entradas
  158. ;********************   Inicializacion de Variables     ************************
  159.         clrf    Cont,.0                                 ;Cont = 0
  160.        
  161. MainP0 
  162.  
  163.         movf    Cont,W,.0                               ;W = Cont, para realizar el despliegue
  164.         rcall   Conv7Seg                                ;realizamos la conversion de BCD a 7 segmentos
  165.         movwf   LATD,.0                                 ;movemos el valor convertido al PORT D
  166.         movlw   .1
  167.         movwf   CantSeg                                 ;CantSeg = 1 , para el retardo de 1 seg
  168.         rcall   RetardoSeg                              ;Esperamos 1 seg
  169.         incf    Cont,F,.0                               ;Cont ++
  170.         movlw   0x0A
  171.         cpfseq  Cont,.0                                 ;Cont == 0x0A (Cont==WREG)?
  172.         bra             MainP0                                  ;No => continuamos en el ciclo
  173.         clrf    Cont,.0                                 ;Si =>  reiniciamos la cuenta (Cont = 0)
  174.         bra             MainP0                                  ;Continuamos con el ciclo
  175.  
  176. ;**********************         Conv7Seg        *******************************************
  177. ;       Conv7Seg        Esta subrutina maneja realiza el acceso a la tabla BCD7Seg, recibe
  178. ;                               en W un offset para que sea sumado a TBLPTRL para asi acceder al
  179. ;       valor de 7 segmentos correspondiente al valor BCD recibido en WREG
  180. ;
  181. ;       Devuelve el valor de 7 seg en el registro W.
  182. ;**********************************************************************************
  183. Conv7Seg
  184.         movwf   TablaOffs,.0                    ;Guardamos el valor BCD recibido
  185.         movlw   UPPER BCD7Seg                   ;tomamos la parte mas alta de la dir de la tabla
  186.         movwf   TBLPTRU,.0                              ;y la actualizamos TBLPTRU
  187.         movlw   HIGH BCD7Seg                    ;tomamos la parte  alta de la dir de la tabla
  188.         movwf   TBLPTRH,.0                              ;y la actualizamos TBLPTRH
  189.         movlw   LOW BCD7Seg                             ;tomamos la parte baja de la dir de la tabla
  190.         movwf   TBLPTRL,.0                              ;y la actualizamos TBLPTRL, Aqui tenemos a TBLPTR
  191.                                                                         ;apuntado al inicio de la tabla BCD7seg
  192.         movf    TablaOffs,W,.0                  ;Nos preparamos para recorrer la tabla
  193.         addwf   TBLPTRL,F,.0                    ;TBLPTR apunta al valor de 7 seg que necesitamos
  194.         tblrd   *                                               ;Leemos el valor de la tabla
  195.         movf    TABLAT,W,.0                             ;guardamos el valor leido en WREG
  196.         return                                                  ;retornamos
  197. ;**********************************************************************************
  198.        
  199. ;****************************   RetardoSeg      **********************************
  200. ;       RetardoSeg      Realiza una espera de la cantidad de segundos indicados
  201. ;                               mediante la variable CantSeg. CantSeg es de 8 bits
  202. ;*****************************************************************************
  203. RetardoSeg
  204.         movf    CantSeg,W,.0
  205.         btfsc   STATUS,Z                                ;CantSeg == 0?
  206.         return                                                  ;Si => retornamos
  207.         movlw   0x03                                    ;No => hacemos Cantms = 1000
  208.         movwf   Cantms+1,.0
  209.         movlw   0xE8
  210.         movwf   Cantms,.0
  211.         rcall   Retardo_ms                              ;realizamos un retardo de 1000 ms
  212.         decf    CantSeg,F,.0                    ;CantSeg --,
  213.         bra             RetardoSeg                              ;Continuamos con el ciclo
  214. ;*****************************************************************************
  215.  
  216. ;****************************   Retardo_ms      **********************************
  217. ;       Retardo_ms      Realiza un retardo de la cantidad de milisegundos indicados
  218. ;                               mediante Cantms y Cantms+1, Cantms y Cantms+1 son tratados como
  219. ;       variables de 16 bits.
  220. ;*****************************************************************************
  221. Retardo_ms
  222.         rcall   Retardo1ms                              ;realizamos un retardo de 1 ms
  223.         decfsz  Cantms,F,.0                             ;Cantms --, Cantms == 0
  224.         bra             Retardo_ms                              ;no => vamos a Retardo_ms
  225.         movf    Cantms+1,W,.0                   ;
  226.         btfsc   STATUS,Z                                ;Cantms+1 == 0?
  227.         return                                                  ;Si => retornamos
  228.         decf    Cantms+1,F,.0                   ;No => decrementamos
  229.         bra             Retardo_ms                              ;Continuamos con el ciclo      
  230. ;*****************************************************************************
  231.  
  232. ;****************************   Retardo1ms      **********************************
  233. ;       Retardo1ms      realiza una espera de 1 ms decrementado W 249 veces en un ciclo
  234. ;                               que ocupa 4 us
  235. ;*****************************************************************************
  236. Retardo1ms
  237.         movlw           .249
  238. Retardo1msP0
  239.         addlw   0xFF                                    ;W--
  240.         btfss   STATUS,Z,.0                             ;W == 0?
  241.         bra             Retardo1msP0                    ;No => seguimos esperando
  242.         return                                                  ;Si => ya paso 1 ms    
  243. ;*****************************************************************************
  244.  
  245.  
  246.         ORG             0x800
  247.        
  248.  
  249. ;*******************************        BCD7Seg         ***********************************
  250. ;       BCD7Seg         Es una tabla que se utiliza para convertir valores BCD a 7 Segmentos
  251. ;
  252. ;               |RB7|RB6|RB5|RB4 |      |RB3|RB2|RB1|RB0|       |
  253. ;               |DP     |G      |F      |E       |      |D      |C      |B      |A      |Hex|
  254. ;               |---|---|---|-------|---|---|---|---|---|
  255. ;       0       |1      |1      |0      |0       |       0      |0      |0      |0      |C0     |
  256. ;   1   |1      |1      |1      |1       |       1      |0      |0      |1      |F9     |
  257. ;   2   |1      |0      |1      |0       |       0      |1      |0      |0  |A4 |
  258. ;   3   |1      |0      |1      |1       |       0      |0      |0      |0      |B0     |
  259. ;   4   |1      |0      |0      |1       |       1      |0      |0      |1      |99     |
  260. ;   5   |1      |0      |0      |1       |       0      |0      |1      |0      |92     |
  261. ;       6       |1      |0      |0      |0       |       0      |0      |1      |0      |82     |
  262. ;       7       |1      |1      |1      |1       |       1      |0      |0      |0      |F8     |
  263. ;       8       |1      |0      |0      |0       |       0      |0      |0      |0      |80     |
  264. ;       9       |1      |0      |0      |1       |       0      |0      |0      |0      |90     |
  265. ;**********************************************************************************
  266. BCD7Seg
  267.         ;               0        1        2             3       4        5         6    7       8        9                                             
  268.         DB              0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90
  269. ;**********************************************************************************
  270.  
  271.  
  272.                 END                     ;Directiva fin del programa

Como no me gusta como se ve en el GeShi aqui les dejo el programa y la simulacion



Saludos
La electronica es el arte de manipular señales electricas que transportan información
Jan Davidse

Visita mi blog

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Ejemplos PIC18F4550
« Respuesta #2 en: 08 de Agosto de 2008, 18:56:23 »
muy bien hecho sander, muy buenas aplicaciones, buena iniciativa, te ha quedado muy bien

felicidades por eso compatriota!

a colocar más! :mrgreen:

un saludo
.

Desconectado Slalen

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1079
    • Página web personal de Guillermo Herrero González
Re: Ejemplos PIC18F4550
« Respuesta #3 en: 09 de Agosto de 2008, 05:17:42 »
Felicidades!!

Te han quedado unos programas muy bien explicados!!!

Sigue así y a  ver si consigues controlar el USB con ensamblador :mrgreen:

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Ejemplos PIC18F4550
« Respuesta #4 en: 09 de Agosto de 2008, 11:07:24 »
Citar
controlar el USB con ensamblador :mrgreen:

lo mismo iba a decir :mrgreen:
esperare eso :-/
.

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 603
Re: Ejemplos PIC18F4550
« Respuesta #5 en: 17 de Agosto de 2008, 00:34:47 »
USB en ensamblador? suena interesante , si bien la idea paso por mi mente no habia decidido si lo hacia o no, asi que decidi comenzar con cosas mas faciles pero ya veremos que pasa, por lo pronto sigo avanzando y ya he hecho algo con interrupciones y aqui se los dejo.

IntExt1y2.asm

Este programa lo hice para comprobar que una interrupcion definida con alta prioridad puede ser ejecutada cuando ya se esta ejecutando una interrupcion pero de baja prioridad. Para esto uso la INT1(RB1) , la INT2(RB2), y un display de 7 segmentos. La INT1 incrementa el display y la INT2 lo decrementa. mas explicaciones estan en el programa.

Código: ASM
  1. ;******************************************************************************
  2. ;                                                                             *
  3. ;   Nombre:             IntExt1y2.asm
  4. ;   Fecha:              09/08/2008
  5. ;   Version:    v0.90
  6. ;                                                                             *
  7. ;   Autor:              Sander
  8. ;   Empresa:
  9. ;                                                                             *
  10. ;******************************************************************************
  11. ;                                                                             *
  12. ;   Archivos Requeridos:         P18F4550.INC
  13. ;                                                                             *
  14. ;******************************************************************************
  15. ;       Notas:  Este programa mostrara el uso de las interrupciones INT1, INT2
  16. ;       asignandoles prioridades diferentes a cada una.
  17. ;
  18. ;       El programa controlara un display de 7 segmentos de acuerdo al estado de dos
  19. ;       pulsadores que se conectaran a RB1(INT1) y RB2(INT2)
  20. ;
  21. ;       RB1(INT1) hara que el display incremente y su interrupcion tendra prioridad
  22. ;                         alta
  23. ;       RB2(INT2) hara que el display decremente y su interrupcion tendra prioridad
  24. ;                         baja
  25. ;
  26. ;       Para que pueda verse el efecto de la asigancion de prioridades, es decir, que
  27. ;       la interrupcion de alta  prioridad se ejecute aun cuando se esta ejecutando
  28. ;       la interrupcion de baja prioridad, el incremento o decremento se lo hara en la
  29. ;       misma rutina de interrupcion.
  30. ;
  31. ;       Para realizar retardos se usaran las rutinas de retardo del proyecto
  32. ;       parpadea, el display de 7 segmentos se incrementara de 0 a F, se habilitaran las
  33. ;       resistencias de PULL-UP y para convertir el valor BCD que cuenta se implementara
  34. ;       una tabla en la memoria de programa usando la directiva DB
  35. ;
  36. ;       La conexion del display de anodo comun , y de los pulsadores sera como se muestra
  37. ;       a continuacion
  38. ;
  39. ;                                                         _Vdd_
  40. ;                                                               |
  41. ;                                       ____________|_
  42. ;                                  |                      |
  43. ;               A(RD0)  -->|   AAAAAAA    |                                      
  44. ;               B(RD1)  -->|  F           B       |                                _|_ 
  45. ;               C(RD2)  -->|  F           B       |                             X-0   0---> RB1(INT1)
  46. ;               D(RD3)  -->|  F           B       |                         |  
  47. ;                                  |   GGGGGG     |                             |  _|_
  48. ;               E(RD4)  -->|  E       C   |                             X-0   0---> RB2(INT2)
  49. ;               F(RD5)  -->|  E           C   |                         |
  50. ;               G(RD6)  -->|  E           C   |                         |
  51. ;               DP(RD7) -->|   DDDDDDD  DP|                       -GND-
  52. ;                                  |______________|    
  53. ;
  54. ;******************************************************************************
  55.  
  56.         LIST P=18F4550                          ;Directiva para definir el procesador
  57.         #include <P18F4550.INC>         ;Definicion de SFRs para el procesador
  58.  
  59. ;******************************************************************************
  60. ;Bits de Configuracion
  61. ;Microchip ha cambiado el formato para definir los bits de configuracion, por favor
  62. ;revisar el archivo P18F4550.INC para informacion adicional de la notacion
  63. ;Abajo hay algunos ejemplos
  64.  
  65. ;********       Configuracion del Oscilador     **********
  66.     CONFIG      FOSC = INTOSCIO_EC         ;Osc interno, RA6 como pin, USB usa Osc EC
  67. ;********       Otros bits de configuracion     **********
  68.         CONFIG  PWRT = ON                                       ;PWRT habilitado
  69.         CONFIG  BOR  = OFF                                      ;Brown out resete deshabilitado
  70.         CONFIG  WDT      = OFF                                  ;Watch dog deshabilitado       
  71.         CONFIG  MCLRE = OFF                                     ;MCLR como entrada
  72.         CONFIG  PBADEN = ON                                     ;Todos los pines como entradas analogicas
  73.         CONFIG  LVP     = OFF                                   ;Programacion en bajo voltaje apagado
  74. ;*********      Bits de proteccion      ******************
  75.         CONFIG  CP0     = OFF                                   ;los bloques del codigo de programa
  76.         CONFIG  CP1     = OFF                                   ;no estan protegidos
  77.         CONFIG  CP2     = OFF
  78.         CONFIG  CP3     = OFF
  79.         CONFIG  CPB     = OFF                                   ;Sector Boot no esta protegido
  80.         CONFIG  CPD     = OFF                                   ;La EEPROM no esta protegida
  81. ;******************************************************************************
  82. ; Definicion de variables
  83. ; Estas variables son necesarias solo si las interrupciones de baja prioridad son usadas.
  84. ; Mas variables podrian se necesarias para almacenar otros SFRs usados en las rutinas de
  85. ; interrupcion.
  86.  
  87.                 CBLOCK  0x080
  88.                 WREG_TEMP               ;variable usada para salvar contexto
  89.                 STATUS_TEMP             ;variable usada para salvar contexto
  90.                 BSR_TEMP                ;variable usada para salvar contexto
  91.                 ENDC
  92.  
  93.                 CBLOCK  0x000   ;Variables en la ACCESS RAM (Banco 0) max 96 bytes
  94.                 Cantms:2                ;variable para generar hasta 65535 ms
  95.                 CantSeg                 ;Variable para producir retardos de hasta 255 seg
  96.                 Cont                    ;Variable para realizar el conteo
  97.                 TablaOffs               ;Para movernos por la tabla
  98.                 ENDC
  99.  
  100.         #DEFINE         BotU            PORTB,.1
  101.         #DEFINE         BotD            PORTB,.2
  102.  
  103. ;******************************************************************************
  104. ;Datos de la EEPROM
  105. ;Los Datos a ser programados en la  EEPROM son definidos aqui
  106.  
  107.                 ORG     0xf00000
  108.  
  109.                 DE      "Test Data",0,1,2,3,4,5
  110.  
  111. ;******************************************************************************
  112. ; Vector de Reset.
  113. ; Este codigo comenzara a ejecutarse cuando suceda un reset
  114.  
  115.                 ORG     0x0000
  116.  
  117.                 goto    Main            ;Se va al inicio del codigo principal
  118.  
  119. ;******************************************************************************
  120. ; Vector de interrupcion de alta prioridad
  121. ; Este codigo comenzara a ejecutarse cuando una interrupcion de alta prioridad ocurra
  122. ; o cuando cualquier interrupcion ocurra si es que las prioridades de las interrupciones
  123. ; no estan habilitadas
  124.  
  125.                 ORG     0x0008
  126.  
  127.                 bra             HighInt                                 ;Va a la rutina de interrupcion de alta prioridad
  128.  
  129. ;******************************************************************************
  130. ; Vector de interrupcion de baja prioridad y rutina
  131. ; Este codigo comenzara a ejecutrase cuando una interrupcion de baja prioridad ocurra
  132. ; Este codigo puede ser eliminado si las interrupciones de baja prioridad no son usadas
  133.  
  134.                 ORG     0x0018
  135.  
  136.                 movff   STATUS,STATUS_TEMP              ;Salva el registro STATUS
  137.                 movff   WREG,WREG_TEMP                  ;Salva el registro de trabajo
  138.                 movff   BSR,BSR_TEMP                    ;Salva el registro BSR
  139. ;********* El codigo de la interrupcion de baja prioridad va aqui **************
  140.                
  141.                 btfsc   INTCON3,INT2IF,.0               ;INT2IF == 1?(ocurrio la INT2?)
  142.                 bra             IntINT2                                 ;Si => vamos a su rutina
  143.                 movlw   B'10110110'                             ;No => un error extraño sucedio,encedemos los
  144.                 movwf   LATD,.0                                 ;segmentos A,D y G para indicarlo y detenemos
  145.                 bcf             INTCON,GIEH                             ;la ejecucion el programa
  146.                 bcf             INTCON,GIEL                            
  147.                 sleep
  148. IntINT2
  149.                 clrf    Cantms+1,.0
  150.                 movlw   .50                                             ;Hacemos un retardo de 50 ms para antirrebote
  151.                 movwf   Cantms,.0                              
  152.                 rcall   Retardo_ms                             
  153. IntINT2_0      
  154.                 btfsc   BotD                                    ;Sigue presionado el boton de decremento?
  155.                 bra             IntINT2_X                               ;No => vamos a salir de esta interrupcion
  156.                 decf    Cont,F,.0                               ;Si => Cont --
  157.                 movlw   0xFF                                   
  158.                 cpfseq  Cont,.0                                 ;Cont == 0xFF (Cont==WREG)?
  159.                 bra             IntINT2_00                              ;No => vamos a actualizar el display
  160.                 movlw   0x0F                                    ;Si => reiniciamos el decremento       
  161.                 movwf   Cont,.0                                 ; y continuamos actualizando el display
  162. IntINT2_00
  163.                 movf    Cont,W,.0                               ;W = Cont, para realizar el despliegue
  164.                 rcall   Conv7Seg                                ;realizamos la conversion de BCD a 7 segmentos
  165.                 movwf   LATD,.0                                 ;movemos el valor convertido al PORT D
  166.                 movlw   .1
  167.                 movwf   CantSeg,.0                              ;realizamos una espera de 1 seg, para
  168.                 rcall   RetardoSeg                              ;ver el cambio en el display
  169.                 bra             IntINT2_0                               ;volvemos a revisar el boton
  170. IntINT2_X
  171.                 bcf             INTCON3,INT2IF                  ;Para dar por terminada la interrupcion y
  172.                                                                                 ;salir de las interrupciones de baja prioridad
  173. X_IntLow
  174.                 movff   BSR_TEMP,BSR                    ;recupera el registro BSR
  175.                 movff   WREG_TEMP,WREG                  ;recupera el registro de trabajo
  176.                 movff   STATUS_TEMP,STATUS              ;recupera el registro STATUS
  177.                 retfie
  178. ;******************************************************************************
  179. ; Rutina de interrupcion de alta prioridad
  180. ; El codigo para la rutina de interrupcion de alta prioridad es colocado aqui para
  181. ; evitar conflictos con el vector de interrupciones de baja prioridad
  182.  
  183. HighInt:
  184.  
  185. ;       *** El codigo para las interrupciones de alta prioridad va aqui ***
  186.                 btfsc   INTCON3,INT1IF,.0               ;INT1IF == 1?(ocurrio la INT1?)
  187.                 bra             IntINT1                                 ;Si => vamos a su rutina
  188.                 movlw   B'10110110'                             ;No => un error extraño sucedio,encedemos los
  189.                 movwf   LATD,.0                                 ;segmentos A,D y G para indicarlo y detenemos
  190.                 bcf             INTCON,GIEH                             ;la ejecucion el programa
  191.                 bcf             INTCON,GIEL                            
  192.                 sleep
  193. IntINT1
  194.                 clrf    Cantms+1,.0
  195.                 movlw   .50                                             ;Hacemos un retardo de 50 ms para antirrebote
  196.                 movwf   Cantms,.0                              
  197.                 rcall   Retardo_ms                             
  198. IntINT1_0      
  199.                 btfsc   BotU                                    ;Sigue presionado el boton de incremento?
  200.                 bra             IntINT1_X                               ;No => vamos a salir de esta interrupcion
  201.                 incf    Cont,F,.0                               ;Si => Cont ++
  202.                 movlw   0x10                                   
  203.                 cpfseq  Cont,.0                                 ;Cont == 0x10 (Cont==WREG)?
  204.                 bra             IntINT1_00                              ;No => vamos a actualizar el display
  205.                 clrf    Cont,.0                                 ;Si => reiniciamos el incremento
  206.                                                                                 ; y continuamos actualizando el display
  207. IntINT1_00
  208.                 movf    Cont,W,.0                               ;W = Cont, para realizar el despliegue
  209.                 rcall   Conv7Seg                                ;realizamos la conversion de BCD a 7 segmentos
  210.                 movwf   LATD,.0                                 ;movemos el valor convertido al PORT D
  211.                 movlw   .1
  212.                 movwf   CantSeg,.0                              ;realizamos una espera de 1 seg, para
  213.                 rcall   RetardoSeg                              ;ver el cambio en el display
  214.                 bra             IntINT1_0                               ;volvemos a revisar el boton
  215. IntINT1_X
  216.                 bcf             INTCON3,INT1IF                  ;Para dar por terminada la interrupcion y
  217.                                                                                 ;salir de las interrupciones de alta prioridad
  218. X_IntHigh
  219.                 retfie  FAST
  220.  
  221. ;******************************************************************************
  222. ; Comienzo del programa principal
  223. ; El codigo del programa principal es colocado aqui
  224.  
  225. Main:
  226. ;       *** EL codigo principal va aqui ***
  227.  
  228. ;********************   Inicializacion de perifericos   *********************
  229.         movlw   B'01100000'
  230.         movwf   OSCCON                                  ;Ajustamos el oscilador interno a 4 MHz
  231.         movlw   B'00001111'
  232.         movwf   ADCON1,.0                               ;Todos los pines como I/O digitales
  233.        
  234.         clrf    TRISD,.0                                ;Puerto D como salida
  235.                                                                         ;Los demas se quedan como entradas
  236.         movlw   B'01000101'                             ;habilitamos PULL-UPs(bit 7), y hacemos que
  237.         movwf   INTCON2,.0                              ;INT1 e INT2 se activen en flanco de bajada
  238.                                                                         ;(Bits 4 y 5), lo demas se queda como estaba
  239.         movlw   B'01011000'                             ;Asignamos prioridades(Bits 7 y 6), y habilitamos
  240.         movwf   INTCON3,.0                              ;las interrupciones para INT1 e INT2 (bits 3 y 4)
  241.  
  242.         bsf             RCON,IPEN,.0                    ;Habilitamos las prioridades para las interrupciones
  243.        
  244. ;********************   Inicializacion de Variables     ************************
  245.         clrf    Cont,.0                                 ;Cont = 0
  246. ;***************************************************************************
  247.         bsf             INTCON,GIEH,.0                  ;Habilitamos las interrupciones de prioridad alta
  248.         bsf             INTCON,GIEL,.0                  ;y las de prioridad baja
  249.  
  250.         movf    Cont,W,.0                               ;W = Cont, para realizar el despliegue
  251.         rcall   Conv7Seg                                ;realizamos la conversion de BCD a 7 segmentos
  252.         movwf   LATD,.0                                 ;movemos el valor convertido al PORT D
  253.  
  254. MainP0 
  255.  
  256.         bra             MainP0                                  ;Continuamos con el ciclo
  257.  
  258. ;**********************         Conv7Seg        *******************************************
  259. ;       Conv7Seg        Esta subrutina maneja realiza el acceso a la tabla BCD7Seg, recibe
  260. ;                               en W un offset para que sea sumado a TBLPTRL para asi acceder al
  261. ;       valor de 7 segmentos correspondiente al valor BCD recibido en WREG
  262. ;
  263. ;       Devuelve el valor de 7 seg en el registro W.
  264. ;**********************************************************************************
  265. Conv7Seg
  266.         movwf   TablaOffs,.0                    ;Guardamos el valor BCD recibido
  267.         movlw   UPPER BCD7Seg                   ;tomamos la parte mas alta de la dir de la tabla
  268.         movwf   TBLPTRU,.0                              ;y la actualizamos TBLPTRU
  269.         movlw   HIGH BCD7Seg                    ;tomamos la parte  alta de la dir de la tabla
  270.         movwf   TBLPTRH,.0                              ;y la actualizamos TBLPTRH
  271.         movlw   LOW BCD7Seg                             ;tomamos la parte baja de la dir de la tabla
  272.         movwf   TBLPTRL,.0                              ;y la actualizamos TBLPTRL, Aqui tenemos a TBLPTR
  273.                                                                         ;apuntado al inicio de la tabla BCD7seg
  274.         movf    TablaOffs,W,.0                  ;Nos preparamos para recorrer la tabla
  275.         addwf   TBLPTRL,F,.0                    ;TBLPTR apunta al valor de 7 seg que necesitamos
  276.         tblrd   *                                               ;Leemos el valor de la tabla
  277.         movf    TABLAT,W,.0                             ;guardamos el valor leido en WREG
  278.         return                                                  ;retornamos
  279. ;**********************************************************************************
  280.        
  281. ;****************************   RetardoSeg      **********************************
  282. ;       RetardoSeg      Realiza una espera de la cantidad de segundos indicados
  283. ;                               mediante la variable CantSeg. CantSeg es de 8 bits
  284. ;*****************************************************************************
  285. RetardoSeg
  286.         movf    CantSeg,W,.0
  287.         btfsc   STATUS,Z                                ;CantSeg == 0?
  288.         return                                                  ;Si => retornamos
  289.         movlw   0x03                                    ;No => hacemos Cantms = 1000
  290.         movwf   Cantms+1,.0
  291.         movlw   0xE8
  292.         movwf   Cantms,.0
  293.         rcall   Retardo_ms                              ;realizamos un retardo de 1000 ms
  294.         decf    CantSeg,F,.0                    ;CantSeg --,
  295.         bra             RetardoSeg                              ;Continuamos con el ciclo
  296. ;*****************************************************************************
  297.  
  298. ;****************************   Retardo_ms      **********************************
  299. ;       Retardo_ms      Realiza un retardo de la cantidad de milisegundos indicados
  300. ;                               mediante Cantms y Cantms+1, Cantms y Cantms+1 son tratados como
  301. ;       variables de 16 bits.
  302. ;*****************************************************************************
  303. Retardo_ms
  304.         rcall   Retardo1ms                              ;realizamos un retardo de 1 ms
  305.         decfsz  Cantms,F,.0                             ;Cantms --, Cantms == 0
  306.         bra             Retardo_ms                              ;no => vamos a Retardo_ms
  307.         movf    Cantms+1,W,.0                   ;
  308.         btfsc   STATUS,Z                                ;Cantms+1 == 0?
  309.         return                                                  ;Si => retornamos
  310.         decf    Cantms+1,F,.0                   ;No => decrementamos
  311.         bra             Retardo_ms                              ;Continuamos con el ciclo      
  312. ;*****************************************************************************
  313.  
  314. ;****************************   Retardo1ms      **********************************
  315. ;       Retardo1ms      realiza una espera de 1 ms decrementado W 249 veces en un ciclo
  316. ;                               que ocupa 4 us
  317. ;*****************************************************************************
  318. Retardo1ms
  319.         movlw           .249
  320. Retardo1msP0
  321.         addlw   0xFF                                    ;W--
  322.         btfss   STATUS,Z,.0                             ;W == 0?
  323.         bra             Retardo1msP0                    ;No => seguimos esperando
  324.         return                                                  ;Si => ya paso 1 ms    
  325. ;*****************************************************************************
  326.  
  327.  
  328.         ORG             0x800
  329.        
  330.  
  331. ;*******************************        BCD7Seg         ***********************************
  332. ;       BCD7Seg         Es una tabla que se utiliza para convertir valores BCD a 7 Segmentos
  333. ;
  334. ;               |RB7|RB6|RB5|RB4 |      |RB3|RB2|RB1|RB0|       |
  335. ;               |DP     |G      |F      |E       |      |D      |C      |B      |A      |Hex|
  336. ;               |---|---|---|-------|---|---|---|---|---|
  337. ;       0       |1      |1      |0      |0       |       0      |0      |0      |0      |C0     |
  338. ;   1   |1      |1      |1      |1       |       1      |0      |0      |1      |F9     |
  339. ;   2   |1      |0      |1      |0       |       0      |1      |0      |0  |A4 |
  340. ;   3   |1      |0      |1      |1       |       0      |0      |0      |0      |B0     |
  341. ;   4   |1      |0      |0      |1       |       1      |0      |0      |1      |99     |
  342. ;   5   |1      |0      |0      |1       |       0      |0      |1      |0      |92     |
  343. ;       6       |1      |0      |0      |0       |       0      |0      |1      |0      |82     |
  344. ;       7       |1      |1      |1      |1       |       1      |0      |0      |0      |F8     |
  345. ;       8       |1      |0      |0      |0       |       0      |0      |0      |0      |80     |
  346. ;       9       |1      |0      |0      |1       |       0      |0      |0      |0      |90     |
  347. ;       A       |1      |0      |0      |0       |       1      |0      |0      |0      |88     |
  348. ;       B       |1      |0      |0      |0       |       0      |0      |1      |1      |83     |
  349. ;       C       |1      |1      |0      |0       |       0      |1      |1      |0      |C6     |
  350. ;       D       |1      |0      |1      |0       |       0      |0      |0      |1      |A1     |
  351. ;       E       |1      |0      |0      |0       |       0      |1      |1      |0      |86     |
  352. ;       F       |1      |0      |0      |0       |       1      |1      |1      |0      |8E     |
  353. ;**********************************************************************************
  354. BCD7Seg
  355.         ;               0        1        2             3       4        5         6    7       8        9              A       B       C         D             E       F
  356.         DB              0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
  357. ;**********************************************************************************
  358.  
  359.  
  360.                 END                     ;Directiva fin del programa

Notas
  • Simulando en el MPLAB pude notar que cuando se pasaba de la INT2 a la INT1 y luego se retornaba a la INT2 ,el programa como que se colgaba, pero en realidad solo se tenia que esperar unos 255 seg, esto porque las rutinas de interrupcion comparten rutinas de retardo y al volver de la INT1 las variables usadas en las rutinas de retardo toman otros valores. 
  • La version del PROTEUS que uso (7.2 SP0) no simula correctamente las resistencias internas de PULLUP del este PIC en los pines RB0 y RB1.

Bueno finalmente aqui les dejo el circuito para la simulacion y el programa


La electronica es el arte de manipular señales electricas que transportan información
Jan Davidse

Visita mi blog

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 603
Re: Ejemplos PIC18F4550
« Respuesta #6 en: 17 de Agosto de 2008, 00:47:56 »
IntExt1y2_1

Bueno , este programa lo hice para corregir el fallo que apunte en la nota 1 para el anterior programa, para corregir este fallo se debe guardar las variables de retardo o talvez usar rutinas de retardo independientes para cada rutina de interrupcion , yo me incline por la primera opcion, y utilizo la pila para guardar estas variables, ya que los PIC18 permiten acceder a la Pila hay que usar esta caracteristica.

Código: ASM
  1. ;******************************************************************************
  2. ;                                                                             *
  3. ;   Nombre:             IntExt1y2_1.asm
  4. ;   Fecha:              12/08/2008
  5. ;   Version:    v1.00
  6. ;                                                                             *
  7. ;   Autor:              Sander
  8. ;   Empresa:
  9. ;                                                                             *
  10. ;******************************************************************************
  11. ;                                                                             *
  12. ;   Archivos Requeridos:         P18F4550.INC
  13. ;                                                                             *
  14. ;******************************************************************************
  15. ;       Notas:  Este programa mostrara el uso de las interrupciones INT1, INT2
  16. ;       asignandoles prioridades diferentes a cada una.
  17. ;
  18. ;       El programa controlara un display de 7 segmentos de acuerdo al estado de dos
  19. ;       pulsadores que se conectaran a RB1(INT1) y RB2(INT2)
  20. ;
  21. ;       RB1(INT1) hara que el display incremente y su interrupcion tendra prioridad
  22. ;                         alta
  23. ;       RB2(INT2) hara que el display decremente y su interrupcion tendra prioridad
  24. ;                         baja
  25. ;
  26. ;       Para que pueda verse el efecto de la asigancion de prioridades, es decir, que
  27. ;       la interrupcion de alta  prioridad se ejecute aun cuando se esta ejecutando
  28. ;       la interrupcion de baja prioridad, el incremento o decremento se lo hara en la
  29. ;       misma rutina de interrupcion.
  30. ;
  31. ;       Para realizar retardos se usaran las rutinas de retardo del proyecto
  32. ;       parpadea, el display de 7 segmentos se incrementara de 0 a F, se habilitaran las
  33. ;       resistencias de PULL-UP y para convertir el valor BCD que cuenta se implementara
  34. ;       una tabla en la memoria de programa usando la directiva DB
  35. ;
  36. ;       La conexion del display de anodo comun , y de los pulsadores sera como se muestra
  37. ;       a continuacion
  38. ;
  39. ;                                                         _Vdd_
  40. ;                                                               |
  41. ;                                       ____________|_
  42. ;                                  |                      |
  43. ;               A(RD0)  -->|   AAAAAAA    |                                      
  44. ;               B(RD1)  -->|  F           B       |                                _|_ 
  45. ;               C(RD2)  -->|  F           B       |                             X-0   0---> RB1(INT1)
  46. ;               D(RD3)  -->|  F           B       |                         |  
  47. ;                                  |   GGGGGG     |                             |  _|_
  48. ;               E(RD4)  -->|  E       C   |                             X-0   0---> RB2(INT2)
  49. ;               F(RD5)  -->|  E           C   |                         |
  50. ;               G(RD6)  -->|  E           C   |                         |
  51. ;               DP(RD7) -->|   DDDDDDD  DP|                       -GND-
  52. ;                                  |______________|    
  53. ;
  54.  
  55. ;       Esta version corrige los errores vistos en la simulacion al momento
  56. ;       de pasar de la interrupcion de baja prioridad a la de alta prioridad, para esto
  57. ;       usaremos la bandera IntHigh_F que le indicara a la interrupcion de baja
  58. ;       prioridad que se produjo una interrupcion de alta prioridad, ademas guardaremos
  59. ;       las variables que son compartidas por ambas interrupciones en la PILA
  60. ;******************************************************************************
  61.  
  62.         LIST P=18F4550                          ;Directiva para definir el procesador
  63.         #include <P18F4550.INC>         ;Definicion de SFRs para el procesador
  64.  
  65. ;******************************************************************************
  66. ;Bits de Configuracion
  67. ;Microchip ha cambiado el formato para definir los bits de configuracion, por favor
  68. ;revisar el archivo P18F4550.INC para informacion adicional de la notacion
  69. ;Abajo hay algunos ejemplos
  70.  
  71. ;********       Configuracion del Oscilador     **********
  72.     CONFIG      FOSC = INTOSCIO_EC         ;Osc interno, RA6 como pin, USB usa Osc EC
  73. ;********       Otros bits de configuracion     **********
  74.         CONFIG  PWRT = ON                                       ;PWRT habilitado
  75.         CONFIG  BOR  = OFF                                      ;Brown out resete deshabilitado
  76.         CONFIG  WDT      = OFF                                  ;Watch dog deshabilitado       
  77.         CONFIG  MCLRE = OFF                                     ;MCLR como entrada
  78.         CONFIG  PBADEN = ON                                     ;Todos los pines como entradas analogicas
  79.         CONFIG  LVP     = OFF                                   ;Programacion en bajo voltaje apagado
  80. ;*********      Bits de proteccion      ******************
  81.         CONFIG  CP0     = OFF                                   ;los bloques del codigo de programa
  82.         CONFIG  CP1     = OFF                                   ;no estan protegidos
  83.         CONFIG  CP2     = OFF
  84.         CONFIG  CP3     = OFF
  85.         CONFIG  CPB     = OFF                                   ;Sector Boot no esta protegido
  86.         CONFIG  CPD     = OFF                                   ;La EEPROM no esta protegida
  87. ;******************************************************************************
  88. ; Definicion de variables
  89. ; Estas variables son necesarias solo si las interrupciones de baja prioridad son usadas.
  90. ; Mas variables podrian se necesarias para almacenar otros SFRs usados en las rutinas de
  91. ; interrupcion.
  92.  
  93.         CBLOCK  0x080
  94.         WREG_TEMP               ;variable usada para salvar contexto
  95.         STATUS_TEMP             ;variable usada para salvar contexto
  96.         BSR_TEMP                ;variable usada para salvar contexto
  97.         ENDC
  98.  
  99.         CBLOCK  0x000   ;Variables en la ACCESS RAM (Banco 0) max 96 bytes
  100.         Cantms:2                ;variable para generar hasta 65535 ms
  101.         CantSeg                 ;Variable para producir retardos de hasta 255 seg
  102.         Cont                    ;Variable para realizar el conteo
  103.         Banderas                ;Variable para el manejo de banderas, que controlan la ejecucion
  104.         TablaOffs               ;Para movernos por la tabla
  105.         ENDC
  106.  
  107.         #DEFINE         BotU            PORTB,.1
  108.         #DEFINE         BotD            PORTB,.2
  109.  
  110.         #DEFINE         IntHigh_F       Banderas,.0,.0
  111. ;******************************************************************************
  112. ;Datos de la EEPROM
  113. ;Los Datos a ser programados en la  EEPROM son definidos aqui
  114.  
  115.         ORG     0xf00000
  116.  
  117.         DE      "Test Data",0,1,2,3,4,5
  118.  
  119. ;******************************************************************************
  120. ; Vector de Reset.
  121. ; Este codigo comenzara a ejecutarse cuando suceda un reset
  122.  
  123.         ORG     0x0000
  124.  
  125.         goto    Main            ;Se va al inicio del codigo principal
  126.  
  127. ;******************************************************************************
  128. ; Vector de interrupcion de alta prioridad
  129. ; Este codigo comenzara a ejecutarse cuando una interrupcion de alta prioridad ocurra
  130. ; o cuando cualquier interrupcion ocurra si es que las prioridades de las interrupciones
  131. ; no estan habilitadas
  132.  
  133.         ORG     0x0008
  134.  
  135.         bra             HighInt                                 ;Va a la rutina de interrupcion de alta prioridad
  136.  
  137. ;******************************************************************************
  138. ; Vector de interrupcion de baja prioridad y rutina
  139. ; Este codigo comenzara a ejecutrase cuando una interrupcion de baja prioridad ocurra
  140. ; Este codigo puede ser eliminado si las interrupciones de baja prioridad no son usadas
  141.  
  142.         ORG     0x0018
  143.  
  144.         movff   STATUS,STATUS_TEMP              ;Salva el registro STATUS
  145.         movff   WREG,WREG_TEMP                  ;Salva el registro de trabajo
  146.         movff   BSR,BSR_TEMP                    ;Salva el registro BSR
  147. ;********* El codigo de la interrupcion de baja prioridad va aqui **************
  148.                
  149.         btfsc   INTCON3,INT2IF,.0               ;INT2IF == 1?(ocurrio la INT2?)
  150.         bra             IntINT2                                 ;Si => vamos a su rutina
  151.         movlw   B'10110110'                             ;No => un error extraño sucedio,encedemos los
  152.         movwf   LATD,.0                                 ;segmentos A,D y G para indicarlo y detenemos
  153.         bcf             INTCON,GIEH                             ;la ejecucion el programa
  154.         bcf             INTCON,GIEL                            
  155.         sleep
  156. IntINT2
  157.         clrf    Cantms+1,.0
  158.         movlw   .50                                             ;Hacemos un retardo de 50 ms para antirrebote
  159.         movwf   Cantms,.0                              
  160.         rcall   Retardo_ms                             
  161. IntINT2_0
  162.         bcf             IntHigh_F                               ;ponemos en cero esta bandera, por si venimos
  163.                                                                         ;de la interrupcion alta
  164.         btfsc   BotD                                    ;Sigue presionado el boton de decremento?
  165.         bra             IntINT2_X                               ;No => vamos a salir de esta interrupcion
  166.         btfsc   IntHigh_F                               ;Se produjo una interrupcion de mayor prioridad?
  167.         bra             IntINT2_0                               ;Si => usamos el valor de Cont que dejo la int alta
  168.         decf    Cont,F,.0                               ;Si => Cont --
  169.         movlw   0xFF                                   
  170.         cpfseq  Cont,.0                                 ;Cont == 0xFF (Cont==WREG)?
  171.         bra             IntINT2_00                              ;No => vamos a actualizar el display
  172.         movlw   0x0F                                    ;Si => reiniciamos el decremento       
  173.         movwf   Cont,.0                                 ; y continuamos actualizando el display
  174. IntINT2_00
  175.         movf    Cont,W,.0                               ;W = Cont, para realizar el despliegue
  176.         rcall   Conv7Seg                                ;realizamos la conversion de BCD a 7 segmentos
  177.         btfsc   IntHigh_F                               ;Se produjo una interrupcion de mayor prioridad?
  178.         bra             IntINT2_0                               ;Si => usamos el valor de Cont que dejo la int alta
  179.         movwf   LATD,.0                                 ;No => movemos el valor convertido al PORT D
  180.         movlw   .1
  181.         movwf   CantSeg,.0                              ;realizamos una espera de 1 seg, para
  182.         rcall   RetardoSeg                              ;ver el cambio en el display
  183.         bra             IntINT2_0                               ;volvemos a revisar el boton
  184. IntINT2_X
  185.         bcf             INTCON3,INT2IF                  ;Para dar por terminada la interrupcion y
  186.                                                                         ;salir de las interrupciones de baja prioridad
  187. X_IntLow
  188.         movff   BSR_TEMP,BSR                    ;recupera el registro BSR
  189.         movff   WREG_TEMP,WREG                  ;recupera el registro de trabajo
  190.         movff   STATUS_TEMP,STATUS              ;recupera el registro STATUS
  191.         retfie
  192. ;******************************************************************************
  193. ; Rutina de interrupcion de alta prioridad
  194. ; El codigo para la rutina de interrupcion de alta prioridad es colocado aqui para
  195. ; evitar conflictos con el vector de interrupciones de baja prioridad
  196.  
  197. HighInt:
  198. ;****** El codigo para las interrupciones de alta prioridad va aqui ******
  199.  
  200.         push                                                    ;Para comenzar a guarda las variables que se
  201.                                                                         ;comparten en la pila, primero apilamos la direccion
  202.                                                                         ;actual
  203.  
  204.         movf    Cantms,W,.0                             ;Guardamos Cantms en la parte baja del
  205.         movwf   TOSL                                    ;Top Of Stack
  206.         movf    Cantms+1,W,.0                   ;Guardamos Cantms+1 en la parte alta del
  207.         movwf   TOSH                                    ;Top Of Stack
  208.  
  209.         push                                                    ;apilamos la direccion actual
  210.         movf    CantSeg,W,.0                    ;Guardamos Cantms en la parte baja del
  211.         movwf   TOSL                                    ;Top Of Stack
  212.  
  213.         btfsc   INTCON3,INT1IF,.0               ;INT1IF == 1?(ocurrio la INT1?)
  214.         bra             IntINT1                                 ;Si => vamos a su rutina
  215.         movlw   B'10110110'                             ;No => un error extraño sucedio,encedemos los
  216.         movwf   LATD,.0                                 ;segmentos A,D y G para indicarlo y detenemos
  217.         bcf             INTCON,GIEH                             ;la ejecucion el programa
  218.         bcf             INTCON,GIEL                            
  219.         sleep
  220. IntINT1
  221.         clrf    Cantms+1,.0
  222.         movlw   .50                                             ;Hacemos un retardo de 50 ms para antirrebote
  223.         movwf   Cantms,.0                              
  224.         rcall   Retardo_ms                             
  225. IntINT1_0      
  226.         btfsc   BotU                                    ;Sigue presionado el boton de incremento?
  227.         bra             IntINT1_X                               ;No => vamos a salir de esta interrupcion
  228.         incf    Cont,F,.0                               ;Si => Cont ++
  229.         movlw   0x10                                   
  230.         cpfseq  Cont,.0                                 ;Cont == 0x10 (Cont==WREG)?
  231.         bra             IntINT1_00                              ;No => vamos a actualizar el display
  232.         clrf    Cont,.0                                 ;Si => reiniciamos el incremento
  233.                                                                                 ; y continuamos actualizando el display
  234. IntINT1_00
  235.         movf    Cont,W,.0                               ;W = Cont, para realizar el despliegue
  236.         rcall   Conv7Seg                                ;realizamos la conversion de BCD a 7 segmentos
  237.         movwf   LATD,.0                                 ;movemos el valor convertido al PORT D
  238.         movlw   .1
  239.         movwf   CantSeg,.0                              ;realizamos una espera de 1 seg, para
  240.         rcall   RetardoSeg                              ;ver el cambio en el display
  241.         bra             IntINT1_0                               ;volvemos a revisar el boton
  242. IntINT1_X
  243. ;************   Recuperamos los valores de la pila      ****************
  244.         movff   TOSL,CantSeg                    ;Recuperamos el valor guardado, primero CantSeg
  245.         pop                                                             ;El pop efectivamente decrementa el STKPTR y
  246.                                                                         ;descarta e valor de TOS
  247.  
  248.         movff   TOSL,Cantms                             ;Recuperamos Cantms
  249.         movff   TOSH,Cantms+1                   ;y Cantms+1
  250.         pop                                                             ;STKPTR --, y descartamos TOS
  251.  
  252.         bcf             INTCON3,INT1IF                  ;Para dar por terminada la interrupcion y
  253.                                                                         ;salir de las interrupciones de alta prioridad
  254.         bsf             IntHigh_F                               ;ponemos en 1 esta bandera par indicar que se produjo
  255.                                                                         ;esta interrupcion
  256. X_IntHigh
  257.         retfie  FAST
  258.  
  259. ;******************************************************************************
  260. ; Comienzo del programa principal
  261. ; El codigo del programa principal es colocado aqui
  262.  
  263. Main:
  264. ;       *** EL codigo principal va aqui ***
  265.  
  266. ;********************   Inicializacion de perifericos   *********************
  267.         movlw   B'01100000'
  268.         movwf   OSCCON                                  ;Ajustamos el oscilador interno a 4 MHz
  269.         movlw   B'00001111'
  270.         movwf   ADCON1,.0                               ;Todos los pines como I/O digitales
  271.        
  272.         clrf    TRISD,.0                                ;Puerto D como salida
  273.                                                                         ;Los demas se quedan como entradas
  274.         movlw   B'01000101'                             ;habilitamos PULL-UPs(bit 7), y hacemos que
  275.         movwf   INTCON2,.0                              ;INT1 e INT2 se activen en flanco de bajada
  276.                                                                         ;(Bits 4 y 5), lo demas se queda como estaba
  277.         movlw   B'01011000'                             ;Asignamos prioridades(Bits 7 y 6), y habilitamos
  278.         movwf   INTCON3,.0                              ;las interrupciones para INT1 e INT2 (bits 3 y 4)
  279.  
  280.         bsf             RCON,IPEN,.0                    ;Habilitamos las prioridades para las interrupciones
  281.        
  282. ;********************   Inicializacion de Variables     ************************
  283.         clrf    Cont,.0                                 ;Cont = 0
  284.         clrf    Banderas,.0                             ;Banderas = 0
  285. ;***************************************************************************
  286.         bsf             INTCON,GIEH,.0                  ;Habilitamos las interrupciones de prioridad alta
  287.         bsf             INTCON,GIEL,.0                  ;y las de prioridad baja
  288.  
  289.         movf    Cont,W,.0                               ;W = Cont, para realizar el primer despliegue
  290.         rcall   Conv7Seg                                ;realizamos la conversion de BCD a 7 segmentos
  291.         movwf   LATD,.0                                 ;movemos el valor convertido al PORT D
  292.  
  293. MainP0 
  294.  
  295.         bra             MainP0                                  ;Continuamos con el ciclo, esperando que las
  296.                                                                         ;interrupciones cambien el valor del display
  297.  
  298.        
  299. ;**********************         Conv7Seg        *******************************************
  300. ;       Conv7Seg        Esta subrutina maneja realiza el acceso a la tabla BCD7Seg, recibe
  301. ;                               en W un offset para que sea sumado a TBLPTRL para asi acceder al
  302. ;       valor de 7 segmentos correspondiente al valor BCD recibido en WREG
  303. ;
  304. ;       Devuelve el valor de 7 seg en el registro W.
  305. ;**********************************************************************************
  306. Conv7Seg
  307.         movwf   TablaOffs,.0                    ;Guardamos el valor BCD recibido
  308.         movlw   UPPER BCD7Seg                   ;tomamos la parte mas alta de la dir de la tabla
  309.         movwf   TBLPTRU,.0                              ;y la actualizamos TBLPTRU
  310.         movlw   HIGH BCD7Seg                    ;tomamos la parte  alta de la dir de la tabla
  311.         movwf   TBLPTRH,.0                              ;y la actualizamos TBLPTRH
  312.         movlw   LOW BCD7Seg                             ;tomamos la parte baja de la dir de la tabla
  313.         movwf   TBLPTRL,.0                              ;y la actualizamos TBLPTRL, Aqui tenemos a TBLPTR
  314.                                                                         ;apuntado al inicio de la tabla BCD7seg
  315.         movf    TablaOffs,W,.0                  ;Nos preparamos para recorrer la tabla
  316.         addwf   TBLPTRL,F,.0                    ;TBLPTR apunta al valor de 7 seg que necesitamos
  317.         tblrd   *                                               ;Leemos el valor de la tabla
  318.         movf    TABLAT,W,.0                             ;guardamos el valor leido en WREG
  319.         return                                                  ;retornamos
  320. ;**********************************************************************************
  321.        
  322. ;****************************   RetardoSeg      **********************************
  323. ;       RetardoSeg      Realiza una espera de la cantidad de segundos indicados
  324. ;                               mediante la variable CantSeg. CantSeg es de 8 bits
  325. ;*****************************************************************************
  326. RetardoSeg
  327.         movf    CantSeg,W,.0
  328.         btfsc   STATUS,Z                                ;CantSeg == 0?
  329.         return                                                  ;Si => retornamos
  330.         movlw   0x03                                    ;No => hacemos Cantms = 1000
  331.         movwf   Cantms+1,.0
  332.         movlw   0xE8
  333.         movwf   Cantms,.0
  334.         rcall   Retardo_ms                              ;realizamos un retardo de 1000 ms
  335.         decf    CantSeg,F,.0                    ;CantSeg --,
  336.         bra             RetardoSeg                              ;Continuamos con el ciclo
  337. ;*****************************************************************************
  338.  
  339. ;****************************   Retardo_ms      **********************************
  340. ;       Retardo_ms      Realiza un retardo de la cantidad de milisegundos indicados
  341. ;                               mediante Cantms y Cantms+1, Cantms y Cantms+1 son tratados como
  342. ;       variables de 16 bits.
  343. ;*****************************************************************************
  344. Retardo_ms
  345.         rcall   Retardo1ms                              ;realizamos un retardo de 1 ms
  346.         decfsz  Cantms,F,.0                             ;Cantms --, Cantms == 0
  347.         bra             Retardo_ms                              ;no => vamos a Retardo_ms
  348.         movf    Cantms+1,W,.0                   ;
  349.         btfsc   STATUS,Z                                ;Cantms+1 == 0?
  350.         return                                                  ;Si => retornamos
  351.         decf    Cantms+1,F,.0                   ;No => decrementamos
  352.         bra             Retardo_ms                              ;Continuamos con el ciclo      
  353. ;*****************************************************************************
  354.  
  355. ;****************************   Retardo1ms      **********************************
  356. ;       Retardo1ms      realiza una espera de 1 ms decrementado W 249 veces en un ciclo
  357. ;                               que ocupa 4 us
  358. ;*****************************************************************************
  359. Retardo1ms
  360.         movlw           .249
  361. Retardo1msP0
  362.         addlw   0xFF                                    ;W--
  363.         btfss   STATUS,Z,.0                             ;W == 0?
  364.         bra             Retardo1msP0                    ;No => seguimos esperando
  365.         return                                                  ;Si => ya paso 1 ms    
  366. ;*****************************************************************************
  367.  
  368.  
  369.         ORG             0x800
  370.        
  371.  
  372. ;*******************************        BCD7Seg         ***********************************
  373. ;       BCD7Seg         Es una tabla que se utiliza para convertir valores BCD a 7 Segmentos
  374. ;
  375. ;               |RB7|RB6|RB5|RB4 |      |RB3|RB2|RB1|RB0|       |
  376. ;               |DP     |G      |F      |E       |      |D      |C      |B      |A      |Hex|
  377. ;               |---|---|---|-------|---|---|---|---|---|
  378. ;       0       |1      |1      |0      |0       |       0      |0      |0      |0      |C0     |
  379. ;   1   |1      |1      |1      |1       |       1      |0      |0      |1      |F9     |
  380. ;   2   |1      |0      |1      |0       |       0      |1      |0      |0  |A4 |
  381. ;   3   |1      |0      |1      |1       |       0      |0      |0      |0      |B0     |
  382. ;   4   |1      |0      |0      |1       |       1      |0      |0      |1      |99     |
  383. ;   5   |1      |0      |0      |1       |       0      |0      |1      |0      |92     |
  384. ;       6       |1      |0      |0      |0       |       0      |0      |1      |0      |82     |
  385. ;       7       |1      |1      |1      |1       |       1      |0      |0      |0      |F8     |
  386. ;       8       |1      |0      |0      |0       |       0      |0      |0      |0      |80     |
  387. ;       9       |1      |0      |0      |1       |       0      |0      |0      |0      |90     |
  388. ;       A       |1      |0      |0      |0       |       1      |0      |0      |0      |88     |
  389. ;       B       |1      |0      |0      |0       |       0      |0      |1      |1      |83     |
  390. ;       C       |1      |1      |0      |0       |       0      |1      |1      |0      |C6     |
  391. ;       D       |1      |0      |1      |0       |       0      |0      |0      |1      |A1     |
  392. ;       E       |1      |0      |0      |0       |       0      |1      |1      |0      |86     |
  393. ;       F       |1      |0      |0      |0       |       1      |1      |1      |0      |8E     |
  394. ;**********************************************************************************
  395. BCD7Seg
  396.         ;       0        1        2             3       4        5         6    7       8        9              A       B       C         D             E       F
  397.         DB      0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
  398. ;**********************************************************************************
  399.  
  400.  
  401.                 END                     ;Directiva fin del programa

Como el circuito para la simulacion es el mismo que el anterior les dejo solo el programa

Saludos
La electronica es el arte de manipular señales electricas que transportan información
Jan Davidse

Visita mi blog

Desconectado Lock

  • PIC10
  • *
  • Mensajes: 3
Re: Ejemplos PIC18F4550
« Respuesta #7 en: 18 de Agosto de 2008, 09:28:28 »
He comenzado a usar este microcontrolador y para aprender un poco mas de las nuevas cosas que trae la arquitectura he decidido realizar algunos programas en ensamblador. por el momento solo llevo dos probados en el Proteus y en un protoboard, y los coloco a continuacion a disposicion del foro

Parpadea.asm

Este programa simplemente realiza un parpadeo de 1 segundo de todos los pines del microcontrolador, para este programa uso el oscilador interno configurado a 4 MHz , y deshabilito el MCLR, (pero este puede  usarse solo como entrada ).

Código: ASM
  1. ;******************************************************************************
  2. ;                                                                             *
  3. ;   Nombre:     parpadea.asm
  4. ;   Fecha:              30-07-2008
  5. ;   Version:    V1.00
  6. ;                                                                             *
  7. ;   Autor:              Sander
  8. ;   Empresa:
  9. ;                                                                             *
  10. ;******************************************************************************
  11. ;                                                                             *
  12. ;   Archivos Requeridos:         P18F4550.INC
  13. ;                                                                             *
  14. ;******************************************************************************
  15. ;       Notas:Este programa implementa rutinas de retardos de 1 ms, 1 seg
  16. ;       para asi poder realizar un parpadeo de 1 seg de todos los pines del
  17. ;       PIC18F4550, estas rutinas estan hechas para un oscilador de 4 MHz
  18. ;******************************************************************************
  19.  
  20.         LIST P=18F4550          ;Directiva para definir el procesador
  21.         #include <P18F4550.INC> ;Definicion de SFRs para el procesador
  22.  
  23. ;******************************************************************************
  24. ;Bits de Configuracion
  25. ;Microchip ha cambiado el formato para definir los bits de configuracion, por favor
  26. ;revisar el archivo P18F4550.INC para informacion adicional de la notacion
  27. ;Abajo hay algunos ejemplos
  28.  
  29. ;********       Configuracion del Oscilador     **********
  30.         CONFIG  FOSC = INTOSCIO_EC        ;Osc interno, RA6 como pin, USB usa Osc EC
  31. ;********       Otros bits de configuracion     **********
  32.         CONFIG  PWRT = ON                                       ;PWRT habilitado
  33.         CONFIG  BOR  = OFF                                      ;Brown out reset deshabilitado
  34.         CONFIG  WDT      = OFF                                  ;Watchdog deshabilitado
  35.         CONFIG     MCLRE = OFF                                  ;MCLR como entrada
  36.         CONFIG  PBADEN = ON                                     ;Todos los pines como entradas analogicas
  37.         CONFIG  LVP     = OFF                                   ;Programacion en bajo voltaje apagado
  38. ;*********      Bits de proteccion      ******************
  39.         CONFIG  CP0     = OFF                                   ;los bloques del codigo de programa
  40.         CONFIG  CP1     = OFF                                   ;no estan protegidos
  41.         CONFIG  CP2     = OFF
  42.         CONFIG  CP3     = OFF
  43.         CONFIG  CPB     = OFF                                   ;Sector Boot no esta protegido
  44.         CONFIG  CPD     = OFF                                   ;La EEPROM no esta protegida
  45.  
  46.  
  47. ;******************************************************************************
  48. ; Definicion de variables
  49. ; Estas variables son necesarias solo si las interrupciones de baja prioridad son usadas.
  50. ; Mas variables podrian se necesarias para almacenar otros SFRs usados en las rutinas de
  51. ; interrupcion.
  52.  
  53.                 CBLOCK  0x080
  54.                 WREG_TEMP               ;variable usada para salvar contexto
  55.                 STATUS_TEMP             ;variable usada para salvar contexto
  56.                 BSR_TEMP                ;variable usada para salvar contexto
  57.                 ENDC
  58.  
  59.                 CBLOCK  0x000   ;Variables en la ACCESS RAM (Banco 0) max 96 bytes
  60.                 Cantms:2                ;variable para generar hasta 65535 ms
  61.                 CantSeg                 ;Variable para producir retardos de hasta 255 seg
  62.                 ENDC
  63.  
  64. ;******************************************************************************
  65. ;Datos de la EEPROM
  66. ;Los Datos a ser programados en la  EEPROM son definidos aqui
  67.  
  68.                 ORG     0xf00000
  69.  
  70.                 DE      "Test Data",0,1,2,3,4,5
  71.  
  72. ;******************************************************************************
  73. ; Vector de Reset.
  74. ; Este codigo comenzara a ejecutarse cuando suceda un reset
  75.  
  76.                 ORG     0x0000
  77.  
  78.                 goto    Main            ;Se va al inicio del codigo principal
  79.  
  80. ;******************************************************************************
  81. ; Vector de interrupcion de alta prioridad
  82. ; Este codigo comenzara a ejecutarse cuando una interrupcion de alta prioridad ocurra
  83. ; o cuando cualquier interrupcion ocurra si es que las prioridades de las interrupciones
  84. ; no estan habilitadas
  85.  
  86.                 ORG     0x0008
  87.  
  88.                 bra     HighInt                                         ;Va a la rutina de interrupcion de alta prioridad
  89.  
  90. ;******************************************************************************
  91. ; Vector de interrupcion de baja prioridad y rutina
  92. ; Este codigo comenzara a ejecutrase cuando una interrupcion de baja prioridad ocurra
  93. ; Este codigo puede ser eliminado si las interrupciones de baja prioridad no son usadas
  94.  
  95.                 ORG     0x0018
  96.  
  97.                 movff   STATUS,STATUS_TEMP              ;Salva el registro STATUS
  98.                 movff   WREG,WREG_TEMP                  ;Salva el registro de trabajo
  99.                 movff   BSR,BSR_TEMP                    ;Salva el registro BSR
  100.  
  101. ;       *** El codigo de la interrupcion de baja prioridad va aqui ***
  102.  
  103.  
  104.                 movff   BSR_TEMP,BSR                    ;recupera el registro BSR
  105.                 movff   WREG_TEMP,WREG                  ;recupera el registro de trabajo
  106.                 movff   STATUS_TEMP,STATUS              ;recupera el registro STATUS
  107.                 retfie
  108.  
  109. ;******************************************************************************
  110. ; Rutina de interrupcion de alta prioridad
  111. ; El codigo para la rutina de interrupcion de alta prioridad es colocado aqui para
  112. ; evitar conflictos con el vector de interrupciones de baja prioridad
  113.  
  114. HighInt:
  115.  
  116. ;       *** El codigo para las interrupciones de alta prioridad va aqui ***
  117.  
  118.  
  119.                 retfie  FAST
  120.  
  121. ;******************************************************************************
  122. ; Comienzo del programa principal
  123. ; El codigo del programa principal es colocado aqui
  124.  
  125. Main:
  126.  
  127. ;       *** EL codigo principal va aqui ***
  128.  
  129. ;*******************    Inicializamos perifericos       ***************************
  130.  
  131.         movlw   B'01100000'                             ;Ajustamos el oscilador interno a 4 MHz
  132.         movwf   OSCCON,.0                              
  133.         movlw   B'00001111'
  134.         movwf   ADCON1,.0                               ;Todos los pines como I/O digitales
  135.         clrf    TRISA,.0
  136.         clrf    TRISB,.0
  137.         clrf    TRISC,.0
  138.         clrf    TRISD,.0
  139.         clrf    TRISE,.0                                ;Todos los pines como salida
  140.  
  141. MainP0
  142.         setf    LATA,.0
  143.         setf    LATB,.0
  144.         setf    LATC,.0
  145.         setf    LATD,.0
  146.         setf    LATE,.0                                 ;Ponemos los puertos en 1
  147.         movlw   .1
  148.         movwf   CantSeg,.0
  149.         rcall   RetardoSeg                              ;esperamos 1 seg
  150.         clrf    LATA,.0
  151.         clrf    LATB,.0
  152.         clrf    LATC,.0
  153.         clrf    LATD,.0
  154.         clrf    LATE,.0                                 ;ponemos los puertos en 0
  155.         movlw   .1
  156.         movwf   CantSeg,.0
  157.         rcall   RetardoSeg                              ;esperamos 1 seg
  158.         bra             MainP0                                  ;Saltamos para continuar con el ciclo
  159.  
  160. ;****************************   RetardoSeg      **********************************
  161. ;       RetardoSeg      Realiza una espera de la cantidad de segundos indicados
  162. ;                               mediante la variable CantSeg. CantSeg es de 8 bits
  163. ;*****************************************************************************
  164. RetardoSeg
  165.         movf    CantSeg,W,.0
  166.         btfsc   STATUS,Z                                ;CantSeg == 0?
  167.         return                                                  ;Si => retornamos
  168.         movlw   0x03                                    ;No => hacemos Cantms = 1000
  169.         movwf   Cantms+1,.0
  170.         movlw   0xE8
  171.         movwf   Cantms,.0
  172.         rcall   Retardo_ms                              ;realizamos un retardo de 1000 ms
  173.         decf    CantSeg,F,.0                    ;CantSeg --,
  174.         bra             RetardoSeg                              ;Continuamos con el ciclo
  175. ;*****************************************************************************
  176.  
  177. ;****************************   Retardo_ms      **********************************
  178. ;       Retardo_ms      Realiza un retardo de la cantidad de milisegundos indicados
  179. ;                               mediante Cantms y Cantms+1, Cantms y Cantms+1 son tratados como
  180. ;       variables de 16 bits.
  181. ;*****************************************************************************
  182. Retardo_ms
  183.         rcall   Retardo1ms                              ;realizamos un retardo de 1 ms
  184.         decfsz  Cantms,F,.0                             ;Cantms --, Cantms == 0
  185.         bra             Retardo_ms                              ;no => vamos a Retardo_ms
  186.         movf    Cantms+1,W,.0                   ;
  187.         btfsc   STATUS,Z                                ;Cantms+1 == 0?
  188.         return                                                  ;Si => retornamos
  189.         decf    Cantms+1,F,.0                   ;No => decrementamos
  190.         bra             Retardo_ms                              ;Continuamos con el ciclo      
  191. ;*****************************************************************************
  192.  
  193. ;****************************   Retardo1ms      **********************************
  194. ;       Retardo1ms      realiza una espera de 1 ms decrementado W 249 veces en un ciclo
  195. ;                               que ocupa 4 us
  196. ;*****************************************************************************
  197. Retardo1ms
  198.         movlw           .249
  199. Retardo1msP0
  200.         addlw   0xFF                                    ;W--
  201.         btfss   STATUS,Z,.0                             ;W == 0?
  202.         bra             Retardo1msP0                    ;No => seguimos esperando
  203.         return                                                  ;Si => ya paso 1 ms    
  204. ;*****************************************************************************
  205.  
  206.  
  207. ;******************************************************************************
  208.  
  209.  
  210.                 END                     ;Directiva fin del programa

Notas

  • En la version de proteus que tengo (7.2 SP0) por algun motivo toma al pin RA4 como si tuviera salida de colector abierto por lo que se necesita colocarle una resistencia de PULL-UP para que se simule ese pin correctamente, en la hoja de datos no dice que este pin sea de colector abierto,  y como es de esperarse la prueba en protoboard le da la razon a la hoja de datos
  • En la primer programa que hice no me preocupe del bit de configuracion LVP (que por defecto esta activado), y  el circuito no funcionaba bien en el protoboard, luego de varios dolores de cabeza y revisando con mas detenimiento la hoja de datos lei que si no se piensa usar el modo de programacion en bajo voltaje (LVP) se debe colocar el pin RB5 a tierra mediante una resistencia, una vez hecho esto el circuito funciono como se esperaba, y como puede verse ahora en el codigo fuente LVP = OFF

Saludos


A pesar de que muchos sitios en internet me dicen que la gama 18Fxxxx sólo usan C, por fin veo a alguien que usa el ASM para los 18F.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1939
Re: Ejemplos PIC18F4550
« Respuesta #8 en: 19 de Agosto de 2008, 12:42:39 »
Que tal amigos!
Sander Excelente iniciativa, yo estoy haciendo lo mismo que tu  :mrgreen:  pero con el proton y asm  :shock:

Estaba leyendo los ejemplos que colocaste y hubo una partecita que no entendi  :(   es esta:


CBLOCK 0x000    ;Variables en la ACCESS RAM (Banco 0) max 96 bytes
Cantms:2            ;variable para generar hasta 65535 ms
CantSeg              ;Variable para producir retardos de hasta 255 seg
ENDC

 
Como se interpreta esto Cantms:2,  no me quedo claro eso, me la podrias explicar, que significa esos dos puntos?


Saludos

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 603
Re: Ejemplos PIC18F4550
« Respuesta #9 en: 19 de Agosto de 2008, 14:48:26 »
Hola RALF2,  lo de los dos puntos sirve para que el ensamblador reserve dos bytes en memoria para esa variable , si te fijas Cantms la utilizo como variable de 16 bits, por eso puse en el comentario lo de los 65535 ms . Usando los dos puntos tambien puedes reservar espacio en memoria para variables mas grandes.


Saludos
La electronica es el arte de manipular señales electricas que transportan información
Jan Davidse

Visita mi blog

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1939
Re: Ejemplos PIC18F4550
« Respuesta #10 en: 19 de Agosto de 2008, 17:40:44 »
Hola RALF2,  lo de los dos puntos sirve para que el ensamblador reserve dos bytes en memoria para esa variable , si te fijas Cantms la utilizo como variable de 16 bits, por eso puse en el comentario lo de los 65535 ms . Usando los dos puntos tambien puedes reservar espacio en memoria para variables mas grandes.

Saludos

Muy intersante sander no habia visto eso antes en asembler, voy a hacer unos ejemplos aplicando esa tecnica

Gracias!

Desconectado picNIC

  • PIC16
  • ***
  • Mensajes: 140
Re: Ejemplos PIC18F4550
« Respuesta #11 en: 19 de Agosto de 2008, 22:16:43 »
Hola gente... muy buena la idea de poner ejemplos....
y hablando de ejemplos de usb en asm encontre esta pagina...
Aunque todavia no estudie el programa parece que puede servir de guia..

Sal u 2

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 603
Re: Ejemplos PIC18F4550
« Respuesta #12 en: 12 de Octubre de 2008, 01:52:13 »
Bueno continuando con lo de los ejemplos aqui pongo un par mas

BlinkT0.asm

Código: ASM
  1. ;******************************************************************************
  2.  
  3. ;                                                                             *
  4.  
  5. ;   Nombre:     BlinkT0.asm
  6.  
  7. ;   Fecha:      27/08/2008
  8.  
  9. ;   Version: v0.90     
  10.  
  11. ;                                                                             *
  12.  
  13. ;   Autor:      Sander
  14.  
  15. ;   Empresa:
  16.  
  17. ;                                                                             *
  18.  
  19. ;******************************************************************************
  20.  
  21. ;                                                                             *
  22.  
  23. ;   Archivos Requeridos:         P18F4550.INC
  24.  
  25. ;                                                                             *
  26.  
  27. ;******************************************************************************
  28.  
  29. ;       Notas:  El programa hace parpadear los pines del PIC a razon de 1 seg usando
  30.  
  31. ;                       el TMR0 para generar los retardos.
  32.  
  33. ;       El TMR0 sera usado en su modo de 16 bits y se configurara para que genere
  34.  
  35. ;       con presicion un retardo de 100 ms.
  36.  
  37. ;      
  38.  
  39. ;       Tiempo = (NumCuentasTMR0)(4/Fosc)(preescaler)
  40.  
  41. ;      
  42.  
  43. ;       Para Fosc = 4 MHz; y el Tiempo de 100 ms , tenemos :
  44.  
  45. ;
  46.  
  47. ;       (4 MHz/4)(100 ms) = (NumCuentasTMR0)(preescaler)
  48.  
  49. ;       (NumCuentasTMR0)(preescaler) = 100000
  50.  
  51. ;       Los valores posibles para el preescaler son: 2,4,16,32,64,128 y 256, entonces
  52.  
  53. ;       son posibles diferentes combinaciones para el (NumCuentasTMR0) y el     preescaler,
  54.  
  55. ;       Sin embargo debe notarse que al ser el TMR0 un contador ascendente el valor
  56.  
  57. ;       hallado anteriormente no es el que debe cargarse al TMR0 si no :
  58.  
  59. ;
  60.  
  61. ;       TMR0 = 65536 - (NumCuentasTMR0)
  62.  
  63. ;      
  64.  
  65. ;        -----------------------------------------------------------
  66.  
  67. ;       |Preescaler     | NumCuentasTMR0|Valor a cargar |Valor a cargar |
  68.  
  69. ;       |                       |                               |       TMR0            |       TMR0(Hex)       |
  70.  
  71. ;        -----------------------------------------------------------
  72.  
  73. ;       |       2               |       50000           |       15536           |       0x3CB0          |
  74.  
  75. ;       |       4               |       25000           |       40536           |       0x9E58          |
  76.  
  77. ;       |       8               |       12500           |       53036           |       0xCF2C          |
  78.  
  79. ;       |       16              |        6250           |       59286           |       0xE796          |
  80.  
  81. ;       |       32              |        3125           |       62411           |       0xF3CB          |
  82.  
  83. ;       |       64              |        1562,5         |       -----           |       ------          |
  84.  
  85. ;       |       128             |         781,25        |       -----           |       ------          |
  86.  
  87. ;       |       256             |         390,625       |       -----           |       ------          |
  88.  
  89. ;        -----------------------------------------------------------
  90.  
  91. ;                                                               Tabla 1
  92.  
  93. ;******************************************************************************
  94.  
  95.  
  96.  
  97.         LIST P=18F4550          ;Directiva para definir el procesador
  98.  
  99.         #include <P18F4550.INC> ;Definicion de SFRs para el procesador
  100.  
  101.  
  102.  
  103. ;******************************************************************************
  104.  
  105. ;Bits de Configuracion
  106.  
  107. ;Microchip ha cambiado el formato para definir los bits de configuracion, por favor
  108.  
  109. ;revisar el archivo P18F4550.INC para informacion adicional de la notacion
  110.  
  111. ;Abajo hay algunos ejemplos
  112.  
  113.  
  114.  
  115. ;********       Configuracion del Oscilador     **********
  116.  
  117.     CONFIG      FOSC = XT_XT                    ;Osc XT, XT usado para el USB
  118.  
  119.        
  120.  
  121. ;********       Otros bits de configuracion     **********
  122.  
  123.         CONFIG  PWRT = ON                                       ;PWRT habilitado
  124.  
  125.         CONFIG  BOR  = OFF                                      ;Brown out resete deshabilitado
  126.  
  127.         CONFIG  WDT      = OFF                                  ;Watch dog deshabilitado       
  128.  
  129.         CONFIG  MCLRE = OFF                                     ;MCLR como entrada
  130.  
  131.         CONFIG  PBADEN = ON                                     ;Todos los pines como entradas analogicas
  132.  
  133.         CONFIG  LVP     = OFF                                   ;programacion en bajo voltaje deshabilitado
  134.  
  135. ;*********      Bits de proteccion      ******************
  136.  
  137.         CONFIG  CP0     = OFF                                   ;los bloques del codigo de programa
  138.  
  139.         CONFIG  CP1     = OFF                                   ;no estan protegidos
  140.  
  141.         CONFIG  CP2     = OFF
  142.  
  143.         CONFIG  CP3     = OFF
  144.  
  145.         CONFIG  CPB     = OFF                                   ;Sector Boot no esta protegido
  146.  
  147.         CONFIG  CPD     = OFF                                   ;La EEPROM no esta protegida
  148.  
  149. ;******************************************************************************
  150.  
  151. ; Definicion de variables
  152.  
  153. ; Estas variables son necesarias solo si las interrupciones de baja prioridad son usadas.
  154.  
  155. ; Mas variables podrian se necesarias para almacenar otros SFRs usados en las rutinas de
  156.  
  157. ; interrupcion.
  158.  
  159.  
  160.  
  161.                 CBLOCK  0x080
  162.  
  163.                 WREG_TEMP               ;variable usada para salvar contexto
  164.  
  165.                 STATUS_TEMP             ;variable usada para salvar contexto
  166.  
  167.                 BSR_TEMP                ;variable usada para salvar contexto
  168.  
  169.                 ENDC
  170.  
  171.  
  172.  
  173.                 CBLOCK  0x000   ;Variables en la ACCESS RAM (Banco 0) max 96 bytes
  174.  
  175.                 ContT0                  ;para contar las veces que TMR0 desborda
  176.  
  177.                 ENDC
  178.  
  179.  
  180.  
  181. ;******************************************************************************
  182.  
  183. ;Datos de la EEPROM
  184.  
  185. ;Los Datos a ser programados en la  EEPROM son definidos aqui
  186.  
  187.  
  188.  
  189.                 ORG     0xf00000
  190.  
  191.  
  192.  
  193.                 DE      "Test Data",0,1,2,3,4,5
  194.  
  195.  
  196.  
  197. ;******************************************************************************
  198.  
  199. ; Vector de Reset.
  200.  
  201. ; Este codigo comenzara a ejecutarse cuando suceda un reset
  202.  
  203.  
  204.  
  205.                 ORG     0x0000
  206.  
  207.  
  208.  
  209.                 goto    Main            ;Se va al inicio del codigo principal
  210.  
  211.  
  212.  
  213. ;******************************************************************************
  214.  
  215. ; Vector de interrupcion de alta prioridad
  216.  
  217. ; Este codigo comenzara a ejecutarse cuando una interrupcion de alta prioridad ocurra
  218.  
  219. ; o cuando cualquier interrupcion ocurra si es que las prioridades de las interrupciones
  220.  
  221. ; no estan habilitadas
  222.  
  223.  
  224.  
  225.                 ORG     0x0008
  226.  
  227.  
  228.  
  229.         bra     HighInt                                         ;Va a la rutina de interrupcion de alta prioridad
  230.  
  231.  
  232.  
  233. ;******************************************************************************
  234.  
  235. ; Vector de interrupcion de baja prioridad y rutina
  236.  
  237. ; Este codigo comenzara a ejecutrase cuando una interrupcion de baja prioridad ocurra
  238.  
  239. ; Este codigo puede ser eliminado si las interrupciones de baja prioridad no son usadas
  240.  
  241.  
  242.  
  243.                 ORG     0x0018
  244.  
  245.  
  246.  
  247.         movff   STATUS,STATUS_TEMP              ;Salva el registro STATUS
  248.  
  249.         movff   WREG,WREG_TEMP                  ;Salva el registro de trabajo
  250.  
  251.         movff   BSR,BSR_TEMP                    ;Salva el registro BSR
  252.  
  253.  
  254.  
  255. ;       *** El codigo de la interrupcion de baja prioridad va aqui ***
  256.  
  257.  
  258.  
  259.  
  260.  
  261.         movff   BSR_TEMP,BSR                    ;recupera el registro BSR
  262.  
  263.         movff   WREG_TEMP,WREG                  ;recupera el registro de trabajo
  264.  
  265.         movff   STATUS_TEMP,STATUS              ;recupera el registro STATUS
  266.  
  267.         retfie
  268.  
  269.  
  270.  
  271. ;******************************************************************************
  272.  
  273. ; Rutina de interrupcion de alta prioridad
  274.  
  275. ; El codigo para la rutina de interrupcion de alta prioridad es colocado aqui para
  276.  
  277. ; evitar conflictos con el vector de interrupciones de baja prioridad
  278.  
  279.  
  280.  
  281. HighInt:
  282.  
  283.  
  284.  
  285. ;       *** El codigo para las interrupciones de alta prioridad va aqui ***
  286.  
  287.  
  288.  
  289.  
  290.  
  291.         retfie  FAST
  292.  
  293.  
  294.  
  295. ;******************************************************************************
  296.  
  297. ; Comienzo del programa principal
  298.  
  299. ; El codigo del programa principal es colocado aqui
  300.  
  301.  
  302.  
  303. Main:
  304.  
  305. ;       *** EL codigo principal va aqui ***
  306.  
  307.  
  308.  
  309. ;*******************    Inicializacion de puertos       ***************************
  310.  
  311.         movlw   B'00001111'
  312.  
  313.         movwf   ADCON1,.0                               ;Todos los pines como I/O digitales
  314.  
  315.         clrf    TRISA,.0
  316.  
  317.         clrf    TRISB,.0
  318.  
  319.         clrf    TRISC,.0
  320.  
  321.         clrf    TRISD,.0
  322.  
  323.         clrf    TRISE,.0                                ;Todos los pines como salida
  324.  
  325.        
  326.  
  327.         clrf    LATA,.0
  328.  
  329.         clrf    LATB,.0
  330.  
  331.         clrf    LATC,.0
  332.  
  333.         clrf    LATD,.0
  334.  
  335.         clrf    LATE,.0                                 ;Ponemos las salidas en cero
  336.  
  337. ;******************************************************************************
  338.  
  339.  
  340.  
  341. ;*******************    Inicializacion del TMR0         ***************************
  342.  
  343.         movlw   B'10010000'                             ;TMR0 on, modo 16 bits, cambia con las
  344.  
  345.         movwf   T0CON,.0                                ;instrucciones, asignamos preescaler de 2
  346.  
  347.  
  348.  
  349.         movlw   0x3C                                    ;De acuerdo a la Tabla 1 cargamos los valores
  350.  
  351.         movwf   TMR0H,.0                                ;a TMR0H y TMR0L, pero a TMR0L se le aumenta
  352.  
  353.         movlw   0xB1                                    ;un 1 para compensar los 2 ciclos de
  354.  
  355.         movwf   TMR0L,.0                                ;instruccion que el TMR0 permanece detenido
  356.  
  357. ;******************************************************************************
  358.  
  359. Ciclo
  360.  
  361.         movlw   .10                                             ;
  362.  
  363.         movwf   ContT0,.0                               ;ContT0 = 10 para controlar 1 segundo
  364.  
  365. CicloP0
  366.  
  367.         btfss   INTCON,TMR0IF                   ;TMR0IF == 1? (TMR0 desbordo?)
  368.  
  369.         bra             CicloP0                                 ;No => continuamos esperando
  370.  
  371.         movlw   0xB1                                    ;Si => recargamos el TMR0L, no es necesario
  372.  
  373.         movwf   TMR0L,.0                                ;recargar el TMR0H
  374.  
  375.         bcf             INTCON,TMR0IF                   ;limpiamos TMR0IF para reiniciar la cuenta
  376.  
  377.         decfsz  ContT0,F,.0                             ;ContT0 -- , y ContT0 == 0?    
  378.  
  379.         bra             CicloP0                                 ;No => Volvemos al ciclo de espera
  380.  
  381.         movlw   0xFF                                    ;Si => Cambiamos el estado de los puertos (toggle)
  382.  
  383.         xorwf   LATA,F,.0                               ;para eso realizamos un XOR de cada puerto con 0xFF
  384.  
  385.         xorwf   LATB,F,.0
  386.  
  387.         xorwf   LATC,F,.0
  388.  
  389.         xorwf   LATD,F,.0
  390.  
  391.         xorwf   LATE,F,.0
  392.  
  393.         bra             Ciclo                                   ;Volvemos a recargar el valor de ContT0,
  394.  
  395.  
  396.  
  397. ;******************************************************************************
  398.  
  399.  
  400.  
  401.                 END                     ;Directiva fin del programa
  402.  


Bueno , este programa muestra el uso del TMR0 en su modo temporizador de 16 bits , lo he usado para generar retardos de 1 seg, de la manera mas precisa posible , a la primera obtuve un tiempo de 1,000004 seg si no me equivoco, , dentro del programa se explica con cierto detalle como es que configure el TMR0 .

Lo que el programa hace simplemente es prender y apagar los Leds cada segundo , no es gran cosa pero el objetivo en si era usar el TMR0 como temporizador de 16 bits , ademas de usar un oscilador con cristal de 4MHz. Aunque me sirvio para ver algo de lo que no me habia dado cuenta y que ademas lo pase por alto en la hoja de datos y en el anterior programa de parpadeo y es que los pines RC4  y RC5 (que son usados para el USB) no pueden ser usados como salidas digitales de proposito general, esto ultimo mi version del proteus tampoco los simula , asi que tiene otro punto menos .

Saludos
« Última modificación: 12 de Octubre de 2008, 03:25:07 por sander »
La electronica es el arte de manipular señales electricas que transportan información
Jan Davidse

Visita mi blog

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 603
Re: Ejemplos PIC18F4550
« Respuesta #13 en: 12 de Octubre de 2008, 02:52:06 »
TxRx_0.asm

Código: ASM
  1.  
  2. ;******************************************************************************
  3.  
  4. ;                                                                            
  5.  
  6. ;   Nombre:             TxRx_0.asm
  7.  
  8. ;   Fecha:              02/09/2008
  9.  
  10. ;   Version:    v0.90  
  11.  
  12. ;                                                                            
  13.  
  14. ;   Autor:              Sander
  15.  
  16. ;   Empresa:
  17.  
  18. ;                                                                              
  19.  
  20. ;********************************************************************************
  21.  
  22. ;                                                                            
  23.  
  24. ;   Archivos Requeridos:         P18F4550.INC
  25.  
  26. ;                                                                            
  27.  
  28. ;********************************************************************************
  29.  
  30. ;       Notas:  El programa muestra el uso del EUSART para realizar una comunicacion
  31.  
  32. ;                       asincrona con la PC, para este ejemplo configuraremos el oscilador
  33.  
  34. ;       para que funcione a 48 MHz usando un cristal externo de 4 MHz.
  35.  
  36. ;
  37.  
  38. ;       Para configurar la  velocidad de transmision  se usara el modo de 16 bits y
  39.  
  40. ;       el modo de alta de velocidad para el generador de baudios (BRG16=1; BRGH=1),
  41.  
  42. ;       para este caso tenemos que la velocidad esta dada por:
  43.  
  44. ;
  45.  
  46. ;       Vel = Fosc/[4(n+1)]             Donde n es el valor que se carga a SPBRGH:SPBRG
  47.  
  48. ;       n = [(Fosc/Vel)-1]/4   
  49.  
  50. ;
  51.  
  52. ;        ---------------------------------------------------------------------------
  53.  
  54. ;       |Velocidad      |Valor n        |Valor para             |Valor Hex para |Velocidad      | %             |
  55.  
  56. ;       |(Baudios)      |                       |SPBRGH:SPBRG   |SPBRGH:SPBRG   |real           | Error |
  57.  
  58. ;        ---------------------------------------------------------------------------
  59.  
  60. ;       |          110  | 109090,66     |       --------        |       --------        |       ------- | ----- |
  61.  
  62. ;       |          300  |  39999,75     |       39999           |       0x9C3F          |        300    |  0    |
  63.  
  64. ;       |         1200  |   9999,75     |        9999           |       0x270F          |       1200    |  0    |
  65.  
  66. ;       |         2400  |   4999,75     |        4999           |       0xC34F          |       2400    |  0    |
  67.  
  68. ;       |         4800  |   2499,75     |        2499           |       0x09C3          |       4800    |  0    |
  69.  
  70. ;       |         9600  |   1249,75     |        1249           |       0x04E1          |       9600    |  0    |
  71.  
  72. ;       |        19600  |    611,99     |         611           |       0x0263          |  19607,84     |  0,04 |
  73.  
  74. ;       |        38400  |    312,25     |         312           |       0x0137          |  38338,65     |  0,16 |
  75.  
  76. ;       |        57600  |    208,08     |         207           |       0x00CF          |  57692,30     |  0,16 |
  77.  
  78. ;       |       115200  |    103,91     |         103           |       0x0067          | 115384,61     |  0,16 |
  79.  
  80. ;       |       230400  |     51,83     |          51           |       0x0033          | 230769,23     |  0,16 |
  81.  
  82. ;       |       460800  |     25,79     |          25           |       0x0019          | 461538,46     |  0,16 |
  83.  
  84. ;       |       921600  |     12,77     |          12           |       0x000C          | 923076,92     |  0,16 |
  85.  
  86. ;        ---------------------------------------------------------------------------
  87.  
  88. ;                                                                               Tabla 1
  89.  
  90. ;       Lo que el programa hara es recibir caracteres e ir almacenandolos en BufferRx,
  91.  
  92. ;       dejara de recibir caracteres si recibe el caracter enter(0x0D ), si ya han
  93.  
  94. ;       llegado 256 caracteres, o si se ha dejado de recibir caracteres durante 2
  95.  
  96. ;       segundos aproximadamente.
  97.  
  98. ;
  99.  
  100. ;       Cuando se deja de recibir los caracteres , el microcontrolador recorrera el
  101.  
  102. ;       arreglo BufferRx y convertira todas las letras minusculas en mayusculas , la
  103.  
  104. ;       cadena modificada se ira guardando en BufferTx , durante este proceso cualquier
  105.  
  106. ;       caracter recibido sera descartado, una vez que BufferTx haya sido cargado con
  107.  
  108. ;       todos los caracteres estos seran enviados de regreso a la PC.
  109.  
  110. ;
  111.  
  112. ;       Tanto para la recepcion como para la transmision se usran interrupciones,
  113.  
  114. ;       cualquier retardo que se necesite sera realizado usando el TMR0
  115.  
  116. ;**********************************************************************************
  117.  
  118.  
  119.  
  120.         LIST P=18F4550          ;Directiva para definir el procesador
  121.  
  122.         #include <P18F4550.INC> ;Definicion de SFRs para el procesador
  123.  
  124.  
  125.  
  126. ;******************************************************************************
  127.  
  128. ;Bits de Configuracion
  129.  
  130. ;Microchip ha cambiado el formato para definir los bits de configuracion, por favor
  131.  
  132. ;revisar el archivo P18F4550.INC para informacion adicional de la notacion
  133.  
  134. ;Abajo hay algunos ejemplos
  135.  
  136.  
  137.  
  138. ;********       Configuracion del Oscilador     **********
  139.  
  140.     CONFIG      FOSC = XTPLL_XT                 ;Osc XT que pasa a travez del PLL,USB usa
  141.  
  142.                                                                                 ;el Osc XT
  143.  
  144.         CONFIG  PLLDIV = 1                                      ;La entrada del Osc de 4 MHz va directo al PLL
  145.  
  146.         CONFIG  CPUDIV = OSC1_PLL2                      ;La salida del PLL (96 MHz)     , la dividimos entre dos
  147.  
  148.                                                                                 ;para que sea la señal del oscilador del sistema,
  149.  
  150.                                                                                 ;Entoces tenemos 48 MHz
  151.  
  152. ;********       Otros bits de configuracion     **********
  153.  
  154.         CONFIG  PWRT = ON                                       ;PWRT habilitado
  155.  
  156.         CONFIG  BOR  = OFF                                      ;Brown out resete deshabilitado
  157.  
  158.         CONFIG  WDT      = OFF                                  ;Watch dog deshabilitado       
  159.  
  160.         CONFIG  MCLRE = OFF                                     ;MCLR como entrada
  161.  
  162.         CONFIG  PBADEN = ON                                     ;Todos los pines como entradas analogicas
  163.  
  164.         CONFIG  LVP     = OFF                                   ;programacion en bajo voltaje deshabilitado
  165.  
  166. ;*********      Bits de proteccion      ******************
  167.  
  168.         CONFIG  CP0     = OFF                                   ;los bloques del codigo de programa
  169.  
  170.         CONFIG  CP1     = OFF                                   ;no estan protegidos
  171.  
  172.         CONFIG  CP2     = OFF
  173.  
  174.         CONFIG  CP3     = OFF
  175.  
  176.         CONFIG  CPB     = OFF                                   ;Sector Boot no esta protegido
  177.  
  178.         CONFIG  CPD     = OFF                                   ;La EEPROM no esta protegida
  179.  
  180. ;******************************************************************************
  181.  
  182. ; Definicion de variables
  183.  
  184. ; Estas variables son necesarias solo si las interrupciones de baja prioridad son usadas.
  185.  
  186. ; Mas variables podrian se necesarias para almacenar otros SFRs usados en las rutinas de
  187.  
  188. ; interrupcion.
  189.  
  190.  
  191.  
  192.         VelHI   EQU             0x04            ;Estas constantes  sirven para definir la velocidad
  193.  
  194.         VelLO   EQU             0xE1            ;de la comunicacion, 9600 baudios
  195.  
  196.  
  197.  
  198.                 CBLOCK  0x080
  199.  
  200.                 WREG_TEMP               ;variable usada para salvar contexto
  201.  
  202.                 STATUS_TEMP             ;variable usada para salvar contexto
  203.  
  204.                 BSR_TEMP                ;variable usada para salvar contexto
  205.  
  206.                 ENDC
  207.  
  208.  
  209.  
  210.                 CBLOCK  0x000   ;Variables en la ACCESS RAM (Banco 0) max 96 bytes
  211.  
  212.                 ContT0                  ;para contar las veces que TMR0 desborda
  213.  
  214.                 ContRx                  ;para contar los bytes recibidos
  215.  
  216.                 ContTx                  ;para contar los bytes transmitidos
  217.  
  218.                 DatoRx                  ;variable temporal para la recepcion
  219.  
  220.                 DatoTemp                ;usado como variable auxiliar
  221.  
  222.                 Banderas
  223.  
  224.                 TablaOffs               ;Para movernos en las tablas
  225.  
  226.                 ENDC
  227.  
  228.  
  229.  
  230.                 CBLOCK  0x100   ;Variables en el Banco 1
  231.  
  232.                 BufferRx:.256   ;Buffer para la recepcion
  233.  
  234.                 ENDC
  235.  
  236.  
  237.  
  238.                 CBLOCK  0x200   ;Variables en el banco 2
  239.  
  240.                 BufferTx:.256   ;Buffer para la transmision
  241.  
  242.                 ENDC   
  243.  
  244.  
  245.  
  246.         #DEFINE         TimeOut                 Banderas,.0                     ;=1 si el pasan 2 seg
  247.  
  248.         #DEFINE         RxOK                    Banderas,.1                     ;=1 si se termino de recibir
  249.  
  250.         #DEFINE         TxOK                    Banderas,.2
  251.  
  252. ;******************************************************************************
  253.  
  254. ;Datos de la EEPROM
  255.  
  256. ;Los Datos a ser programados en la  EEPROM son definidos aqui
  257.  
  258.  
  259.  
  260.                 ORG     0xf00000
  261.  
  262.  
  263.  
  264.                 DE      "Test Data",0,1,2,3,4,5
  265.  
  266.  
  267.  
  268. ;******************************************************************************
  269.  
  270. ; Vector de Reset.
  271.  
  272. ; Este codigo comenzara a ejecutarse cuando suceda un reset
  273.  
  274.  
  275.  
  276.                 ORG     0x0000
  277.  
  278.  
  279.  
  280.                 goto    Main            ;Se va al inicio del codigo principal
  281.  
  282.  
  283.  
  284. ;******************************************************************************
  285.  
  286. ; Vector de interrupcion de alta prioridad
  287.  
  288. ; Este codigo comenzara a ejecutarse cuando una interrupcion de alta prioridad ocurra
  289.  
  290. ; o cuando cualquier interrupcion ocurra si es que las prioridades de las interrupciones
  291.  
  292. ; no estan habilitadas
  293.  
  294.  
  295.  
  296.                 ORG     0x0008
  297.  
  298.  
  299.  
  300.         bra             LowInt                                  ;cuando las prioridades estan deshabilitadas
  301.  
  302.                                                                         ;se salta a 0x0008 en caso de interrupcion
  303.  
  304. ;******************************************************************************
  305.  
  306. ; Vector de interrupcion de baja prioridad y rutina
  307.  
  308. ; Este codigo comenzara a ejecutrase cuando una interrupcion de baja prioridad ocurra
  309.  
  310. ; Este codigo puede ser eliminado si las interrupciones de baja prioridad no son usadas
  311.  
  312.  
  313.  
  314.                 ORG     0x0018
  315.  
  316. LowInt
  317.  
  318.         movff   STATUS,STATUS_TEMP              ;Salva el registro STATUS
  319.  
  320.         movff   WREG,WREG_TEMP                  ;Salva el registro de trabajo
  321.  
  322.         movff   BSR,BSR_TEMP                    ;Salva el registro BSR
  323.  
  324.  
  325.  
  326. ;       *** El codigo de la interrupcion de baja prioridad va aqui ***
  327.  
  328.         btfsc   INTCON,TMR0IF                   ;Interrupcion del TMR0
  329.  
  330.         bra             IntT0                                   ;Si => vamos a IntT0
  331.  
  332.         btfsc   PIR1,RCIF                               ;No => interupcion de recepcion?
  333.  
  334.         bra             IntRx                                   ;Si => vamos a IntRx
  335.  
  336.         btfsc   PIR1,TXIF                               ;No => interrupcion de transmision?
  337.  
  338.         bra             IntTx                                   ;Si => vamos a IntTx
  339.  
  340.         movlw   .6                                              ;No => enviamos mensaje de error
  341.  
  342.         call    EnvMsg                                  ;
  343.  
  344.         sleep                                                   ;y dormimos
  345.  
  346.  
  347.  
  348. ;****************************   IntT0   **********************************
  349.  
  350. ;       IntT0   atiende la interrupcion de desborde del TMR0 y controla
  351.  
  352. ;                       cuando transcuren dos segundos sin recibir nada para producir
  353.  
  354. ;       el time out
  355.  
  356. ;*************************************************************************
  357.  
  358. IntT0
  359.  
  360.         movlw   0x61
  361.  
  362.         movwf   TMR0L                                   ;recargamos TMR0L, para desbordes de 100 ms
  363.  
  364.         bcf             INTCON,TMR0IF                   ;limpiamos la bandera de interrupcion
  365.  
  366.         decfsz  ContT0                                  ;ContT0 --, ya paso 2 seg?
  367.  
  368.         bra             IntT0_X                                 ;No => salimos
  369.  
  370.         bsf             TimeOut                                 ;Si => indicamos que hubo un time out
  371.  
  372.         bra             IntT0_X
  373.  
  374. IntT0_X
  375.  
  376.         bra             SalirInt                                ;Vamos a salir de las interrupciones
  377.  
  378. ;****************************************************************************
  379.  
  380.  
  381.  
  382. ;****************************   IntRx   **********************************
  383.  
  384. ;       IntRx   se encarga de guardar los bytes recibidos en el BufferRx,
  385.  
  386. ;                       descarta los bytes recibidos cuando se esta procesando la trama
  387.  
  388. ;       ademas controla cuando el buffer de recepcion desborda
  389.  
  390. ;*************************************************************************
  391.  
  392. IntRx
  393.  
  394.         btfsc   RCSTA,OERR                              ;Desbordo el buffer de recepcion?
  395.  
  396.         bra             IntRx_Er1                               ;vamos a atender el error
  397.  
  398.         btfsc   RxOK                                    ;termino la recepcion?
  399.  
  400.         bra             IntRx_P1                                ;Si => vamos a descartar el caracter recibido  
  401.  
  402.  
  403.  
  404.         movf    RCREG,W,.0                              ;No => guardamos el caracter
  405.  
  406.         movwf   DatoRx
  407.  
  408.         movlw   0x0D                                    ;Revisamos si se recibio enter
  409.  
  410.         xorwf   DatoRx,W,.0                            
  411.  
  412.         btfsc   STATUS,Z                                ;RCREG == 0x0D?, se recibio 0x0D(enter)?
  413.  
  414.         bra             IntRx_P0_1                              ;Si => vamos a terminar la recepcion
  415.  
  416.         movf    DatoRx,W,.0                             ;No => guardamos el caracter
  417.  
  418.         movwf   POSTINC0                                ;Guardamos e incrementamos FSR
  419.  
  420.         movlw   .20
  421.  
  422.         movwf   ContT0                                  ;Reiniciamos el contador para el TimeOut
  423.  
  424.         incfsz  ContRx,F,.0                             ;ContRx llego a 256, (desbordo?)
  425.  
  426.         bra             IntRx_X                                 ;No => terminamos
  427.  
  428.                                                                         ;Si => tenemos 256 caracteres recibidos
  429.  
  430. IntRx_P0_1
  431.  
  432.         bsf             RxOK                                    ;ponemos en 1 RxOK     
  433.  
  434.         bra             IntRx_X
  435.  
  436. IntRx_P1
  437.  
  438.         movf    RCREG,W,.0                              ;Descartamos el byte recibido
  439.  
  440.         bra             IntRx_X
  441.  
  442. IntRx_Er1
  443.  
  444.         bcf             RCSTA,CREN
  445.  
  446.         bsf             RCSTA,CREN                              ;Reiniciamos el EUSART
  447.  
  448.         movf    RCREG,W,.0                              ;Descartamos el byte recibido  
  449.  
  450. IntRx_X
  451.  
  452.         bra             SalirInt                                ;Vamos a salir de las interrupciones
  453.  
  454. ;**********************************************************************************
  455.  
  456.  
  457.  
  458. ;*******************************        IntTx   ***************************************
  459.  
  460. ;       IntTx   Atiende la interrupcion que se produce cuando el TXREG envia su
  461.  
  462. ;                       dato a al registro TSR, por lo aqui se copia el nuevo valor a
  463.  
  464. ;       transmitir a TXREG, esto mientras ContTx > 0.
  465.  
  466. ;**********************************************************************************
  467.  
  468. IntTx
  469.  
  470.         decfsz  ContTx,F,.0                             ;ContTx --, ContTx == 0?
  471.  
  472.         bra             IntTxP0                                 ;No => vamos a cargar otro caracter
  473.  
  474.         bra             IntTxP1                                 ;Si => vamos a terminar la transmision
  475.  
  476. IntTxP0
  477.  
  478.         movf    POSTINC1,W                              ;Cargamos el caracter a W e incrementamos FSR1
  479.  
  480.         movwf   TXREG                                   ;Cargamos TXREG
  481.  
  482.         bra             $+2                                             ;Esperamos a que TXIF se ponga en cero
  483.  
  484.         bra             IntTx_X                                 ;vamos a salir de la IntTx
  485.  
  486. IntTxP1
  487.  
  488.         bsf             TxOK                                    ;Indicamos que la transmision termino
  489.  
  490.         bcf             PIE1,TXIE                               ;Deshabilitamos esta interrupcion
  491.  
  492.         bra             IntTx_X                                 ;vamos a salir de la IntTx
  493.  
  494. IntTx_X
  495.  
  496.         bra             SalirInt                                ;Vamos a salir de las interrupciones
  497.  
  498. ;**********************************************************************************
  499.  
  500.  
  501.  
  502.  
  503.  
  504. SalirInt
  505.  
  506.         movff   BSR_TEMP,BSR                    ;recupera el registro BSR
  507.  
  508.         movff   WREG_TEMP,WREG                  ;recupera el registro de trabajo
  509.  
  510.         movff   STATUS_TEMP,STATUS              ;recupera el registro STATUS
  511.  
  512.         retfie
  513.  
  514.  
  515.  
  516. ;******************************************************************************
  517.  
  518. ; Rutina de interrupcion de alta prioridad
  519.  
  520. ; El codigo para la rutina de interrupcion de alta prioridad es colocado aqui para
  521.  
  522. ; evitar conflictos con el vector de interrupciones de baja prioridad
  523.  
  524.  
  525.  
  526. HighInt:
  527.  
  528.  
  529.  
  530. ;       *** El codigo para las interrupciones de alta prioridad va aqui ***
  531.  
  532.  
  533.  
  534.  
  535.  
  536.                 retfie  FAST
  537.  
  538.  
  539.  
  540. ;******************************************************************************
  541.  
  542. ; Comienzo del programa principal
  543.  
  544. ; El codigo del programa principal es colocado aqui
  545.  
  546.  
  547.  
  548. Main:
  549.  
  550.  
  551.  
  552. ;       *** EL codigo principal va aqui ***
  553.  
  554.  
  555.  
  556. ;************************       Inicializacion de Puertos       ***********************
  557.  
  558.  
  559.  
  560.         movlw   B'00001111'
  561.  
  562.         movwf   ADCON1,.0                               ;Todos los pines como I/O digitales
  563.  
  564.                                                                         ;NO ES NECESARIO MODIFICAR LOS REGISTROS
  565.  
  566.                                                                         ;TRIS (estan todos en 1)
  567.  
  568. ;************************       Configuracion del EUSART        ***********************
  569.  
  570.  
  571.  
  572.         movlw   B'00000100'                             ;Configuramos para una transmision de 8 bit(bit 6)
  573.  
  574.         movwf   TXSTA,.0                                ;modo asincrono (bit 4),para ajustar los baudios
  575.  
  576.                                                                         ;BRGH = 1 (bit 2)
  577.  
  578.  
  579.  
  580.         movlw   B'01001000'                             ;Habilitamos los 16 bits del generador de baudios
  581.  
  582.         movwf   BAUDCON,.0                              ;BRG16 = 1 (bit 3)
  583.  
  584.        
  585.  
  586.         movlw   VelHI                                   ;Cargamos los registros SPBRGH:SPBRG con los
  587.  
  588.         movwf   SPBRGH,.0                               ;valores de la tabla 1 para la velocidad deseada
  589.  
  590.         movlw   VelLO
  591.  
  592.         movwf   SPBRG,.0
  593.  
  594.  
  595.  
  596.         movlw   B'10010000'                             ;Habilitamos el puerto seria (Bit 7), modo 8 bits
  597.  
  598.         movwf   RCSTA                                   ;(bit 6), y habilitamos el receptor (Bit 4).
  599.  
  600.  
  601.  
  602. ;***********************        Configuracion del TMR0          *************************
  603.  
  604.         movlw   B'10010110'                             ;TMR0 on, modo 16 bits, cambia con las
  605.  
  606.         movwf   T0CON,.0                                ;instrucciones, asignamos preescaler de 128
  607.  
  608.  
  609.  
  610.         movlw   0xDB                                    ;De acuerdo a BlinkT0.asm calculamos los valores a
  611.  
  612.         movwf   TMR0H,.0                                ;cargar para TMR0H y TMR0L, para el oscilador  
  613.  
  614.         movlw   0x61                                    ;de 48 MHz. y un tiempo de 100 ms
  615.  
  616.         movwf   TMR0L,.0                                ;
  617.  
  618.  
  619.  
  620.         movlw   .20                                             ;
  621.  
  622.         movwf   ContT0,.0                               ;ContT0 = 20 para controlar 2 segundos
  623.  
  624. ;**********************         Configuracion de interrupciones **********************
  625.  
  626.  
  627.  
  628.         bsf             PIE1,RCIE,</