Como muy bien dice el amigo MLO si recibes ASCII arreglalo con otro ASCII (Como aquello que decía mi agüela de que la mancha de mora1 con otra mora se quita) :D :D :DCódigo: C#
char c; int8 i; c=getc(); i = c-'0';
Asi si con el PC le envía un '8' entonces '8'-'0'=8 (sean cuales sean los códigos ASCII del '0' y del '8' ya que el del '8' será exactamente 8 mayor que el del '0') :mrgreen:
1 Mora (http://es.wikipedia.org/wiki/Mora_%28fruta%29)
i=(int)(c-'0');// ****************** CONFIGURACION DEL MODO PWM ******************************
//
// T_PWM=1/Freq_PWM
// T_PWM=(PR2+1)*4*TOSC*TMR2_PREESCALER
//
// T_PWM
// PR2= (---------------------------)-1
// 4*TOSC*TMR2_PREESCALER
//
// CTPWM=(CCPR1L:CCP1CON<5:4>)*TOSC*TMR2PREEESCALER
//
// CTPWM es el ciclo de trabajo y no puede superar el valor del periodo
// de la señal PWM por lo que es posible que no se utilicen los
// 10 bits de resolución que tiene
//
//
// CTPWM
// CCPR1L:CCP1CON<5:4>= ----------------------
// TOSC*TMR2PREEESCALER
//
// El valor del duty maximo es CCPR1L:CCP1CON<5:4>=1000
//
// Frecuencia de la señal PWM=250 Hz
// OSCILADOR= 4MHZ
// TMR2_PREESCALER=16
// T_PWM= 4 ms
// PR2=250
//
// *****************************************************************************
#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,NOCPD,BROWNOUT
#use delay(clock=4000000)
//#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,bits=8,stream=HOSTPC)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,bits=8,parity=N)
#use fast_io(c)
#use fast_io(d)
#use fast_io(b)
int8 display7seg(int8 valor){
switch (valor){
case 0:
return 0b11111100;
break;
case 1:
return 0b01100000;
break;
case 2:
return 0b11011010;
break;
case 3:
return 0b11110010;
break;
case 4:
return 0b01100110;
break;
case 5:
return 0b10110110;
break;
case 6:
return 0b00111110;
break;
case 7:
return 0b11100000;
break;
case 8:
return 0b11111110;
break;
case 9:
return 0b11100110;
break;}
}
int8 aux,dig_1,dig_2;
int16 num;
char c;
#int_rda
void serial_isr(){
c=getc();
}
void main(void){
set_tris_c(0x00);
set_tris_d(0x00);
set_tris_b(0x00);
output_c(0x00);
output_d(0x00);
output_b(0x00);
setup_timer_2(T2_DIV_BY_16,249,1);
setup_ccp1(CCP_PWM);
//set_pwm1_duty(CCP_OFF);
enable_interrupts(GLOBAL);
enable_interrupts(int_rda);
while(1){
output_high(PIN_C4);
output_low(PIN_C5);
//c=fgetc(HOSTPC);
aux=(int8)(c-'0');
switch (aux){
case 2:
num = 10;
dig_1=(num/10);
dig_2=(num-(dig_1*10));
output_b(display7seg(dig_1));
output_d(display7seg(dig_2));
set_pwm1_duty(num*100);
delay_ms(30);
break;
case 4:
num = 20;
dig_1=(num/10);
dig_2=(num-(dig_1*10));
output_b(display7seg(dig_1));
output_d(display7seg(dig_2));
set_pwm1_duty(num*100);
delay_ms(30);
break;
case 8:
num = 30;
dig_1=(num/10);
dig_2=(num-(dig_1*10));
output_b(display7seg(dig_1));
output_d(display7seg(dig_2));
set_pwm1_duty(num*100);
delay_ms(30);
break;
case 16:
num = 40;
dig_1=(num/10);
dig_2=(num-(dig_1*10));
output_b(display7seg(dig_1));
output_d(display7seg(dig_2));
set_pwm1_duty(num*100);
delay_ms(30);
break;
case 32:
num = 50;
dig_1=(num/10);
dig_2=(num-(dig_1*10));
output_b(display7seg(dig_1));
output_d(display7seg(dig_2));
set_pwm1_duty(num*100);
delay_ms(30);
break;
case 64:
num = 60;
dig_1=(num/10);
dig_2=(num-(dig_1*10));
output_b(display7seg(dig_1));
output_d(display7seg(dig_2));
set_pwm1_duty(num*100);
delay_ms(30);
break;
case 128:
num = 70;
dig_1=(num/10);
dig_2=(num-(dig_1*10));
output_b(display7seg(dig_1));
output_d(display7seg(dig_2));
set_pwm1_duty(num*100);
delay_ms(30);
break;}
}
}
Hola:
Por cierto, la linea 108 es incorrecta. Se debe quitar la instrucción c=0x00.
Entonces ¿te ha funcionado? :shock:Hola:
Por cierto, la linea 108 es incorrecta. Se debe quitar la instrucción c=0x00.
¿Por qué? es una buena forma de asegurarte de que c vale 0x00 antes de habilitar la #int_rda ... pero si la quieres quitar no debe haber problema. Creo humildemente que se puede quitar pero no veo por qué se debe quitar. :shock:
Yo siempre inicializo las variables antes de usarlas, así me aseguro de que antes de empezar a funcionar mi programa tienen las condiciones iniciales que explícitamente yo deseo.
Si en mi bucle while(1) testeo la condición de if(c!=0x00) quiero asegurarme de que c vale exactamente 0x00 hasta que se reciba algo por la USART, de ahí el c=0x00; antes de entrar en él.
Es una pequeña manía que me ha ahorrado muchos dolores de cabeza. :mrgreen:
Perdón, perdón, perdón. Creía que te referías al primer c=0x00; no al segundo. efectivamente el segundo hay que moverlo debajo de donde se usa para calcular el valor de aux. :oops:
Y MLO tiene razón, yo también "levanto" un flag en la interrupción que es el que detecto en el main() y no uso directamente la variable de recogida del dato.
Que tal amigos!
Aprovecho este enlace para hacerles una consulta :mrgreen:
Tengo un pic16f876A @ 8Mhz
Y estoy empleando dos interrupciones una por el timer0 cada 5ms y otra por recepcion serial (int_rda) @ 9600bps, ahora bien el problema que presento, es con la interrupcion por recepcion, ya que no recibe el caracter que le envio (solo un caracter a la vez) :5]
Estoy empleando los pines por hardware del pic para recepcion.
Alguna idea de que podra ser?
Gracias