TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: maunix en 01 de Septiembre de 2006, 21:38:33

Título: Ejemplo de ECO USART para 18F452
Publicado por: maunix en 01 de Septiembre de 2006, 21:38:33
Les adjunto un simple ejemplo de cómo hacer un eco de usart con los PIC18.

Para hacerlo con una PC haría falta un PIC + un MAX232.

Espero les sea útil.  Adjunto todo el proyecto que puede ser simulado con MPLAB 7.4x.  Está hecho para ser descomprimido en C:\ pero puede ser ubicado donde uds deseen.

Código: ASM
  1. ;--------------------------------------------------------------------------------------------------------------------------
  2. ;  Software ECO de USART para PIC18F452
  3. ;
  4. ;  Descripción: El siguiente software está concebido con fines educativos únicamente.
  5. ;               El código no contiene secretos ni cosas raras, está permitido el uso parcial o total del mismo
  6. ;               sin necesidad de consultar al autor o nombrarlo
  7. ;
  8. ;  Elegí este PIC por ser el más popular de la familia aunque será discontinuado, es fácil migrar código de este pic a otros.
  9. ;  La migración a otros microcontroladorse de la familia 18F es posible y bastante sencilla previa lectura de
  10. ;  los aspectos que lo diferencia con el 18F452.
  11. ;
  12. ;--------------------------------------------------------------------------------------------------------------------------
  13.  
  14.         list p=18F452
  15.         #include <p18f452.inc>
  16.  
  17.         ;Code Protection Deshabilitado
  18.         CONFIG     CP0=OFF
  19.  
  20.         ;Oscillator switch deshabilitado.  Oscilador tipo HS. PLL desactivado
  21.         CONFIG     OSCS=OFF, OSC=HS
  22.  
  23.         ;Brown-OutReset enabled, Voltage de Brown Out es 2.5V
  24.         CONFIG     BOR=OFF, BORV=25
  25.  
  26.         ;Watch Dog Timer Habilitado, Watch Dog Timer PostScaler 1:128
  27.         CONFIG     WDT=OFF, WDTPS=128
  28.  
  29.         ;Low Voltage Programming Deshabilitado
  30.         CONFIG     LVP=OFF
  31.  
  32.         ;CCP2 pin Mux enabled
  33.         CONFIG     CCP2MUX=ON
  34.  
  35.         ;Stack over/underflow Reset Habilitado.
  36.         CONFIG     STVR=ON
  37.  
  38. TEMPVAR equ     0x00    ;En Banco 0.
  39.  
  40.  
  41.         org     0x0000
  42.  
  43. _BOOT:
  44.         goto    _INICIO
  45.  
  46.  
  47.  
  48.         org     0x00A0
  49.  
  50. _INICIO:
  51.         movlw   b'10111111'     ;TRISC<6> como salida de USART (en los 18F es así)
  52.                                 ;y TRISC<7> en 1, para ser configurados como pines USART
  53.         movwf   TRISC  
  54.  
  55. ;---------------------------------------------------------------------------------
  56. ;       Configuración USART Transmisor
  57. ;---------------------------------------------------------------------------------
  58.         movlw   .64             ;9600 bps - Clock 10Mhz - PLL apagado
  59.         movwf   SPBRG
  60.         movlw   b'00100100'             ;TXEN=on , SYNC = 0 , BRGH = 1
  61.         movwf   TXSTA
  62.  
  63.  
  64. ;---------------------------------------------------------------------------------
  65. ;             Configuración USART Receptor
  66. ;---------------------------------------------------------------------------------
  67.  
  68.         movlw   b'00000000'
  69.         movwf   RCSTA
  70.         bsf     RCSTA,SPEN              ;SPEN = 1 habilita el puerto serie, con recepcion continua
  71.  
  72.         call    _USARTCLEAR
  73.         bsf     RCSTA,CREN              ;Habilita Usart.  Recepción Continua
  74.  
  75.        
  76. _USARTLOOP:
  77.         btfss   PIR1,RCIF               ;Espera próximo caracter
  78.         goto    _USARTLOOP
  79.  
  80.         btfsc   RCREG,OERR
  81.         call    _USARTCLEAR             ;Error de Sobreescritura
  82.         btfsc   RCREG,FERR
  83.         call    _USARTCLEAR             ;Error de Trama
  84.  
  85.         movff   RCREG,TEMPVAR
  86.         btfsc   PIR1,TXIF               ;Con esto garantizo que si el buffer está ocupado
  87.                                 ;no será sobreescrito.  Se recibe el caracter pero no se responde.
  88.         movwf   TXREG
  89.         goto    _USARTLOOP
  90.  
  91.  
  92. _USARTCLEAR
  93.         bcf     RCSTA,CREN
  94.         movf    RCREG,w
  95.         movf    RCREG,w
  96.         movf    RCREG,w         ;Vacío buffers de usart
  97.         bsf     RCSTA,CREN
  98.         return
  99.  
  100.  
  101.         end

Saludos
Título: Re: Ejemplo de ECO USART para 18F452
Publicado por: stk500 en 19 de Diciembre de 2007, 16:08:14
Hola Mauricio!
aqui viendo tu ejemplo basado en la USART, mi pregunta es como puedo usarla para recibir aqui DMX o enviar
creo que deberia cambia aqui algunos parametro Pj.
 movlw   .64      ;9600 bps - Clock 10Mhz - PLL apagado
donde seria 250000 bps
podia tu aqui darme detalle?
es que soy nuevecito en esto y quiero aprender la implementacion ,
Título: Re: Ejemplo de ECO USART para 18F452
Publicado por: ESTECA55 en 19 de Diciembre de 2007, 16:45:11
Excelente aporte Mauricio!, gracias.

Estoy empezando con el C18 y esto me viene de 10, precien veo el mensaje jejeje





Título: Re: Ejemplo de ECO USART para 18F452
Publicado por: maunix en 20 de Diciembre de 2007, 12:08:30
Excelente aporte Mauricio!, gracias.

Estoy empezando con el C18 y esto me viene de 10, precien veo el mensaje jejeje

Ya subiré algo para el C18, pero antes quisiera probarlo :) :)

Algo asi como un eco usart para 18F4520 o 18F452 como para comenzar  :)
Título: Re: Ejemplo de ECO USART para 18F452
Publicado por: maunix en 20 de Diciembre de 2007, 12:10:37
Hola Mauricio!
aqui viendo tu ejemplo basado en la USART, mi pregunta es como puedo usarla para recibir aqui DMX o enviar
creo que deberia cambia aqui algunos parametro Pj.
 movlw   .64      ;9600 bps - Clock 10Mhz - PLL apagado
donde seria 250000 bps
podia tu aqui darme detalle?
es que soy nuevecito en esto y quiero aprender la implementacion ,


Hola stk500 , se ve que este es un post que les gusta a los "esteca" jajaja.

Puntualmente quieres hacerlo andar a 250.000 bps?  o 250kbps ? ese baudeaje es clavado? digamos sí o sí es ese valor o quieres algo similar?

Tendría que revisar como hacer el cálculo, no es complejo y te puedo dar una mano si quieres.

Título: Re: Ejemplo de ECO USART para 18F452
Publicado por: Nocturno en 20 de Diciembre de 2007, 12:44:24
Recientemente me he tenido que enfrentar a la configuración de una usart a 250Kbps para DMX y tengo los cálculos hechos para 4MHz y para 8MHz.
Para 4MHz tienes que cargar un 3 en el registro SPBRG.
Para 8MHz tienes que cargar un 7.

La fórmula es: baudios = Fosc / (4 * (SPBRG+1))

Para 10MHz, el resultado sería 9, en teoría.
Título: Re: Ejemplo de ECO USART para 18F452
Publicado por: maunix en 20 de Diciembre de 2007, 15:08:07
Recientemente me he tenido que enfrentar a la configuración de una usart a 250Kbps para DMX y tengo los cálculos hechos para 4MHz y para 8MHz.
Para 4MHz tienes que cargar un 3 en el registro SPBRG.
Para 8MHz tienes que cargar un 7.

La fórmula es: baudios = Fosc / (4 * (SPBRG+1))

Para 10MHz, el resultado sería 9, en teoría.


Desconozco el DMX, ¿hablamos de 250kbps en uart síncrona?
Título: Re: Ejemplo de ECO USART para 18F452
Publicado por: Nocturno en 20 de Diciembre de 2007, 15:11:47
250Kbps en asíncrona, Mauricio, y con señal de break y start particulares.
Título: Re: Ejemplo de ECO USART para 18F452
Publicado por: maunix en 20 de Diciembre de 2007, 15:53:52
250Kbps en asíncrona, Mauricio, y con señal de break y start particulares.

Ah, fíjate porqué lo menciono, extraído del datasheet ds35964 de los PIC18Fxx2




Sync    BRGH = 0 (Baja Velocidad)    BRGH = 1 (Alta Velocidad)



0(Asíncrono) Baudeaje = FOSC/(64(X+1))      Baudeaje = FOSC/(16(X+1))



1(Síncrono) Baudeaje = FOSC/(4(X+1))N/A





En el caso de asíncrono y alta velocidad creo que el cálculo sería dividiendo por 16 y no por 4.

Baudeaje = Fosc / ( 16 *  (X + 1) )

X = (Fosc / (Baudeaje * 16)) - 1



Luego

Para 10MHz

X = (10.000.000 / (250.000 x 16)) - 1 = 2,5 - 1 = 1,5 (lo cual es un valor no válido)

Para 40MHz (clock de 10Mhz con HSPLL habilitado que multiplica por 4)

X = (40.000.000 / (250.000 x 16)) - 1 = 9


El resultado también es 9 pero para 40Mhz.

Título: Re: Ejemplo de ECO USART para 18F452
Publicado por: microcom en 20 de Diciembre de 2007, 18:23:50
maunix gracias por el aporte

saludos
Título: Re: Ejemplo de ECO USART para 18F452
Publicado por: Nocturno en 21 de Diciembre de 2007, 02:47:56
Mauricio, concretamente me refiero a la configuración que aparece en la cuarta fila de esta tabla:

(http://img155.imageshack.us/img155/530/baudratend5.jpg)

SYNC=0, BRG16=1 y BRGH=1

Ahí se ve que la fórmula es Fosc / (4 * (SPBRG+1))

De todas formas, diga lo que diga la data, yo lo he probado a 4MHz y a 8MHz y son los números que dije antes  :mrgreen: . En este caso me aplico lo que decía Linus Torvals:
"Y jamás cometas el error de creer que puedes diseñar algo mejor que lo que obtienes de hacer prueba-y-error en paralelo despiadada y masivamente con un ciclo de retroalimentación."
Título: Re: Ejemplo de ECO USART para 18F452
Publicado por: maunix en 21 de Diciembre de 2007, 11:04:00
Ahh Manolo pero estabas haciendo trampa, el 18F452 no tiene EUSART  :mrgreen: :mrgreen: (lo digo con tono humorístico)

Yo hablaba del 18F452 por el topic, bueno misterio resuelto.  :wink: :wink:



PD: Para alguien que se interese en el Hilo, la fórmula de Manolo funciona para Modo Extended Usart y la que yo expuse para la Usart Convencional.
Un pic con EUSART puede configurarse en forma idéntica con la fórmula de USART pero también tiene posibilidades 'extra' que lo hacen "enhanced" o mejorado, como por ejemplo contar con un registro de 16 bits para el Generador de Baudeaje.
Título: Re: Ejemplo de ECO USART para 18F452
Publicado por: Nocturno en 21 de Diciembre de 2007, 12:42:45
Ah, pues pido disculpas por la confusión. Yo estaba mirando la data de un 18F2550 y daba por hecho que era la misma.
Título: Re: Ejemplo de ECO USART para 18F452
Publicado por: maunix en 21 de Diciembre de 2007, 15:29:26
Ah, pues pido disculpas por la confusión. Yo estaba mirando la data de un 18F2550 y daba por hecho que era la misma.

Ambas opciones son válidas ya que la info acá vertida queda ya disponible para varios pics.  El punto de mayor confusión creo fue que como yo no sabía si era síncrono o no el DMX lo hubieramos descubierto antes.  Si fuera síncrono si era divido 4 y también aplicaba para un 18F452.

Mientras se haya aclarado, creo que queda bien expuesto asi, ambas opciones son válidas dependiendo del pic que se use.  ;)