TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: sander en 07 de Agosto de 2008, 23:27:57

Título: Ejemplos PIC18F4550
Publicado por: sander 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


Saludos
Título: Re: Ejemplos PIC18F4550
Publicado por: sander 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
Título: Re: Ejemplos PIC18F4550
Publicado por: Cryn 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
Título: Re: Ejemplos PIC18F4550
Publicado por: Slalen 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:
Título: Re: Ejemplos PIC18F4550
Publicado por: Cryn en 09 de Agosto de 2008, 11:07:24
Citar
controlar el USB con ensamblador :mrgreen:

lo mismo iba a decir :mrgreen:
esperare eso :-/
Título: Re: Ejemplos PIC18F4550
Publicado por: sander 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

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


Título: Re: Ejemplos PIC18F4550
Publicado por: sander 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
Título: Re: Ejemplos PIC18F4550
Publicado por: Lock 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.
Título: Re: Ejemplos PIC18F4550
Publicado por: RALF2 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
Título: Re: Ejemplos PIC18F4550
Publicado por: sander 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
Título: Re: Ejemplos PIC18F4550
Publicado por: RALF2 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!
Título: Re: Ejemplos PIC18F4550
Publicado por: picNIC 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 (http://pe.ece.olin.edu/ece/projects.html)...
Aunque todavia no estudie el programa parece que puede servir de guia..

Sal u 2
Título: Re: Ejemplos PIC18F4550
Publicado por: sander 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
Título: Re: Ejemplos PIC18F4550
Publicado por: sander 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:


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
 
Título: Re: Ejemplos PIC18F4550
Publicado por: Leon Pic 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.
Título: Re: Ejemplos PIC18F4550
Publicado por: sander en 12 de Octubre de 2008, 12:10:50
Saludos Leon Pic, Me parece muy buena tu idea de organizar tus rutinas , yo voy hacer lo propio con las rutinas que voy escribiendo para este PIC tratando de hacerlas lo mas generales posibles. se me esta ocurriendo que talvez el ultimo ejemplo podria ser el uso de las rutinas que  voy escribiendo usando el MPLINK, como si de librerias se trataran, pero en realidad para ese ultimo ejemplo falta muucho todavia, hay varias cosas que quiero probar antes.

Título: Re: Ejemplos PIC18F4550
Publicado por: Leon Pic en 16 de Noviembre de 2008, 14:46:29
Lo prometido es deuda http://www.todopic.com.ar/foros/index.php?topic=23812.msg191686#msg191686
Título: Re: Ejemplos PIC18F4550
Publicado por: epacho1 en 14 de Enero de 2009, 13:33:59
Felicitaciones a tu aporte, me parece excelente que programes en ASSEMBLER, yo programo en C y en Basic tambien, pero creo que en asm tu aprendes el funcionamiento del uC muy a fondo ya que tienens que configurarlo por completo para que funcione. Me gustaria saber si ya has creado un programa para USB pero en asm???

Saludos
Título: Re: Ejemplos PIC18F4550
Publicado por: LABmouse en 15 de Mayo de 2009, 23:58:34
sander,
Quiero agradecerte por colocar estos códigos en ASM tan pero tan bien explicados.. Te felicito por ser tan organizado.

SALUDOS!
Título: Re: Ejemplos PIC18F4550
Publicado por: silcarmig en 19 de Junio de 2010, 17:42:51
GRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIAS
Título: Re: Ejemplos PIC18F4550
Publicado por: cosmic en 21 de Noviembre de 2010, 16:37:13
Amigo sander como estas? :)
Gracias por los ejemplos
Tienes un ejemplo de conversion AD con este pic.. :-/
Gracias de nuevo y hasta pronto.
Título: Re: Ejemplos PIC18F4550
Publicado por: c@Lic_0 en 24 de Enero de 2011, 22:31:52
felicidades por el trabajo que realizas, por ahi me entro una 'dudilla', cuando reservas memoria para:
      CBLOCK   0x080       
                                     WREG_TEMP      ;variable usada para salvar contexto       
                                     STATUS_TEMP      ;variable usada para salvar contexto       
                                     BSR_TEMP      ;variable usada para salvar contexto       
                                ENDC
es la que usas para salvar contexto cuando llega la interrupcion, estos registros no se guardan de manera automatica cuando llega la interrupcion en los pic18?¡?¡?
Título: Re: Ejemplos PIC18F4550
Publicado por: sander en 25 de Enero de 2011, 11:53:57
felicidades por el trabajo que realizas, por ahi me entro una 'dudilla', cuando reservas memoria para:
      CBLOCK   0x080       
                                     WREG_TEMP      ;variable usada para salvar contexto       
                                     STATUS_TEMP      ;variable usada para salvar contexto       
                                     BSR_TEMP      ;variable usada para salvar contexto       
                                ENDC
es la que usas para salvar contexto cuando llega la interrupcion, estos registros no se guardan de manera automatica cuando llega la interrupcion en los pic18?¡?¡?

Hola c@lic_0,  los registros se guardan de manera automatica cuando, se salta al vector de interrupcion 0x0008 (el de alta prioridad o de modo compatible), pero si vas a usar interrupciones de baja prioridad(direccion 0x0018) necesitas guardar estos registros, ya que estos no se guardan solos.

Saludos
Título: Re: Ejemplos PIC18F4550
Publicado por: c@Lic_0 en 09 de Febrero de 2011, 13:14:47

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



   LIST P=18F4550      ;Directiva para definir el procesador

   #include <P18F4550.INC>   ;Definicion de SFRs para el procesador



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

;Bits de Configuracion

;Microchip ha cambiado el formato para definir los bits de configuracion, por favor

;revisar el archivo P18F4550.INC para informacion adicional de la notacion

;Abajo hay algunos ejemplos



;********   Configuracion del Oscilador   **********

    CONFIG   FOSC = XT_XT               ;Osc XT, XT usado para el USB

   

;********   Otros bits de configuracion   **********

   CONFIG   PWRT = ON               ;PWRT habilitado

   CONFIG   BOR  = OFF               ;Brown out resete deshabilitado

   CONFIG   WDT    = OFF               ;Watch dog deshabilitado   

   CONFIG  MCLRE = OFF               ;MCLR como entrada

   CONFIG   PBADEN = ON               ;Todos los pines como entradas analogicas

   CONFIG   LVP   = OFF               ;programacion en bajo voltaje deshabilitado

;*********   Bits de proteccion   ******************

   CONFIG   CP0   = OFF               ;los bloques del codigo de programa

   CONFIG   CP1   = OFF               ;no estan protegidos

   CONFIG   CP2   = OFF

   CONFIG   CP3   = OFF

   CONFIG   CPB   = OFF               ;Sector Boot no esta protegido

   CONFIG   CPD   = OFF               ;La EEPROM no esta protegida

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


Hola Sander una pregunta de donde sacas los valores esos para la configuracion de los bits, si yo por ejm quisiera usa el pll y un oscilador externo como se que valores colocar ahi, anteriormente estaba usando estos:

   __CONFIG   _CONFIG1H, _FOSC_XT_XT_1H & _FCMEN_OFF_1H & _IESO_OFF_1H      
   __CONFIG   _CONFIG2H, _WDT_OFF_2H; & _WDTPS_32768_2H               __CONFIG   _CONFIG2L, _PWRT_ON_2L & _BOR_OFF_2L

y cuando los compilo me aparece que las directivas son obsoletas :D :D para los pic18 y me dice que use CONFIG, al ser asi suprimi las barras bajas __CONFIG -->  CONFIG   y mantuve lo demas pero me sale error y bueno al colocar las tuyas todo anda bien :-/ :-/ :-/  y quisiera saber como o de donde sé los valores que debo de colocar, un saludo desde cbba 8) 8)
Título: Re: Ejemplos PIC18F4550
Publicado por: sander en 09 de Febrero de 2011, 15:48:19
Hola c@lic_0, yo saque los  valores  para los bits de configuracion del archivo p18f4550.inc, en la parte final de ese archivo encontraras el siguiente texto comentado:

Código: [Seleccionar]
;==========================================================================
;
;   IMPORTANT: For the PIC18 devices, the __CONFIG directive has been
;              superseded by the CONFIG directive.  The following settings
;              are available for this device.
;
;   PLL Prescaler Selection bits:
;     PLLDIV = 1           No prescale (4 MHz oscillator input drives PLL directly)
;     PLLDIV = 2           Divide by 2 (8 MHz oscillator input)
;     PLLDIV = 3           Divide by 3 (12 MHz oscillator input)
;     PLLDIV = 4           Divide by 4 (16 MHz oscillator input)
;     PLLDIV = 5           Divide by 5 (20 MHz oscillator input)
;     PLLDIV = 6           Divide by 6 (24 MHz oscillator input)
;     PLLDIV = 10          Divide by 10 (40 MHz oscillator input)
;     PLLDIV = 12          Divide by 12 (48 MHz oscillator input)
;
;   System Clock Postscaler Selection bits:
;     CPUDIV = OSC1_PLL2   [Primary Oscillator Src: /1][96 MHz PLL Src: /2]
;     CPUDIV = OSC2_PLL3   [Primary Oscillator Src: /2][96 MHz PLL Src: /3]
;     CPUDIV = OSC3_PLL4   [Primary Oscillator Src: /3][96 MHz PLL Src: /4]
;     CPUDIV = OSC4_PLL6   [Primary Oscillator Src: /4][96 MHz PLL Src: /6]
;
;   USB Clock Selection bit (used in Full-Speed USB mode only; UCFG:FSEN = 1):
;     USBDIV = 1           USB clock source comes directly from the primary oscillator block with no postscale
;     USBDIV = 2           USB clock source comes from the 96 MHz PLL divided by 2
;
;   Oscillator Selection bits:
;     FOSC = XT_XT         XT oscillator (XT)
;     FOSC = XTPLL_XT      XT oscillator, PLL enabled (XTPLL)
;     FOSC = ECIO_EC       EC oscillator, port function on RA6 (ECIO)
;     FOSC = EC_EC         EC oscillator, CLKO function on RA6 (EC)
;     FOSC = ECPLLIO_EC    EC oscillator, PLL enabled, port function on RA6 (ECPIO)
;     FOSC = ECPLL_EC      EC oscillator, PLL enabled, CLKO function on RA6 (ECPLL)
;     FOSC = INTOSCIO_EC   Internal oscillator, port function on RA6, EC used by USB (INTIO)
;     FOSC = INTOSC_EC     Internal oscillator, CLKO function on RA6, EC used by USB (INTCKO)
;     FOSC = INTOSC_XT     Internal oscillator, XT used by USB (INTXT)
;     FOSC = INTOSC_HS     Internal oscillator, HS oscillator used by USB (INTHS)
;     FOSC = HS            HS oscillator (HS)
;     FOSC = HSPLL_HS      HS oscillator, PLL enabled (HSPLL)
;
;   Fail-Safe Clock Monitor Enable bit:
;     FCMEN = OFF          Fail-Safe Clock Monitor disabled
;     FCMEN = ON           Fail-Safe Clock Monitor enabled
;
;   Internal/External Oscillator Switchover bit:
;     IESO = OFF           Oscillator Switchover mode disabled
;     IESO = ON            Oscillator Switchover mode enabled
;
;   Power-up Timer Enable bit:
;     PWRT = ON            PWRT enabled
;     PWRT = OFF           PWRT disabled
;
;   Brown-out Reset Enable bits:
;     BOR = OFF            Brown-out Reset disabled in hardware and software
;     BOR = SOFT           Brown-out Reset enabled and controlled by software (SBOREN is enabled)
;     BOR = ON_ACTIVE      Brown-out Reset enabled in hardware only and disabled in Sleep mode (SBOREN is disabled)
;     BOR = ON             Brown-out Reset enabled in hardware only (SBOREN is disabled)
;
;   Brown-out Reset Voltage bits:
;     BORV = 0             Maximum setting
;     BORV = 1             
;     BORV = 2             
;     BORV = 3             Minimum setting
;
;   USB Voltage Regulator Enable bit:
;     VREGEN = OFF         USB voltage regulator disabled
;     VREGEN = ON          USB voltage regulator enabled
;
;   Watchdog Timer Enable bit:
;     WDT = OFF            WDT disabled (control is placed on the SWDTEN bit)
;     WDT = ON             WDT enabled
;
;   Watchdog Timer Postscale Select bits:
;     WDTPS = 1            1:1
;     WDTPS = 2            1:2
;     WDTPS = 4            1:4
;     WDTPS = 8            1:8
;     WDTPS = 16           1:16
;     WDTPS = 32           1:32
;     WDTPS = 64           1:64
;     WDTPS = 128          1:128
;     WDTPS = 256          1:256
;     WDTPS = 512          1:512
;     WDTPS = 1024         1:1024
;     WDTPS = 2048         1:2048
;     WDTPS = 4096         1:4096
;     WDTPS = 8192         1:8192
;     WDTPS = 16384        1:16384
;     WDTPS = 32768        1:32768
;
;   CCP2 MUX bit:
;     CCP2MX = OFF         CCP2 input/output is multiplexed with RB3
;     CCP2MX = ON          CCP2 input/output is multiplexed with RC1
;
;   PORTB A/D Enable bit:
;     PBADEN = OFF         PORTB<4:0> pins are configured as digital I/O on Reset
;     PBADEN = ON          PORTB<4:0> pins are configured as analog input channels on Reset
;
;   Low-Power Timer 1 Oscillator Enable bit:
;     LPT1OSC = OFF        Timer1 configured for higher power operation
;     LPT1OSC = ON         Timer1 configured for low-power operation
;
;   MCLR Pin Enable bit:
;     MCLRE = OFF          RE3 input pin enabled; MCLR pin disabled
;     MCLRE = ON           MCLR pin enabled; RE3 input pin disabled
;
;   Stack Full/Underflow Reset Enable bit:
;     STVREN = OFF         Stack full/underflow will not cause Reset
;     STVREN = ON          Stack full/underflow will cause Reset
;
;   Single-Supply ICSP Enable bit:
;     LVP = OFF            Single-Supply ICSP disabled
;     LVP = ON             Single-Supply ICSP enabled
;
;   Dedicated In-Circuit Debug/Programming Port (ICPORT) Enable bit:
;     ICPRT = OFF          ICPORT disabled
;     ICPRT = ON           ICPORT enabled
;
;   Extended Instruction Set Enable bit:
;     XINST = OFF          Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
;     XINST = ON           Instruction set extension and Indexed Addressing mode enabled
;
;   Background Debugger Enable bit:
;     DEBUG = ON           Background debugger enabled, RB6 and RB7 are dedicated to In-Circuit Debug
;     DEBUG = OFF          Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
;
;   Code Protection bit:
;     CP0 = ON             Block 0 (000800-001FFFh) is code-protected
;     CP0 = OFF            Block 0 (000800-001FFFh) is not code-protected
;
;   Code Protection bit:
;     CP1 = ON             Block 1 (002000-003FFFh) is code-protected
;     CP1 = OFF            Block 1 (002000-003FFFh) is not code-protected
;
;   Code Protection bit:
;     CP2 = ON             Block 2 (004000-005FFFh) is code-protected
;     CP2 = OFF            Block 2 (004000-005FFFh) is not code-protected
;
;   Code Protection bit:
;     CP3 = ON             Block 3 (006000-007FFFh) is code-protected
;     CP3 = OFF            Block 3 (006000-007FFFh) is not code-protected
;
;   Boot Block Code Protection bit:
;     CPB = ON             Boot block (000000-0007FFh) is code-protected
;     CPB = OFF            Boot block (000000-0007FFh) is not code-protected
;
;   Data EEPROM Code Protection bit:
;     CPD = ON             Data EEPROM is code-protected
;     CPD = OFF            Data EEPROM is not code-protected
;
;   Write Protection bit:
;     WRT0 = ON            Block 0 (000800-001FFFh) is write-protected
;     WRT0 = OFF           Block 0 (000800-001FFFh) is not write-protected
;
;   Write Protection bit:
;     WRT1 = ON            Block 1 (002000-003FFFh) is write-protected
;     WRT1 = OFF           Block 1 (002000-003FFFh) is not write-protected
;
;   Write Protection bit:
;     WRT2 = ON            Block 2 (004000-005FFFh) is write-protected
;     WRT2 = OFF           Block 2 (004000-005FFFh) is not write-protected
;
;   Write Protection bit:
;     WRT3 = ON            Block 3 (006000-007FFFh) is write-protected
;     WRT3 = OFF           Block 3 (006000-007FFFh) is not write-protected
;
;   Configuration Register Write Protection bit:
;     WRTC = ON            Configuration registers (300000-3000FFh) are write-protected
;     WRTC = OFF           Configuration registers (300000-3000FFh) are not write-protected
;
;   Boot Block Write Protection bit:
;     WRTB = ON            Boot block (000000-0007FFh) is write-protected
;     WRTB = OFF           Boot block (000000-0007FFh) is not write-protected
;
;   Data EEPROM Write Protection bit:
;     WRTD = ON            Data EEPROM is write-protected
;     WRTD = OFF           Data EEPROM is not write-protected
;
;   Table Read Protection bit:
;     EBTR0 = ON           Block 0 (000800-001FFFh) is protected from table reads executed in other blocks
;     EBTR0 = OFF          Block 0 (000800-001FFFh) is not protected from table reads executed in other blocks
;
;   Table Read Protection bit:
;     EBTR1 = ON           Block 1 (002000-003FFFh) is protected from table reads executed in other blocks
;     EBTR1 = OFF          Block 1 (002000-003FFFh) is not protected from table reads executed in other blocks
;
;   Table Read Protection bit:
;     EBTR2 = ON           Block 2 (004000-005FFFh) is protected from table reads executed in other blocks
;     EBTR2 = OFF          Block 2 (004000-005FFFh) is not protected from table reads executed in other blocks
;
;   Table Read Protection bit:
;     EBTR3 = ON           Block 3 (006000-007FFFh) is protected from table reads executed in other blocks
;     EBTR3 = OFF          Block 3 (006000-007FFFh) is not protected from table reads executed in other blocks
;
;   Boot Block Table Read Protection bit:
;     EBTRB = ON           Boot block (000000-0007FFh) is protected from table reads executed in other blocks
;     EBTRB = OFF          Boot block (000000-0007FFh) is not protected from table reads executed in other blocks
;
;==========================================================================
;==========================================================================
;
;       Configuration Bits
;
;   NAME            Address
;   CONFIG1L        300000h
;   CONFIG1H        300001h
;   CONFIG2L        300002h
;   CONFIG2H        300003h
;   CONFIG3H        300005h
;   CONFIG4L        300006h
;   CONFIG5L        300008h
;   CONFIG5H        300009h
;   CONFIG6L        30000Ah
;   CONFIG6H        30000Bh
;   CONFIG7L        30000Ch
;   CONFIG7H        30000Dh
;
;==========================================================================

Ahi esta la explicacion para cada bit, y cada archivo inc tiene la misma informacion.

Saludos
Título: Re: Ejemplos PIC18F4550
Publicado por: c@Lic_0 en 09 de Febrero de 2011, 18:32:22
ok muchas gracias por la ayuda :-/ :-/
Título: Re: Ejemplos PIC18F4550
Publicado por: c@Lic_0 en 09 de Febrero de 2011, 20:32:30
yo otra vez xD¡¡ :mrgreen: :mrgreen: estuve revisando los bits de configuracion y hay muchas nuevas configuraciones de las cuales no entiendo algunas o no me doy cuenta y ando un tanto perdido, no se si me puedes echar una manito con esto :-/ :-/, o debo de abrir otro hilo. gracias
Título: Re: Ejemplos PIC18F4550
Publicado por: sander en 10 de Febrero de 2011, 20:51:22
Hola c@lic_0, yo creo que puedes postear en este hilo tus dudas, por mi no hay problema,  pero si te recomiendo que antes de postear tus dudas primero trates de responderlas leyendo la hoja de datos del micro, es una muy buena costumbre que se debe ir adquiriendo, y si el ingles te cuesta, con gusto tratare de ayudarte.

Saludos
Título: Re: Ejemplos PIC18F4550
Publicado por: c@Lic_0 en 11 de Febrero de 2011, 16:45:05
ok ahi te va, el bit FCMEN hasta donde lo lei tengo entendido que permite asignar un oscilador RC interno en caso de que falle el oscilador externo que se esta usando (a no ser que lo entendi mal :D :D) y en el datasheet muestra la imagen(esta en adjuntos, no se como colocar la imagen aqui), ahora como sabe ese oscilador interno RC a que frecuencia debe oscilar o soy yo el que lo debe de configurar y el postcaler que tiene es fijo? o tb se configura  :-/ :-/ :-/

Título: Re: Ejemplos PIC18F4550
Publicado por: Suky en 11 de Febrero de 2011, 19:07:05
Busca en el datasheet sobre OSCCON  ;-)


Saludos!
Título: Re: Ejemplos PIC18F4550
Publicado por: c@Lic_0 en 19 de Febrero de 2011, 13:46:03
Revisando el modulo eusart me entro una duda, sabemos que cuando esta funcionando en modo sincrono-esclavo, el esclavo no tiene control sobre la señal de clock(a menos que me haya equivocado todo este tiempo :D :D)solo la recibe, en el registro BAUDCON el bit TXCKP es el que permite invertir la señal de clock(modo sincrono) la cuestion es si en modo sincrono-slave el esclavo puede invertir esta señal de clock que esta recibiendo

Saludos
Título: Re: Ejemplos PIC18F4550
Publicado por: filo2516 en 08 de Julio de 2012, 23:28:43
Sander tienes algún ejemplo de cómo generar una señal senoidal controlando la amplitud y frecuencia??
O me podrias encamina....

Gracias... Muy buenos tus aportes!!
Título: Re: Ejemplos PIC18F4550
Publicado por: Suky en 08 de Julio de 2012, 23:52:11
Busca sobre PWM y generación de señales analógicas implementandolo junto a un filtro pasabajos  ;-)
Título: Re: Ejemplos PIC18F4550
Publicado por: tapi8 en 09 de Julio de 2012, 05:17:44
Me da que lo que quiere es hacer un variador de frecuencia, mirate esto, a ver si te da una idea, creo que aqui en el foro no hay mucho sobre el tema, sobre todo en ensamblador.
Título: Re: Ejemplos PIC18F4550
Publicado por: sander en 09 de Julio de 2012, 16:09:53
Sander tienes algún ejemplo de cómo generar una señal senoidal controlando la amplitud y frecuencia??
O me podrias encamina....

Gracias... Muy buenos tus aportes!!

No tengo un ejemplo de esos, pero exactamente que la aplicacion le piensas dar?

Saludos
Título: Re: Ejemplos PIC18F4550
Publicado por: inyelber en 21 de Diciembre de 2012, 12:35:37
hola que tal comunidad!

a ver si me pueden ayudar con un problemita que tengo!
quiero hacer parpadear un led con un pic 18f14k50 en assembler.

en proteus me va bien pero en el circuito real no, ya verifique que no sea el circuito, hice el mismo programa pero en ccs y funciona bien!

creo que es un problema con la configuracion del oscilador interno del pic.
si me pueden ayudar les agradezco.

      list P=18F14K50
      #include <P18f14k50.inc>
      
config_CPUDIV_NOCLKDIV
config_USBDIV_OFF
config_INTOSCIO_EC
config_PLLEN_OFF
config_PCLKEN_OFF
config_IESO_OFF
config_PWRTEN_ON
config_BOREN_OFF
config_WDTEN_OFF
config_MCLRE_OFF
config_LVP_OFF

      
contador EQU 0x01
contador1 EQU 0x02
contador2 EQU 0x03
      
      org 0x00
   
      movlw b'01010000'
      movwf OSCCON
      clrf TRISB
      goto accion

accion
      bsf  PORTB,4   
      call bucle   
      bcf  PORTB,4
      call bucle
      goto accion
      
bucle
      movlw d'244'
      movwf contador1      
      movlw d'239'
      movwf contador
      
      nop
      nop
      nop
      nop      
      decfsz contador
      goto 0x22
      decfsz contador1
      goto 0x1e
      return

   end   
Título: Re: Ejemplos PIC18F4550
Publicado por: sander en 21 de Diciembre de 2012, 20:23:18
a que velocidad quiere que parpdeen los leds?, talvez estan parpedeando muy rapido y no lo ve, otra cosa a que frecuencia quiere configurar el oscilador del micro.

Saludos
Título: Re: Ejemplos PIC18F4550
Publicado por: inyelber en 21 de Diciembre de 2012, 20:28:09
quiero configurar el oscilador a 4mhz

y el delay esta para que parpadee cada 500 ms.

en proteus anda bien pero en la vida real no! y ya probe con uno que hice en ccs y va bien, quiere decir que el circuito esta bien!
Título: Re: Ejemplos PIC18F4550
Publicado por: sander en 22 de Diciembre de 2012, 08:58:43
ahora que lo veo creo que no esta indicando bien los bits de configuración, debe utilizar la directiva CONFIG    FOSC = IRC, para configurar el oscilador como interno, es mas cualquier otro bit de configuracion debe fijarlo de esa forma y no de la forma que lo viene haciendo.

Otra cosa mas en su rutina de retardo en vez de poner esos goto 0x22 o goto 0x1e, seria mejor que coloque etiquetas para saber donde quiere que vaya.

Saludos
Título: Re: Ejemplos PIC18F4550
Publicado por: inyelber en 22 de Diciembre de 2012, 14:18:40
ya acomode lo que me dijiste y nada :(

      list P=18F14K50
      #include <P18F14K50.inc>

   CONFIG FOSC   = IRC
   CONFIG CPUDIV = NOCLKDIV
   CONFIG USBDIV = ON
   CONFIG PLLEN  = OFF
   CONFIG PCLKEN = OFF
   CONFIG FCMEN  = ON
   CONFIG IESO   = ON
   CONFIG PWRTEN = OFF
   CONFIG WDTEN  = OFF
   CONFIG MCLRE  = OFF
   CONFIG LVP    = ON


contador  EQU 0x01
contador1 EQU 0x02
contador2 EQU 0x03
      
      ORG 0x00
      
      MOVLW b'01010000'
      MOVWF OSCCON
      CLRF TRISB
      GOTO ACCION

ACCION   MOVLW b'10000000'
      MOVWF PORTB   
      CALL CICLO1   
       MOVLW b'00000000'
      MOVWF PORTB
      CALL CICLO1
      GOTO ACCION
      

CICLO1   MOVLW d'244'
      MOVWF contador1   
      GOTO CICLO2    
CICLO2   MOVLW d'239'
      MOVWF contador
      GOTO CICLO3
      
CICLO3   NOP
      NOP
      NOP
      NOP   
      DECFSZ contador
      GOTO CICLO3
      DECFSZ contador1
      GOTO CICLO2
      RETURN

   END
Título: Re: Ejemplos PIC18F4550
Publicado por: inyelber en 22 de Diciembre de 2012, 15:21:38
listo!
ya lo solucione!
gracias sander!

adelante con el foro!
Título: Re: Ejemplos PIC18F4550
Publicado por: sander en 22 de Diciembre de 2012, 16:38:05
listo!
ya lo solucione!
gracias sander!

adelante con el foro!

y que fue lo que hiciste para que funcione, poner el bit LVP en OFF?

Saludos
Título: Re: Ejemplos PIC18F4550
Publicado por: inyelber en 22 de Diciembre de 2012, 19:47:52
esa fue una, la otra es que yo estaba trabajando en puerto B4 y si ves en la etiqueta ACCION esta en 1 el bit 7 y no el bit 4
Título: Re: Ejemplos PIC18F4550
Publicado por: proteus7 en 06 de Marzo de 2014, 11:50:10
Algun ejemplo para escribir y leer memorias eepron I2C?
Título: Re: Ejemplos PIC18F4550
Publicado por: Agusto1 en 19 de Mayo de 2014, 18:33:09
Muy buenas tardes Sander, he estado revisando todos tus ejemplos y he comprobado que no soy el único que programa este pic en lenguaje ensamblador lo cual ha sido un gran alivio para mi proyecto, así que iré directo al punto:

Estoy programado mi PIC18F4550 in circuit,  supongo que sabes qué significa eso, y me surgió una duda al leer tu primer mensaje en este hilo, referente al bit de configuración de programación por bajo voltaje (LVP), tu mencionas y cito: "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, mencionas seguidamente que el circuito en protoboard funciona como se esperaba, así que yo he decidido hacerte caso en esa recomendación, porque me parece que tienes razón, mi pregunta es, si programo mi 4550 sin retirarlo del circuito (In circuit) esta programación es hecha en bajo voltaje? Porque cada vez que compilo y programo el PIC utilizando las 5 líneas conocidas del programador (Vpp, PGC, PGD, VDD y GND), quedo con la duda que te comento.

Agradezco de antemano la atención prestada, un saludo desde Colombia.
Título: Re: Ejemplos PIC18F4550
Publicado por: sander en 19 de Mayo de 2014, 19:00:57
Muy buenas tardes Sander, he estado revisando todos tus ejemplos y he comprobado que no soy el único que programa este pic en lenguaje ensamblador lo cual ha sido un gran alivio para mi proyecto, así que iré directo al punto:

Estoy programado mi PIC18F4550 in circuit,  supongo que sabes qué significa eso, y me surgió una duda al leer tu primer mensaje en este hilo, referente al bit de configuración de programación por bajo voltaje (LVP), tu mencionas y cito: "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, mencionas seguidamente que el circuito en protoboard funciona como se esperaba, así que yo he decidido hacerte caso en esa recomendación, porque me parece que tienes razón, mi pregunta es, si programo mi 4550 sin retirarlo del circuito (In circuit) esta programación es hecha en bajo voltaje? Porque cada vez que compilo y programo el PIC utilizando las 5 líneas conocidas del programador (Vpp, PGC, PGD, VDD y GND), quedo con la duda que te comento.

Agradezco de antemano la atención prestada, un saludo desde Colombia.

Si esta usando la linea VPP entonces esta programando en el modo de alto voltaje, ya que en el modo de bajo voltaje el pin RB5 es utilizado por el grabador para colocar al microcontrolador en modo programacion, le envia 5 V y no 13 como a la linea VPP.

Asi que, fe de errata: donde dice: "Si no se piensa usar el modo de programacion en bajo voltaje (LVP) se debe colocar el pin RB5 a tierra mediante una resistencia" debe decir :

"Si  se piensa usar el modo de programacion en bajo voltaje (LVP), o se tiene activo el bit de configuracion LVP se debe colocar el pin RB5 a tierra mediante una resistencia"

Creo que con eso queda mas claro, perdon por la equivocacion.

Saludos
Título: Re: Ejemplos PIC18F4550
Publicado por: Agusto1 en 19 de Mayo de 2014, 19:34:37
Intentaré algo nuevo.