TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Mando31 en 11 de Septiembre de 2009, 21:17:10

Título: Como hacer una USART por software en ccs c sin usar la directiva #use RS232??
Publicado por: Mando31 en 11 de Septiembre de 2009, 21:17:10
Hola compañeros foreros, pues mi inquietud y problema es como poder generar una usart por software sin usar la gran ayuda del ccs como es la directuva #use RS232, sino que generarla toda por programación usando el protocolo NRZ-L.  :mrgreen:
Título: Re: Como hacer una USART por software en ccs c sin usar la directiva #use RS232??
Publicado por: MGLSOFT en 12 de Septiembre de 2009, 07:21:50
No lo se, pero si lo que intentas es complicarte la vida, podrias agregarle Modbus, por ejemplo... :mrgreen:
Título: Re: Como hacer una USART por software en ccs c sin usar la directiva #use RS232?
Publicado por: MLO__ en 12 de Septiembre de 2009, 10:51:28
Hola.

De poderse, se puede, claro está. Puedes usar la función output_bit(), con la función shift_left() para hacerlo. Lo que si debes tener en cuenta son los tiempos, para calculo del BaudRate y esas cosas.

Saludos
Título: Re: Como hacer una USART por software en ccs c sin usar la directiva #use RS232??
Publicado por: Mando31 en 12 de Septiembre de 2009, 21:48:09
Hola MLO__ teno claro que debo de sacar los calculos para el BaudReate y todo eso  :P, podrias explicarm un poquito lo del shift_left() como se maneja un ejemplo, gracias.

Y MGLSOFT no es que quiera complicarme la vida yo sino es más culpa de mi profesor que es el que nos pidio investigaramos sobre como hacer esto y después para poder hacerlo, inclusive el nos dijo que consultaramos en los foros y como soy miembro de este grandioso foro pues decidi exponer mi duda aqui en donde hay grandes en el tema de los PIC.

Por todo Muchas Gracias.
Título: Re: Como hacer una USART por software en ccs c sin usar la directiva #use RS232?
Publicado por: MLO__ en 12 de Septiembre de 2009, 21:57:18
output_bit()

Citar
Outputs the specified value (0 or 1) to the specified I/O pin.  The method  of  setting  the  direction register   is  determined  by  the  last  #USE *_IO  directive.

shift_left()

Citar
Shifts a bit into an array or structure.  The address may be an array identifier or an address to a structure (such as &data).   Bit 0 of the lowest byte in RAM is treated as the LSB.

Supongamos que definimos como pin de salida a algun pin, al que llamaremos DATA y que tenemos una variable de 8 bits VAR la cual vamos a sacar bit a bit por el pin DATA:

Código: C#
  1. for(i=0;i<8;i++)
  2.  output_bit(DATA, shift_left(&VAR,1,0));

Saludos

Título: Re: Como hacer una USART por software en ccs c sin usar la directiva #use RS232??
Publicado por: MGLSOFT en 13 de Septiembre de 2009, 06:13:02
Tambien puedes hacer rutinas en assembler dentro de C, donde deberas hacer los retardos en assembler.
Eso le gustara a tu profesor, se relamen cuando le mencionas el assembler... :mrgreen: :mrgreen:
Título: Re: Como hacer una USART por software en ccs c sin usar la directiva #use RS232?
Publicado por: fr4n en 27 de Abril de 2011, 07:10:52
output_bit()

Citar
Outputs the specified value (0 or 1) to the specified I/O pin.  The method  of  setting  the  direction register   is  determined  by  the  last  #USE *_IO  directive.

shift_left()

Citar
Shifts a bit into an array or structure.  The address may be an array identifier or an address to a structure (such as &data).   Bit 0 of the lowest byte in RAM is treated as the LSB.

Supongamos que definimos como pin de salida a algun pin, al que llamaremos DATA y que tenemos una variable de 8 bits VAR la cual vamos a sacar bit a bit por el pin DATA:

Código: C#
  1. for(i=0;i<8;i++)
  2.  output_bit(DATA, shift_left(&VAR,1,0));

Saludos



¿Y como se hace para calcular el baudrate y para marcarle los tiempos a esa instrucción? ¿meterlo dentro de una rutina de interrupción de algun timer cada X segundos?
¿o existe alguna forma más sencilla?

Gracias. Saludos.
Título: Re: Como hacer una USART por software en ccs c sin usar la directiva #use RS232??
Publicado por: Suky en 27 de Abril de 2011, 10:56:08
Con la calculadora se puede hacer 1/baudrate y se tiene el periodo de cada bit. Con eso ya se puede utilizar delay_xs(....)


Saludos!
Título: Re: Como hacer una USART por software en ccs c sin usar la directiva #use RS232??
Publicado por: fr4n en 27 de Abril de 2011, 12:39:25
Con la calculadora se puede hacer 1/baudrate y se tiene el periodo de cada bit. Con eso ya se puede utilizar delay_xs(....)


Saludos!

Gracias por responder!

Si mi PIC trabaja a 48Mhz y quiero enviar 500K bits cada segundo... ¿como sería la formula? No influye que esté trabajando a 48Mhz?

Saludos!
Título: Re: Como hacer una USART por software en ccs c sin usar la directiva #use RS232??
Publicado por: Suky en 27 de Abril de 2011, 12:51:49
Ufff... A 500000 tienes que tener en cuenta cuanto demora cada instrucción en C, y a partir de ello agregarle la demora necesaria para que cada bit sea colocado o leido cada 2us (1/500k) .

Puede que las instrucciones de C demoren mucho y lo mejor sea incrustar código en asm.


Saludos!
Título: Re: Como hacer una USART por software en ccs c sin usar la directiva #use RS232??
Publicado por: fr4n en 27 de Abril de 2011, 18:44:31
Ufff... A 500000 tienes que tener en cuenta cuanto demora cada instrucción en C, y a partir de ello agregarle la demora necesaria para que cada bit sea colocado o leido cada 2us (1/500k) .

Puede que las instrucciones de C demoren mucho y lo mejor sea incrustar código en asm.


Saludos!

de asm no tengo mucha idea :S
¿Como quedaria más o menos?

Gracias.
Título: Re: Como hacer una USART por software en ccs c sin usar la directiva #use RS232??
Publicado por: Suky en 27 de Abril de 2011, 20:27:25
Ufff... A 500000 tienes que tener en cuenta cuanto demora cada instrucción en C, y a partir de ello agregarle la demora necesaria para que cada bit sea colocado o leido cada 2us (1/500k) .

Puede que las instrucciones de C demoren mucho y lo mejor sea incrustar código en asm.


Saludos!

de asm no tengo mucha idea :S
¿Como quedaria más o menos?

Gracias.

Busca información el foro, hay bastante sobre el tema. Ya sea sobre assembler y assembler en CCS.


Saludos!
Título: Re: Como hacer una USART por software en ccs c sin usar la directiva #use RS232??
Publicado por: fr4n en 28 de Abril de 2011, 06:09:58
Todo mi programa es en C usando el ccs, puedo incrustar solo esa parte del codigo en asm y que todo compile sin problemas?

Saludos.
Título: Re: Como hacer una USART por software en ccs c sin usar la directiva #use RS232??
Publicado por: jukinch en 28 de Abril de 2011, 09:36:17
hola fr4n:
        si podés hacerlo. Sólo debes encerrar el código en asm entre la siguiente sintaxis:

#ASM



#ENDASM

       Saludos.
               Jukinch



"Este par de instrucciones permite que utilicemos un bloque de instrucciones en assembler dentro de nuestro código CCS. El siguiente es un ejemplo de uso tomado de la ayuda del CCS:

int find_parity (int data)    {
 int count;
 #ASM
 movlw   0x8
 movwf   count
 movlw   0
 loop:
  xorwf   data,w
  rrf     data,f
  decfsz  count,f
 goto    loop
 movlw   1
 awdwf   count,f
 movwf   _return_
 #ENDASM
}


La variable predefinida _RETURN_ puede utilzarse para transferir un valor desde el código ASM a CCS.

Si en lugar de #ASM utilizamos #ASM ASIS, CCS no intentará efectuar cambios de bancos de memória automaticos para las variables que no pueden ser accedidas desde el banco actual. El codigo assembler es utilizado "as-is" ("como es").


fuente: http://www.ucontrol.com.ar/wiki/index.php?title=CCS_-_Directivas_para_el_compilador#.23ASM_.2F_.23ENDASM
Título: Re: Como hacer una USART por software en ccs c sin usar la directiva #use RS232??
Publicado por: fr4n en 28 de Abril de 2011, 10:28:52
Muchas gracias!  ;-)

Ahora solo tengo que aprender como hacer el codigo en asm para que me envie los datos de una variable (por ejemplo byte o long) a un pin determinado del pic a razon de 500 kbits por segundo...