TODOPIC
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?
25 de Octubre de 2014, 20:32:26

Ingresar con nombre de usuario, contraseña y duración de la sesión
Buscar:     Búsqueda Avanzada
350318 Mensajes en 39301 Temas por 41052 Usuarios
Último usuario: juantabletaoc
* Inicio Ayuda Buscar Calendario Ingresar Registrarse
Buscar en TodoPIC
+  TODOPIC
|-+  Microcontroladores PIC
| |-+  Almacén del Assembler (Moderadores: maunix, MGLSOFT, PAOLA09, Suky)
| | |-+  Ejemplos PIC18F4550
0 Usuarios y 1 Visitante están viendo este tema. « anterior próximo »
Páginas: [1] 2 3 Marcar como favorito Imprimir
Autor Tema: Ejemplos PIC18F4550  (Leído 38396 veces)
sander
Colaborador
PIC24F
*****
Desconectado Desconectado

Sexo: Masculino
Bolivia Bolivia

Mensajes: 532



« : 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
GeSHi (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
En línea

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

Visita mi blog
sander
Colaborador
PIC24F
*****
Desconectado Desconectado

Sexo: Masculino
Bolivia Bolivia

Mensajes: 532



« Respuesta #1 : 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
GeSHi (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. clrf TRISD,.0 ;Puerto D como salida
  156. ;Los demas se quedan como entradas
  157. ;******************** Inicializacion de Variables ************************
  158. clrf Cont,.0 ;Cont = 0
  159. MainP0
  160.  
  161. movf Cont,W,.0 ;W = Cont, para realizar el despliegue
  162. rcall Conv7Seg ;realizamos la conversion de BCD a 7 segmentos
  163. movwf LATD,.0 ;movemos el valor convertido al PORT D
  164. movlw .1
  165. movwf CantSeg ;CantSeg = 1 , para el retardo de 1 seg
  166. rcall RetardoSeg ;Esperamos 1 seg
  167. incf Cont,F,.0 ;Cont ++
  168. movlw 0x0A
  169. cpfseq Cont,.0 ;Cont == 0x0A (Cont==WREG)?
  170. bra MainP0 ;No => continuamos en el ciclo
  171. clrf Cont,.0 ;Si => reiniciamos la cuenta (Cont = 0)
  172. bra MainP0 ;Continuamos con el ciclo
  173.  
  174. ;********************** Conv7Seg *******************************************
  175. ; Conv7Seg Esta subrutina maneja realiza el acceso a la tabla BCD7Seg, recibe
  176. ; en W un offset para que sea sumado a TBLPTRL para asi acceder al
  177. ; valor de 7 segmentos correspondiente al valor BCD recibido en WREG
  178. ;
  179. ; Devuelve el valor de 7 seg en el registro W.
  180. ;**********************************************************************************
  181. Conv7Seg
  182. movwf TablaOffs,.0 ;Guardamos el valor BCD recibido
  183. movlw UPPER BCD7Seg ;tomamos la parte mas alta de la dir de la tabla
  184. movwf TBLPTRU,.0 ;y la actualizamos TBLPTRU
  185. movlw HIGH BCD7Seg ;tomamos la parte  alta de la dir de la tabla
  186. movwf TBLPTRH,.0 ;y la actualizamos TBLPTRH
  187. movlw LOW BCD7Seg ;tomamos la parte baja de la dir de la tabla
  188. movwf TBLPTRL,.0 ;y la actualizamos TBLPTRL, Aqui tenemos a TBLPTR
  189. ;apuntado al inicio de la tabla BCD7seg
  190. movf TablaOffs,W,.0 ;Nos preparamos para recorrer la tabla
  191. addwf TBLPTRL,F,.0 ;TBLPTR apunta al valor de 7 seg que necesitamos
  192. tblrd * ;Leemos el valor de la tabla
  193. movf TABLAT,W,.0 ;guardamos el valor leido en WREG
  194. return ;retornamos
  195. ;**********************************************************************************
  196. ;**************************** RetardoSeg **********************************
  197. ; RetardoSeg Realiza una espera de la cantidad de segundos indicados
  198. ; mediante la variable CantSeg. CantSeg es de 8 bits
  199. ;*****************************************************************************
  200. RetardoSeg
  201. movf CantSeg,W,.0
  202. btfsc STATUS,Z ;CantSeg == 0?
  203. return ;Si => retornamos
  204. movlw 0x03 ;No => hacemos Cantms = 1000
  205. movwf Cantms+1,.0
  206. movlw 0xE8
  207. movwf Cantms,.0
  208. rcall Retardo_ms ;realizamos un retardo de 1000 ms
  209. decf CantSeg,F,.0 ;CantSeg --,
  210. bra RetardoSeg ;Continuamos con el ciclo
  211. ;*****************************************************************************
  212.  
  213. ;**************************** Retardo_ms **********************************
  214. ; Retardo_ms Realiza un retardo de la cantidad de milisegundos indicados
  215. ; mediante Cantms y Cantms+1, Cantms y Cantms+1 son tratados como
  216. ; variables de 16 bits.
  217. ;*****************************************************************************
  218. Retardo_ms
  219. rcall Retardo1ms ;realizamos un retardo de 1 ms
  220. decfsz Cantms,F,.0 ;Cantms --, Cantms == 0
  221. bra Retardo_ms ;no => vamos a Retardo_ms
  222. movf Cantms+1,W,.0 ;
  223. btfsc STATUS,Z ;Cantms+1 == 0?
  224. return ;Si => retornamos
  225. decf Cantms+1,F,.0 ;No => decrementamos
  226. bra Retardo_ms ;Continuamos con el ciclo
  227. ;*****************************************************************************
  228.  
  229. ;**************************** Retardo1ms **********************************
  230. ; Retardo1ms realiza una espera de 1 ms decrementado W 249 veces en un ciclo
  231. ; que ocupa 4 us
  232. ;*****************************************************************************
  233. Retardo1ms
  234. movlw .249
  235. Retardo1msP0
  236. addlw 0xFF ;W--
  237. btfss STATUS,Z,.0 ;W == 0?
  238. bra Retardo1msP0 ;No => seguimos esperando
  239. return ;Si => ya paso 1 ms
  240. ;*****************************************************************************
  241.  
  242.  
  243. ORG 0x800
  244.  
  245. ;******************************* BCD7Seg ***********************************
  246. ; BCD7Seg Es una tabla que se utiliza para convertir valores BCD a 7 Segmentos
  247. ;
  248. ; |RB7|RB6|RB5|RB4 | |RB3|RB2|RB1|RB0| |
  249. ; |DP |G |F |E | |D |C |B |A |Hex|
  250. ; |---|---|---|-------|---|---|---|---|---|
  251. ; 0 |1 |1 |0 |0 | 0 |0 |0 |0 |C0 |
  252. ;   1 |1 |1 |1 |1 | 1 |0 |0 |1 |F9 |
  253. ;   2 |1 |0 |1 |0 | 0 |1 |0 |0  |A4 |
  254. ;   3 |1 |0 |1 |1 | 0 |0 |0 |0 |B0 |
  255. ;   4 |1 |0 |0 |1 | 1 |0 |0 |1 |99 |
  256. ;   5 |1 |0 |0 |1 | 0 |0 |1 |0 |92 |
  257. ; 6 |1 |0 |0 |0 | 0 |0 |1 |0 |82 |
  258. ; 7 |1 |1 |1 |1 | 1 |0 |0 |0 |F8 |
  259. ; 8 |1 |0 |0 |0 | 0 |0 |0 |0 |80 |
  260. ; 9 |1 |0 |0 |1 | 0 |0 |0 |0 |90 |
  261. ;**********************************************************************************
  262. BCD7Seg
  263. ; 0 1  2 3 4 5   6 7 8 9
  264. DB 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90
  265. ;**********************************************************************************
  266.  
  267.  
  268. END ;Directiva fin del programa

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



Saludos
En línea

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

Visita mi blog
Cryn
Colaborador
DsPIC33
*****
Desconectado Desconectado

Sexo: Masculino
Bolivia Bolivia

Mensajes: 4170


ya no te extraño =p


« Respuesta #2 : 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! Mr. Green

un saludo
En línea

.
Slalen
Colaborador
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Nepal Nepal

Mensajes: 1076


ingeniero electrónico Freelance


WWW
« Respuesta #3 : 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 Mr. Green
En línea

Cryn
Colaborador
DsPIC33
*****
Desconectado Desconectado

Sexo: Masculino
Bolivia Bolivia

Mensajes: 4170


ya no te extraño =p


« Respuesta #4 : 09 de Agosto de 2008, 11:07:24 »

Citar
controlar el USB con ensamblador Mr. Green

lo mismo iba a decir Mr. Green
esperare eso rebotando
En línea

.
sander
Colaborador
PIC24F
*****
Desconectado Desconectado

Sexo: Masculino
Bolivia Bolivia

Mensajes: 532



« Respuesta #5 : 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
GeSHi (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. btfsc INTCON3,INT2IF,.0 ;INT2IF == 1?(ocurrio la INT2?)
  141. bra IntINT2 ;Si => vamos a su rutina
  142. movlw B'10110110' ;No => un error extraño sucedio,encedemos los
  143. movwf LATD,.0 ;segmentos A,D y G para indicarlo y detenemos
  144. bcf INTCON,GIEH ;la ejecucion el programa
  145. bcf INTCON,GIEL
  146. sleep
  147. IntINT2
  148. clrf Cantms+1,.0
  149. movlw .50 ;Hacemos un retardo de 50 ms para antirrebote
  150. movwf Cantms,.0
  151. rcall Retardo_ms
  152. IntINT2_0
  153. btfsc BotD ;Sigue presionado el boton de decremento?
  154. bra IntINT2_X ;No => vamos a salir de esta interrupcion
  155. decf Cont,F,.0 ;Si => Cont --
  156. movlw 0xFF
  157. cpfseq Cont,.0 ;Cont == 0xFF (Cont==WREG)?
  158. bra IntINT2_00 ;No => vamos a actualizar el display
  159. movlw 0x0F ;Si => reiniciamos el decremento
  160. movwf Cont,.0 ; y continuamos actualizando el display
  161. IntINT2_00
  162. movf Cont,W,.0 ;W = Cont, para realizar el despliegue
  163. rcall Conv7Seg ;realizamos la conversion de BCD a 7 segmentos
  164. movwf LATD,.0 ;movemos el valor convertido al PORT D
  165. movlw .1
  166. movwf CantSeg,.0 ;realizamos una espera de 1 seg, para
  167. rcall RetardoSeg ;ver el cambio en el display
  168. bra IntINT2_0 ;volvemos a revisar el boton
  169. IntINT2_X
  170. bcf INTCON3,INT2IF ;Para dar por terminada la interrupcion y
  171. ;salir de las interrupciones de baja prioridad
  172. X_IntLow
  173. movff BSR_TEMP,BSR ;recupera el registro BSR
  174. movff WREG_TEMP,WREG ;recupera el registro de trabajo
  175. movff STATUS_TEMP,STATUS ;recupera el registro STATUS
  176. retfie
  177. ;******************************************************************************
  178. ; Rutina de interrupcion de alta prioridad
  179. ; El codigo para la rutina de interrupcion de alta prioridad es colocado aqui para
  180. ; evitar conflictos con el vector de interrupciones de baja prioridad
  181.  
  182. HighInt:
  183.  
  184. ; *** El codigo para las interrupciones de alta prioridad va aqui ***
  185. btfsc INTCON3,INT1IF,.0 ;INT1IF == 1?(ocurrio la INT1?)
  186. bra IntINT1 ;Si => vamos a su rutina
  187. movlw B'10110110' ;No => un error extraño sucedio,encedemos los
  188. movwf LATD,.0 ;segmentos A,D y G para indicarlo y detenemos
  189. bcf INTCON,GIEH ;la ejecucion el programa
  190. bcf INTCON,GIEL
  191. sleep
  192. IntINT1
  193. clrf Cantms+1,.0
  194. movlw .50 ;Hacemos un retardo de 50 ms para antirrebote
  195. movwf Cantms,.0
  196. rcall Retardo_ms
  197. IntINT1_0
  198. btfsc BotU ;Sigue presionado el boton de incremento?
  199. bra IntINT1_X ;No => vamos a salir de esta interrupcion
  200. incf Cont,F,.0 ;Si => Cont ++
  201. movlw 0x10
  202. cpfseq Cont,.0 ;Cont == 0x10 (Cont==WREG)?
  203. bra IntINT1_00 ;No => vamos a actualizar el display
  204. clrf Cont,.0 ;Si => reiniciamos el incremento
  205. ; y continuamos actualizando el display
  206. IntINT1_00
  207. movf Cont,W,.0 ;W = Cont, para realizar el despliegue
  208. rcall Conv7Seg ;realizamos la conversion de BCD a 7 segmentos
  209. movwf LATD,.0 ;movemos el valor convertido al PORT D
  210. movlw .1
  211. movwf CantSeg,.0 ;realizamos una espera de 1 seg, para
  212. rcall RetardoSeg ;ver el cambio en el display
  213. bra IntINT1_0 ;volvemos a revisar el boton
  214. IntINT1_X
  215. bcf INTCON3,INT1IF ;Para dar por terminada la interrupcion y
  216. ;salir de las interrupciones de alta prioridad
  217. X_IntHigh
  218. retfie FAST
  219.  
  220. ;******************************************************************************
  221. ; Comienzo del programa principal
  222. ; El codigo del programa principal es colocado aqui
  223.  
  224. Main:
  225. ; *** EL codigo principal va aqui ***
  226.  
  227. ;******************** Inicializacion de perifericos *********************
  228. movlw B'01100000'
  229. movwf OSCCON ;Ajustamos el oscilador interno a 4 MHz
  230. movlw B'00001111'
  231. movwf ADCON1,.0 ;Todos los pines como I/O digitales
  232. clrf TRISD,.0 ;Puerto D como salida
  233. ;Los demas se quedan como entradas
  234. movlw B'01000101' ;habilitamos PULL-UPs(bit 7), y hacemos que
  235. movwf INTCON2,.0 ;INT1 e INT2 se activen en flanco de bajada
  236. ;(Bits 4 y 5), lo demas se queda como estaba
  237. movlw B'01011000' ;Asignamos prioridades(Bits 7 y 6), y habilitamos
  238. movwf INTCON3,.0 ;las interrupciones para INT1 e INT2 (bits 3 y 4)
  239.  
  240. bsf RCON,IPEN,.0 ;Habilitamos las prioridades para las interrupciones
  241. ;******************** Inicializacion de Variables ************************
  242. clrf Cont,.0 ;Cont = 0
  243. ;***************************************************************************
  244. bsf INTCON,GIEH,.0 ;Habilitamos las interrupciones de prioridad alta
  245. bsf INTCON,GIEL,.0 ;y las de prioridad baja
  246.  
  247. movf Cont,W,.0 ;W = Cont, para realizar el despliegue
  248. rcall Conv7Seg ;realizamos la conversion de BCD a 7 segmentos
  249. movwf LATD,.0 ;movemos el valor convertido al PORT D
  250.  
  251. MainP0
  252.  
  253. bra MainP0 ;Continuamos con el ciclo
  254.  
  255. ;********************** Conv7Seg *******************************************
  256. ; Conv7Seg Esta subrutina maneja realiza el acceso a la tabla BCD7Seg, recibe
  257. ; en W un offset para que sea sumado a TBLPTRL para asi acceder al
  258. ; valor de 7 segmentos correspondiente al valor BCD recibido en WREG
  259. ;
  260. ; Devuelve el valor de 7 seg en el registro W.
  261. ;**********************************************************************************
  262. Conv7Seg
  263. movwf TablaOffs,.0 ;Guardamos el valor BCD recibido
  264. movlw UPPER BCD7Seg ;tomamos la parte mas alta de la dir de la tabla
  265. movwf TBLPTRU,.0 ;y la actualizamos TBLPTRU
  266. movlw HIGH BCD7Seg ;tomamos la parte  alta de la dir de la tabla
  267. movwf TBLPTRH,.0 ;y la actualizamos TBLPTRH
  268. movlw LOW BCD7Seg ;tomamos la parte baja de la dir de la tabla
  269. movwf TBLPTRL,.0 ;y la actualizamos TBLPTRL, Aqui tenemos a TBLPTR
  270. ;apuntado al inicio de la tabla BCD7seg
  271. movf TablaOffs,W,.0 ;Nos preparamos para recorrer la tabla
  272. addwf TBLPTRL,F,.0 ;TBLPTR apunta al valor de 7 seg que necesitamos
  273. tblrd * ;Leemos el valor de la tabla
  274. movf TABLAT,W,.0 ;guardamos el valor leido en WREG
  275. return ;retornamos
  276. ;**********************************************************************************
  277. ;**************************** RetardoSeg **********************************
  278. ; RetardoSeg Realiza una espera de la cantidad de segundos indicados
  279. ; mediante la variable CantSeg. CantSeg es de 8 bits
  280. ;*****************************************************************************
  281. RetardoSeg
  282. movf CantSeg,W,.0
  283. btfsc STATUS,Z ;CantSeg == 0?
  284. return ;Si => retornamos
  285. movlw 0x03 ;No => hacemos Cantms = 1000
  286. movwf Cantms+1,.0
  287. movlw 0xE8
  288. movwf Cantms,.0
  289. rcall Retardo_ms ;realizamos un retardo de 1000 ms
  290. decf CantSeg,F,.0 ;CantSeg --,
  291. bra RetardoSeg ;Continuamos con el ciclo
  292. ;*****************************************************************************
  293.  
  294. ;**************************** Retardo_ms **********************************
  295. ; Retardo_ms Realiza un retardo de la cantidad de milisegundos indicados
  296. ; mediante Cantms y Cantms+1, Cantms y Cantms+1 son tratados como
  297. ; variables de 16 bits.
  298. ;*****************************************************************************
  299. Retardo_ms
  300. rcall Retardo1ms ;realizamos un retardo de 1 ms
  301. decfsz Cantms,F,.0 ;Cantms --, Cantms == 0
  302. bra Retardo_ms ;no => vamos a Retardo_ms
  303. movf Cantms+1,W,.0 ;
  304. btfsc STATUS,Z ;Cantms+1 == 0?
  305. return ;Si => retornamos
  306. decf Cantms+1,F,.0 ;No => decrementamos
  307. bra Retardo_ms ;Continuamos con el ciclo
  308. ;*****************************************************************************
  309.  
  310. ;**************************** Retardo1ms **********************************
  311. ; Retardo1ms realiza una espera de 1 ms decrementado W 249 veces en un ciclo
  312. ; que ocupa 4 us
  313. ;*****************************************************************************
  314. Retardo1ms
  315. movlw .249
  316. Retardo1msP0
  317. addlw 0xFF ;W--
  318. btfss STATUS,Z,.0 ;W == 0?
  319. bra Retardo1msP0 ;No => seguimos esperando
  320. return ;Si => ya paso 1 ms
  321. ;*****************************************************************************
  322.  
  323.  
  324. ORG 0x800
  325.  
  326. ;******************************* BCD7Seg ***********************************
  327. ; BCD7Seg Es una tabla que se utiliza para convertir valores BCD a 7 Segmentos
  328. ;
  329. ; |RB7|RB6|RB5|RB4 | |RB3|RB2|RB1|RB0| |
  330. ; |DP |G |F |E | |D |C |B |A |Hex|
  331. ; |---|---|---|-------|---|---|---|---|---|
  332. ; 0 |1 |1 |0 |0 | 0 |0 |0 |0 |C0 |
  333. ;   1 |1 |1 |1 |1 | 1 |0 |0 |1 |F9 |
  334. ;   2 |1 |0 |1 |0 | 0 |1 |0 |0  |A4 |
  335. ;   3 |1 |0 |1 |1 | 0 |0 |0 |0 |B0 |
  336. ;   4 |1 |0 |0 |1 | 1 |0 |0 |1 |99 |
  337. ;   5 |1 |0 |0 |1 | 0 |0 |1 |0 |92 |
  338. ; 6 |1 |0 |0 |0 | 0 |0 |1 |0 |82 |
  339. ; 7 |1 |1 |1 |1 | 1 |0 |0 |0 |F8 |
  340. ; 8 |1 |0 |0 |0 | 0 |0 |0 |0 |80 |
  341. ; 9 |1 |0 |0 |1 | 0 |0 |0 |0 |90 |
  342. ; A |1 |0 |0 |0 | 1 |0 |0 |0 |88 |
  343. ; B |1 |0 |0 |0 | 0 |0 |1 |1 |83 |
  344. ; C |1 |1 |0 |0 | 0 |1 |1 |0 |C6 |
  345. ; D |1 |0 |1 |0 | 0 |0 |0 |1 |A1 |
  346. ; E |1 |0 |0 |0 | 0 |1 |1 |0 |86 |
  347. ; F |1 |0 |0 |0 | 1 |1 |1 |0 |8E |
  348. ;**********************************************************************************
  349. BCD7Seg
  350. ; 0 1  2 3 4 5   6 7 8 9 A B C  D E F
  351. DB 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
  352. ;**********************************************************************************
  353.  
  354.  
  355. END ;Directiva fin del programa

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

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


En línea

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

Visita mi blog
sander
Colaborador
PIC24F
*****
Desconectado Desconectado

Sexo: Masculino
Bolivia Bolivia

Mensajes: 532



« Respuesta #6 : 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
GeSHi (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. btfsc INTCON3,INT2IF,.0 ;INT2IF == 1?(ocurrio la INT2?)
  149. bra IntINT2 ;Si => vamos a su rutina
  150. movlw B'10110110' ;No => un error extraño sucedio,encedemos los
  151. movwf LATD,.0 ;segmentos A,D y G para indicarlo y detenemos
  152. bcf INTCON,GIEH ;la ejecucion el programa
  153. bcf INTCON,GIEL
  154. sleep
  155. IntINT2
  156. clrf Cantms+1,.0
  157. movlw .50 ;Hacemos un retardo de 50 ms para antirrebote
  158. movwf Cantms,.0
  159. rcall Retardo_ms
  160. IntINT2_0
  161. bcf IntHigh_F ;ponemos en cero esta bandera, por si venimos
  162. ;de la interrupcion alta
  163. btfsc BotD ;Sigue presionado el boton de decremento?
  164. bra IntINT2_X ;No => vamos a salir de esta interrupcion
  165. btfsc IntHigh_F ;Se produjo una interrupcion de mayor prioridad?
  166. bra IntINT2_0 ;Si => usamos el valor de Cont que dejo la int alta
  167. decf Cont,F,.0 ;Si => Cont --
  168. movlw 0xFF
  169. cpfseq Cont,.0 ;Cont == 0xFF (Cont==WREG)?
  170. bra IntINT2_00 ;No => vamos a actualizar el display
  171. movlw 0x0F ;Si => reiniciamos el decremento
  172. movwf Cont,.0 ; y continuamos actualizando el display
  173. IntINT2_00
  174. movf Cont,W,.0 ;W = Cont, para realizar el despliegue
  175. rcall Conv7Seg ;realizamos la conversion de BCD a 7 segmentos
  176. btfsc IntHigh_F ;Se produjo una interrupcion de mayor prioridad?
  177. bra IntINT2_0 ;Si => usamos el valor de Cont que dejo la int alta
  178. movwf LATD,.0 ;No => movemos el valor convertido al PORT D
  179. movlw .1
  180. movwf CantSeg,.0 ;realizamos una espera de 1 seg, para
  181. rcall RetardoSeg ;ver el cambio en el display
  182. bra IntINT2_0 ;volvemos a revisar el boton
  183. IntINT2_X
  184. bcf INTCON3,INT2IF ;Para dar por terminada la interrupcion y
  185. ;salir de las interrupciones de baja prioridad
  186. X_IntLow
  187. movff BSR_TEMP,BSR ;recupera el registro BSR
  188. movff WREG_TEMP,WREG ;recupera el registro de trabajo
  189. movff STATUS_TEMP,STATUS ;recupera el registro STATUS
  190. retfie
  191. ;******************************************************************************
  192. ; Rutina de interrupcion de alta prioridad
  193. ; El codigo para la rutina de interrupcion de alta prioridad es colocado aqui para
  194. ; evitar conflictos con el vector de interrupciones de baja prioridad
  195.  
  196. HighInt:
  197. ;****** El codigo para las interrupciones de alta prioridad va aqui ******
  198.  
  199. push ;Para comenzar a guarda las variables que se
  200. ;comparten en la pila, primero apilamos la direccion
  201. ;actual
  202.  
  203. movf Cantms,W,.0 ;Guardamos Cantms en la parte baja del
  204. movwf TOSL ;Top Of Stack
  205. movf Cantms+1,W,.0 ;Guardamos Cantms+1 en la parte alta del
  206. movwf TOSH ;Top Of Stack
  207.  
  208. push ;apilamos la direccion actual
  209. movf CantSeg,W,.0 ;Guardamos Cantms en la parte baja del
  210. movwf TOSL ;Top Of Stack
  211.  
  212. btfsc INTCON3,INT1IF,.0 ;INT1IF == 1?(ocurrio la INT1?)
  213. bra IntINT1 ;Si => vamos a su rutina
  214. movlw B'10110110' ;No => un error extraño sucedio,encedemos los
  215. movwf LATD,.0 ;segmentos A,D y G para indicarlo y detenemos
  216. bcf INTCON,GIEH ;la ejecucion el programa
  217. bcf INTCON,GIEL
  218. sleep
  219. IntINT1
  220. clrf Cantms+1,.0
  221. movlw .50 ;Hacemos un retardo de 50 ms para antirrebote
  222. movwf Cantms,.0
  223. rcall Retardo_ms
  224. IntINT1_0
  225. btfsc BotU ;Sigue presionado el boton de incremento?
  226. bra IntINT1_X ;No => vamos a salir de esta interrupcion
  227. incf Cont,F,.0 ;Si => Cont ++
  228. movlw 0x10
  229. cpfseq Cont,.0 ;Cont == 0x10 (Cont==WREG)?
  230. bra IntINT1_00 ;No => vamos a actualizar el display
  231. clrf Cont,.0 ;Si => reiniciamos el incremento
  232. ; y continuamos actualizando el display
  233. IntINT1_00
  234. movf Cont,W,.0 ;W = Cont, para realizar el despliegue
  235. rcall Conv7Seg ;realizamos la conversion de BCD a 7 segmentos
  236. movwf LATD,.0 ;movemos el valor convertido al PORT D
  237. movlw .1
  238. movwf CantSeg,.0 ;realizamos una espera de 1 seg, para
  239. rcall RetardoSeg ;ver el cambio en el display
  240. bra IntINT1_0 ;volvemos a revisar el boton
  241. IntINT1_X
  242. ;************ Recuperamos los valores de la pila ****************
  243. movff TOSL,CantSeg ;Recuperamos el valor guardado, primero CantSeg
  244. pop ;El pop efectivamente decrementa el STKPTR y
  245. ;descarta e valor de TOS
  246.  
  247. movff TOSL,Cantms ;Recuperamos Cantms
  248. movff TOSH,Cantms+1 ;y Cantms+1
  249. pop ;STKPTR --, y descartamos TOS
  250.  
  251. bcf INTCON3,INT1IF ;Para dar por terminada la interrupcion y
  252. ;salir de las interrupciones de alta prioridad
  253. bsf IntHigh_F ;ponemos en 1 esta bandera par indicar que se produjo
  254. ;esta interrupcion
  255. X_IntHigh
  256. retfie FAST
  257.  
  258. ;******************************************************************************
  259. ; Comienzo del programa principal
  260. ; El codigo del programa principal es colocado aqui
  261.  
  262. Main:
  263. ; *** EL codigo principal va aqui ***
  264.  
  265. ;******************** Inicializacion de perifericos *********************
  266. movlw B'01100000'
  267. movwf OSCCON ;Ajustamos el oscilador interno a 4 MHz
  268. movlw B'00001111'
  269. movwf ADCON1,.0 ;Todos los pines como I/O digitales
  270. clrf TRISD,.0 ;Puerto D como salida
  271. ;Los demas se quedan como entradas
  272. movlw B'01000101' ;habilitamos PULL-UPs(bit 7), y hacemos que
  273. movwf INTCON2,.0 ;INT1 e INT2 se activen en flanco de bajada
  274. ;(Bits 4 y 5), lo demas se queda como estaba
  275. movlw B'01011000' ;Asignamos prioridades(Bits 7 y 6), y habilitamos
  276. movwf INTCON3,.0 ;las interrupciones para INT1 e INT2 (bits 3 y 4)
  277.  
  278. bsf RCON,IPEN,.0 ;Habilitamos las prioridades para las interrupciones
  279. ;******************** Inicializacion de Variables ************************
  280. clrf Cont,.0 ;Cont = 0
  281. clrf Banderas,.0 ;Banderas = 0
  282. ;***************************************************************************
  283. bsf INTCON,GIEH,.0 ;Habilitamos las interrupciones de prioridad alta
  284. bsf INTCON,GIEL,.0 ;y las de prioridad baja
  285.  
  286. movf Cont,W,.0 ;W = Cont, para realizar el primer despliegue
  287. rcall Conv7Seg ;realizamos la conversion de BCD a 7 segmentos
  288. movwf LATD,.0 ;movemos el valor convertido al PORT D
  289.  
  290. MainP0
  291.  
  292. bra MainP0 ;Continuamos con el ciclo, esperando que las
  293. ;interrupciones cambien el valor del display
  294.  
  295. ;********************** Conv7Seg *******************************************
  296. ; Conv7Seg Esta subrutina maneja realiza el acceso a la tabla BCD7Seg, recibe
  297. ; en W un offset para que sea sumado a TBLPTRL para asi acceder al
  298. ; valor de 7 segmentos correspondiente al valor BCD recibido en WREG
  299. ;
  300. ; Devuelve el valor de 7 seg en el registro W.
  301. ;**********************************************************************************
  302. Conv7Seg
  303. movwf TablaOffs,.0 ;Guardamos el valor BCD recibido
  304. movlw UPPER BCD7Seg ;tomamos la parte mas alta de la dir de la tabla
  305. movwf TBLPTRU,.0 ;y la actualizamos TBLPTRU
  306. movlw HIGH BCD7Seg ;tomamos la parte  alta de la dir de la tabla
  307. movwf TBLPTRH,.0 ;y la actualizamos TBLPTRH
  308. movlw LOW BCD7Seg ;tomamos la parte baja de la dir de la tabla
  309. movwf TBLPTRL,.0 ;y la actualizamos TBLPTRL, Aqui tenemos a TBLPTR
  310. ;apuntado al inicio de la tabla BCD7seg
  311. movf TablaOffs,W,.0 ;Nos preparamos para recorrer la tabla
  312. addwf TBLPTRL,F,.0 ;TBLPTR apunta al valor de 7 seg que necesitamos
  313. tblrd * ;Leemos el valor de la tabla
  314. movf TABLAT,W,.0 ;guardamos el valor leido en WREG
  315. return ;retornamos
  316. ;**********************************************************************************
  317. ;**************************** RetardoSeg **********************************
  318. ; RetardoSeg Realiza una espera de la cantidad de segundos indicados
  319. ; mediante la variable CantSeg. CantSeg es de 8 bits
  320. ;*****************************************************************************
  321. RetardoSeg
  322. movf CantSeg,W,.0
  323. btfsc STATUS,Z ;CantSeg == 0?
  324. return ;Si => retornamos
  325. movlw 0x03 ;No => hacemos Cantms = 1000
  326. movwf Cantms+1,.0
  327. movlw 0xE8
  328. movwf Cantms,.0
  329. rcall Retardo_ms ;realizamos un retardo de 1000 ms
  330. decf CantSeg,F,.0 ;CantSeg --,
  331. bra RetardoSeg ;Continuamos con el ciclo
  332. ;*****************************************************************************
  333.  
  334. ;**************************** Retardo_ms **********************************
  335. ; Retardo_ms Realiza un retardo de la cantidad de milisegundos indicados
  336. ; mediante Cantms y Cantms+1, Cantms y Cantms+1 son tratados como
  337. ; variables de 16 bits.
  338. ;*****************************************************************************
  339. Retardo_ms
  340. rcall Retardo1ms ;realizamos un retardo de 1 ms
  341. decfsz Cantms,F,.0 ;Cantms --, Cantms == 0
  342. bra Retardo_ms ;no => vamos a Retardo_ms
  343. movf Cantms+1,W,.0 ;
  344. btfsc STATUS,Z ;Cantms+1 == 0?
  345. return ;Si => retornamos
  346. decf Cantms+1,F,.0 ;No => decrementamos
  347. bra Retardo_ms ;Continuamos con el ciclo
  348. ;*****************************************************************************
  349.  
  350. ;**************************** Retardo1ms **********************************
  351. ; Retardo1ms realiza una espera de 1 ms decrementado W 249 veces en un ciclo
  352. ; que ocupa 4 us
  353. ;*****************************************************************************
  354. Retardo1ms
  355. movlw .249
  356. Retardo1msP0
  357. addlw 0xFF ;W--
  358. btfss STATUS,Z,.0 ;W == 0?
  359. bra Retardo1msP0 ;No => seguimos esperando
  360. return ;Si => ya paso 1 ms
  361. ;*****************************************************************************
  362.  
  363.  
  364. ORG 0x800
  365.  
  366. ;******************************* BCD7Seg ***********************************
  367. ; BCD7Seg Es una tabla que se utiliza para convertir valores BCD a 7 Segmentos
  368. ;
  369. ; |RB7|RB6|RB5|RB4 | |RB3|RB2|RB1|RB0| |
  370. ; |DP |G |F |E | |D |C |B |A |Hex|
  371. ; |---|---|---|-------|---|---|---|---|---|
  372. ; 0 |1 |1 |0 |0 | 0 |0 |0 |0 |C0 |
  373. ;   1 |1 |1 |1 |1 | 1 |0 |0 |1 |F9 |
  374. ;   2 |1 |0 |1 |0 | 0 |1 |0 |0  |A4 |
  375. ;   3 |1 |0 |1 |1 | 0 |0 |0 |0 |B0 |
  376. ;   4 |1 |0 |0 |1 | 1 |0 |0 |1 |99 |
  377. ;   5 |1 |0 |0 |1 | 0 |0 |1 |0 |92 |
  378. ; 6 |1 |0 |0 |0 | 0 |0 |1 |0 |82 |
  379. ; 7 |1 |1 |1 |1 | 1 |0 |0 |0 |F8 |
  380. ; 8 |1 |0 |0 |0 | 0 |0 |0 |0 |80 |
  381. ; 9 |1 |0 |0 |1 | 0 |0 |0 |0 |90 |
  382. ; A |1 |0 |0 |0 | 1 |0 |0 |0 |88 |
  383. ; B |1 |0 |0 |0 | 0 |0 |1 |1 |83 |
  384. ; C |1 |1 |0 |0 | 0 |1 |1 |0 |C6 |
  385. ; D |1 |0 |1 |0 | 0 |0 |0 |1 |A1 |
  386. ; E |1 |0 |0 |0 | 0 |1 |1 |0 |86 |
  387. ; F |1 |0 |0 |0 | 1 |1 |1 |0 |8E |
  388. ;**********************************************************************************
  389. BCD7Seg
  390. ; 0 1  2 3 4 5   6 7 8 9 A B C  D E F
  391. DB 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
  392. ;**********************************************************************************
  393.  
  394.  
  395. END ;Directiva fin del programa

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

Saludos
En línea

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

Visita mi blog
Lock
PIC10
*
Desconectado Desconectado

España España

Mensajes: 3


« Respuesta #7 : 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
GeSHi (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.
En línea
RALF2
Colaborador
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Venezuela Venezuela

Mensajes: 1661



« Respuesta #8 : 19 de Agosto de 2008, 12:42:39 »

Que tal amigos!
Sander Excelente iniciativa, yo estoy haciendo lo mismo que tu  Mr. Green  pero con el proton y asm  Shocked

Estaba leyendo los ejemplos que colocaste y hubo una partecita que no entendi  Sad   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
En línea
sander
Colaborador
PIC24F
*****
Desconectado Desconectado

Sexo: Masculino
Bolivia Bolivia

Mensajes: 532



« Respuesta #9 : 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
En línea

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

Visita mi blog
RALF2
Colaborador
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Venezuela Venezuela

Mensajes: 1661



« Respuesta #10 : 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!
En línea
picNIC
PIC16
***
Desconectado Desconectado

Russian Federation Russian Federation

Mensajes: 140



« Respuesta #11 : 19 de Agosto de 2008, 22:16:43 »

Hola gente... muy buena la idea de poner ejemplos....
y hablando de ejemplos de usb en asm encontre esta pagina...
Aunque todavia no estudie el programa parece que puede servir de guia..

Sal u 2
En línea
sander
Colaborador
PIC24F
*****
Desconectado Desconectado

Sexo: Masculino
Bolivia Bolivia

Mensajes: 532



« Respuesta #12 : 12 de Octubre de 2008, 01:52:13 »

Bueno continuando con lo de los ejemplos aqui pongo un par mas

BlinkT0.asm

Código
GeSHi (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. ;******** Otros bits de configuracion **********
  121.  
  122. CONFIG PWRT = ON ;PWRT habilitado
  123.  
  124. CONFIG BOR  = OFF ;Brown out resete deshabilitado
  125.  
  126. CONFIG WDT = OFF ;Watch dog deshabilitado
  127.  
  128. CONFIG  MCLRE = OFF ;MCLR como entrada
  129.  
  130. CONFIG PBADEN = ON ;Todos los pines como entradas analogicas
  131.  
  132. CONFIG LVP = OFF ;programacion en bajo voltaje deshabilitado
  133.  
  134. ;********* Bits de proteccion ******************
  135.  
  136. CONFIG CP0 = OFF ;los bloques del codigo de programa
  137.  
  138. CONFIG CP1 = OFF ;no estan protegidos
  139.  
  140. CONFIG CP2 = OFF
  141.  
  142. CONFIG CP3 = OFF
  143.  
  144. CONFIG CPB = OFF ;Sector Boot no esta protegido
  145.  
  146. CONFIG CPD = OFF ;La EEPROM no esta protegida
  147.  
  148. ;******************************************************************************
  149.  
  150. ; Definicion de variables
  151.  
  152. ; Estas variables son necesarias solo si las interrupciones de baja prioridad son usadas.
  153.  
  154. ; Mas variables podrian se necesarias para almacenar otros SFRs usados en las rutinas de
  155.  
  156. ; interrupcion.
  157.  
  158.  
  159.  
  160. CBLOCK 0x080
  161.  
  162. WREG_TEMP ;variable usada para salvar contexto
  163.  
  164. STATUS_TEMP ;variable usada para salvar contexto
  165.  
  166. BSR_TEMP ;variable usada para salvar contexto
  167.  
  168. ENDC
  169.  
  170.  
  171.  
  172. CBLOCK 0x000 ;Variables en la ACCESS RAM (Banco 0) max 96 bytes
  173.  
  174. ContT0 ;para contar las veces que TMR0 desborda
  175.  
  176. ENDC
  177.  
  178.  
  179.  
  180. ;******************************************************************************
  181.  
  182. ;Datos de la EEPROM
  183.  
  184. ;Los Datos a ser programados en la  EEPROM son definidos aqui
  185.  
  186.  
  187.  
  188. ORG 0xf00000
  189.  
  190.  
  191.  
  192. DE "Test Data",0,1,2,3,4,5
  193.  
  194.  
  195.  
  196. ;******************************************************************************
  197.  
  198. ; Vector de Reset.
  199.  
  200. ; Este codigo comenzara a ejecutarse cuando suceda un reset
  201.  
  202.  
  203.  
  204. ORG 0x0000
  205.  
  206.  
  207.  
  208. goto Main ;Se va al inicio del codigo principal
  209.  
  210.  
  211.  
  212. ;******************************************************************************
  213.  
  214. ; Vector de interrupcion de alta prioridad
  215.  
  216. ; Este codigo comenzara a ejecutarse cuando una interrupcion de alta prioridad ocurra
  217.  
  218. ; o cuando cualquier interrupcion ocurra si es que las prioridades de las interrupciones
  219.  
  220. ; no estan habilitadas
  221.  
  222.  
  223.  
  224. ORG 0x0008
  225.  
  226.  
  227.  
  228. bra HighInt ;Va a la rutina de interrupcion de alta prioridad
  229.  
  230.  
  231.  
  232. ;******************************************************************************
  233.  
  234. ; Vector de interrupcion de baja prioridad y rutina
  235.  
  236. ; Este codigo comenzara a ejecutrase cuando una interrupcion de baja prioridad ocurra
  237.  
  238. ; Este codigo puede ser eliminado si las interrupciones de baja prioridad no son usadas
  239.  
  240.  
  241.  
  242. ORG 0x0018
  243.  
  244.  
  245.  
  246. movff STATUS,STATUS_TEMP ;Salva el registro STATUS
  247.  
  248. movff WREG,WREG_TEMP ;Salva el registro de trabajo
  249.  
  250. movff BSR,BSR_TEMP ;Salva el registro BSR
  251.  
  252.  
  253.  
  254. ; *** El codigo de la interrupcion de baja prioridad va aqui ***
  255.  
  256.  
  257.  
  258.  
  259.  
  260. movff BSR_TEMP,BSR ;recupera el registro BSR
  261.  
  262. movff WREG_TEMP,WREG ;recupera el registro de trabajo
  263.  
  264. movff STATUS_TEMP,STATUS ;recupera el registro STATUS
  265.  
  266. retfie
  267.  
  268.  
  269.  
  270. ;******************************************************************************
  271.  
  272. ; Rutina de interrupcion de alta prioridad
  273.  
  274. ; El codigo para la rutina de interrupcion de alta prioridad es colocado aqui para
  275.  
  276. ; evitar conflictos con el vector de interrupciones de baja prioridad
  277.  
  278.  
  279.  
  280. HighInt:
  281.  
  282.  
  283.  
  284. ; *** El codigo para las interrupciones de alta prioridad va aqui ***
  285.  
  286.  
  287.  
  288.  
  289.  
  290. retfie FAST
  291.  
  292.  
  293.  
  294. ;******************************************************************************
  295.  
  296. ; Comienzo del programa principal
  297.  
  298. ; El codigo del programa principal es colocado aqui
  299.  
  300.  
  301.  
  302. Main:
  303.  
  304. ; *** EL codigo principal va aqui ***
  305.  
  306.  
  307.  
  308. ;******************* Inicializacion de puertos ***************************
  309.  
  310. movlw B'00001111'
  311.  
  312. movwf ADCON1,.0 ;Todos los pines como I/O digitales
  313.  
  314. clrf TRISA,.0
  315.  
  316. clrf TRISB,.0
  317.  
  318. clrf TRISC,.0
  319.  
  320. clrf TRISD,.0
  321.  
  322. clrf TRISE,.0 ;Todos los pines como salida
  323.  
  324.  
  325. clrf LATA,.0
  326.  
  327. clrf LATB,.0
  328.  
  329. clrf LATC,.0
  330.  
  331. clrf LATD,.0
  332.  
  333. clrf LATE,.0 ;Ponemos las salidas en cero
  334.  
  335. ;******************************************************************************
  336.  
  337.  
  338.  
  339. ;******************* Inicializacion del TMR0 ***************************
  340.  
  341. movlw B'10010000' ;TMR0 on, modo 16 bits, cambia con las
  342.  
  343. movwf T0CON,.0 ;instrucciones, asignamos preescaler de 2
  344.  
  345.  
  346.  
  347. movlw 0x3C ;De acuerdo a la Tabla 1 cargamos los valores
  348.  
  349. movwf TMR0H,.0 ;a TMR0H y TMR0L, pero a TMR0L se le aumenta
  350.  
  351. movlw 0xB1 ;un 1 para compensar los 2 ciclos de
  352.  
  353. movwf TMR0L,.0 ;instruccion que el TMR0 permanece detenido
  354.  
  355. ;******************************************************************************
  356.  
  357. Ciclo
  358.  
  359. movlw .10 ;
  360.  
  361. movwf ContT0,.0 ;ContT0 = 10 para controlar 1 segundo
  362.  
  363. CicloP0
  364.  
  365. btfss INTCON,TMR0IF ;TMR0IF == 1? (TMR0 desbordo?)
  366.  
  367. bra CicloP0 ;No => continuamos esperando
  368.  
  369. movlw 0xB1 ;Si => recargamos el TMR0L, no es necesario
  370.  
  371. movwf TMR0L,.0 ;recargar el TMR0H
  372.  
  373. bcf INTCON,TMR0IF ;limpiamos TMR0IF para reiniciar la cuenta
  374.  
  375. decfsz ContT0,F,.0 ;ContT0 -- , y ContT0 == 0?
  376.  
  377. bra CicloP0 ;No => Volvemos al ciclo de espera
  378.  
  379. movlw 0xFF ;Si => Cambiamos el estado de los puertos (toggle)
  380.  
  381. xorwf LATA,F,.0 ;para eso realizamos un XOR de cada puerto con 0xFF
  382.  
  383. xorwf LATB,F,.0
  384.  
  385. xorwf LATC,F,.0
  386.  
  387. xorwf LATD,F,.0
  388.  
  389. xorwf LATE,F,.0
  390.  
  391. bra Ciclo ;Volvemos a recargar el valor de ContT0,
  392.  
  393.  
  394.  
  395. ;******************************************************************************
  396.  
  397.  
  398.  
  399. END ;Directiva fin del programa
  400.  


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

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

Saludos
« Última modificación: 12 de Octubre de 2008, 03:25:07 por sander » En línea

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

Visita mi blog
sander
Colaborador
PIC24F
*****
Desconectado Desconectado

Sexo: Masculino
Bolivia Bolivia

Mensajes: 532



« Respuesta #13 : 12 de Octubre de 2008, 02:52:06 »

TxRx_0.asm

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

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

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

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

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

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

Saludos
 
« Última modificación: 12 de Octubre de 2008, 03:26:48 por sander » En línea

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

Visita mi blog
Leon Pic
Colaborador
DsPIC30
*****
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 3382


Cumuloninbus


WWW
« Respuesta #14 : 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.
En línea

Él dijo: "destruyan a la Iglesia y yo la levantaré en tres días". Con esto definió que la Iglesia, somos nosotros; el cuerpo y alma, y no el edificio o templo.
-"Ámense los unos a los otros como yo los he amado" Nuestro Señor Dios hecho hombre: Jesús.
-Él, fue a la cruz, pagó nuestro pecado con un dolor increible siendo inocente de lo que lo acusaban, para salvarnos.

-Mi propio Foro de Meteorología
www.meteorologiafacil.com.ar/foros/index.php

-Web
www.meteorologiafacil.com.ar
sander
Colaborador
PIC24F
*****
Desconectado Desconectado

Sexo: Masculino
Bolivia Bolivia

Mensajes: 532



« Respuesta #15 : 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.

En línea

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

Visita mi blog
Leon Pic
Colaborador
DsPIC30
*****
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 3382


Cumuloninbus


WWW
« Respuesta #16 : 16 de Noviembre de 2008, 13:46:29 »

Lo prometido es deuda http://www.todopic.com.ar/foros/index.php?topic=23812.msg191686#msg191686
En línea

Él dijo: "destruyan a la Iglesia y yo la levantaré en tres días". Con esto definió que la Iglesia, somos nosotros; el cuerpo y alma, y no el edificio o templo.
-"Ámense los unos a los otros como yo los he amado" Nuestro Señor Dios hecho hombre: Jesús.
-Él, fue a la cruz, pagó nuestro pecado con un dolor increible siendo inocente de lo que lo acusaban, para salvarnos.

-Mi propio Foro de Meteorología
www.meteorologiafacil.com.ar/foros/index.php

-Web
www.meteorologiafacil.com.ar
epacho1
PIC10
*
Desconectado Desconectado

Sexo: Masculino
Ecuador Ecuador

Mensajes: 10


« Respuesta #17 : 14 de Enero de 2009, 12: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
En línea
LABmouse
Moderadores
DsPIC30
*****
Desconectado Desconectado

Sexo: Masculino
Colombia Colombia

Mensajes: 3542



WWW
« Respuesta #18 : 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!
En línea

silcarmig
PIC10
*
Desconectado Desconectado

Ecuador Ecuador

Mensajes: 1


« Respuesta #19 : 19 de Junio de 2010, 17:42:51 »

GRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIAS
En línea
TODOPIC
   

 En línea
Páginas: [1] 2 3 Imprimir 
« anterior próximo »
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.20 | SMF © 2006-2008, Simple Machines XHTML 1.0 válido! CSS válido!
Página creada en 1.379 segundos con 23 consultas.
anything