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

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

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 624
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 electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 624
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 electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

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: 624
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 electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 624
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 electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

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: 2059
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: 624
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 electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2059
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: 624
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


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 electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 624
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. ;   Nombre:             TxRx_0.asm
  6.  
  7. ;   Fecha:              02/09/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 muestra el uso del EUSART para realizar una comunicacion
  30.  
  31. ;                       asincrona con la PC, para este ejemplo configuraremos el oscilador
  32.  
  33. ;       para que funcione a 48 MHz usando un cristal externo de 4 MHz.
  34.  
  35. ;
  36.  
  37. ;       Para configurar la  velocidad de transmision  se usara el modo de 16 bits y
  38.  
  39. ;       el modo de alta de velocidad para el generador de baudios (BRG16=1; BRGH=1),
  40.  
  41. ;       para este caso tenemos que la velocidad esta dada por:
  42.  
  43. ;
  44.  
  45. ;       Vel = Fosc/[4(n+1)]             Donde n es el valor que se carga a SPBRGH:SPBRG
  46.  
  47. ;       n = [(Fosc/Vel)-1]/4   
  48.  
  49. ;
  50.  
  51. ;        ---------------------------------------------------------------------------
  52.  
  53. ;       |Velocidad      |Valor n        |Valor para             |Valor Hex para |Velocidad      | %             |
  54.  
  55. ;       |(Baudios)      |                       |SPBRGH:SPBRG   |SPBRGH:SPBRG   |real           | Error |
  56.  
  57. ;        ---------------------------------------------------------------------------
  58.  
  59. ;       |          110  | 109090,66     |       --------        |       --------        |       ------- | ----- |
  60.  
  61. ;       |          300  |  39999,75     |       39999           |       0x9C3F          |        300    |  0    |
  62.  
  63. ;       |         1200  |   9999,75     |        9999           |       0x270F          |       1200    |  0    |
  64.  
  65. ;       |         2400  |   4999,75     |        4999           |       0xC34F          |       2400    |  0    |
  66.  
  67. ;       |         4800  |   2499,75     |        2499           |       0x09C3          |       4800    |  0    |
  68.  
  69. ;       |         9600  |   1249,75     |        1249           |       0x04E1          |       9600    |  0    |
  70.  
  71. ;       |        19600  |    611,99     |         611           |       0x0263          |  19607,84     |  0,04 |
  72.  
  73. ;       |        38400  |    312,25     |         312           |       0x0137          |  38338,65     |  0,16 |
  74.  
  75. ;       |        57600  |    208,08     |         207           |       0x00CF          |  57692,30     |  0,16 |
  76.  
  77. ;       |       115200  |    103,91     |         103           |       0x0067          | 115384,61     |  0,16 |
  78.  
  79. ;       |       230400  |     51,83     |          51           |       0x0033          | 230769,23     |  0,16 |
  80.  
  81. ;       |       460800  |     25,79     |          25           |       0x0019          | 461538,46     |  0,16 |
  82.  
  83. ;       |       921600  |     12,77     |          12           |       0x000C          | 923076,92     |  0,16 |
  84.  
  85. ;        ---------------------------------------------------------------------------
  86.  
  87. ;                                                                               Tabla 1
  88.  
  89. ;       Lo que el programa hara es recibir caracteres e ir almacenandolos en BufferRx,
  90.  
  91. ;       dejara de recibir caracteres si recibe el caracter enter(0x0D ), si ya han
  92.  
  93. ;       llegado 256 caracteres, o si se ha dejado de recibir caracteres durante 2
  94.  
  95. ;       segundos aproximadamente.
  96.  
  97. ;
  98.  
  99. ;       Cuando se deja de recibir los caracteres , el microcontrolador recorrera el
  100.  
  101. ;       arreglo BufferRx y convertira todas las letras minusculas en mayusculas , la
  102.  
  103. ;       cadena modificada se ira guardando en BufferTx , durante este proceso cualquier
  104.  
  105. ;       caracter recibido sera descartado, una vez que BufferTx haya sido cargado con
  106.  
  107. ;       todos los caracteres estos seran enviados de regreso a la PC.
  108.  
  109. ;
  110.  
  111. ;       Tanto para la recepcion como para la transmision se usran interrupciones,
  112.  
  113. ;       cualquier retardo que se necesite sera realizado usando el TMR0
  114.  
  115. ;**********************************************************************************
  116.  
  117.  
  118.  
  119.         LIST P=18F4550          ;Directiva para definir el procesador
  120.  
  121.         #include <P18F4550.INC> ;Definicion de SFRs para el procesador
  122.  
  123.  
  124.  
  125. ;******************************************************************************
  126.  
  127. ;Bits de Configuracion
  128.  
  129. ;Microchip ha cambiado el formato para definir los bits de configuracion, por favor
  130.  
  131. ;revisar el archivo P18F4550.INC para informacion adicional de la notacion
  132.  
  133. ;Abajo hay algunos ejemplos
  134.  
  135.  
  136.  
  137. ;********       Configuracion del Oscilador     **********
  138.  
  139.     CONFIG      FOSC = XTPLL_XT                 ;Osc XT que pasa a travez del PLL,USB usa
  140.  
  141.                                                                                 ;el Osc XT
  142.  
  143.         CONFIG  PLLDIV = 1                                      ;La entrada del Osc de 4 MHz va directo al PLL
  144.  
  145.         CONFIG  CPUDIV = OSC1_PLL2                      ;La salida del PLL (96 MHz)     , la dividimos entre dos
  146.  
  147.                                                                                 ;para que sea la señal del oscilador del sistema,
  148.  
  149.                                                                                 ;Entoces tenemos 48 MHz
  150.  
  151. ;********       Otros bits de configuracion     **********
  152.  
  153.         CONFIG  PWRT = ON                                       ;PWRT habilitado
  154.  
  155.         CONFIG  BOR  = OFF                                      ;Brown out resete deshabilitado
  156.  
  157.         CONFIG  WDT      = OFF                                  ;Watch dog deshabilitado       
  158.  
  159.         CONFIG  MCLRE = OFF                                     ;MCLR como entrada
  160.  
  161.         CONFIG  PBADEN = ON                                     ;Todos los pines como entradas analogicas
  162.  
  163.         CONFIG  LVP     = OFF                                   ;programacion en bajo voltaje deshabilitado
  164.  
  165. ;*********      Bits de proteccion      ******************
  166.  
  167.         CONFIG  CP0     = OFF                                   ;los bloques del codigo de programa
  168.  
  169.         CONFIG  CP1     = OFF                                   ;no estan protegidos
  170.  
  171.         CONFIG  CP2     = OFF
  172.  
  173.         CONFIG  CP3     = OFF
  174.  
  175.         CONFIG  CPB     = OFF                                   ;Sector Boot no esta protegido
  176.  
  177.         CONFIG  CPD     = OFF                                   ;La EEPROM no esta protegida
  178.  
  179. ;******************************************************************************
  180.  
  181. ; Definicion de variables
  182.  
  183. ; Estas variables son necesarias solo si las interrupciones de baja prioridad son usadas.
  184.  
  185. ; Mas variables podrian se necesarias para almacenar otros SFRs usados en las rutinas de
  186.  
  187. ; interrupcion.
  188.  
  189.  
  190.  
  191.         VelHI   EQU             0x04            ;Estas constantes  sirven para definir la velocidad
  192.  
  193.         VelLO   EQU             0xE1            ;de la comunicacion, 9600 baudios
  194.  
  195.  
  196.  
  197.                 CBLOCK  0x080
  198.  
  199.                 WREG_TEMP               ;variable usada para salvar contexto
  200.  
  201.                 STATUS_TEMP             ;variable usada para salvar contexto
  202.  
  203.                 BSR_TEMP                ;variable usada para salvar contexto
  204.  
  205.                 ENDC
  206.  
  207.  
  208.  
  209.                 CBLOCK  0x000   ;Variables en la ACCESS RAM (Banco 0) max 96 bytes
  210.  
  211.                 ContT0                  ;para contar las veces que TMR0 desborda
  212.  
  213.                 ContRx                  ;para contar los bytes recibidos
  214.  
  215.                 ContTx                  ;para contar los bytes transmitidos
  216.  
  217.                 DatoRx                  ;variable temporal para la recepcion
  218.  
  219.                 DatoTemp                ;usado como variable auxiliar
  220.  
  221.                 Banderas
  222.  
  223.                 TablaOffs               ;Para movernos en las tablas
  224.  
  225.                 ENDC
  226.  
  227.  
  228.  
  229.                 CBLOCK  0x100   ;Variables en el Banco 1
  230.  
  231.                 BufferRx:.256   ;Buffer para la recepcion
  232.  
  233.                 ENDC
  234.  
  235.  
  236.  
  237.                 CBLOCK  0x200   ;Variables en el banco 2
  238.  
  239.                 BufferTx:.256   ;Buffer para la transmision
  240.  
  241.                 ENDC   
  242.  
  243.  
  244.  
  245.         #DEFINE         TimeOut                 Banderas,.0                     ;=1 si el pasan 2 seg
  246.  
  247.         #DEFINE         RxOK                    Banderas,.1                     ;=1 si se termino de recibir
  248.  
  249.         #DEFINE         TxOK                    Banderas,.2
  250.  
  251. ;******************************************************************************
  252.  
  253. ;Datos de la EEPROM
  254.  
  255. ;Los Datos a ser programados en la  EEPROM son definidos aqui
  256.  
  257.  
  258.  
  259.                 ORG     0xf00000
  260.  
  261.  
  262.  
  263.                 DE      "Test Data",0,1,2,3,4,5
  264.  
  265.  
  266.  
  267. ;******************************************************************************
  268.  
  269. ; Vector de Reset.
  270.  
  271. ; Este codigo comenzara a ejecutarse cuando suceda un reset
  272.  
  273.  
  274.  
  275.                 ORG     0x0000
  276.  
  277.  
  278.  
  279.                 goto    Main            ;Se va al inicio del codigo principal
  280.  
  281.  
  282.  
  283. ;******************************************************************************
  284.  
  285. ; Vector de interrupcion de alta prioridad
  286.  
  287. ; Este codigo comenzara a ejecutarse cuando una interrupcion de alta prioridad ocurra
  288.  
  289. ; o cuando cualquier interrupcion ocurra si es que las prioridades de las interrupciones
  290.  
  291. ; no estan habilitadas
  292.  
  293.  
  294.  
  295.                 ORG     0x0008
  296.  
  297.  
  298.  
  299.         bra             LowInt                                  ;cuando las prioridades estan deshabilitadas
  300.  
  301.                                                                         ;se salta a 0x0008 en caso de interrupcion
  302.  
  303. ;******************************************************************************
  304.  
  305. ; Vector de interrupcion de baja prioridad y rutina
  306.  
  307. ; Este codigo comenzara a ejecutrase cuando una interrupcion de baja prioridad ocurra
  308.  
  309. ; Este codigo puede ser eliminado si las interrupciones de baja prioridad no son usadas
  310.  
  311.  
  312.  
  313.                 ORG     0x0018
  314.  
  315. LowInt
  316.  
  317.         movff   STATUS,STATUS_TEMP              ;Salva el registro STATUS
  318.  
  319.         movff   WREG,WREG_TEMP                  ;Salva el registro de trabajo
  320.  
  321.         movff   BSR,BSR_TEMP                    ;Salva el registro BSR
  322.  
  323.  
  324.  
  325. ;       *** El codigo de la interrupcion de baja prioridad va aqui ***
  326.  
  327.         btfsc   INTCON,TMR0IF                   ;Interrupcion del TMR0
  328.  
  329.         bra             IntT0                                   ;Si => vamos a IntT0
  330.  
  331.         btfsc   PIR1,RCIF                               ;No => interupcion de recepcion?
  332.  
  333.         bra             IntRx                                   ;Si => vamos a IntRx
  334.  
  335.         btfsc   PIR1,TXIF                               ;No => interrupcion de transmision?
  336.  
  337.         bra             IntTx                                   ;Si => vamos a IntTx
  338.  
  339.         movlw   .6                                              ;No => enviamos mensaje de error
  340.  
  341.         call    EnvMsg                                  ;
  342.  
  343.         sleep                                                   ;y dormimos
  344.  
  345.  
  346.  
  347. ;****************************   IntT0   **********************************
  348.  
  349. ;       IntT0   atiende la interrupcion de desborde del TMR0 y controla
  350.  
  351. ;                       cuando transcuren dos segundos sin recibir nada para producir
  352.  
  353. ;       el time out
  354.  
  355. ;*************************************************************************
  356.  
  357. IntT0
  358.  
  359.         movlw   0x61
  360.  
  361.         movwf   TMR0L                                   ;recargamos TMR0L, para desbordes de 100 ms
  362.  
  363.         bcf             INTCON,TMR0IF                   ;limpiamos la bandera de interrupcion
  364.  
  365.         decfsz  ContT0                                  ;ContT0 --, ya paso 2 seg?
  366.  
  367.         bra             IntT0_X                                 ;No => salimos
  368.  
  369.         bsf             TimeOut                                 ;Si => indicamos que hubo un time out
  370.  
  371.         bra             IntT0_X
  372.  
  373. IntT0_X
  374.  
  375.         bra             SalirInt                                ;Vamos a salir de las interrupciones
  376.  
  377. ;****************************************************************************
  378.  
  379.  
  380.  
  381. ;****************************   IntRx   **********************************
  382.  
  383. ;       IntRx   se encarga de guardar los bytes recibidos en el BufferRx,
  384.  
  385. ;                       descarta los bytes recibidos cuando se esta procesando la trama
  386.  
  387. ;       ademas controla cuando el buffer de recepcion desborda
  388.  
  389. ;*************************************************************************
  390.  
  391. IntRx
  392.  
  393.         btfsc   RCSTA,OERR                              ;Desbordo el buffer de recepcion?
  394.  
  395.         bra             IntRx_Er1                               ;vamos a atender el error
  396.  
  397.         btfsc   RxOK                                    ;termino la recepcion?
  398.  
  399.         bra             IntRx_P1                                ;Si => vamos a descartar el caracter recibido  
  400.  
  401.  
  402.  
  403.         movf    RCREG,W,.0                              ;No => guardamos el caracter
  404.  
  405.         movwf   DatoRx
  406.  
  407.         movlw   0x0D                                    ;Revisamos si se recibio enter
  408.  
  409.         xorwf   DatoRx,W,.0                            
  410.  
  411.         btfsc   STATUS,Z                                ;RCREG == 0x0D?, se recibio 0x0D(enter)?
  412.  
  413.         bra             IntRx_P0_1                              ;Si => vamos a terminar la recepcion
  414.  
  415.         movf    DatoRx,W,.0                             ;No => guardamos el caracter
  416.  
  417.         movwf   POSTINC0                                ;Guardamos e incrementamos FSR
  418.  
  419.         movlw   .20
  420.  
  421.         movwf   ContT0                                  ;Reiniciamos el contador para el TimeOut
  422.  
  423.         incfsz  ContRx,F,.0                             ;ContRx llego a 256, (desbordo?)
  424.  
  425.         bra             IntRx_X                                 ;No => terminamos
  426.  
  427.                                                                         ;Si => tenemos 256 caracteres recibidos
  428.  
  429. IntRx_P0_1
  430.  
  431.         bsf             RxOK                                    ;ponemos en 1 RxOK     
  432.  
  433.         bra             IntRx_X
  434.  
  435. IntRx_P1
  436.  
  437.         movf    RCREG,W,.0                              ;Descartamos el byte recibido
  438.  
  439.         bra             IntRx_X
  440.  
  441. IntRx_Er1
  442.  
  443.         bcf             RCSTA,CREN
  444.  
  445.         bsf             RCSTA,CREN                              ;Reiniciamos el EUSART
  446.  
  447.         movf    RCREG,W,.0                              ;Descartamos el byte recibido  
  448.  
  449. IntRx_X
  450.  
  451.         bra             SalirInt                                ;Vamos a salir de las interrupciones
  452.  
  453. ;**********************************************************************************
  454.  
  455.  
  456.  
  457. ;*******************************        IntTx   ***************************************
  458.  
  459. ;       IntTx   Atiende la interrupcion que se produce cuando el TXREG envia su
  460.  
  461. ;                       dato a al registro TSR, por lo aqui se copia el nuevo valor a
  462.  
  463. ;       transmitir a TXREG, esto mientras ContTx > 0.
  464.  
  465. ;**********************************************************************************
  466.  
  467. IntTx
  468.  
  469.         decfsz  ContTx,F,.0                             ;ContTx --, ContTx == 0?
  470.  
  471.         bra             IntTxP0                                 ;No => vamos a cargar otro caracter
  472.  
  473.         bra             IntTxP1                                 ;Si => vamos a terminar la transmision
  474.  
  475. IntTxP0
  476.  
  477.         movf    POSTINC1,W                              ;Cargamos el caracter a W e incrementamos FSR1
  478.  
  479.         movwf   TXREG                                   ;Cargamos TXREG
  480.  
  481.         bra             $+2                                             ;Esperamos a que TXIF se ponga en cero
  482.  
  483.         bra             IntTx_X                                 ;vamos a salir de la IntTx
  484.  
  485. IntTxP1
  486.  
  487.         bsf             TxOK                                    ;Indicamos que la transmision termino
  488.  
  489.         bcf             PIE1,TXIE                               ;Deshabilitamos esta interrupcion
  490.  
  491.         bra             IntTx_X                                 ;vamos a salir de la IntTx
  492.  
  493. IntTx_X
  494.  
  495.         bra             SalirInt                                ;Vamos a salir de las interrupciones
  496.  
  497. ;**********************************************************************************
  498.  
  499.  
  500.  
  501.  
  502.  
  503. SalirInt
  504.  
  505.         movff   BSR_TEMP,BSR                    ;recupera el registro BSR
  506.  
  507.         movff   WREG_TEMP,WREG                  ;recupera el registro de trabajo
  508.  
  509.         movff   STATUS_TEMP,STATUS              ;recupera el registro STATUS
  510.  
  511.         retfie
  512.  
  513.  
  514.  
  515. ;******************************************************************************
  516.  
  517. ; Rutina de interrupcion de alta prioridad
  518.  
  519. ; El codigo para la rutina de interrupcion de alta prioridad es colocado aqui para
  520.  
  521. ; evitar conflictos con el vector de interrupciones de baja prioridad
  522.  
  523.  
  524.  
  525. HighInt:
  526.  
  527.  
  528.  
  529. ;       *** El codigo para las interrupciones de alta prioridad va aqui ***
  530.  
  531.  
  532.  
  533.  
  534.  
  535.                 retfie  FAST
  536.  
  537.  
  538.  
  539. ;******************************************************************************
  540.  
  541. ; Comienzo del programa principal
  542.  
  543. ; El codigo del programa principal es colocado aqui
  544.  
  545.  
  546.  
  547. Main:
  548.  
  549.  
  550.  
  551. ;       *** EL codigo principal va aqui ***
  552.  
  553.  
  554.  
  555. ;************************       Inicializacion de Puertos       ***********************
  556.  
  557.  
  558.  
  559.         movlw   B'00001111'
  560.  
  561.         movwf   ADCON1,.0                               ;Todos los pines como I/O digitales
  562.  
  563.                                                                         ;NO ES NECESARIO MODIFICAR LOS REGISTROS
  564.  
  565.                                                                         ;TRIS (estan todos en 1)
  566.  
  567. ;************************       Configuracion del EUSART        ***********************
  568.  
  569.  
  570.  
  571.         movlw   B'00000100'                             ;Configuramos para una transmision de 8 bit(bit 6)
  572.  
  573.         movwf   TXSTA,.0                                ;modo asincrono (bit 4),para ajustar los baudios
  574.  
  575.                                                                         ;BRGH = 1 (bit 2)
  576.  
  577.  
  578.  
  579.         movlw   B'01001000'                             ;Habilitamos los 16 bits del generador de baudios
  580.  
  581.         movwf   BAUDCON,.0                              ;BRG16 = 1 (bit 3)
  582.  
  583.        
  584.  
  585.         movlw   VelHI                                   ;Cargamos los registros SPBRGH:SPBRG con los
  586.  
  587.         movwf   SPBRGH,.0                               ;valores de la tabla 1 para la velocidad deseada
  588.  
  589.         movlw   VelLO
  590.  
  591.         movwf   SPBRG,.0
  592.  
  593.  
  594.  
  595.         movlw   B'10010000'                             ;Habilitamos el puerto seria (Bit 7), modo 8 bits
  596.  
  597.         movwf   RCSTA                                   ;(bit 6), y habilitamos el receptor (Bit 4).
  598.  
  599.  
  600.  
  601. ;***********************        Configuracion del TMR0          *************************
  602.  
  603.         movlw   B'10010110'                             ;TMR0 on, modo 16 bits, cambia con las
  604.  
  605.         movwf   T0CON,.0                                ;instrucciones, asignamos preescaler de 128
  606.  
  607.  
  608.  
  609.         movlw   0xDB                                    ;De acuerdo a BlinkT0.asm calculamos los valores a
  610.  
  611.         movwf   TMR0H,.0                                ;cargar para TMR0H y TMR0L, para el oscilador  
  612.  
  613.         movlw   0x61                                    ;de 48 MHz. y un tiempo de 100 ms
  614.  
  615.         movwf   TMR0L,.0                                ;
  616.  
  617.  
  618.  
  619.         movlw   .20                                             ;
  620.  
  621.         movwf   ContT0,.0                               ;ContT0 = 20 para controlar 2 segundos
  622.  
  623. ;**********************         Configuracion de interrupciones **********************
  624.  
  625.  
  626.  
  627.         bsf             PIE1,RCIE,.0                    ;Habilitamos la interrupcion de recepcion
  628.  
  629.         bsf             INTCON,TMR0IE,.0                ;Habilitamos la interruocion de desborde del TMR0
  630.  
  631.         bsf             INTCON,PEIE,.0                  ;Habilitamos las interrupciones para los perifericos
  632.  
  633.        
  634.  
  635. ;************************       Inicializacion de variables     ***************************    
  636.  
  637.  
  638.  
  639.         clrf    Banderas,.0
  640.  
  641.         clrf    ContRx,.0                              
  642.  
  643.  
  644.  
  645. ;******************************************************************************
  646.  
  647.         clrf    WREG
  648.  
  649.         rcall   EnvMsg                                  ;Enviamos el primer mensaje
  650.  
  651.         bsf             INTCON,GIE                              ;Habilitamos las interrupciones
  652.  
  653. MainP0
  654.  
  655.         movlw   HIGH BufferRx
  656.  
  657.         movwf   FSR0H,.0
  658.  
  659.         movlw   LOW BufferRx
  660.  
  661.         movwf   FSR0L,.0                                ;FSR0 apunta al inicio de BufferRx
  662.  
  663.         clrf    ContRx,.0                               ;para reiniciar el conteo de bytes recibidos
  664.  
  665.         clrf    Banderas                                ;reiniciamos las banderas
  666.  
  667.         movlw   .20                                             ;reiniciamos el contador del time out
  668.  
  669.         movwf   ContT0,.0                               ;ContT0 = 20 para controlar 2 segundos
  670.  
  671.         movlw   .1
  672.  
  673.         rcall   EnvMsg
  674.  
  675. MainP1
  676.  
  677.         btfsc   TimeOut                                 ;Se produjo un time out?
  678.  
  679.         bra             MainP2                                  ;Si => vamos a atender el timeout
  680.  
  681.         btfsc   RxOK                                    ;No, Se termino la recepcion?
  682.  
  683.         bra             MainP3                                  ;Si => vamos a atender la recepcion
  684.  
  685.         bra             MainP1                                  ;No => continuamos esperando
  686.  
  687.  
  688.  
  689. MainP2
  690.  
  691.         bsf             RxOK                                    ;Para detener la recepcion
  692.  
  693.         movlw   .4
  694.  
  695.         rcall   EnvMsg                                  ;Enviamos el mensaje de timeout
  696.  
  697.         tstfsz  ContRx,.0                               ;ContRx == 0?;
  698.  
  699.         bra             MainP2_P0                               ;No => se recibieron caracteres y vamos a procesarlos
  700.  
  701.         bcf             RxOK                                    ;Si => no se recibieron caracteres,
  702.  
  703.         bra             MainP0                                  ;asi que volvemos a empezar
  704.  
  705. MainP2_P0
  706.  
  707.         movlw   .2
  708.  
  709.         rcall   EnvMsg                                  ;Indicamos que procesamos la trama
  710.  
  711.         rcall   ProcTrama                               ;vamos a procesar la trama
  712.  
  713.         bcf             TimeOut                                 ;reiniciamos las banderas
  714.  
  715.         bra             MainTx                                  ;Vamos a ennviar la nueva trama
  716.  
  717.         bra             MainP0                                  ;Volvemos a empezar
  718.  
  719.  
  720.  
  721. MainP3
  722.  
  723.         tstfsz  ContRx,.0                               ;ContRx == 0?;
  724.  
  725.         bra             MainP3_P0                               ;No => se recibio un 0x0D (enter)
  726.  
  727.         movlw   .5                                              ;Si => se lleno el buffer, y enviamos
  728.  
  729.         rcall   EnvMsg                                  ;el mensaje respectivo
  730.  
  731. MainP3_P0
  732.  
  733.         movlw   .2
  734.  
  735.         rcall   EnvMsg                                  ;Indicamos que procesamos la trama
  736.  
  737.         rcall   ProcTrama                               ;vamos a procesar la trama
  738.  
  739.         bra             MainTx                                  ;Vamos a Enviar la nueva trama
  740.  
  741.         bra             MainP0                                  ;Volvemos a empezar
  742.  
  743.  
  744.  
  745. MainTx
  746.  
  747.         movlw   .3
  748.  
  749.         rcall   EnvMsg                                  ;Enviamos el mensaje para transmitir
  750.  
  751.         bsf             TXSTA,TXEN                              ;Habilitamos es transmisor
  752.  
  753.         movf    POSTINC1,W                              ;leemos el dato e incrementamos FSR1
  754.  
  755.         movwf   TXREG                                   ;copiamos el dato a TXREG
  756.  
  757.         bsf             PIE1,TXIE,.0                    ;Habilitamos la interrupcion de transmision
  758.  
  759.         btfss   TxOK                                    ;La transmision termino?
  760.  
  761.         bra             $-2                                             ;No => esperamos
  762.  
  763.         btfss   TXSTA,TRMT                              ;Si => esperamos a que el ultimo caracter sea enviado
  764.  
  765.         bra             $-2                                             ;
  766.  
  767.         bcf             TXSTA,TXEN                              ;cuando se envia el ultimo caracter
  768.  
  769.                                                                         ;deshabilitamos es transmisor
  770.  
  771.         bcf             RxOK                                    ;reniciamos las banderas
  772.  
  773.         bcf             TxOK                                    ;
  774.  
  775.         bra             MainP0                                  ;;Volvemos a empezar   
  776.  
  777. ;*******************************        ProcTrama       ******************************
  778.  
  779. ;       ProcTrama       Copia los datos del buffer de recepcion al buffer de transmision
  780.  
  781. ;                               convirtiendo las minusculas en mayusculas.
  782.  
  783. ;******************************************************************************
  784.  
  785. ProcTrama
  786.  
  787.         movlw   HIGH BufferRx
  788.  
  789.         movwf   FSR0H,.0
  790.  
  791.         movlw   LOW BufferRx
  792.  
  793.         movwf   FSR0L,.0                                ;FSR0  apunta al inicio del BufferRx
  794.  
  795.  
  796.  
  797.         movlw   HIGH BufferTx
  798.  
  799.         movwf   FSR1H,.0
  800.  
  801.         movlw   LOW BufferTx
  802.  
  803.         movwf   FSR1L,.0                                ;FSR1  apunta al inicio del BufferTx
  804.  
  805.         clrf    ContTx,.0                               ;ContTx = 0
  806.  
  807. ProcTramaP0
  808.  
  809.         movf    POSTINC0,W                              ;Cargamos el caracter a W e incrementamos FSR0
  810.  
  811.         movwf   DatoTemp                                ;guardamos el dato para procesar
  812.  
  813.         movlw   'a'
  814.  
  815.         cpfslt  DatoTemp                                ;DatoTemp <'a'
  816.  
  817.         bra             ProcTramaP0_0                   ;No => es >= 'a' vamos a ver si es menor a z
  818.  
  819.         bra             ProcTramaP0_2                   ;Si => no es minuscula y vamos a guardar DatoTemp
  820.  
  821. ProcTramaP0_0
  822.  
  823.         movlw   'z'
  824.  
  825.         cpfsgt  DatoTemp                                ;DatoTemp > 'z'
  826.  
  827.         bra             ProcTramaP0_1                   ;No => es <= 'z' vamos a convertirlo en mayuscula
  828.  
  829.         bra             ProcTramaP0_2                   ;Si => no es minuscula y vamos a guardar DatoTemp
  830.  
  831. ProcTramaP0_1
  832.  
  833.         movlw   0x20                                    ;le restamos 0x20 al dato para que sea mayuscula
  834.  
  835.         subwf   DatoTemp,F                              ;
  836.  
  837. ProcTramaP0_2
  838.  
  839.         movf    DatoTemp,W                              ;
  840.  
  841.         movwf   POSTINC1                                ;Guardamos el dato e incrementamos FSR1
  842.  
  843.         incf    ContTx,F,.0                             ;ContTx ++     
  844.  
  845.         movf    ContRx,W,.0
  846.  
  847.         cpfseq  ContTx                                  ;ContTx == ContRx ?
  848.  
  849.         bra             ProcTramaP0                             ;No => seguimos copiando
  850.  
  851.  
  852.  
  853.         movlw   HIGH BufferTx                   ;Si => volvemos a apuntar FSR1 a BufferTx, para
  854.  
  855.         movwf   FSR1H,.0                                ;salir
  856.  
  857.         movlw   LOW BufferTx
  858.  
  859.         movwf   FSR1L,.0
  860.  
  861.         return
  862.  
  863. ;******************************************************************************
  864.  
  865.  
  866.  
  867. ;***********************************    EnvMsg  ********************************
  868.  
  869. ;       EnvMsg  Recibe en WREG el numero de mensaje que se quiere enviar, luego  
  870.  
  871. ;                       realiza un "computed goto", para ir a la rutina que atiende el
  872.  
  873. ;       numero de mensaje recibido en WREG.
  874.  
  875. ;******************************************************************************
  876.  
  877.  
  878.  
  879. EnvMsg
  880.  
  881.         rlcf    WREG,.0,.0                              ;WREG = WREG*2, solo se usan posiciones pares
  882.  
  883.         movwf   TablaOffs,.0                    ;guardamos el valor de W en TablaOffs
  884.  
  885.         movlw   UPPER EnvMsgP0                  ;Tomamos la Parte mas alta de EnvMsgP0
  886.  
  887.         movwf   PCLATU,.0                               ;y actualizamos PCLATU
  888.  
  889.         movlw   HIGH EnvMsgP0                   ;Tomamos la Parte alta de EnvMsgP0
  890.  
  891.         movwf   PCLATH,.0                               ;y actualizamos PCLATh
  892.  
  893.         movlw   LOW EnvMsgP0                    ;Tomamos la Parte baja de EnvMsgP0
  894.  
  895.         addwf   TablaOffs,W,.0                  ;y realizamos el calculo para el salto
  896.  
  897.         btfsc   STATUS,C                                ;el salto es mayor de 256?
  898.  
  899.         incf    PCLATH,F,.0                             ;Si => incrementamos PCLATH
  900.  
  901.         movf    TablaOffs,W,.0                  ;leemos el valor a saltar
  902.  
  903.         addwf   PCL,F                                   ;cuando se suma TablaOffs a PCL se realiza el salto
  904.  
  905. EnvMsgP0
  906.  
  907.         bra             EnvMsg_0                                ;Vamos a atender el mensaje respectivo
  908.  
  909.         bra             EnvMsg_1
  910.  
  911.         bra             EnvMsg_2
  912.  
  913.         bra             EnvMsg_3
  914.  
  915.         bra             EnvMsg_4
  916.  
  917.         bra             EnvMsg_5
  918.  
  919.         bra             EnvMsg_6
  920.  
  921. EnvMsg_0
  922.  
  923.         movlw   UPPER Msg_0                             ;tomamos la parte mas alta del mensage que enviaremos
  924.  
  925.         movwf   TBLPTRU,.0                              ;y la actualizamos TBLPTRU
  926.  
  927.         movlw   HIGH Msg_0                              ;tomamos la parte  alta del mensage que enviaremos
  928.  
  929.         movwf   TBLPTRH,.0                              ;y la actualizamos TBLPTRH
  930.  
  931.         movlw   LOW Msg_0                               ;tomamos la parte baja del mensage que enviaremos
  932.  
  933.         movwf   TBLPTRL,.0                              ;y la actualizamos TBLPTRL, Aqui tenemos a TBLPTR
  934.  
  935.                                                                         ;apuntado al inicio del mensaje
  936.  
  937.         rcall   EnviarMsg                               ;llamamos a enviar el mensaje
  938.  
  939.         return
  940.  
  941.  
  942.  
  943. EnvMsg_1       
  944.  
  945.         movlw   UPPER Msg_1                             ;tomamos la parte mas alta del mensage que enviaremos
  946.  
  947.         movwf   TBLPTRU,.0                              ;y la actualizamos TBLPTRU
  948.  
  949.         movlw   HIGH Msg_1                              ;tomamos la parte  alta del mensage que enviaremos
  950.  
  951.         movwf   TBLPTRH,.0                              ;y la actualizamos TBLPTRH
  952.  
  953.         movlw   LOW Msg_1                               ;tomamos la parte baja del mensage que enviaremos
  954.  
  955.         movwf   TBLPTRL,.0                              ;y la actualizamos TBLPTRL, Aqui tenemos a TBLPTR
  956.  
  957.                                                                         ;apuntado al inicio del mensaje
  958.  
  959.         rcall   EnviarMsg                               ;llamamos a enviar el mensaje
  960.  
  961.         return
  962.  
  963. EnvMsg_2       
  964.  
  965.         movlw   UPPER Msg_2                             ;tomamos la parte mas alta del mensage que enviaremos
  966.  
  967.         movwf   TBLPTRU,.0                              ;y la actualizamos TBLPTRU
  968.  
  969.         movlw   HIGH Msg_2                              ;tomamos la parte  alta del mensage que enviaremos
  970.  
  971.         movwf   TBLPTRH,.0                              ;y la actualizamos TBLPTRH
  972.  
  973.         movlw   LOW Msg_2                               ;tomamos la parte baja del mensage que enviaremos
  974.  
  975.         movwf   TBLPTRL,.0                              ;y la actualizamos TBLPTRL, Aqui tenemos a TBLPTR
  976.  
  977.                                                                         ;apuntado al inicio del mensaje
  978.  
  979.         rcall   EnviarMsg                               ;llamamos a enviar el mensaje
  980.  
  981.         return
  982.  
  983. EnvMsg_3       
  984.  
  985.         movlw   UPPER Msg_3                             ;tomamos la parte mas alta del mensage que enviaremos
  986.  
  987.         movwf   TBLPTRU,.0                              ;y la actualizamos TBLPTRU
  988.  
  989.         movlw   HIGH Msg_3                              ;tomamos la parte  alta del mensage que enviaremos
  990.  
  991.         movwf   TBLPTRH,.0                              ;y la actualizamos TBLPTRH
  992.  
  993.         movlw   LOW Msg_3                               ;tomamos la parte baja del mensage que enviaremos
  994.  
  995.         movwf   TBLPTRL,.0                              ;y la actualizamos TBLPTRL, Aqui tenemos a TBLPTR
  996.  
  997.                                                                         ;apuntado al inicio del mensaje
  998.  
  999.         rcall   EnviarMsg                               ;llamamos a enviar el mensaje
  1000.  
  1001.         return
  1002.  
  1003. EnvMsg_4       
  1004.  
  1005.         movlw   UPPER Msg_4                             ;tomamos la parte mas alta del mensage que enviaremos
  1006.  
  1007.         movwf   TBLPTRU,.0                              ;y la actualizamos TBLPTRU
  1008.  
  1009.         movlw   HIGH Msg_4                              ;tomamos la parte  alta del mensage que enviaremos
  1010.  
  1011.         movwf   TBLPTRH,.0                              ;y la actualizamos TBLPTRH
  1012.  
  1013.         movlw   LOW Msg_4                               ;tomamos la parte baja del mensage que enviaremos
  1014.  
  1015.         movwf   TBLPTRL,.0                              ;y la actualizamos TBLPTRL, Aqui tenemos a TBLPTR
  1016.  
  1017.                                                                         ;apuntado al inicio del mensaje
  1018.  
  1019.         rcall   EnviarMsg                               ;llamamos a enviar el mensaje
  1020.  
  1021.         return
  1022.  
  1023. EnvMsg_5       
  1024.  
  1025.         movlw   UPPER Msg_5                             ;tomamos la parte mas alta del mensage que enviaremos
  1026.  
  1027.         movwf   TBLPTRU,.0                              ;y la actualizamos TBLPTRU
  1028.  
  1029.         movlw   HIGH Msg_5                              ;tomamos la parte  alta del mensage que enviaremos
  1030.  
  1031.         movwf   TBLPTRH,.0                              ;y la actualizamos TBLPTRH
  1032.  
  1033.         movlw   LOW Msg_5                               ;tomamos la parte baja del mensage que enviaremos
  1034.  
  1035.         movwf   TBLPTRL,.0                              ;y la actualizamos TBLPTRL, Aqui tenemos a TBLPTR
  1036.  
  1037.                                                                         ;apuntado al inicio del mensaje
  1038.  
  1039.         rcall   EnviarMsg                               ;llamamos a enviar el mensaje
  1040.  
  1041.         return
  1042.  
  1043. EnvMsg_6       
  1044.  
  1045.         movlw   UPPER Msg_6                             ;tomamos la parte mas alta del mensage que enviaremos
  1046.  
  1047.         movwf   TBLPTRU,.0                              ;y la actualizamos TBLPTRU
  1048.  
  1049.         movlw   HIGH Msg_6                              ;tomamos la parte  alta del mensage que enviaremos
  1050.  
  1051.         movwf   TBLPTRH,.0                              ;y la actualizamos TBLPTRH
  1052.  
  1053.         movlw   LOW Msg_6                               ;tomamos la parte baja del mensage que enviaremos
  1054.  
  1055.         movwf   TBLPTRL,.0                              ;y la actualizamos TBLPTRL, Aqui tenemos a TBLPTR
  1056.  
  1057.                                                                         ;apuntado al inicio del mensaje
  1058.  
  1059.         rcall   EnviarMsg                               ;llamamos a enviar el mensaje
  1060.  
  1061.         return
  1062.  
  1063. ;******************************************************************************
  1064.  
  1065.  
  1066.  
  1067. ;*********************************      EnviarMsg       ******************************
  1068.  
  1069. ;       EnviarMsg       recibe como dato el registro TBLPTR apuntando al mensaje que
  1070.  
  1071. ;                               quiere ser enviado y va recorriendo el mensaje enviando
  1072.  
  1073. ;       caracter por caracter hasta que se encuentre con el caracter 0x00
  1074.  
  1075. ;******************************************************************************
  1076.  
  1077. EnviarMsg
  1078.  
  1079.         tblrd   *+                                              ;Leemos el valor de la tabla e incrementamos
  1080.  
  1081.                                                                         ;el puntero
  1082.  
  1083.         tstfsz  TABLAT,.0                               ;El valor leido es 0x000?
  1084.  
  1085.         bra             EnviarMsgP0                             ;No => vamos a enviar el caracter      
  1086.  
  1087.         return                                                  ;Si => retornamos      
  1088.  
  1089. EnviarMsgP0
  1090.  
  1091.         bsf             TXSTA,TXEN                              ;Habilitamos el transmisor
  1092.  
  1093.         movff   TABLAT,TXREG                    ;Movemos el caracter a TXREG
  1094.  
  1095.         bra             $+2                                             ;espera a que el dato vaya al registro TSR
  1096.  
  1097.         btfss   TXSTA,TRMT                              ;EL caracter fue enviado?
  1098.  
  1099.         bra             $-2                                             ;No => esperamos
  1100.  
  1101.         bcf             TXSTA,TXEN                              ;Si => apagamos el transmisor
  1102.  
  1103.         bra             EnviarMsg                               ;Volvemos a leer el otro caracter
  1104.  
  1105. ;******************************************************************************
  1106.  
  1107.  
  1108.  
  1109. ;******************************************************************************
  1110.  
  1111.  
  1112.  
  1113.         ORG     0x800
  1114.  
  1115.  
  1116.  
  1117. Msg_0
  1118.  
  1119.         DB      '\n','\r'
  1120.  
  1121.         DB      'P','r','o','g','r','a','m','a',' ','e','j','e','m','p','l','o'
  1122.  
  1123.         DB      ' ','p','a','r','a',' ','e','l',' ','u','s','o',' ','d','e','l'
  1124.  
  1125.         DB      ' ','E','U','S','A','R','T','\n','\r',0x00
  1126.  
  1127. Msg_1
  1128.  
  1129.         DB      '\n','\r'
  1130.  
  1131.         DB      'I','n','t','r','o','d','u','z','c','a',' ','l','a',' ','c','a'
  1132.  
  1133.         DB      'd','e','n','a','.','.','.','.','\n','\r',0x00
  1134.  
  1135. Msg_2
  1136.  
  1137.         DB      '\n','\r'
  1138.  
  1139.         DB      'P','r','o','c','e','s','a','n','d','o','.','.','.','\n','\r',0x00
  1140.  
  1141. Msg_3
  1142.  
  1143.         DB      'L','a',' ','n','u','e','v','a',' ','c','a','d','e','n','a',' '
  1144.  
  1145.         DB      'e','s',':','\n','\r',0x00
  1146.  
  1147. Msg_4
  1148.  
  1149.         DB      '\n','\r'
  1150.  
  1151.         DB      'T','i','m','e',' ','o','u','t','\n','\r',0x00
  1152.  
  1153. Msg_5
  1154.  
  1155.         DB      '\n','\r'
  1156.  
  1157.         DB      'B','u','f','f','e','r',' ','d','e',' ','r','e','c','e','p','c'
  1158.  
  1159.         DB      'i','o','n',' ','l','l','e','n','o','\n','\r',0x00
  1160.  
  1161.  
  1162.  
  1163. Msg_6
  1164.  
  1165.         DB      '\n','\r'
  1166.  
  1167.         DB      'E','r','r','o','r','\n','\r',0x00
  1168.  
  1169.        
  1170.  
  1171.                 END                     ;Directiva fin del programa

Este programa al principio tenia como objetivo mostrar una simple comunicacion serial usando el EUSART, pero mientras estaba realizando algo del codigo se me ocurrieron algunas ideas que talvez hicieron el ejemplo mas complicado de lo que tenia pensado para estos ejemplos, bueno lo que se podria aprender de este ejemplo es:

  • 1. Configurar el EUSART para una comunicacion de 8 bits de datos  sin paridad y velocidad de  9600 baudios usando un reloj de 48 MHz, es decir usando un cristal externo de 4 MHz junto con el PLL interno
  • 2. Muestra la recepcion de caracteres con interrupciones, y la transmision de caracteres con y sin interrupciones
  • 3. Muestra el uso del direccionamiento indirecto (usando FSRx e INDFx), para manejar arreglos
  • 4. Muestra como almacenar mensajes de caracteres en la memoria de programa y como manejarlos para enviarlos usando el EUSART
  • 5. Muestra como  realizar saltos calculados (Computed gotos)

Bueno creo que esos son las cosas  mas relevantes  en cuanto a lo que se maneja en el programa, en cuanto al hardware pues no utilizo mas que un MAX232 para adaptar las señales TTL a RS232.

Para las pruebas en protoboard que he realizado he usado el programa para monitorear el puerto serial de CCS (Siow), donde ha funcionado bien, aunque para ver los caracteres que se envian debe de habilitarse el eco local, las pruebas las he realizado con la velocidad de 9600 baudios, y pienso probar con otras velocidades tambien.

En los proximos ejemplos pienso probar otras caracteristicas del EUSART, como su deteccion automatica de baudios, su capacidad de salir del Sleep y otras mas que queden

Saludos
 
« Última modificación: 12 de Octubre de 2008, 03:26:48 por sander »
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Ejemplos PIC18F4550
« Respuesta #14 en: 12 de Octubre de 2008, 10:31:01 »
Que buena guía Sander. Voy a seguir el hilo de serquita.


Por el comentario del usb en asm, me ha dado una idea, que nos puede servir a todos los que trabajamos en asm.

El lenguaje C, es más fácil, por que una de las cosas que tiene, es que ya tiene creadas las rutinas para todo. Desde un teclado hasta el USB. DE esta menera, el programador (usuario) solo se concentra en armar el programa y no hacer toda la comunicación.

Lo que voy hacer, es organizar mis rutinas, y las subiré en un hilo nuevo. Explicaré como usarlo y listo. Además, podremos ir mejorando las rutinas para hacerlas más eficientes y que cada uno las modifique a su gusto. Igual como en C.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.


 

anything