Autor Tema: Duda respecto a diferentes compiladores  (Leído 9192 veces)

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

Desconectado Limbo

  • PIC10
  • *
  • Mensajes: 44
Re: Duda respecto a diferentes compiladores
« Respuesta #15 en: 18 de Junio de 2013, 22:29:58 »
Ya me va quedando más claro. Hoy he pasado toda la tarde intentando hacer andar una libreria LCD y no ha habido forma de ver una palabra en la pantalla :oops: :( He probado la xlcd que viene con XC8, me baje un par más de internet y nada, quizas sea una pregunta repetida pero ¿Me recomendais algun tutorial mascadito para usar una libreria LCD en XC8? De verdad, est anoche lo deje aburrido, despues de horas dandole he acabado desesperado.. ¿Me hechais una mano? :mrgreen: :-/

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Duda respecto a diferentes compiladores
« Respuesta #16 en: 18 de Junio de 2013, 23:59:55 »
  Todo lo que se va comentando en este tema te puede ser util
http://www.todopic.com.ar/foros/index.php?topic=40649.0
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Duda respecto a diferentes compiladores
« Respuesta #17 en: 19 de Junio de 2013, 04:42:02 »
Yo he programado el PIC16F883  (7kb de programa) con el compilador CC5X y da mucho juego (puedes realizar programas relativamente grandes sin problemas de espacio).

Con el XC8 no lo he probado todavía, porque prefiero trabajar de forma habitual con PIC18. Normalmente tiene memoria de sobra para los desarrollos que hago, pero así me vale el mismo micro para el día que tenga que hacer un programa mayor. La diferencia de precio es pequeña.

Para que tengas una idea, el último programa que he hecho en C con 1500 líneas de código (contando espacios y comentarios) ocupa una memoria de programa de 8Kbytes compilado con XC8 sin optimizar.

El programa es bastante grande como para hacer un montón de cosas con el y el 16f886 tiene más memoria todavía.


Si te decides por el compilador CC5X, es poco conocido y poco estandar, pero tiene la ventaja de que si lo manejas bien, te compila cada línea de C en una o dos líneas de ensamblador. Es muy eficiente incluso en la versión gratuita. Los otros compiladores como el XC8 meten un montón de líneas de código en el paso de argumentos a las funciones. Por ejemplo para pasar un caracter a una función, el CC5X lo manda mediante el registro de trabajo WREG, mientras que otros compiladores pasan el argumento mediante una pila, con bastantes líneas de ASM para una cosa tan sencilla.


Saludos.
« Última modificación: 19 de Junio de 2013, 04:46:50 por Picuino »

Desconectado Limbo

  • PIC10
  • *
  • Mensajes: 44
Re: Duda respecto a diferentes compiladores
« Respuesta #18 en: 19 de Junio de 2013, 05:45:11 »
  Todo lo que se va comentando en este tema te puede ser util
http://www.todopic.com.ar/foros/index.php?topic=40649.0
Ya le he hechado un ojo a ese tema

Citar
Para que tengas una idea, el último programa que he hecho en C con 1500 líneas de código (contando espacios y comentarios) ocupa una memoria de programa de 8Kbytes compilado con XC8 sin optimizar.
No creo que haga más de 1500 lineas..

Creo que me quedare con XC8, eso si,  si consigo hacer funcionar la libreria LCD  :D Se me resiste. Esta tarde volvere a la carga.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Duda respecto a diferentes compiladores
« Respuesta #19 en: 19 de Junio de 2013, 07:24:17 »
¿Puedes poner un esquema de las conexiones al lcd?
Tengo una librería que podría ayudarte en el caso de que utilices la conexión a 4 bits.

Saludos

Desconectado Limbo

  • PIC10
  • *
  • Mensajes: 44
Re: Duda respecto a diferentes compiladores
« Respuesta #20 en: 19 de Junio de 2013, 08:57:58 »
No lo guarde el esquema, pero vamos, lo conecte como indicaba en la libreria, la alimentacion tambien estaba bien conectada, lo unico que tenia dudas era en los 4bits de datos.. si conectarlos seguidos a los otros 3 (RS,RW,E) o conectarlos en los bits altos.. estoy casi seguro que el codigo estaba mal...

No tengo mucha experiencia con LCD, hice lo justo en ensamblador y usabamos 8bits pero veo que la mayoria usa 4 bits... alguna ventaja tendra, voy a leer un poco sobre eso ahora mismo..

¿Si me la puedes pasar la libreria LCD? ¿o decirme de donde la descargo? Una cosa, ¿la XLCD nadie la usa?no veo mucha info en internet..

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Duda respecto a diferentes compiladores
« Respuesta #21 en: 19 de Junio de 2013, 09:54:57 »
Los LCD son muy sencillos, simplemente deberias buscarte algun sitio donde te lo expliquen correctamente (algun tutorial) y seguro que te resulta muy sencillo, los glcd por ejemplo se complican algo mas, pero una vez ves como van pues te resulta bastante sencillo. Ahora que te vas a pasar a C tienes varias librerias a tu disposicion y con un simple comando puedes escribir facilmente en el lcd sin tener que escribir mil lineas en asm.

La ventaja de 8bits vs 4bits es que son 4 cables en vez de 8 y reduce mucho las conexiones y utilizacion de pines.

Desconectado Limbo

  • PIC10
  • *
  • Mensajes: 44
Re: Duda respecto a diferentes compiladores
« Respuesta #22 en: 19 de Junio de 2013, 10:12:02 »
Citar
Los LCD son muy sencillos, simplemente deberias buscarte algun sitio donde te lo expliquen correctamente (algun tutorial)
Eso es lo qu eno encuentro para CX8..

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Duda respecto a diferentes compiladores
« Respuesta #23 en: 19 de Junio de 2013, 10:29:34 »
buscalo para C18, como indico xc8 es un c18, todo lo que tengas para c18 vale para xc8, si no encuentras mucho para xc8 es porque ha salido hace poco y entonces no hay muchos tutoriales.

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Duda respecto a diferentes compiladores
« Respuesta #24 en: 19 de Junio de 2013, 14:02:03 »
yo estoy ahora mismo instalando el XC8 free...
no se pueden adaptar librerias que por ejemplo tiene el compilador ccs a xc8?
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Duda respecto a diferentes compiladores
« Respuesta #25 en: 19 de Junio de 2013, 15:38:36 »
Esta es la rutina que yo utilizo.
Sirve para enviar datos al LCD con 4 bits de ancho que también se utilizan para leer pulsadores.

El esquema es el siguiente:
https://sites.google.com/site/picuino/_/rsrc/1324213759944/picuino-18f2550/lcd_display/Schematic_v11.png


El código para manejarlo es:

Código: [Seleccionar]
/*
   LCD AND KEYBOARD MANAGE ROUTINES
*/
#include <p18cxxx.h>
#include "lcd_keyb.h"
#include "config.h"
#include "delays.h"

/****************************************************************************
      HARDWARE DEFINITIONS
 ****************************************************************************/
//#define LCD_PORTA
#ifndef LCD_PORTA
   #define LCD_PORTB
#endif

#ifdef LCD_PORTB
   #define LCD_E      LATBbits.LATB2            // LCD CONTROL BIT. Enable
   #define LCD_RS     LATBbits.LATB3            // LCD CONTROL BIT. Control/data mode
   #define LCD_D4     LATBbits.LATB4            // LCD DATA BIT
   #define LCD_D5     LATBbits.LATB5            // LCD DATA BIT
   #define LCD_D6     LATBbits.LATB6            // LCD DATA BIT
   #define LCD_D7     LATBbits.LATB7            // LCD DATA BIT
   #define KEYB_KB1   PORTBbits.RB4
   #define KEYB_KB2   PORTBbits.RB5
   #define KEYB_KB3   PORTBbits.RB6
   #define KEYB_KB4   PORTBbits.RB7
   #define LCD_TRIS_DATA_OUT()     TRISB &= 0b00001111
   #define LCD_TRIS_DATA_IN()      TRISB |= 0b11110000
   #define LCD_TRIS_CONTROL_OUT()  TRISB &= 0b11110011
#elif defined LCD_PORTA
   #define LCD_E      LATAbits.LATA0            // LCD CONTROL BIT. Enable
   #define LCD_RS     LATAbits.LATA1            // LCD CONTROL BIT. Control/data mode
   #define LCD_D4     LATAbits.LATA2            // LCD DATA BIT
   #define LCD_D5     LATAbits.LATA3            // LCD DATA BIT
   #define LCD_D6     LATAbits.LATA4            // LCD DATA BIT
   #define LCD_D7     LATAbits.LATA5            // LCD DATA BIT
   #define KEYB_KB1   PORTAbits.RA2
   #define KEYB_KB2   PORTAbits.RA3
   #define KEYB_KB3   PORTAbits.RA4
   #define KEYB_KB4   PORTAbits.RA5
   #define LCD_TRIS_DATA_OUT()     TRISA &= 0b11000011
   #define LCD_TRIS_DATA_IN()      TRISA |= 0b00111100
   #define LCD_TRIS_CONTROL_OUT()  TRISA &= 0b11111100
#endif

/****************************************************************************
      DATA DEFINITIONS
 ****************************************************************************/
typedef union {
   unsigned char byte;
   struct {
      unsigned b0:1;
      unsigned b1:1;
      unsigned b2:1;
      unsigned b3:1;
      unsigned b4:1;
      unsigned b5:1;
      unsigned b6:1;
      unsigned b7:1;
   };
} tbyte;


/****************************************************************************
      DELAY ROUTINES
 ****************************************************************************/

/*
   Active delay of 20us
   F_OSC (frequency of working oscillator) must be defined
*/
void Delay_20us(void) {
#if F_OSC == 4000000
   Delay10TCYx(2-1);
#elif F_OSC == 8000000
   Delay10TCYx(4-1);
#elif F_OSC == 12000000
   Delay10TCYx(6-1);
#elif F_OSC == 16000000
   Delay10TCYx(8-1);
#elif F_OSC == 20000000
   Delay10TCYx(10-1);
#elif F_OSC == 24000000
   Delay10TCYx(12-1);
#elif F_OSC == 48000000
   Delay10TCYx(24-1);
#else
#error F_OSC not recognized
#endif
}


/*
   Active delay of 1us*time
   with error of several TCY
*/
void Delay_ms(unsigned int time) {
   do {
      #if F_OSC == 4000000
         Delay100TCYx(10);
      #elif F_OSC == 8000000
         Delay100TCYx(20);
      #elif F_OSC == 12000000
         Delay100TCYx(30);
      #elif F_OSC == 16000000
         Delay100TCYx(40);
      #elif F_OSC == 20000000
         Delay100TCYx(50);
      #elif F_OSC == 24000000
         Delay100TCYx(60);
      #elif F_OSC == 48000000
         Delay100TCYx(120);
      #else
      #error F_OSC not recognized
      #endif
   } while(--time);
}

/****************************************************************************
      KEYBOARD ROUTINES
 ****************************************************************************/

/*
   Read keyboard and return result.
   Side efects:
      Disable analog inputs (ADCON1).
  Change data pin as inputs.
      Disable Pull-up resistors (PORTB option)     
   
   Return:
     if key1 pressed  bit 0 = 1;
     if key2 pressed  bit 1 = 1;
     if key3 pressed  bit 2 = 1;
     if key4 pressed  bit 3 = 1;
*/
unsigned char kb_read(void) {
   tbyte kb;

#ifdef LCD_PORTB
   // Disable all PORTB pull-ups
   INTCON2bits.RBPU = 1;
#endif
   // Change all pins to digital inputs
   ADCON1 = 0b00001111;   

   // Charge capacitors
   LCD_TRIS_DATA_OUT();
   LCD_D4 = LCD_D5 = LCD_D6 = LCD_D7 = 1;
   Delay_20us();

   // Read keyboard
   LCD_TRIS_DATA_IN();
   kb.byte = 0;
   if (KEYB_KB1==0) kb.b0 = 1;
   if (KEYB_KB2==0) kb.b1 = 1;
   if (KEYB_KB3==0) kb.b2 = 1;
   if (KEYB_KB4==0) kb.b3 = 1;

   // Test if keyboard is disconected (all inputs == 1)
   if (kb.byte == 0b00001111) {
      return 0;
   }

   // Return keys pressed
   return kb.byte;
}


/****************************************************************************
      LCD ROUTINES
 ****************************************************************************/

/*
  INITIALIZE LCD IN 4-BIT MODE AND SET PREFERENCES
*/
void lcd_init(void) {
   // Init data pins
   LCD_D4 = 0;
   LCD_D5 = 0;
   LCD_D6 = 0;
   LCD_D7 = 0;
   LCD_TRIS_DATA_OUT();

   // Init control pins
   LCD_TRIS_CONTROL_OUT();
   LCD_RS = 0;  // LCD IN CONTROL MODE
   LCD_E = 0;

   //Delay_ms(25)      ;          // Wait for more than 20 ms after Vdd rises to 4.5 V

   // Reset procedure through software
   lcd_putctrl(0b00110000);     // 8 bits mode
   Delay_ms(5);
   lcd_putctrl(0b00110000);     // 8 bits mode
   Delay_ms(5);
   lcd_putctrl(0b00110010);     // 4 bits mode
   Delay_ms(5);

   // CONFIGURE LCD
   lcd_putctrl(0b00101000);     // 001 = FUNCTION SET.
                                // 0   = 4 BIT INTERFACE
                                // 1   = 2 LINES
                                // 0   = 5x8 DOTS, x, x
   lcd_putctrl(0b00001000);     // 00001  = DISPLAY CONTROL. 0=DISPLAY OFF, 1=CURSOR ON, 1=CURSOR BLINK OFF, x
   lcd_putctrl(0b00001100);     // 00001  = DISPLAY CONTROL. 1=DISPLAY ON, 1=CURSOR ON, 1=CURSOR BLINK OFF, x
   lcd_clear();
   lcd_putctrl(0b00000110);     // 000001 = ENTRY MODE. CURSOR MOVE INCREMENT, DO NOT SHIFT DISPLAY
   lcd_putctrl(0b00010100);     // 0001   = CURSOR-DISPLAY. 0=MOVE CURSOR, 1=SHIFT RIGHT, x, x
   lcd_goto(0);
}


/*
   Clears entire display and sets DDRAM address 0 in address
   counter
*/
void lcd_clear(void) {
   lcd_putctrl(0b00000001);             // CLEAR DISPLAY.
   Delay_ms(2);                     // Execution time > 1.6 ms
}


/*
   Sets DDRAM address 0 in address counter. Also returns
   display from being shifted to original position. DDRAM
   contents remain unchanged
*/
void lcd_home(void) {
   lcd_putctrl(0b00000010);             // CURSOR TO POSITION 0
   Delay_ms(2);                     // Execution time > 1.6 ms
}


/*
   Set address of cursor in LCD
   Send addr to DDRAM address register
*/
void lcd_goto(unsigned char x) {
   lcd_putctrl(0b10000000 + x);         // CURSOR TO POSITION x
}


/*
   Send control code to LCD
*/
void lcd_putctrl(unsigned char c) {
   LCD_TRIS_DATA_OUT();
   LCD_RS = 0;  // LCD IN CONTROL MODE
   lcd_putbyte(c);
   LCD_TRIS_DATA_IN();
}


/*
   Send character to LCD
*/
void lcd_putc(unsigned char c) {
   LCD_TRIS_DATA_OUT();
   LCD_RS = 1;       // LCD IN DATA MODE
   lcd_putbyte(c);
   LCD_TRIS_DATA_IN();
}


/*
   Send string from rom to LCD
*/
void lcd_puts(const char *str) {
   while(*str) {
      lcd_putc(*str);
      str++;
   }
}


/*
   Send string from ram to LCD
*/
void lcd_puts_ram(char *str) {
   while(*str) {
      lcd_putc(*str);
      str++;
   }
}


void lcd_putbyte(unsigned char c) {
   LCD_E = 0;
   lcd_putnibble(c);
   lcd_putnibble(c<<4);
}


/*
   Send high nibble of character 'c' to LCD
*/
void lcd_putnibble(unsigned char c) {
   tbyte C;
   LCD_D4 = 0;
   LCD_D5 = 0;
   LCD_D6 = 0;
   LCD_D7 = 0;
   C.byte = c;
   if (C.b4==1) LCD_D4 = 1;
   if (C.b5==1) LCD_D5 = 1;
   if (C.b6==1) LCD_D6 = 1;
   if (C.b7==1) LCD_D7 = 1;
   lcd_enable();
}


/*
   ENABLE LCD
   Send enable signal to LCD
*/
void lcd_enable(void) {
   // Enable signal must be set 1us min
   LCD_E = 1;
   Delay_20us();
   LCD_E = 0;
   Delay_20us();
}


En ocasiones da problemas la inicialización del LCD. Creo que es un problema de tiempos. En cualquier caso el 99% de las veces funciona OK.

Página del proyecto (con código para C18):
https://sites.google.com/site/picuino/picuino-18f2550/lcd_display

Saludos.
« Última modificación: 19 de Junio de 2013, 15:54:16 por Picuino »

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Duda respecto a diferentes compiladores
« Respuesta #26 en: 20 de Junio de 2013, 13:21:51 »
Si quieres aprender te recomiendo que te olvides de librerias, seguramente el curso que estas haciendo no te dejen usar librerias porque le quita toda la gracia a la enseñanza, una vez ya sepas como funciona todo pues a usar librerias o incluso hacerlas tu mismo.

Desconectado Limbo

  • PIC10
  • *
  • Mensajes: 44
Re: Duda respecto a diferentes compiladores
« Respuesta #27 en: 20 de Junio de 2013, 13:41:58 »
Pero esa rutina es para pic18 y yo estoy usando la serie 16... la probare igualmente intentado adaptarla.. muchas gracias.
Estoy leyendome el manual de Suky que esta en pdf y copiando el ejemplo de libreria XLCD que tiene me salta un error que me dice que no estan definidas las funciones de la libreria... :5]:
Código: [Seleccionar]
0: error: undefined symbols:
        _WriteCmdXLCD(dist/default/production\tuto_C18.X.production.obj) _putrsXLCD(dist/default/production\tuto_C18.X.production.obj) _OpenXLCD(dist/default/production\tuto_C18.X.production.obj) _BusyXLCD(dist/default/production\tuto_C18.X.production.obj)
(908) exit status = 1

Pero esas funciones deben estar definidas en alguna libreria de las que vienen por defecto no?¿

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re: Duda respecto a diferentes compiladores
« Respuesta #28 en: 20 de Junio de 2013, 14:53:53 »

Citar
Para que tengas una idea, el último programa que he hecho en C con 1500 líneas de código (contando espacios y comentarios) ocupa una memoria de programa de 8Kbytes compilado con XC8 sin optimizar.
No creo que haga más de 1500 lineas..

Creo que me quedare con XC8, eso si,  si consigo hacer funcionar la libreria LCD  :D Se me resiste. Esta tarde volvere a la carga.
[/quote]

Hola Limbo ...yo logre hacer funcionar una libreria lcd en cx8 , por el port b y el a de un pic16f819 esta en el curso de xc8 con el dsn de proteus ...mirala te va a servir ...despues de eso le meti un i2c por soft ...y al quererle meter una libreria de un sensor de presion me quede sin memoria ...el pic tiene 3,5 k ....y con el xc8 sin optimizar me comio todo ...aparte de eso me ha vuelto loco con los problemas ...la verdad me estoy arrepintiendo de este compiler ....ojo es mi opinion ...soy nuevo en C ...y lo que veo que en Hi-Tech ..hay mas soluciones en la red ...tambien en CCS pero dicen que tiene muchos bugs ...de hi-tech tambien podes conseguir por emule o ares el full

Bueno esa es mi opinion ..

Un Abrazo
Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Duda respecto a diferentes compiladores
« Respuesta #29 en: 20 de Junio de 2013, 16:49:54 »
En microcontroladores PIC16/18 es todo un tema, a pesar de trabajar en un lenguaje de alto nivel, casi todo lo que se hace requiere trabajar mucho a nivel hardware, y los compiladores existentes lo trabajan de forma diferente. Cuando comienzas a utilizar microcontroladores de mayores capacidades, encaras proyectos mas complejos y podes separar con mas facilidad lo que es a nivel hardware y lo que es de alto nivel, y allí solo te dedicas a programar en C. No es una obligación, pero es una buena practica. Te vas a dar cuento de esto cuando le des un vistazo a los RTOS, donde esto se pone en practica.

Volviendo a los peques, PIC16/18, lo mejor es utilizar el compilador que mas cómodo y mejores resultados no de, se va a resolver el proyecto en menos tiempo y de buena manera, generalmente. Mi recomendación es utilizar un compilador de sea ANSI C, así no nos acostumbramos a malas practicas de programación, que después cuando tengamos que migrar nos va a dar dolores de cabeza  :mrgreen:


Saludos!
No contesto mensajes privados, las consultas en el foro


 

anything