TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: LucasBols en 21 de Marzo de 2014, 18:16:42

Título: XC8 - ¿asignación de puertos a variables como en CCS?
Publicado por: LucasBols en 21 de Marzo de 2014, 18:16:42
hola, buenas tardes,

¿existe alguna forma de implementar en XC8 la característica de asignación de puertos a variables como en CCS?

en CCS:
Código: [Seleccionar]
#byte puerto_D = 0x08

puerto_d = 0b01010011;

¿como se puede hacer en XC8?

muchas gracias
Título: Re: XC8 - ¿asignación de puertos a variables como en CCS?
Publicado por: MGLSOFT en 21 de Marzo de 2014, 18:29:23
Hacelo en CCS, compilalo y luego lees el archivo .LST
Es muy probable que desde allí saques como hacerlo... ;-)
Título: Re: XC8 - ¿asignación de puertos a variables como en CCS?
Publicado por: LucasBols en 21 de Marzo de 2014, 18:36:41
gracias MGLSOFT, pero el tema es que me pasé a C para no tener que lidiar con ASM, soy muy vago no?  :lol: :D

con mi paso a la velocidad del rayo por CSS me quedó picando ese tema, porque ahorraría mucho código, en lugar de hacer un switch para seleccionar un puerto usaría un for

muchas gracias
Título: Re: XC8 - ¿asignación de puertos a variables como en CCS?
Publicado por: MGLSOFT en 21 de Marzo de 2014, 18:59:44
No dije que lo hagas en assembler, sino que lo aprendas a hacer a través de la lectura del assembler generado...
Luego lo codificas para XC8.
Título: Re: XC8 - ¿asignación de puertos a variables como en CCS?
Publicado por: AngelGris en 21 de Marzo de 2014, 19:11:34
hola, buenas tardes,

¿existe alguna forma de implementar en XC8 la característica de asignación de puertos a variables como en CCS?

en CCS:
Código: [Seleccionar]
#byte puerto_D = 0x08

puerto_d = 0b01010011;

¿como se puede hacer en XC8?

muchas gracias

  No entiendo para que quieres hacer eso, en XC8 puedes modificar el valor de un puerto escribiendo algo así...

Código: C
  1. PORTC = 0b11110000;

  Si lo que quieres es asignarle a una variable una dirección específica (que puede ser o no la dirección de un puerto) creo que se hace como en HiTech

Código: C
  1. unsigned char variable @ 0x08;
Título: Re: XC8 - ¿asignación de puertos a variables como en CCS?
Publicado por: sander en 21 de Marzo de 2014, 21:55:08
En el XC8 tambien se puede acceder a cualquier registro del PIC sin necesidad de definir nada extra, tambien puede acceder a los bits de la siguiente forma:

Código: C
  1. PORTCbits.RC0 = 1;     // Pone 1 en el pin RC0

Saludos
Título: Re: XC8 - ¿asignación de puertos a variables como en CCS?
Publicado por: LucasBols en 24 de Marzo de 2014, 19:28:32
hola, disculpen por la demora,

MGLSOFT, si, tendría que ver como lo implementa CCS, esun tema interesante, pero antes voy a probar la sugerencia de GeSHi, si no me funciona, tendré que escarbar en el .lst

GeSHi, tengo una lista de puertos sin órden que los tengo que modificar simultáneamente, y en lugar de hacer portxbits.rxx= x; portxbits.rxx= x; ... quería hacerlo con un for
en CCS se puede asignar puertos a un array y con for modificarlos, voy a probar tu sugerencia con un array

perdón, modifico la respuesta, GeSHi, lo que estaba buscando es asignar los bits de un puerto a una var, es decir, la dirección de un bit, supongo que con

Código: [Seleccionar]
unsigned char variable @ 0x08+1;
sander, lo de arriba  :D esto si que me cataloga como vago  :D

muchas gracias por las respuestas
Título: Re: XC8 - ¿asignación de puertos a variables como en CCS?
Publicado por: AngelGris en 24 de Marzo de 2014, 19:32:02
hola, disculpen por la demora,

MGLSOFT, si, tendría que ver como lo implementa CCS, esun tema interesante, pero antes voy a probar la sugerencia de GeSHi, si no me funciona, tendré que escarbar en el .lst

GeSHi, tengo una lista de puertos sin órden que los tengo que modificar simultáneamente, y en lugar de hacer portxbits.rxx= x; portxbits.rxx= x; ... quería hacerlo con un for
en CCS se puede asignar puertos a un array y con for modificarlos, voy a probar tu sugerencia con un array

sander, lo de arriba  :D esto si que me cataloga como vago  :D

muchas gracias por las respuestas

  GeSHi no es ningún usuario  :D :D :D es una opción en el editor de mensajes del foro, para colgar código.  :D :D :D
Título: Re: XC8 - ¿asignación de puertos a variables como en CCS?
Publicado por: rivale en 24 de Marzo de 2014, 19:32:14
hola, disculpen por la demora,

MGLSOFT, si, tendría que ver como lo implementa CCS, esun tema interesante, pero antes voy a probar la sugerencia de GeSHi, si no me funciona, tendré que escarbar en el .lst

GeSHi, tengo una lista de puertos sin órden que los tengo que modificar simultáneamente, y en lugar de hacer portxbits.rxx= x; portxbits.rxx= x; ... quería hacerlo con un for
en CCS se puede asignar puertos a un array y con for modificarlos, voy a probar tu sugerencia con un array

sander, lo de arriba  :D esto si que me cataloga como vago  :D

muchas gracias por las respuestas

creo que GeSHi es realmente AngelGris  :D :D
Título: Re: XC8 - ¿asignación de puertos a variables como en CCS?
Publicado por: rivale en 24 de Marzo de 2014, 19:33:38
hola, disculpen por la demora,

MGLSOFT, si, tendría que ver como lo implementa CCS, esun tema interesante, pero antes voy a probar la sugerencia de GeSHi, si no me funciona, tendré que escarbar en el .lst

GeSHi, tengo una lista de puertos sin órden que los tengo que modificar simultáneamente, y en lugar de hacer portxbits.rxx= x; portxbits.rxx= x; ... quería hacerlo con un for
en CCS se puede asignar puertos a un array y con for modificarlos, voy a probar tu sugerencia con un array

sander, lo de arriba  :D esto si que me cataloga como vago  :D

muchas gracias por las respuestas

  GeSHi no es ningún usuario  :D :D :D es una opción en el editor de mensajes del foro, para colgar código.  :D :D :D


jeje, me ganaste en publicar AngelGris. 

Título: Re: XC8 - ¿asignación de puertos a variables como en CCS?
Publicado por: LucasBols en 24 de Marzo de 2014, 19:36:42
hola, disculpen por la demora,

MGLSOFT, si, tendría que ver como lo implementa CCS, esun tema interesante, pero antes voy a probar la sugerencia de GeSHi, si no me funciona, tendré que escarbar en el .lst

GeSHi, tengo una lista de puertos sin órden que los tengo que modificar simultáneamente, y en lugar de hacer portxbits.rxx= x; portxbits.rxx= x; ... quería hacerlo con un for
en CCS se puede asignar puertos a un array y con for modificarlos, voy a probar tu sugerencia con un array

sander, lo de arriba  :D esto si que me cataloga como vago  :D

muchas gracias por las respuestas

  GeSHi no es ningún usuario  :D :D :D es una opción en el editor de mensajes del foro, para colgar código.  :D :D :D

ahhh bueno!! hoy me tendría que haber tomado el feriado jajajajaja

disculpame AngelGris (¿es por Dolina?  :shock:)

muchas gracias
Título: Re: XC8 - ¿asignación de puertos a variables como en CCS?
Publicado por: MerLiNz en 24 de Marzo de 2014, 19:39:37
es muy simple:

unsigned char *puertos[3];

puertos[0]=0x08;
puertos[1]=0x10;
puertos[2]=0x11;

*puertos[ x ]=numero a asignar;

y yasta
Título: Re: XC8 - ¿asignación de puertos a variables como en CCS?
Publicado por: LucasBols en 24 de Marzo de 2014, 19:44:55
hola MerLiNz, si, lo de la asignación del puerto completo a una var va bien, pero lo que necesito es a un bit de ese puerto
sería algo como
Código: [Seleccionar]
bit variable[x] @ 0x08+1; pero al XC8 no le gustan los arrays de bits
Título: Re: XC8 - ¿asignación de puertos a variables como en CCS?
Publicado por: AngelGris en 24 de Marzo de 2014, 19:53:48


ahhh bueno!! hoy me tendría que haber tomado el feriado jajajajaja

disculpame AngelGris (¿es por Dolina?  :shock:)

muchas gracias

  Sep, hace mucho tiempo que he leído ese libro. Y hace mucho tiempo que no lo escucho.... Recuerdo que cuando lo escuchaba, el programa comenzaba bastante puntual pero en un tiempo el primer bloque comenzaba alrededor de 00:30Hs y me cansó esa situación.
Título: Re: XC8 - ¿asignación de puertos a variables como en CCS?
Publicado por: MerLiNz en 24 de Marzo de 2014, 20:39:46
los bits no se pueden asignar en variables en ningun compilador, se que el CCS hace algo parecido pero luego lo que hace es lo siguiente:

si vas a poner el bit en 1 de PORTD:
PORTD|=1<<x;

en caso de quererlo ponerlo a 0:
PORTD&=~(1<<x);

Por asi decirtelo los bits no se pueden separar, el pic gestiona la RAM de byte en byte (8bits), en caso de querer manejar un simple bit es necesario de hacer una operacion de lectura de la variable actual, modificar el contenido (ponerlo en 1 o 0) y escribirlo en el puerto.

Por ejemplo si has trabajado o algun dia vas a trabajar con un pic de 16bits veras que las variables de 8bits hace lo mismo y lo ideal es utilizar minimo 16bits porque sino se complica la operacion ya que tiene que trabajar con variables de un valor inferior a lo minimo.

Con el codigo que te he puesto arriba tienes de sobra para hacer lo que quieres en for o donde sea y probablemente sea mas optimizado que el CCS.

Título: Re: XC8 - ¿asignación de puertos a variables como en CCS?
Publicado por: rivale en 25 de Marzo de 2014, 11:23:44
como te comenta Merlinz, no puedes usar un vertor de bits, tal vez esto te sirva, yo uso estos macros para modificar bits

Código: C
  1. #define BIT(X)             (0x00000001 << (X))//definicion para seleccionar un bit
  2. #define BitMask(P,X)       (P&(BIT(X)))//aplica una mascara al bit deseado
  3. #define GetBit(P,X,state)  if(BitMask(P,X)!=0)state=1;else state=0;//el macro lee el estado deun bit y lo regresa en "state"
  4. #define SetBit(Reg,X)      Reg=Reg|(BIT(X))//setea un bit deseado
  5. #define ClearBit(Reg,X)    Reg=Reg&(~BIT(X))//borra un bit deseado

Tambien podrias hacer un arreglo de punteros hacia las direcciones de los registros que quieras modificar y modificar el contenido de tu puntero
Título: Re: XC8 - ¿asignación de puertos a variables como en CCS?
Publicado por: jhozate en 21 de Mayo de 2014, 20:55:57
hola, aprovecho este tema para exponer un problema que tengo, poniéndolos en contexto:
PIC24FJ64GA002, XC16.

Tengo una tarjeta ensamblada sobre la cual tengo 3 leds que por software se encienden con nivel lógico alto   configuración    vcc---Resistencia----led---pin--<
Compilando en CCS puedo encender los 3 sin ningún problema.

Iniciando un código sencillo en XC16 no se enciende uno de los leds, y no encuentro por que, se trata del pin B10, que no encuentro nada raro en la hoja de datos con respecto al pin.

el código que uso en XC es el siguiente

Código: C
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <xc.h>
  4.  
  5. // CONFIG2
  6. #pragma config POSCMOD = NONE           // Primary Oscillator Select (Primary oscillator disabled)
  7. #pragma config I2C1SEL = PRI            // I2C1 Pin Location Select (Use default SCL1/SDA1 pins)
  8. #pragma config IOL1WAY = ON             // IOLOCK Protection (Once IOLOCK is set, cannot be changed)
  9. #pragma config OSCIOFNC = ON            // Primary Oscillator Output Function (OSC2/CLKO/RC15 functions as port I/O (RC15))
  10. #pragma config FCKSM = CSDCMD           // Clock Switching and Monitor (Clock switching and Fail-Safe Clock Monitor are disabled)
  11. #pragma config FNOSC = FRC              // Oscillator Select (Fast RC Oscillator (FRC))
  12. #pragma config SOSCSEL = SOSC           // Sec Oscillator Select (Default Secondary Oscillator (SOSC))
  13. #pragma config WUTSEL = LEG             // Wake-up timer Select (Legacy Wake-up Timer)
  14. #pragma config IESO = OFF               // Internal External Switch Over Mode (IESO mode (Two-Speed Start-up) disabled)
  15.  
  16. // CONFIG1
  17. #pragma config WDTPS = PS32768          // Watchdog Timer Postscaler (1:32,768)
  18. #pragma config FWPSA = PR128            // WDT Prescaler (Prescaler ratio of 1:128)
  19. #pragma config WINDIS = OFF             // Watchdog Timer Window (Windowed Watchdog Timer enabled; FWDTEN must be 1)
  20. #pragma config FWDTEN = OFF             // Watchdog Timer Enable (Watchdog Timer is disabled)
  21. #pragma config ICS = PGx1               // Comm Channel Select (Emulator EMUC1/EMUD1 pins are shared with PGC1/PGD1)
  22. #pragma config GWRP = OFF               // General Code Segment Write Protect (Writes to program memory are allowed)
  23. #pragma config GCP = OFF                // General Code Segment Code Protect (Code protection is disabled)
  24. #pragma config JTAGEN = OFF             // JTAG Port Enable (JTAG port is disabled)
  25.  
  26. /*
  27.  *
  28.  */
  29. #define PB1     PORTBbits.RB7
  30. #define PB2     PORTBbits.RB8
  31.  
  32. #define ONLED5  LATBbits.LATB10=0;
  33. #define ONLED6  LATBbits.LATB12=0;
  34. #define ONLED7  LATBbits.LATB6=0;
  35.  
  36.  
  37. //###########  DECLARACION DE VARIABLES GLOBALES ##############################
  38.  
  39. //#############################################################################
  40.  
  41.  
  42. //###########  DECLARACION DE FUNCIONES #######################################
  43.  
  44. void configuraciones(void);
  45.  
  46. //#############################################################################
  47. int main(int argc, char** argv)
  48. {
  49.     configuraciones();
  50.  
  51.     while(1)
  52.     {
  53.       ONLED5
  54.       ONLED6
  55.       ONLED7
  56.     }
  57.  
  58.     return (EXIT_SUCCESS);
  59. }
  60.  
  61. void configuraciones()
  62. {
  63.     TRISBbits.TRISB12=0;
  64.     TRISBbits.TRISB10=0;
  65.     TRISBbits.TRISB6=0;
  66.  
  67. }

cuando compilo con ccs y mido con voltimetro encuentro nivel bajo en los leds por lo cual encienden los 3
cuando uso XC16 y mido encuentro que el led que no enciende alcanza a tener 1.9v, los otros dos si tienen nivel bajo y prenden :z)

otra pregunta, programo con el software del pickit3 , cuando quiero cargar el .hex me dice que no se encuentran los word configuration en el hexadecimal  ???
Título: Re: XC8 - ¿asignación de puertos a variables como en CCS?
Publicado por: migsantiago en 21 de Mayo de 2014, 21:03:22
Hola Jhozate

CCS hace mucho por debajo del agua. Talvez está reconfigurando los pines PPS sin que te enteres. Checa si no hay algo más que hacer ahí. ¿No será que debes deshabilitar un JTAG o un LVPD en ese pin?
Título: Re: XC8 - ¿asignación de puertos a variables como en CCS?
Publicado por: MGLSOFT en 21 de Mayo de 2014, 21:18:13
La mejor forma de averiguarlo es compilarlo en CCS y después ver el listado en assembler para ver como lo hace, de esa forma te sacas la intriga...
Título: Re: XC8 - ¿asignación de puertos a variables como en CCS?
Publicado por: MerLiNz en 22 de Mayo de 2014, 07:04:36
Tu problema esta en los fuses, yo tambien tuve problemas por ponerlo con #pragma config me ocurria lo mismo, al final lo hice asi

_FGS(
    GWRP_OFF &           // General Segment Write-Protect bit (General Segment may be written)
    GSS_OFF &            // General Segment Code-Protect bit (General Segment Code protect is disabled)
    GSSK_OFF             // General Segment Key bits (General Segment Write Protection and Code Protection is Disabled)
);

_FOSCSEL(
    FNOSC_FRC &          // Initial Oscillator Source Selection Bits (Internal Fast RC (FRC))
    IESO_ON              // Two-speed Oscillator Start-up Enable bit (Start up device with FRC, then switch to user-selected oscillator source)
);

......
Y ya no habia mas problemas
Título: Re: XC8 - ¿asignación de puertos a variables como en CCS?
Publicado por: jhozate en 22 de Mayo de 2014, 11:37:33
Hola Jhozate

CCS hace mucho por debajo del agua. Talvez está reconfigurando los pines PPS sin que te enteres. Checa si no hay algo más que hacer ahí. ¿No será que debes deshabilitar un JTAG o un LVPD en ese pin?
voy a tener que mirar el asm que genera mplab, aunque en los archivos que genera no se cual de todos es, voy a buscarlo.

La mejor forma de averiguarlo es compilarlo en CCS y después ver el listado en assembler para ver como lo hace, de esa forma te sacas la intriga...
Si, de hecho trato de migrar un código de ccs a XC, he visto el asm de css y en donde pone los bits del puerto en bajo , cambia el TRIS como salida y luego accede al LAT , aunque  hay mas código que no visto porque en ccs uso los PPS,  en XC aun no los configuro.

gracias MerLiNz, voy a probar a ver que sucede
_FSG y _FOSCSEL  no veo estos nombres en la hoja de datos, pero los bits que configuras hacen parte de las configuration words, en mi caso seria CW1 y CW2 , probaré,  gracias
Título: Re: XC8 - ¿asignación de puertos a variables como en CCS?
Publicado por: MerLiNz en 22 de Mayo de 2014, 14:43:44
te he puesto un ejemplo de un dspic, buscate para el tuyo, creo que estaba en un archivo de ayuda de mplabx
Título: Re: XC8 - ¿asignación de puertos a variables como en CCS?
Publicado por: jhozate en 23 de Mayo de 2014, 14:08:47
hola, he comentado las lineas que usan #PRAGMA que del codigo que se genera con el asistente de MPLAB, y lo he hecho asi
Citar
_CONFIG1( FWDTEN_OFF & GWRP_OFF & GCP_OFF & JTAGEN_OFF & ICS_PGx1 & FWDTEN_OFF )
_CONFIG2( POSCMOD_NONE & I2C1SEL_PRI & IOL1WAY_ON & OSCIOFNC_ON & FCKSM_CSDCMD & FNOSC_FRC & IESO_OFF)

el led sigue sin encender y el programa del pickit3 me arroja el mismo warning de los connfiguration word
Título: Re: XC8 - ¿asignación de puertos a variables como en CCS?
Publicado por: migsantiago en 23 de Mayo de 2014, 22:38:57
hola, he comentado las lineas que usan #PRAGMA que del codigo que se genera con el asistente de MPLAB, y lo he hecho asi
Citar
_CONFIG1( FWDTEN_OFF & GWRP_OFF & GCP_OFF & JTAGEN_OFF & ICS_PGx1 & FWDTEN_OFF )
_CONFIG2( POSCMOD_NONE & I2C1SEL_PRI & IOL1WAY_ON & OSCIOFNC_ON & FCKSM_CSDCMD & FNOSC_FRC & IESO_OFF)

el led sigue sin encender y el programa del pickit3 me arroja el mismo warning de los connfiguration word


Hola, el PICkit3 programmer es beta hasta donde recuerdo. ¿No será mejor si usas el programador de MPLAB X?

¿Cuál estás usando?
Título: Re: XC8 - ¿asignación de puertos a variables como en CCS?
Publicado por: jhozate en 24 de Mayo de 2014, 13:49:39
uso pickit3 programmer v3.10, no uso directo desde el mplab,  con versiones anteriores vi que siempre el programador buscaba actualización y a veces se quedaba en ese proceso, no se si pasará lo mismo con MPLAB X