// n = 1,2,3
// unidad = 0,1,2
const float factor[]={1.0,1000.0,28.35};
void pesando(int8 n)
{
peso = get_units(10,n); // Lee el peso y hace un promedio de 10 muestras
lcd_gotoxy(1,n+1); printf(lcd_putc, "P%u:%4.1f g ", n , peso/factor[unidad]);
}
Eduardo2. Gracias por responder. Una pregunta.... Ahora cómo hace n para ir avanzando desde n=1 hasta n=5. Con algún ciclo for?.
pesando_1() ;
pesando_2() ;
pesando_3() ;
pesando_4() ;
pesando_5() ;
pesando(1) ;
pesando(2) ;
....
// n = 1,2,3,4,5
// unidad = 0,1,2
const float factor[]={1.0,1000.0,28.35};
const int8 linea[]={2,3,4,3,4};
void pesando(int8 n)
{
peso = get_units(10,n); // Lee el peso y hace un promedio de 10 muestras
lcd_gotoxy(1,linea[n-1]); printf(lcd_putc, "P%u:%4.1f g ",n,peso/factor[unidad]);
}void pesando_1(void)
{
peso = get_units(10,1); // Lee el peso y hace un promedio de 10 muestras
switch (unidad){
case 1:
factor = 1.0;
lcd_gotoxy(1,2); printf(lcd_putc, "P1:%4.1f g ",peso/factor);
break;
case 2:
factor = 1000.0;
lcd_gotoxy(1,2); printf(lcd_putc, "P1:%4.2f Kg",peso/factor);
break;
case 3:
factor = 28.35;
lcd_gotoxy(1,2); printf(lcd_putc, "P1:%4.2f oz",peso/factor);
break;
}
}
void pesando_2(void)
{
peso = get_units(10,2); // Lee el peso y hace un promedio de 10 muestras
switch (unidad){
case 1:
factor = 1.0;
lcd_gotoxy(1,3); printf(lcd_putc, "P2:%4.1f g ",peso/factor);
break;
case 2:
factor = 1000.0;
lcd_gotoxy(1,3); printf(lcd_putc, "P2:%4.2f Kg",peso/factor);
break;
case 3:
factor = 28.35;
lcd_gotoxy(1,3); printf(lcd_putc, "P2:%4.2f oz",peso/factor);
break;
}
}
void pesando_3(void)
{
peso = get_units(10,3); // Lee el peso y hace un promedio de 10 muestras
switch (unidad){
case 1:
factor = 1.0;
lcd_gotoxy(1,4); printf(lcd_putc, "P3:%4.1f g ",peso/factor);
break;
case 2:
factor = 1000.0;
lcd_gotoxy(1,4); printf(lcd_putc, "P3:%4.2f Kg",peso/factor);
break;
case 3:
factor = 28.35;
lcd_gotoxy(1,4); printf(lcd_putc, "P3:%4.2f oz",peso/factor);
break;
}
}
void pesando_4(void)
{
peso = get_units(10,4); // Lee el peso y hace un promedio de 10 muestras
switch (unidad){
case 1:
factor = 1.0;
lcd_gotoxy(13,3); printf(lcd_putc, "P4:%4.1f g ",peso/factor);
break;
case 2:
factor = 1000.0;
lcd_gotoxy(13,3); printf(lcd_putc, "P4:%4.2f Kg",peso/factor);
break;
case 3:
factor = 28.35;
lcd_gotoxy(13,3); printf(lcd_putc, "P4:%4.2f oz",peso/factor);
break;
}
}
void pesando_5(void)
{
peso = get_units(10,5); // Lee el peso y hace un promedio de 10 muestras
switch (unidad){
case 1:
factor = 1.0;
lcd_gotoxy(13,4); printf(lcd_putc, "P5:%4.1f g ",peso/factor);
break;
case 2:
factor = 1000.0;
lcd_gotoxy(13,4); printf(lcd_putc, "P5:%4.2f Kg",peso/factor);
break;
case 3:
factor = 28.35;
lcd_gotoxy(13,4); printf(lcd_putc, "P5:%4.2f oz",peso/factor);
break;
}
}
void pesando(void){
for(int8 k=1 , fila=3 , columna=1 ; k<=5 ; k++ , fila++){
lcd_gotoxy(4,2) ;
switch(unidad){ // unidad: 1,2 o 3
case 1: printf(lcd_putc, "[g] ") ; break ;
case 2: printf(lcd_putc, "[Kg]") ; break ;
case 3: printf(lcd_putc, "[oz]") ;
}
if(k==3){ fila=2 ; columna=12 ; }
lcd_gotoxy(columna,fila) ;
printf(lcd_putc, "%1u:" , k);
float peso ;
switch(unidad){
case 1:
peso = get_units(10,k);
printf(lcd_putc,"%6.2f",peso) ;
break ;
case 2:
peso = get_units(10,k)/1000.0 ;
printf(lcd_putc,"%6.3f",peso) ;
break ;
case 3:
peso = get_units(10,k)/28.35 ;
printf(lcd_putc,"%6.3f",peso) ;
}
}
}
pesando() ; // muestra los 5 pesos
Usted lo pensó muy bien Eduardo2. Así funciona perfecto.
void pesando(void){
lcd_gotoxy(1,2) ;
switch(unidad){
case 1: printf(lcd_putc, "P [g] ") ; break ;
case 2: printf(lcd_putc, "P [Kg]") ; break ;
case 3: printf(lcd_putc, "P [oz]") ;
}
for(int8 k=1 , fila=3 , columna=1 ; k<=5 ; k++ , fila++){
if(k==3){ fila=2 ; columna=12 ; }
lcd_gotoxy(columna,fila) ;
printf(lcd_putc, "%1u:" , k);
float peso = get_units(10,k);
switch(unidad){
case 1: printf(lcd_putc,"%6.2f",peso) ; break ;
case 2: printf(lcd_putc,"%6.3f",peso/1000.0) ; break ;
case 3: printf(lcd_putc,"%6.3f",peso/28.35) ;
}
}
}
void pesando(void){
lcd_gotoxy(1,2) ;
switch(unidad){
case 1: printf(lcd_putc, "P [g] ") ; break ;
case 2: printf(lcd_putc, "P [Kg]") ; break ;
case 3: printf(lcd_putc, "P [oz]") ;
}
for(int8 k=1 , fila=3 , columna=1 ; k<=5 ; k++ , fila++){
if(k==3){ fila=2 ; columna=12 ; }
lcd_gotoxy(columna,fila) ;
printf(lcd_putc, "%1u:" , k);
float peso = get_units(10,k);
switch(unidad){
case 1: printf(lcd_putc,"%6.2f",peso) ; break ;
case 2: printf(lcd_putc,"%6.3f",peso/1000.0) ; break ;
case 3: printf(lcd_putc,"%6.3f",peso/28.35) ;
}
}
}
void pesando(void){
float peso[5] ; // Está como variable local
// Cambialo de lugar si necesitas que sea global.
lcd_gotoxy(1,2) ;
switch(unidad){
case 1: printf(lcd_putc, "P [g] ") ; break ;
case 2: printf(lcd_putc, "P [Kg]") ; break ;
case 3: printf(lcd_putc, "P [oz]") ;
}
for(int8 k=1 , fila=3 , columna=1 ; k<=5 ; k++ , fila++){
if(k==3){ fila=2 ; columna=12 ; }
lcd_gotoxy(columna,fila) ;
printf(lcd_putc, "%1u:" , k);
float x = peso[k-1] = get_units(10,k);
switch(unidad){
case 1: printf(lcd_putc,"%6.2f",x) ; break ;
case 2: printf(lcd_putc,"%6.3f",x/1000.0) ; break ;
case 3: printf(lcd_putc,"%6.3f",x/28.35) ;
}
}
//-----------------------------------
if(peso[0]<100. && peso[2]<100.) output_high(PIN_A0) ;
else output_low (PIN_A0) ;
//-----------------------------------
}
Aunque un poco fuera de tema, aunque para el mismo. Me atreví a preguntas esto...
Trato de configurar los fuses para el PIC18F4620 a 40Mhz. Por ahí leí que se debe poner #fuses H4 para un cristal externo de 10Mhz.
Y lo puse de la siguiente manera:
#fuses NOWDT, WDT128, H4, NOFCMEN, NOIESO, NOPUT, NOBROWNOUT, NOPBADEN, NOLPT1OSC, MCLR, STVREN, NOLVP, NOXINST, NODEBUG, NOPROTECT, NOCPB, NOCPD, NOWRT, NOWRTC, NOWRTB, NOWRTD, NOEBTR, NOEBTRB
#use delay(clock=40000000, crystal=10000000)
Pero tal parece que el pic no responde a 40Mhz. Alguna recomendación...
...Trato de configurar los fuses para el PIC18F4620 a 40Mhz. Por ahí leí que se debe poner #fuses H4 para un cristal externo de 10Mhz.
Y lo puse de la siguiente manera:
#fuses NOWDT, WDT128, H4, NOFCMEN, NOIESO, NOPUT, NOBROWNOUT, NOPBADEN, NOLPT1OSC, MCLR, STVREN, NOLVP, NOXINST, NODEBUG, NOPROTECT, NOCPB, NOCPD, NOWRT, NOWRTC, NOWRTB, NOWRTD, NOEBTR, NOEBTRB
#use delay(clock=40000000, crystal=10000000)
Pero tal parece que el pic no responde a 40Mhz. Alguna recomendación...
Word 1: C600 H4 FCMEN IESO
Word 2: 1E1E PUT BROWNOUT BORV21 NOWDT WDT32768
Word 3: 8700 CCP2C1 PBADEN LPT1OSC MCLR
Word 4: 0081 STVREN NOLVP NOXINST NODEBUG
Word 5: C00F NOPROTECT NOCPB NOCPD
Word 6: E00F NOWRT NOWRTC NOWRTB NOWRTD
Word 7: 400F NOEBTR NOEBTRB
Entonces está de más el poner #fuses H4. Pruebo y comento, pero tendrá que ser físicamente por qué simulado en PROTEUS pareciera que no lo hace por qué simulado todo va más lento.
#include<18F4620.h>
#use delay(clock=40MHz,crystal=10MHz)
void main(void){
set_tris_b(0) ;
int8 n=0;
while(1){
n++;
if(n==0) output_toggle(PIN_B0) ;
delay_ms(10) ;
}
}Y Proteus me lo simula a la velocidad correcta.