Autor Tema: PIC18 y sus misterios  (Leído 11428 veces)

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

Desconectado yair_xiox

  • PIC16
  • ***
  • Mensajes: 210
Re:PIC18 y sus misterios
« Respuesta #30 en: 09 de Octubre de 2015, 17:19:45 »
oye killer puedes poner un programa con un pic18 para que se comunique con cualquier modulo bluethoot  y lo de mandar los caracteres asci

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PIC18 y sus misterios
« Respuesta #31 en: 09 de Octubre de 2015, 17:35:25 »
oye killer puedes poner un programa con un pic18 para que se comunique con cualquier modulo bluethoot  y lo de mandar los caracteres asci

Enviar caracteres ASCII puede ser. Comunicarse con cualquier modulo bluetooth es muy general. No voy a hacer un programa que por ejemplo se comunique, configure el HT-05/06 por ejemplo. Solo lo de enviar un dato si, o enviar una cadena de caracteres tambien. Pero ya la comunicacion completa es del usuario. Ya que son muchos comandos AT que hay, la forma en especial que quiera hacerlo,etc. Pero vas a tener un comienzo.

gracias killer, igual en el trabajo no me dejan programar en asembler todo es en c

Lo que puse ahi no tiene nada que ver casi con ASM (aunque este escrito los ejemplos para MPASM), al menos lo ultimo sobre le linker/compilador, es funcionamiento comun de casi todos los compiladores C (que en un bin traen todo, compilador C, ASM y linker). Debes entender eso ya que de igual manera se maneja C. Si no me crees compila un proyecto C con 2 archivos y vas a verlo, en las opciones podes agregar que muestre el archivo .lst y de como resultado el .map.
« Última modificación: 09 de Octubre de 2015, 18:49:01 por KILLERJC »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PIC18 y sus misterios
« Respuesta #32 en: 10 de Octubre de 2015, 01:10:48 »
A pedido de yair un codigo para enviar el comando "AT+RST" por UART, en el que se puede ver ademas el uso de las tablas para leer la memoria flash y el guardar string en la misma.

Código: ASM
  1. list
  2.         include "p18f2550.inc"
  3.        
  4. ;************************************************    
  5. ;   Vectores de reset e interrupcion
  6. ;************************************************    
  7.    
  8.         org    0x00     ;Vector de Reset
  9.         GOTO    Configuracion
  10.    
  11.         org    0x08     ;Vector de Interrupcion Alta Prioridad
  12.         RETURN
  13.    
  14.         org    0x18     ;Vector de Interrupcion Baja Prioridad
  15.         RETURN
  16.  
  17. ;************************************************    
  18. ;   Programa Principal
  19. ;************************************************    
  20.  
  21. ; Comienzo de la seccion code
  22.        
  23.         code
  24.  
  25. ; Creacion de datos en la memoria de programa, dentro de la seccion .code (memoria de programa)
  26. ; Podria haber creado una seccion y puesto en otro lado fijo, pero aqui no me importa :P
  27.  
  28. AT_COM1:    dw "AT+RST",00
  29.        
  30. Configuracion:
  31.  
  32.         ; Configuracion modulo UART, segun datasheet
  33.        
  34.         MOVLW   0xC0    ; 1100 0000
  35.         MOVWF   TRISC
  36.         ; 115200 baudios a un cristal de 40Mhz
  37.         CLRF    SPBRGH
  38.         MOVLW   0x56
  39.         MOVWF   SPBRG
  40.         BSF     BAUDCON,BRG16
  41.         BCF     TXSTA,SYNC
  42.         BSF     RCSTA,SPEN
  43.         BSF     TXSTA,TXEN
  44.  
  45. Main:
  46.         MOVLW   UPPER AT_COM1   ; Cargo el valor de la tabla
  47.         MOVWF   TBLPTRU         ; Asi leo de la memoria de programa
  48.         MOVLW   HIGH AT_COM1
  49.         MOVWF   TBLPTRH
  50.         MOVLW   LOW AT_COM1
  51.         MOVWF   TBLPTRL
  52.        
  53.         CALL    Enviar
  54.  
  55. Fin:                            ; Termino de enviar todo, espero.
  56.         GOTO    $               ; Loop infinito
  57.  
  58.        
  59.  
  60. ; Funcion que envia por UART, el contenido indicado por la tabla.      
  61.        
  62. Enviar:
  63.         TBLRD*+                 ; Leo y aumento el puntero
  64.         MOVF    TABLAT,W        ; Me aseguro que no sea 0, con 0 se termino el string
  65.         BTFSC   STATUS,Z        ; Es 0 salgo.
  66.         RETURN
  67.         MOVWF   TXREG           ; Envio
  68. Espero: BTFSS   TXSTA,TRMT      ; Me aseguro que termino antes de enviar otro
  69.         GOTO    Espero          ;
  70.         GOTO    Enviar          ; Esta libre? Envio otro
  71.        
  72.        
  73. ;----------- Fin de programa ---------------------        
  74.     END

Se denota que la funcion Enviar se puede utilizar para varias string, solo hay que definirlas, cargar la base de las mismas y se envian. incluso se puede crear otra seccion que solo contenta esos string, asi solo se necesita modificar por ejemplo la parte baja del apuntador de las tablas y no los 3 registros.

Loop de la UART, lo recibido es nuevamente enviado:

Código: ASM
  1. list
  2.         include "p18f2550.inc"
  3.        
  4. ;************************************************    
  5. ;   Vectores de reset e interrupcion
  6. ;************************************************    
  7.    
  8.         org    0x00     ;Vector de Reset
  9.         GOTO    Configuracion
  10.    
  11.         org    0x08     ;Vector de Interrupcion Alta Prioridad
  12.         GOTO    Interrupcion
  13.    
  14.         org    0x18     ;Vector de Interrupcion Baja Prioridad
  15.         RETURN
  16.  
  17. ;************************************************    
  18. ;   Programa Principal
  19. ;************************************************    
  20.  
  21. ; Comienzo de la seccion code
  22.        
  23.         code
  24.        
  25. Configuracion:
  26.  
  27.         ; Configuracion modulo UART, segun datasheet
  28.        
  29.         MOVLW   0xC0    ; 1100 0000
  30.         MOVWF   TRISC
  31.         ; 115200 baudios a un cristal de 40Mhz
  32.         CLRF    SPBRGH
  33.         MOVLW   0x56
  34.         MOVWF   SPBRG
  35.         BSF     BAUDCON,BRG16
  36.         BCF     TXSTA,SYNC
  37.         BSF     RCSTA,SPEN
  38.         BSF     RCSTA,RCEN
  39.         BSF     TXSTA,TXEN
  40.  
  41.         ; Configurando interrupciones
  42.        
  43.         BSF     PIE1,RCIE   ; Habilito interrupciones de recepcion
  44.         BSF     IPR1,RCIP   ; Prioridad alta en RX
  45.         BSF     RCON,IPEN   ; Habilito las prioridades
  46.         BSF     INTCON,GIEH ; Habilito interrupciones de alta prioridad
  47.        
  48. Main:  
  49.         GOTO    Main            ; Loop infinito
  50.  
  51. ; Interrupcion de la UART usando los registros rapidos para tener W y STATUS
  52.        
  53. Interrupcion:
  54.         MOVFF   RCREG,TXREG
  55.         RETFIE  FAST
  56.        
  57. ;----------- Fin de programa ---------------------        
  58.     END

En ese ultimo ejemplo se aprovecha el uso de las interrupciones en el PIC18, el cual al entrar no solo se guarda el PC sino W y STATUS. Para usarlo uno luego debe usar el FAST al final. Esto no es solo para este caso, si que tambien el CALL y RETURN permiten el uso del FAST
« Última modificación: 10 de Octubre de 2015, 05:19:17 por KILLERJC »

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:PIC18 y sus misterios
« Respuesta #33 en: 09 de Noviembre de 2015, 19:04:43 »
Buenas noches, tengo algunas dudas con las interrupciones de alta y baja prioridad, mi idea es crear una interrupción de baja prioridad en el TMR0 y por lo que veo en la imagen que adjunto mas abajo no veo que necesite del registro IPEN:

pero al mirar esta otra imagen veo que si no pongo a '1' dicho registro no me funcionara la Interrupción ya que al ser una puerta AND todas sus entradas deben de estar a '1' para que su salida sea '1' ¿O soy yo que no lo planteo bien?


Gracias.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PIC18 y sus misterios
« Respuesta #34 en: 09 de Noviembre de 2015, 19:54:29 »
El primer grafico esta simplificado.

IPEN - habilita o no las prioridades

En el primer grafico ves como funcionaria. Si este estuviera activo no estarian "unidos" la parte de alta prioridad y baja prioridad (serian casi 2 circuitos separados uno de otro). Entonces cada interrupcion posee su prioridad.  Tambien se ve que cuando se activa una de alta prioridad, inhabiita a una de baja.

Ahora mira las prioridades, Cuando tenes un 1 en TMR0IP es de alta prioridad, ya que baja prioridad pone el negado y es un 0. Ahora que ocurre cuando deshabilitas las prioridades con IPEN = 0. Tanto las de alta como las de baja actuan sobre el vector de 0x0008, sea cual sea la prioridad, Ejemplo digamos que tenes un 0 en TMR0IP (baja prioridad si estuviera habilitado) Si ocurre una interrupcion por TMR0IF al estar IPEN en 0 iria a la parte superior y actuaria por el vector 0x0008, si hubiera un 1 en TMR0IP actuaria la parte superior, ademas esto inhabilita el vector 0x018.

Es un diagrama simplificado. Si fuera correcto el diagrama tendrias que al estar desactivada las prioridades, se produciria una condicion de carrera, ya que si se activa primero en la parte inferior el tiempo de propagacion entre compuertas se dispararia primero el vector de abajo (0x0018). Aunque luego la de alta prioridad la inhabilite, pero se estarian ejecutando 2 instrucciones por una misma entrada. Ya que no hay una compuerta AND con IPEN  a la salida de baja prioridad. Puede que no sea problema por la latencia de la interrupcion.

El segundo diagrama muestra algo mas real y completo. Y se observa que en "baja prioridad" es decir la salida al vector 0x0018 se bloquea al tener IPEN en 0. esto es por que cuando las interrupciones tiene deshabilitadas las prioridades, todas son tratadas como si fueran alta prioridad. ( vector en 0x0008 )

Entonces aca tenes que decidir, ¿tu intencion es solamente hacer una interrupcion normal o interrupcion con prioridad?

Si es una interrupcion normal, deja IPEN en 0, y actuarias sobre el vector 0x0008 para todas. ( tal cual hacemos en los PIC16 y su vector 0x0004 )
Si queres prioridad, pones el IPEN en 1, y en caso de ser baja prioridad (TMR0IP = 0 ), actuarias sobre el vector 0x0018
« Última modificación: 10 de Noviembre de 2015, 19:42:37 por KILLERJC »

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:PIC18 y sus misterios
« Respuesta #35 en: 10 de Noviembre de 2015, 05:27:25 »
Entendido y gracias por la explicación, mi intención es usar las prioridades, voy a ver si consigo que me funcione el TMR0 en baja prioridad.

Saludos!
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re:PIC18 y sus misterios
« Respuesta #36 en: 10 de Noviembre de 2015, 10:20:02 »
Siento admiración por la gente que conoce a fondo la arquitectura PIC !!! Para los que venimos de arquitecturas mas ortogonales se nos hace muy difícil entenderla. Y ojo no hablo de mejor o peor sino arquitecturas diferentes.

Saludos !


 

anything