Hola metalm y bienvenido al foro. muy agradecido por tu aporteHola, si tienes el compilador integrado en el mplab, si que puede que ocurra eso que dices (lo desconozco pues yo compilo en linea de comandos mediante un fichero .bat), pero en todo caso la opcion para especificar el micro es con el nombre del micro, por ejemplo PICC18.exe -18F8720 para el caso de versiones del compilador 8.xx o PICC18.exe --CHIP=18F8720 para el caso de versiones del compilador 9.5x o superiores.
recien empiezo a usar el hitech y viendo el include al pic18.h, supongo que el compilador selecciona el micro que yo quiero mirandolo en el IDE MPlab (el que se escogió) , porque no se de donde podrá saber cual de todos es.
te podremos ayudar en cualquier duda que tengas siempre que el tiempo y los conocimientos nos lo permita. :)
PD: Les comento que un programa que tenia en ccs lo pasé a hi-tech haciendo únicamente los cambios necesarios y pasó de tener el 93% de memoria de programa a solo el 40%.
CitarPD: Les comento que un programa que tenia en ccs lo pasé a hi-tech haciendo únicamente los cambios necesarios y pasó de tener el 93% de memoria de programa a solo el 40%.
queeeeeeeeeeeeeeee :shock: Esa es una razon de muchisimo pero muchisimo peso.
Soy algo esceptico respecto a eso... elegiste el mismo chip? Compilaste el programa al 100%, sin olvidarte ningun fragmento? No te digo que no pueda ser verdad, pero esque parece demasiado bueno como para serlo jejeje.
Hitech tampoco se salva de los bugs ??? :z)Pero, ¿existe algún software sin bugs?. Yo creo que no, dejaría de tener gracia …
Mil millones de gracias, funciona perfectamente. Lei en estos comentarios que para utilizar la función DelayMs era necesario disponer de la libraria delay.h. Peor mi versión de PIC no la tiene. Hay alguna otra forma de generar un retardo en HI-TECH??. Gracias de nuevo.
Esta línea configura el timer0 interno con pre-scaler en 256, esto se hace en el registro OPTION, del datasheet:Código: C
setup_counters(RTCC_INTERNAL,RTCC_DIV_256);
Código: C
aleatorio = get_rtcc() % 4;
Código: C
aleatorio +=1;
Me he dado cuenta de que hay otra cosa que no se traducir y es la siguiente:
INTCON=0;
enable_interrupts(INT_EEPROM);
enable_interrupts(GLOBAL);
:( :( :( :( :?
#define bitset(var, bitno) ((var) |= 1 << (bitno))
#define bitclr(var, bitno) ((var) &= ~(1 << (bitno)))
#define bittest(var, bitno) (var && (1<<bitno))
#define make8(var,offset) ((unsigned int)var >> (offset * 8)) & 0x00FF
#define make16(varhigh,varlow) (((unsigned int)varhigh & 0xFF)* 0x100) + ((unsigned int)varlow & 0x00FF)
#define make32(var1,var2,var3,var4) \
((unsigned long)var1<<24)+((unsigned long)var2<<16)+ \
((unsigned long)var3<<8)+((unsigned long)var4)
#define make32i(var1,var2) ((unsigned long)var1<<16)+((unsigned long)var2)
el retardo es muy largo 500ms , intenta con 10ms
#include <12f683.h>
#fuses INTRC_IO,NOWDT,NOPROTECT, NOMCLR
#use delay(clock=8000000)
#define GP0 PIN_A0
#define GP1 PIN_A1
#define GP2 PIN_A2
#define GP3 PIN_A3
#define GP4 PIN_A4
#define GP5 PIN_A5
void main() {
setup_oscillator(OSC_8MHZ);
//setup_adc_ports(NO_ANALOGS);
//setup_comparator(NC_NC);
//set_tris_a(0x00);
while(1) {
output_low(GP2);output_low(GP4);output_low(GP5);
delay_ms(100);
output_high(GP2);output_high(GP4);output_high(GP5);
delay_ms(100);
}
}
#include <htc.h>
__CONFIG(0x3FC4);
#define _XTAL_FREQ 8000000
void main() {
OSCCON=0b01110001; // Oscilador interno 8MHz
OSCTUNE=0;
//ANSEL=0; //Desactiva entradas analogas
//CMCON0=0x07; //Desactiva comparador analogo
TRISIO=0; //Configura solo outputs
while(1) {
GP2=0;GP4=0;GP5=0;
__delay_ms(100);
GP2=1;GP4=1;GP5=1;
__delay_ms(100);
}
}
volvi!
ahora ando buscando alguna funcion de delay COMO LA GENTE para el hi tech, alguien se hizo una?
Porque la que viene es bastante trucha, yo generalmente uso al micro en 20 y 40 mhz y no sirve. El mismo header aclara esto:
* Note that there are range limits:
* - on small values of x (i.e. x<10), the delay becomes less
* accurate. DelayUs is accurate with xtal frequencies in the
* range of 4-16MHZ, where x must not exceed 255.
* For xtal frequencies > 16MHz the valid range for DelayUs
* is even smaller - hence affecting DelayMs.
otra cosa: el compilador de hi tech tampoco es perfecto!
aca teniamos escrito una definicion como "T0CON = 0xb11010011;"
fijense que dice "0xb" y no lo tira como error de compilacion, si no que le asigna los dos ultimos numeros a T0CON dejandolo en 0x11!
ademas no tira warnings como que hay variables declaradas y nunca se usan.. eso no me gusta, se puede habilitar este warning?
void retardo(unsigned int tiempo);
void retardo(unsigned int tiempo)
{
TMR1ON = 0;
TMR1IF = 0;
tiempo = 0xFFFF-tiempo;
TMR1H = tiempo>>8;
TMR1L = tiempo & 0xFF;
TMR1ON = 1;
while(!TMR1IF);
TMR1ON = 0;
TMR1IF = 0;
}
while(1)
{
RB1 = !RB1;
delay(500);
}
void escribir_string(const char *letra);
unsigned long obtener_valor(void);
void escribir(char letra);
void convertir(unsigned long number);
void escribir_string(const char *letra)
{
while(*letra != 0)
{
while(!TXIF);
TXREG = *letra++;
}
}
unsigned long obtener_valor()
{
unsigned long value;
char incoming;
value = 0;
while(!RCIF);
incoming = RCREG;
while(incoming >= '0' && incoming <= '9')
{
value = value*10 + (incoming - 48);
while(!RCIF);
incoming = RCREG;
}
return value;
}
void escribir(char letra)
{
while(!TXIF);
TXREG = letra;
}
void convertir(unsigned long number)
{
if(number != 0)
{
unsigned long potencia;
potencia = 1;
while(potencia*10 <= number)
{
potencia = potencia*10;
}
while(potencia != 1)
{
while(!TXIF);
TXREG = (number / potencia)+48;
number = number - ((number/potencia)*potencia);
potencia = potencia/10;
}
}
while(!TXIF);
TXREG = number+48;
}
main()
{
escribir_string("Prueba de funcionamiento"); //String
escribir(10); //line feed
escribir(13); //carriage return (enter)
valor = obtener_valor(); //obtiene caracteres (desde el 0 al 9) y los transforma en número, si el caracter está fuera de ese rango devuelve el valor
convertir(valor); //devuelve el número obtenido en caracteres ASCII
}