Autor Tema: Configurar I/O en C para CCS  (Leído 12870 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado cucaracha

  • PIC24H
  • ******
  • Mensajes: 1409
    • CUCAWEB
Configurar I/O en C para CCS
« en: 04 de Noviembre de 2003, 01:51:00 »
Antes en ensamblador configuraba los pines para entrada y salida con el registro trisA, trisB,..
En C no se bien como hacerlo. En el manual veo:
#USE FIXED_IO(puerto_OUTPUTS)
#FAST_IO(puerto)
#STANDARD_IO(puerto)
SET_TRIS_X(value)
Supongo que lo que hacía en ensamblador se hace igual con la línea set_tris...
Pero, para que leches sirven las otras, que diferencia hay entre ellas. Que es eso de que me ahorro un byte de ram si uso uno u otro. Y si no uso ninguno y uso el set_tris_x ? también me lo ahorro. La verdad es que por el manual no me aclaro.

Un saludo!
Saludos desde Huelva (ESPAÑA)

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Configurar I/O en C para CCS
« Respuesta #1 en: 04 de Noviembre de 2003, 09:48:00 »
Hola Cucaracha. La verdad es que yo támpoco lo tengo claro, la información que dá el manual es mínima y es la siguiente:

· #USE FAST_IO (puerto)
Esta directiva afecta al código que el compilador generará para las instrucciones de entrada y salida. Este método rápido de hacer I/O ocasiona que el compilador realice
I/O sin programar el registro de dirección. El puerto puede ser A-G.
Ejemplo: #use fast_io(A)

· #USE FIXED_IO (puerto_OUTPUTS=pin_x#, pin_x#...)
Esta directiva afecta al código que el compilador generará para las instrucciones de entrada y salida. El método fijo de hacer I/O causará que el compilador genere código
para hacer que un pin de I/O sea entrada o salida cada vez que se utiliza. Esto ahorra el byte de RAM usado en I/O normal.
Ejemplo: #use fixed_io(a_outputs=PIN_A2 ,PIN_A3)

· #USE STANDARD_IO (puerto)
Esta directiva afecta al código que el compilador genera para las instrucciones de entrada y salida. El método standar de hacer I/O causará que el compilador genere
código para hacer que un pin de I/O sea entrada o salida cada vez que se utiliza. En los procesadores de la serie 5X esto necesita un byte de RAM para cada puerto
establecido como I/O estandar.
Ejemplo: #use standard_io(A)

A ver si alguien sabe cuales son las diferencias entre las tres.

Un saludo

Desconectado lu6vg

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 313
RE: Configurar I/O en C para CCS
« Respuesta #2 en: 04 de Noviembre de 2003, 10:14:00 »
Yo no lo tengo muy claro, pese a los denodados esfuerzos de Pikman de explicarmelos en varios emails. Si el lee esto seguro que lo explica bien. Lo unico que puedo decir es que al usar USE FAST_IO() cuando usamos por ejemplo output_high() (o low) el codigo que se genera solo tiene una instruccion ASS. Sin esto tiene 4 instrucciones.

Saludos

Luis

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Configurar I/O en C para CCS
« Respuesta #3 en: 09 de Noviembre de 2003, 13:23:00 »
Otra cosa que he encontrado referente a las directivas del preprocesador de arriba:

El uso de #use fast_io(puerto) afecta a las funciones delay_ms() y delay_us() dando lugar a mal funcionamiento. Cuando pueda pondré un programa corto que lo demuestra.

Desconectado pikman

  • Moderador Local
  • PIC24F
  • *****
  • Mensajes: 679
RE: Configurar I/O en C para CCS
« Respuesta #4 en: 10 de Noviembre de 2003, 09:33:00 »
Hola Pocher,

Hace un tiempo descubri lo que mencionas, generalmente yo uso siempre fast_io y en una rutina que hice para leer la trama del um3750 descubri que los tiempos cortos usando delay_ms y delay_us eran cualquier cosa, fianlemnte inclui retardos en ASM pues me volvio loco, me podes explicar lo que descubriste, pues no le veo razon para interactuar, pero bueno son los misterios del CCS,

saludos

 Ariel
saludos
PikMan

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Configurar I/O en C para CCS
« Respuesta #5 en: 10 de Noviembre de 2003, 12:05:00 »
Hola Pickman. En este programa que te pongo más abajo si se incluye el #use fast_io(puerto) la onda en el osciloscopio conectado a RB6 desaparece. Sin embargo sin el fast_io aparece y va bien. Lo he realizado en PROTEUS con tres osciloscopios virtuales.

#include <16F876.h>

#use Delay(Clock=4000000)

//#use fast_io(B)   //¡¡¡ Si ponemos esta funcion RB6 va mal !!!

main()
{
int8 a=1;            
short b;            
set_tris_b(0x02);
   
    while(1)
    {
   if(!input(PIN_B1))
       {
            output_high(PIN_B5);
            output_high(PIN_B6);
            output_high(PIN_B7);
          
            delay_ms(2*a);            
          output_low(PIN_B5);     //B5 2ms alta y 8ms baja
          delay_ms(3*a);
          output_low(PIN_B6);     //B6 5ms alta y 5ms baja
          delay_ms(3*a);
          output_low(PIN_B7);     //B7 8ms alta y 2ms baja
          delay_ms(2*a);  
       }
       else
       {
          output_high(PIN_B5);
          output_high(PIN_B6);
          output_high(PIN_B7);                    
          delay_ms(1*a);            
          output_low(PIN_B5);     //B5 1ms alta y 9ms baja     
          delay_ms(5*a);
          output_low(PIN_B6);     //B6 6ms alta y 4ms baja  
          delay_ms(3*a);
          output_low(PIN_B7);     //B7 9ms alta y 1ms baja
          delay_ms(1*a);  
       }       
                                       
    }
}        


Sería interesante si alguien lo pudiese probar físicamente y comentar si es como en PROTEUS.

Un saludo

Desconectado pikman

  • Moderador Local
  • PIC24F
  • *****
  • Mensajes: 679
RE: Configurar I/O en C para CCS
« Respuesta #6 en: 10 de Noviembre de 2003, 14:27:00 »
Hola POCHER;
                       Pues la verdad no es exactamente lo que a mi me sucede, lo que me pasaba era que los retardos no eran correctos, no se tampoco si se debe al uso de la directiva fast_io, que por cierto no tendria nada que ver pues lo que hace es que el compilador no programe el puerto antes de cada operacion, que por cierto lo que da como producto final es que el codigo sea mas rapido pues se estan evitando instrucciones, lo que no se es que puede tener que ver con la sentencia delay_ms, loq ue voy a hacer es probar mi programa sin incluir la directiva, para ver si asi se comporta, lo ideal seria poder consultar con CCS, de igual modo voy a consultar el listado de bugs para ver si se menciona algo, lo que si recuerdo es que yo siempre he usado esta directiva, y claro porbablemente no este notando diferencias en retardos largos, aunque ultimamente estoy usando la interrrupcion del timer0 o 1 para tener una base de tiempo permanente y poder eliminar los delay_ms que solo ocupan memoria bueno voy a realizar la experiencia y te cuento, todavia estoy estudiando el proteus ,

vaya un saludo

Ariel
saludos
PikMan

Desconectado chamuergas

  • PIC10
  • *
  • Mensajes: 7
RE: Configurar I/O en C para CCS
« Respuesta #7 en: 09 de Enero de 2004, 06:57:00 »
Dicen que la mejor forma de aprender es esperimentando, bueno pues probad una configuración cualquiera de puerto y compilarlo en mplab posteriormente abrid el fichero xx.lst donde el xx es el nombre del archivo creado en C. En este archivo podeis ver como genera el codigo ensamblado y observar si configura el puerto en cada uso o lo da por configurado.

Desconectado mannverr

  • PIC10
  • *
  • Mensajes: 5
RE: Configurar I/O en C para CCS
« Respuesta #8 en: 25 de Febrero de 2004, 10:02:00 »
     Vuestra charla me ha servido de mucho, aunque no haya preguntado. Si necesitáis algo y os puedo ayudar no dudéis en preguntarme.

                     Sois geniales.


 

anything