Buenas,
Os informo como va la cosa:
En el trabajo estoy liado con un proyecto y hasta principios del año que viene no avanzará rápido el tema de los protos, seguramente los pida a un proveedor que tenemos en china de tarjetas electrónicas.
Por otro lado como dige en anteriores post al final lo haré con un 18F4550 en lugar del Arduino y he estado estas semanas intentando hacer lo que había hecho en Arduino con el MPLAB X, pero no hay punto de comparación entre la facilidad de uso de Arduino y lo complicado que se me esta haciendo el MPLAB X.
A la conclusión que he llegado es que soy un novato y que el MPLAB X me lleva loco jajaja

... No consigo mostrar un simple "HOLA MUNDO" en un display. Se me esta haciendo eterno.
Por otro lado veo que la librería de MPLAB para el LCD (xlcd.h) es muy complicada para algo tan simple. Necesita cargar 11 archivos para hacer funcionar el xlcd.h (aunque todavía no he conseguido que funcione).
En otros IDE como CCS C con una simple librería del LCD hay de sobra. La librería LCD de CCS C tiene muchas más funciones y más útiles que la de Microchip.
No entiendo nada la verdad... Tenía ilusión por usar las herramientas de Microchip, pero poco a poco me estoy convenciendo que lo mejor va a ser usar CCS C u otros. Aunque sigo encabezonado en hacerlo funcionar con MPLAB X (bueno con XC8)
Por si alguien me puede echar una mano os dejo el código que me esta llevando por el camino de la amargura. Este código lo único que debería hacer es mostrar "Hola Mundo" en un display y luego conectar y desconectar un rele en un bucle infinito. Por cierto esta hecho para un PIC18F97J60 que es el que lleva la tarjeta de entrenamiento que estoy usando.
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include "xlcd.h"
#define _XTAL_FREQ 25000000 //Frec. del osc. en Hz para calculo de delays
// PIC18F97J60 Configuration Bit Settings
// CONFIG1L
#pragma config DEBUG = OFF // Background debugger disabled; RB6 and RB7 configured as general purpose I/O pins
#pragma config WDTEN = OFF // Watchdog Timer Enable bit (WDT disabled (control is placed on SWDTEN bit))
#pragma config XINST = OFF // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode enabled)
#pragma config STVR = OFF // Stack Overflow/Underflow Reset Enable bit (Reset on stack overflow/underflow enabled)
// CONFIG1H
#pragma config CP0 = OFF // Code Protection bit (Program memory is not code-protected)
// CONFIG2L
#pragma config IESO = ON // Two-Speed Start-up (Internal/External Oscillator Switchover) Control bit (Two-Speed Start-up enabled)
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config FOSC2 = ON // Default/Reset System Clock Select bit (Clock selected by FOSC1:FOSC0 as system clock is enabled when OSCCON<1:0> = 00)
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor enabled)
// CONFIG2H
#pragma config WDTPS = 32768 // Watchdog Timer Postscaler Select bits (1:32768)
// CONFIG3L
#pragma config EASHFT = OFF // External Address Bus Shift Enable bit (Address shifting enabled; address on external bus is offset to start at 000000h)
#pragma config MODE = MM // External Memory Bus (Microcontroller mode, external bus disabled)
#pragma config BW = 8 // Data Bus Width Select bit (8-Bit Data Width mode)
#pragma config WAIT = OFF // External Bus Wait Enable bit (Wait states for operations on external memory bus disabled)
// CONFIG3H
#pragma config CCP2MX = OFF // ECCP2 MUX bit (ECCP2/P2A is multiplexed with RC1)
#pragma config ECCPMX = OFF // ECCP MUX bit (ECCP1 outputs (P1B/P1C) are multiplexed with RE6 and RE5; ECCP3 outputs (P3B/P3C) are multiplexed with RE4 and RE3)
#pragma config ETHLED = OFF // Ethernet LED Enable bit (RA0/RA1 are multiplexed with LEDA/LEDB when Ethernet module is enabled and function as I/O when Ethernet is disabled)
#define Rele PORTGbits.RG7
#define backlight PORTGbits.RG5
void DelayFor18TCY(void);
void DelayPORXLCD(void);
void DelayXLCD(void);
// Temporizador ms
void delay_ms(int mseconds){
int count = 0;
for(count=0; count<mseconds; count++){
__delay_ms(1);
}
return;
}
void main(void) {
TRIS_DATA_PORT = 0;
TRIS_RW = 0;
TRIS_E = 0;
TRIS_RS = 0;
TRISG7 = 0;
TRISG5 = 0;
backlight = 1;
OpenXLCD(EIGHT_BIT & LINES_5X7);
BusyXLCD();
WriteCmdXLCD(0x06);
BusyXLCD();
WriteCmdXLCD(0x0c);
putrsXLCD("HOLA");
while(1){
Rele = 1;
delay_ms(1000);
Rele = 0;
delay_ms(1000);
}
}
La parte de activar y desactivar el rele funciona correctamente, pero cuando pongo la parte del LCD se queda encallado el programa en cualquiera de estas funciones del programa:
OpenXLCD(EIGHT_BIT & LINES_5X7);
BusyXLCD();
WriteCmdXLCD(0x06);
BusyXLCD();
WriteCmdXLCD(0x0c);
putrsXLCD("HOLA");
Si comento estas funciones el rele funciona correctamente, si dejo sin comentar cualquiera de ellas el código ya no llega hasta el bucle while y el rele no hace nada.
Una ayuda?? estoy a punto de la desesperación jejejejeej

Por otro lado, he estado buscando información sobre como hacer el HMI y he visto herramientas como Microchip Graphics Display Designer (GDD) de Microchip y el Visual TFT y Visual GLCD de MikroElektronika. ¿Alguien ha usado estas herramientas para crear los gráficos de los displays? ¿que tal van? ¿Hay algo parecido que genere código para CCS C?
¿Que opináis de las herramientas del MikroC de Mikroelektronika? la licencia vale la mitad que el CCS C, pero ¿funciona igual de bien?
Saludos!