Por lo que veo estas Duino que comentas llevan un PIC32 vendría a ser algo como lo que comentaba MGLSOFT. Hay que ir con cuidado con estos clones porque he visto en algunos foros que nos son compatibles 100% con Arduino, al menos en cuanto a utilizar la IDE de Arduino. Si las programas con las herramientas para PIC no creo que haya problema. En principio yo me centrare de momento en Arduino por su simplicidad en cuanto a la IDE, pero me parece interesante para ver plataformas parecidas.Las basadas en PIC son pinguino y tienen su propio IDE. También tienen tarjetas basadas en AVR compatibles 100% con Arduino, lo diferente es el diseño del hardware.
Muy Buenas!!! :-/hola, de donde eres? para ver si te recomiendo un buen lugar para mandar hacer esos PCB.
Al final he decido retomar los PIC, y la aplicación que os comentaba al final la he hecho con 18F4550.
Ya tengo el PCB listo para pedir los primeros protos de prueba, os adjunto una imagen del PCB.
He decidido usar la versión Free de MPlab XC8 a ver que tal me desenvuelvo, hice algunos programas sencillos con una tarjeta de desarrollo de Olimex que tenía por aquí no es excesivamente complicado de usar. Lo bueno de esto supongo que es que es una herramienta de Microchip, aunque al principio pensé usar CCS C que me parece más sencillo y practico.
En fin, voy a pedir el proto a ver que tal va ¿alguien tiene alguna buena referencia de fabricantes de PCB? quiero pedir pocas placas, de momento como mucho 2 o 3 para probar y corregir si hay algo mal por lo que necesitaría una empresa que haga protos en estas cantidades y de bajo costo, que no esta la economía para derrochar.
Saludos a todos.
#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);
}
}
// Imprime en el LCD el mansaje (a) en el idioma (b) correspondiente
void mostrar_mensaje(int a, int b){
int j;
for(j=0;j<21;j++){
printf("%c",tabla_mensajes[a][b][j]); //mensaje, idioma, caracter
}
}#define num_idiomas 4
#define mensajes 40
#define caracteres 22
#define INGLES 0
#define CASTELLANO 1
#define HOLANDES 2
#define ALEMAN 3
#define JAPONES 4
const char tabla_mensajes[mensajes][num_idiomas][caracteres] = {
// INGLES CASTELLANO HOLANDES ALEMAN JAPONES
"Texto1", "Texto1", "Texto1", "Texto1", //0
"AEOLUS V1.0", "AEOLUS V1.0", "AEOLUS V1.0", "AEOLUS V1.0", //1
"FAN:", "VENTILADOR:", "FAN:", "FAN:", //2
"VEL:", "VEL:", "VEL:", "VEL:", //3
"UV:", "UV:", "UV:", "UV:", //4
"FILTER:", "FILTRO:", "FILTER:", "FILTER:", //5
"Texto1", "Texto1", "Texto1", "Texto1", //6
"UV ON", "UV ON", "UV ON", "UV ON", //7
"TIME:", "TIEMPO:", "TIME:", "TIME:", //8
"UV TIME:", "TIEMPO UV:", "UV TIME:", "UV TIME:", //9
"HOURS UV:", "HORAS UV:", "HOURS UV:", "HOURS UV:", //10
"HOURS FILTER:", "HORAS FILTRO:", "HOURS FILTER:", "HOURS FILTER:", //11
"HOURS FAN:", "HORAS VENTILADOR:", "HOURS FAN:", "HOURS FAN:", //12
"LENGUAGE", "IDIOMA", "LENGUAGE", "LENGUAGE", //13
"ENGLISH", "INGLES", "ENGLISH", "ENGLISH", //14
"SPANISH", "CASTELLANO", "SPANISH", "SPANISH", //15
"DUTCH", "HOLANDES", "DUTCH", "DUTCH", //16
"GERMAN", "ALEMAN", "GERMAN", "GERMAN", //17
"JAPANESE", "JAPONES", "JAPANESE", "JAPANESE", //18
"FAN SPEED", "VELOCIDAD VENTILADOR", "FAN SPEED", "FAN SPEED", //19
"LAMINAR VELOCITY", "VELOCIDAD LAMINAR", "LAMINAR VELOCITY", "LAMINAR VELOCITY", //20
"RESET FAN HOURS", "RESET HORAS VENT.", "RESET FAN HOURS", "RESET FAN HOURS", //21
"RESET UV HOURS", "RESET HORAS UV", "RESET UV HOURS", "RESET UV HOURS", //22
"RESET FILTER HOURS", "RESET HORAS FILTRO", "RESET FILTER HOURS", "RESET FILTER HOURS", //23
"NO", "NO", "NO", "NO", //24
"YES", "SI", "YES", "YES", //25
"NORMAL", "NORMAL", "NORMAL", "NORMAL", //26
"1/2", "1/2", "1/2", "1/2", //27
"UV OFF", "UV OFF", "UV OFF", "UV OFF", //28
};// Imprime en el LCD el mansaje (a) en el idioma (b) correspondiente
void mostrar_mensaje(int a, int b){
printf("%c",tabla_mensajes[a][b][0]); //mensaje, idioma, caracter
printf("%c",tabla_mensajes[a][b][1]); //mensaje, idioma, caracter
printf("%c",tabla_mensajes[a][b][2]); //mensaje, idioma, caracter
printf("%c",tabla_mensajes[a][b][3]); //mensaje, idioma, caracter
printf("%c",tabla_mensajes[a][b][4]); //mensaje, idioma, caracter
printf("%c",tabla_mensajes[a][b][5]); //mensaje, idioma, caracter
printf("%c",tabla_mensajes[a][b][6]); //mensaje, idioma, caracter
printf("%c",tabla_mensajes[a][b][7]); //mensaje, idioma, caracter
printf("%c",tabla_mensajes[a][b][8]); //mensaje, idioma, caracter
printf("%c",tabla_mensajes[a][b][9]); //mensaje, idioma, caracter
printf("%c",tabla_mensajes[a][b][10]); //mensaje, idioma, caracter
printf("%c",tabla_mensajes[a][b][11]); //mensaje, idioma, caracter
printf("%c",tabla_mensajes[a][b][12]); //mensaje, idioma, caracter
printf("%c",tabla_mensajes[a][b][13]); //mensaje, idioma, caracter
printf("%c",tabla_mensajes[a][b][14]); //mensaje, idioma, caracter
printf("%c",tabla_mensajes[a][b][15]); //mensaje, idioma, caracter
printf("%c",tabla_mensajes[a][b][16]); //mensaje, idioma, caracter
printf("%c",tabla_mensajes[a][b][17]); //mensaje, idioma, caracter
printf("%c",tabla_mensajes[a][b][18]); //mensaje, idioma, caracter
printf("%c",tabla_mensajes[a][b][19]); //mensaje, idioma, caracter
}Puestos a probar cosas, métele un delay dentro del for.Lo he probado también, pero el único efecto que he conseguido es que muestre los "||" más lento.
Prueba a poner el arreglo al inicio de una página de memoria de programas, no dejes que el compilador la ponga donde le da la gana. Además prueba a deshabilitar las optimizaciones del compilador, esa suele ser una buena causa de problemas cuando utilizas arreglos multidimensionales.
En el manual del compilador vas a encontrar la directiva para definir la irección donde quieres que te pongan una variable, ahora no tengo esos docs y por eso no la pongo directo. El datasheet te dice donde comienza cada página.
Un saludo
Reinier
Te faltan los corchetes...