Autor Tema: problema con menu en hyperterminal  (Leído 2596 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado caeshark_

  • PIC10
  • *
  • Mensajes: 41
problema con menu en hyperterminal
« en: 21 de Mayo de 2012, 22:38:23 »
Hola os comento mi proble a ver si alguien me puede echar un cable, mi idea es hacer un menu, segun las teclas que pulse en el pc recibir un mensaje u otro.

Mi idea del menu seria

PULSA 1 PARA CONFIGURAR EL PWM1>>pulsa 3 para pwm al 10%
                                                       >>pulsa 4 para pwm al 20%
                                                                      "
                                                                      "
                                                                      "


PULSA 2 PARA CONFIGURAR EL PWM2>>>



esa era mi intencion pero me encuentro con que si pulso el 2 dentro ya del menu 1 se sale fuera al menu 2
os dejo el codigo para ver si alguien me puede ayudar, la estructura supongo que no estara bien porque no consigo que haga lo que yo quiero.

Código: [Seleccionar]
#include <usart.h>
#include<stdio.h>
#include<pwm.h>
#include<timers.h>

#pragma config FOSC = XT_XT,FCMEN = OFF,IESO = OFF, CPUDIV = OSC1_PLL2
#pragma config PWRT = ON,BOR = OFF,BORV = 0
#pragma config WDT = OFF,WDTPS = 32768
#pragma config MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,CCP2MX = OFF
#pragma config STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF
#pragma config CP0 = ON,CP1 = ON,CP2 = ON
#pragma config CPB = ON,CPD = ON
#pragma config WRT0 = ON,WRT1 = ON,WRT2 = ON
#pragma config WRTB = ON,WRTC = ON,WRTD = ON
#pragma config EBTR0 = ON,EBTR1 = ON,EBTR2 = ON
#pragma config EBTRB = ON

void main(void){


    char string[6];
    unsigned int value;
    TRISC=0x80;
TRISB=0x00;
    OpenUSART(    USART_TX_INT_OFF    &    //Disable Interrupts
                USART_RX_INT_OFF    &    //----------------
                USART_ASYNCH_MODE    &    //Modo asincronico
                USART_EIGHT_BIT        &    //8 bit
                USART_CONT_RX        &    //resepcion continua
                USART_BRGH_HIGH,
                25);                //FOSC / (16 * (spbrg + 1))
                                    //
    OpenTimer2(    TIMER_INT_OFF         &
                T2_PS_1_16            &
                T2_POST_1_16);
    OpenPWM1(255);
    SetDCPWM1(100);
    printf("CONTROL PWM LUXO!!!\r\n");


printf("PULSA 1 PARA CONFIGURAR EL PWM1\r\n");
printf("PULSA 2 PARA CONFIGURAR EL PWM2\r\n");


  
    
    
  

while (1){
getsUSART(string,1);
 
        if(string[0]=='1'){
        WriteUSART(0x0C);
printf("CONFIGURACION DEL PWM1\r\n");

printf("pulsa 3 pwm al 10\r\n");
printf("pulsa 4 pwm al 20\r\n");
getsUSART(string,1);
    
}else if(string[0]=='3'){
printf("pwm al 10\r\n");
getsUSART(string,1);
}else if(string[0]=='4'){
printf("pwm al 20\r\n");




getsUSART(string,1);
        }if(string[0]=='2'){
        WriteUSART(0x0C);
printf("CONFIGURACION DEL PWM2\r\n");
        }
getsUSART(string,1);
        }if(string[0]=='3'){
        
printf("PWM AL 40 \r\n");
        

          
    
        
}  

}

Lo estoy simulando en proteus quiza el fallo este ahi? no se a vecess tambien se me queda colgado os adjunto archivo a ver si alguien puede echarme un cable con la estructura del programa o con el proteus un saludo a todos.
« Última modificación: 21 de Mayo de 2012, 22:47:10 por caeshark_ »

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: problema con menu en hyperterminal
« Respuesta #1 en: 22 de Mayo de 2012, 05:42:06 »
asi como esta la lógica del programa es normal que te este sucediendo, hay varias maneras de resolverlo, te pongo una:

Código: [Seleccionar]

bit bandera=0;

while(1)
{
     leo_uart;
     if(lectura == 1)
     {
          while(1)
         {
               leo_uart;
               switch(lectura)
               {
                       case 3: hago_lo_que_quiero;
                                  y_algo_mas();
                                  bandera = 1;
                                  break;

                      case 4:    ....
                       ...
               }
               if (bandera) break;
         }
     }
     else if(lectura == 2)
     {
            lo mismo de arriba
     }
    
     bandera=0;
}



un saludo

Desconectado caeshark_

  • PIC10
  • *
  • Mensajes: 41
Re: problema con menu en hyperterminal
« Respuesta #2 en: 22 de Mayo de 2012, 07:45:18 »
Tannke muchas gracias por tu respuesta, el caso es que estoy intentando ver como puedo definir el flag bandera que me pones para ir pasando de un caso a otro y no logro entender como se hace, he visto estructuras tipo esta:
Código: [Seleccionar]
struct RELAYBITS
  {
  unsigned rca:1;     /* SEL_UNBAL relay */
  unsigned earth:1;   /* EARTHSEL relay */
  unsigned ground:1;  /* GND_RLY relay */
  unsigned phase:1;   /* Phase invert relay */
  unsigned bridge:1;  /* Mono amplifier mode */
  unsigned dummy:2;   /* Alignment bits */
  unsigned mute:1;    /* MUTE relay */
  };

/*--- Relay bits union ---*/

typedef union
  {
  struct RELAYBITS Bits;
  unsigned char data;
  }RELAY;
  
volatile RELAY RELAYbits;

que parece es para nombrar los bits de un rele, pero no consigo hacer que funcione, seria posible que me pusieras como defino un bit y la variable donde esta ese bit.
Muchas gracias por tu respuesta.




EDITO:

No despues de mucho rebuscar y probar y volver a probar, finalmente consegui que me compilara bien con el tema de los bits, pero ahora hay algo que no me funciona, creo que no me detecta la pulsacion en el switch.

Código: [Seleccionar]
#include <p18f4550.h>
#include <usart.h>
#include<stdio.h>
#include<pwm.h>
#include<timers.h>
#include<GenericTypeDefs.h>

#pragma config FOSC = XT_XT,FCMEN = OFF,IESO = OFF, CPUDIV = OSC1_PLL2
#pragma config PWRT = ON,BOR = OFF,BORV = 0
#pragma config WDT = OFF,WDTPS = 32768
#pragma config MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,CCP2MX = OFF
#pragma config STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF
#pragma config CP0 = ON,CP1 = ON,CP2 = ON
#pragma config CPB = ON,CPD = ON
#pragma config WRT0 = ON,WRT1 = ON,WRT2 = ON
#pragma config WRTB = ON,WRTC = ON,WRTD = ON
#pragma config EBTR0 = ON,EBTR1 = ON,EBTR2 = ON
#pragma config EBTRB = ON

//#define lectura

typedef union
 {
   struct
   {
      unsigned int b0: 1;
      unsigned int b1: 1;
      unsigned int b2: 1;
      unsigned int b3: 1;
      unsigned int b4: 1;
      unsigned int b5: 1;
      unsigned int b6: 1;
      unsigned int b7: 1;
   };
   unsigned char byte;
 } BANDERAS;
 
 BANDERAS  BANDERASBIT;
 
 




void main(void){






int lectura;

char string[1];
    unsigned int value;
    TRISC=0x80;
TRISB=0x00;




    OpenUSART(    USART_TX_INT_OFF    &    //Disable Interrupts
                USART_RX_INT_OFF    &    //----------------
                USART_ASYNCH_MODE    &    //Modo asincronico
                USART_EIGHT_BIT        &    //8 bit
                USART_CONT_RX        &    //resepcion continua
                USART_BRGH_HIGH,
                25);                //FOSC / (16 * (spbrg + 1))
                                    //
    OpenTimer2(    TIMER_INT_OFF         &
                T2_PS_1_16            &
                T2_POST_1_16);
    OpenPWM1(255);
    SetDCPWM1(100);
   




printf("CONTROL PWM !!!\r\n");


printf("PULSA 1 PARA CONFIGURAR EL PWM1\r\n");
printf("PULSA 2 PARA CONFIGURAR EL PWM2\r\n");

BANDERASBIT.b0=0;

while(1)
{
     getsUSART(string,1);
     if(string[0]=='1')
     {
          while(1)
         {
               
printf("configuracion del pwm1\r\n");
printf("PWM1 AL 25 o/o\r\n");
printf("PWM1 AL 50 o/o\r\n");
printf("PWM1 AL 75 o/o\r\n");
printf("PWM1 AL 100 o/o\r\n");

getsUSART(string,1);

            switch(lectura)
               {
                       case 0x01:{    SetDCPWM1(100);
printf("PWM1 AL 25 o/o\r\n");
                                 
                                  BANDERASBIT.b0=0;
                                  break;
}
                      case  0x02:{  SetDCPWM1(100);
printf("PWM1 AL 50 o/o\r\n");                                 
                                  BANDERASBIT.b0=0;
                                  break;
}
               }

               if (BANDERASBIT.b0=1) break;
         }
     }
     else if(string[0]=='2')
     {
          while(1)
         {
               
printf("configuracion del pwm2\r\n");
printf("PWM2 AL 25 o/o\r\n");
printf("PWM2 AL 50 o/o\r\n");
printf("PWM2 AL 75 o/o\r\n");
printf("PWM2 AL 100 o/o\r\n");

getsUSART(string,1);
    btoa(string, lectura);
            switch(lectura)
               {
                       case '1':    SetDCPWM1(100);
                                 
                                  BANDERASBIT.b0=1;
                                  break;

                      case  '2':  SetDCPWM1(100);
                                 
                                  BANDERASBIT.b0=1;
                                  break;
               }
               if (BANDERASBIT.b0=1) break;
         }
     }
     
     BANDERASBIT.b0=1;
 }
}


si no me equivoco y ya digo que soy nuevisimo en esto, segun esta el programa le estoy diciendo en el switch que segun el valor de lectura haga una cosa u otra?
que vaya al case 1 cuando reciba 0x01 y al dos cuando reciba 0x02, el problema es que no se como pasar el dato recibido a esa variable, xq si en el switch pongo que la variable a analizar sea string, me da el error Error [1112] integer type expected in switch control expression, que por lo poco que se de ingles, es que debe esperar que un numero entero sea el control del switch y no un char caracter que es lo que recibe el puerto serie.
Entonces se me ocurren dos formas de solucionar el problema o transformar ese char recibido en un int, o hacer que el control de ese switch sea ese char.
Y por cierto en asm que es de donde vengo lo recibido se almacenaba en un byte, hay en c18 alguna manera de hacer eso? o hay alguna variable donde se almacenen los bytes que se van recibiendo... como veis estoy perdidisimo   :oops:
Alguien puede echarme una manita
« Última modificación: 22 de Mayo de 2012, 22:10:51 por caeshark_ »

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: problema con menu en hyperterminal
« Respuesta #3 en: 23 de Mayo de 2012, 05:53:59 »
Muy buenas, el tema es que no conozco mucho ccs y c18, de momento estoy con mikroc y asm, por lo que no conozco muy bien los detalles de estos. De todos modos lo que puedes intentar hacer es pasarle al switch directamente tu lectura:

getsUSART(string,1);
      
switch(string[0])

Creo que con eso debería ir bien, de todos modos simpre puedes usar if/else if para salir del paso hasta controlar bien el switch.

Sobre tu pregunta de la recepción seguramente c18 tendrá alguna función para recibir los datos byte a byte, si no fuera asi puedes hacer:

char recepcion;  //variable 1byte
getsUSART(string,1);
recepcion = string[0];

Por otro lado viendo tu código, cuidado como usas la bandera(bit), me parece que así como está no podras salir del bucle del menú 1. Yo ese bit lo puse para eso, para que una vez configurado el pwm1/2 en el submenu volver otra vez al menú principal.

-En el primer switch "PWM1" dentro de los case tienes que poner el bit a 1
-Donde "if (BANDERASBIT.b0=1) break;" creo tienes que poner == (dos iguales)
-En el ultimo "BANDERASBIT.b0=1;" ahi tendrias que volver a ponerlo a 0 i no a 1.

un saludo
« Última modificación: 23 de Mayo de 2012, 06:59:30 por tannke »

Desconectado caeshark_

  • PIC10
  • *
  • Mensajes: 41
Re: problema con menu en hyperterminal
« Respuesta #4 en: 23 de Mayo de 2012, 20:49:03 »
 :-/ :-/ :-/ :-/ :-/ :-/ :-/
Lo consegui, despues de cuatro dias liado casi dia y noche, he conseguido sacar mi primer programa funcional en C18
El programa es para un pic18f4550 con un cristal externo de 4Mhz.
Genera un pwm de 1Khz, pudiendo variar el duty entre 0% y 100% mediante un menu a treves del hyperterminal, esta probado y funciona a traves de proteus.
Es algo muy sencillo y supongo que se podran reducir mucho las lineas de codigo pero para ser mi primer programa funcional estoy contento.
Si alguien le sirve ahi esta y si alguien tiene alguna idea de como optimizarlo, tambien puede dejar el comentario o como lo haria el.

Código: [Seleccionar]
#include <p18f4550.h>
#include <usart.h>
#include<stdio.h>
#include<pwm.h>
#include<timers.h>
#include<GenericTypeDefs.h>

#pragma config FOSC = XT_XT,FCMEN = OFF,IESO = OFF, CPUDIV = OSC1_PLL2
#pragma config PWRT = ON,BOR = OFF,BORV = 0
#pragma config WDT = OFF,WDTPS = 32768
#pragma config MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,CCP2MX = OFF
#pragma config STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF
#pragma config CP0 = ON,CP1 = ON,CP2 = ON
#pragma config CPB = ON,CPD = ON
#pragma config WRT0 = ON,WRT1 = ON,WRT2 = ON
#pragma config WRTB = ON,WRTC = ON,WRTD = ON
#pragma config EBTR0 = ON,EBTR1 = ON,EBTR2 = ON
#pragma config EBTRB = ON

//#define lectura

typedef union
 {
   struct
   {
      unsigned int b0: 1;
      unsigned int b1: 1;
      unsigned int b2: 1;
      unsigned int b3: 1;
      unsigned int b4: 1;
      unsigned int b5: 1;
      unsigned int b6: 1;
      unsigned int b7: 1;
   };
   unsigned char byte;
 } BANDERAS;
 
 BANDERAS  BANDERASBIT;
 
 




void main(void){






int lectura;

char string[1];
    unsigned int value;
    TRISC=0x80;
TRISB=0x00;




    OpenUSART(    USART_TX_INT_OFF    &    //Disable Interrupts
                USART_RX_INT_OFF    &    //----------------
                USART_ASYNCH_MODE    &    //Modo asincronico
                USART_EIGHT_BIT        &    //8 bit
                USART_CONT_RX        &    //resepcion continua
                USART_BRGH_HIGH,
                25);                //FOSC / (16 * (spbrg + 1))
                                    //
    OpenTimer2(    TIMER_INT_OFF         &
                T2_PS_1_4          &
                T2_POST_1_12);
    OpenPWM1(255);
    SetDCPWM1(1023);
OpenPWM2(255);
    SetDCPWM2(100);
    




printf("CONTROL PWM !!!\r\n");


printf("PULSA 1 PARA CONFIGURAR EL PWM1\r\n");
printf("PULSA 2 PARA CONFIGURAR EL PWM2\r\n");

BANDERASBIT.b0=0;

while(1)
{
     getsUSART(string,1);
     if(string[0]=='1')
     {
          while(1)
         {
            putcUSART(0x0C);
 
printf("CONFIGURACION DEL PWM1\r\n");
printf("PULSA 0 PARA PWM1 AL 0 o/o\r\n");
printf("PULSA 1 PARA PWM1 AL 10 o/o\r\n");
printf("PULSA 2 PARA PWM1 AL 20 o/o\r\n");
printf("PULSA 3 PARA PWM1 AL 30 o/o\r\n");
printf("PULSA 4 PARA PWM1 AL 40 o/o\r\n");
printf("PULSA 5 PARA PWM1 AL 50 o/o\r\n");
printf("PULSA 6 PARA PWM1 AL 60 o/o\r\n");
printf("PULSA 7 PARA PWM1 AL 70 o/o\r\n");
printf("PULSA 8 PARA PWM1 AL 80 o/o\r\n");
printf("PULSA 9 PARA PWM1 AL 90 o/o\r\n");
printf("PULSA a PARA PWM1 AL 100 o/o\r\n");

getsUSART(string,1);
lectura=getcUSART();
            switch(lectura)
               {
                       case '0':{    SetDCPWM1(0);
putcUSART(0x0C);
printf("PWM1 AL 0 o/o\r\n");

putcUSART(0x0D);
printf("PULSA 1 PARA CONFIGURAR EL PWM1\r\n");
printf("PULSA 2 PARA CONFIGURAR EL PWM2\r\n");

                                
                                 BANDERASBIT.b0=0;
                                  break;
}
case '1':{    SetDCPWM1(102);
putcUSART(0x0C);
printf("PWM1 AL 10 o/o\r\n");

putcUSART(0x0D);
printf("PULSA 1 PARA CONFIGURAR EL PWM1\r\n");
printf("PULSA 2 PARA CONFIGURAR EL PWM2\r\n");

                                
                                 BANDERASBIT.b0=0;
                                  break;
}
                        case '2':{    SetDCPWM1(204);
putcUSART(0x0C);
printf("PWM1 AL 20 o/o\r\n");
;
putcUSART(0x0D);
printf("PULSA 1 PARA CONFIGURAR EL PWM1\r\n");
printf("PULSA 2 PARA CONFIGURAR EL PWM2\r\n");

                                
                                 BANDERASBIT.b0=0;
                                  break;
}
case '3':{    SetDCPWM1(307);
putcUSART(0x0C);
printf("PWM1 AL 30 o/o\r\n");

putcUSART(0x0D);
printf("PULSA 1 PARA CONFIGURAR EL PWM1\r\n");
printf("PULSA 2 PARA CONFIGURAR EL PWM2\r\n");

                                
                                 BANDERASBIT.b0=0;
                                  break;
}
case '4':{    SetDCPWM1(404);
putcUSART(0x0C);
printf("PWM1 AL 40 o/o\r\n");

putcUSART(0x0D);
printf("PULSA 1 PARA CONFIGURAR EL PWM1\r\n");
printf("PULSA 2 PARA CONFIGURAR EL PWM2\r\n");

                                
                                 BANDERASBIT.b0=0;
                                  break;
}
case '5':{    SetDCPWM1(511);
putcUSART(0x0C);
printf("PWM1 AL 50 o/o\r\n");

putcUSART(0x0D);
printf("PULSA 1 PARA CONFIGURAR EL PWM1\r\n");
printf("PULSA 2 PARA CONFIGURAR EL PWM2\r\n");

                                
                                 BANDERASBIT.b0=0;
                                  break;
}
case '6':{    SetDCPWM1(613);
putcUSART(0x0C);
printf("PWM1 AL 60 o/o\r\n");

putcUSART(0x0D);
printf("PULSA 1 PARA CONFIGURAR EL PWM1\r\n");
printf("PULSA 2 PARA CONFIGURAR EL PWM2\r\n");

                                
                                 BANDERASBIT.b0=0;
                                  break;
}
case '7':{    SetDCPWM1(716);
putcUSART(0x0C);
printf("PWM1 AL 70 o/o\r\n");

putcUSART(0x0D);
printf("PULSA 1 PARA CONFIGURAR EL PWM1\r\n");
printf("PULSA 2 PARA CONFIGURAR EL PWM2\r\n");

                                
                                 BANDERASBIT.b0=0;
                                  break;
}
case '8':{    SetDCPWM1(818);
putcUSART(0x0C);
printf("PWM1 AL 80 o/o\r\n");

putcUSART(0x0D);
printf("PULSA 1 PARA CONFIGURAR EL PWM1\r\n");
printf("PULSA 2 PARA CONFIGURAR EL PWM2\r\n");

                                
                                 BANDERASBIT.b0=0;
                                  break;
}
case '9':{    SetDCPWM1(902);
putcUSART(0x0C);
printf("PWM1 AL 90 o/o\r\n");

putcUSART(0x0D);
printf("PULSA 1 PARA CONFIGURAR EL PWM1\r\n");
printf("PULSA 2 PARA CONFIGURAR EL PWM2\r\n");

                                
                                 BANDERASBIT.b0=0;
                                  break;
}
case 'a':{    SetDCPWM1(1023);
putcUSART(0x0C);
printf("PWM1 AL 100 o/o\r\n");

putcUSART(0x0D);
printf("PULSA 1 PARA CONFIGURAR EL PWM1\r\n");
printf("PULSA 2 PARA CONFIGURAR EL PWM2\r\n");

                                
                                 BANDERASBIT.b0=0;
                                  break;
}

               }

               if (BANDERASBIT.b0=1) break;
         }
     }
     else if(string[0]=='2')
     {
          while(1)
         {
            putcUSART(0x0C);  
printf("CONFIGURACION DEL PWM2\r\n");
printf("PULSA 0 PARA PWM2 AL 0 o/o\r\n");
printf("PULSA 1 PARA PWM2 AL 10 o/o\r\n");
printf("PULSA 2 PARA PWM2 AL 20 o/o\r\n");
printf("PULSA 3 PARA PWM2 AL 30 o/o\r\n");
printf("PULSA 4 PARA PWM2 AL 40 o/o\r\n");
printf("PULSA 5 PARA PWM2 AL 50 o/o\r\n");
printf("PULSA 6 PARA PWM2 AL 60 o/o\r\n");
printf("PULSA 7 PARA PWM2 AL 70 o/o\r\n");
printf("PULSA 8 PARA PWM2 AL 80 o/o\r\n");
printf("PULSA 9 PARA PWM2 AL 90 o/o\r\n");
printf("PULSA a PARA PWM2 AL 100 o/o\r\n");
getsUSART(string,1);
lectura=getcUSART();
            switch(lectura)
               {
  case '0':{    SetDCPWM2(0);
putcUSART(0x0C);
printf("PWM2 AL 10 o/o\r\n");

putcUSART(0x0D);
printf("PULSA 1 PARA CONFIGURAR EL PWM1\r\n");
printf("PULSA 2 PARA CONFIGURAR EL PWM2\r\n");

                                
                                 BANDERASBIT.b0=0;
                                  break;
}
                       case '1':{    SetDCPWM2(102);
putcUSART(0x0C);
printf("PWM2 AL 10 o/o\r\n");

putcUSART(0x0D);
printf("PULSA 1 PARA CONFIGURAR EL PWM1\r\n");
printf("PULSA 2 PARA CONFIGURAR EL PWM2\r\n");

                                
                                 BANDERASBIT.b0=0;
                                  break;
}
                        case '2':{    SetDCPWM2(204);
putcUSART(0x0C);
printf("PWM2 AL 20 o/o\r\n");
;
putcUSART(0x0D);
printf("PULSA 1 PARA CONFIGURAR EL PWM1\r\n");
printf("PULSA 2 PARA CONFIGURAR EL PWM2\r\n");

                                
                                 BANDERASBIT.b0=0;
                                  break;
}
case '3':{    SetDCPWM2(307);
putcUSART(0x0C);
printf("PWM2 AL 30 o/o\r\n");

putcUSART(0x0D);
printf("PULSA 1 PARA CONFIGURAR EL PWM1\r\n");
printf("PULSA 2 PARA CONFIGURAR EL PWM2\r\n");

                                
                                 BANDERASBIT.b0=0;
                                  break;
}
case '4':{    SetDCPWM2(404);
putcUSART(0x0C);
printf("PWM2 AL 40 o/o\r\n");

putcUSART(0x0D);
printf("PULSA 1 PARA CONFIGURAR EL PWM1\r\n");
printf("PULSA 2 PARA CONFIGURAR EL PWM2\r\n");

                                
                                 BANDERASBIT.b0=0;
                                  break;
}
case '5':{    SetDCPWM2(511);
putcUSART(0x0C);
printf("PWM2 AL 50 o/o\r\n");

putcUSART(0x0D);
printf("PULSA 1 PARA CONFIGURAR EL PWM1\r\n");
printf("PULSA 2 PARA CONFIGURAR EL PWM2\r\n");

                                
                                 BANDERASBIT.b0=0;
                                  break;
}
case '6':{    SetDCPWM2(613);
putcUSART(0x0C);
printf("PWM2 AL 60 o/o\r\n");

putcUSART(0x0D);
printf("PULSA 1 PARA CONFIGURAR EL PWM1\r\n");
printf("PULSA 2 PARA CONFIGURAR EL PWM2\r\n");

                                
                                 BANDERASBIT.b0=0;
                                  break;
}
case '7':{    SetDCPWM2(716);
putcUSART(0x0C);
printf("PWM2 AL 70 o/o\r\n");

putcUSART(0x0D);
printf("PULSA 1 PARA CONFIGURAR EL PWM1\r\n");
printf("PULSA 2 PARA CONFIGURAR EL PWM2\r\n");

                                
                                 BANDERASBIT.b0=0;
                                  break;
}
case '8':{    SetDCPWM2(818);
putcUSART(0x0C);
printf("PWM2 AL 80 o/o\r\n");

putcUSART(0x0D);
printf("PULSA 1 PARA CONFIGURAR EL PWM1\r\n");
printf("PULSA 2 PARA CONFIGURAR EL PWM2\r\n");

                                
                                 BANDERASBIT.b0=0;
                                  break;
}
case '9':{    SetDCPWM2(902);
putcUSART(0x0C);
printf("PWM2 AL 90 o/o\r\n");

putcUSART(0x0D);
printf("PULSA 1 PARA CONFIGURAR EL PWM1\r\n");
printf("PULSA 2 PARA CONFIGURAR EL PWM2\r\n");

                                
                                 BANDERASBIT.b0=0;
                                  break;
}
case 'a':{    SetDCPWM2(1023);
putcUSART(0x0C);
printf("PWM2 AL 100 o/o\r\n");

putcUSART(0x0D);
printf("PULSA 1 PARA CONFIGURAR EL PWM1\r\n");
printf("PULSA 2 PARA CONFIGURAR EL PWM2\r\n");

                                
                                 BANDERASBIT.b0=0;
                                  break;

}
               }

               if (BANDERASBIT.b0=1) break;
         }
     }
 }
}

Por cierto gracias por las ayudas tannke me mirare eso que me dices del bit bandera que supongo que sera lo que me ahorre mucho codigo.
adjunto esquema en proteus.
« Última modificación: 24 de Mayo de 2012, 21:19:53 por caeshark_ »

Desconectado caeshark_

  • PIC10
  • *
  • Mensajes: 41
Re: problema con menu en hyperterminal
« Respuesta #5 en: 25 de Mayo de 2012, 23:07:25 »
Hola que tal a todos, despues de todos los problemas que he tenido para hacer el programita, ahora resulta que no puedo probarlo en la realidad.
He programado dos chips con ese codigo y la primera vez todo ha funcionado a la perfeccion, pero luego no se que ha pasado que al volver a casa creo que he invertido la polaridad y se han frito.
De todas formas, alguien podria darme algunas intrucciones, de como hay que poner los bits de configuracion para trabajar sin problemas con el ICD 3.
Realmente no me he dado cuenta si he programado con esta configuracion o no y quisiera saber si no puedo volver a grabar los chips por la configuracion o no.
Este es el mensaje que me sale cuando intento grabar los chips.

ICD 3 cannot debug while the following configuration settins are enabled:
Code protect 00800-01FFF
Code protect 02000-03FFF
Code protect 04000-05FFF
Code protect Boot
Table write protect 00800-01FFF
Table write protect 02000-03FFF
Table write protect 04000-05FFF
Config write protect
Table write protect
Data EE write protect
Table read protect 00800-01FFF
Table read protect 02000-03FFF
Table read protect 04000-05FF
Table read protect boot
Would you like ICD 3 to turn off these settings an continue programing?

ACEPTAR                 CANCELAR



Le doy a Aceptar y me sale el siguiente mensaje

Programming...
The following memory regions failed to program correctly:
Program Memory
Address: 00000000 Expected Value: 0000003d Received Value: 00000000
Programming failed

Entonces no se si es que he protegido algo del chip para que no se pueda volver a programar el pic ha muerto el ICD3 ha muerto.

Tambien me sale este mensaje
ICD3Err0075: Unable to set emulator power.
Que por lo que he podido deducir quiere decir no puede poner los 12 v en VPP
ya que en settings me voy a status y el voltages y en VPP tengo 4,9V
He de decir que he podido programar dos chips mas despues de este mensaje, pero a la segunda intentona me ha vuelto a salir el mensaje del Adreess 0000000
No se ya que hacer a ver si alguno me puede echar un cable.
« Última modificación: 25 de Mayo de 2012, 23:16:50 por caeshark_ »

Desconectado caeshark_

  • PIC10
  • *
  • Mensajes: 41
Re: problema con menu en hyperterminal
« Respuesta #6 en: 27 de Mayo de 2012, 07:35:36 »
Bueno finalmente he conseguido ue funcione, pero el problema que tengo ahora en real tampoco lo tenia en el proteus. Me detecta dos pulsaciones seguidas con lo cual, si al principio del programa pulso 1 para modificar el pwm 1, me detecta esa pulsacion pero se mete en la opcion de setear el pwm1 al 10% qque es la siguiente en la que hay q pulsar un 1, vamos q con 1 unica pulsacion se mete seguido en los dos menus que piden la misma tecla.
Sabe alguien como podria hacer q esto no pasase?
Un saludos y gracias de antemano.

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: problema con menu en hyperterminal
« Respuesta #7 en: 28 de Mayo de 2012, 07:33:43 »
Acabas de conocer los rebotes. Bueno, hay a grandes rasgos 2 maneras para solucionar tu problema, por software o por harware.
Por soft sería:(basico) Lees el estado, si está pulsado esperas un poco( un retadro de entre 30 a 50ms) y vuelves a leer la entrada, si sigue pulsado entonces lo das por bueno.
Por hart: (basico) Poner en paralelo al pulsador una resistencia y un condensador.

Un saludo

Desconectado caeshark_

  • PIC10
  • *
  • Mensajes: 41
Re: problema con menu en hyperterminal
« Respuesta #8 en: 28 de Mayo de 2012, 09:55:50 »
Gracias por responder, pero no es este el caso.
No uso los tipicos swichts, detecto las pulsaciones a traves del puerto serie, lo que envia el puerto serie vamos, asi que creo que esto de los rebotes no afectara.

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: problema con menu en hyperterminal
« Respuesta #9 en: 28 de Mayo de 2012, 14:34:13 »
 :oops: Perdón, toda la razón, ya no recordaba que estabas trabajando con uart.

Me imagino que la cosa estará con la recepción y el bufer, las cosa es que no se como trabajan estas dos funciones '' getsUSART(string,1); lectura=getcUSART();  '' me imagino que las 2 son para leer datos de la usart, pero no se si al pasar por la función espera a que haya un dato en la entrada para leerlo o si no hay ningún dato el programa continua su curso. Por otro lado tampoco entiendo porque usas esas 2 funciones seguidas.

Prueba una cosa, (no creo que sea) despues del if(string[0]=='1') y antes del while borra ese string, pon string[0]=0;

Otra cosa, me da la sensación si no me he liado leyendo el codigo que el bit bandera así como está puesto no está haciendo ninguna función, creo que si los quitaras el programa funcionaría igual.

Un saludo.