Autor Tema: Funcionamiento diferente pic18f4550 después de un reset AYUDA!  (Leído 5494 veces)

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

Desconectado abel135

  • PIC10
  • *
  • Mensajes: 42
Hola buenos días;

Tengo un pequeño problemita, a ver si alguna alma generosa me podría ayudar.
Es la primera vez que toco los pics, es para un proyecto con el pic 18f4550, ya he conseguido hacer todo el programa, pero tengo un grave problema, cuando hago un reset externo el programa empieza a funcionar de manera diferente.

Es un programa que se comunica por RS-232, el programa está en un bucle do, guardando información de las entradas, y cuando se introduce un carácter en concreto por el ordenador este tiene que devolver otro carácter con el estado de las entradas, utilizo kbhit para la interrupción int_rda.

Todo funciona perfectamente, se queda en el bucle do hasta que se pulsa la tecla que hace la interrupción, lo que pasa es que cuando se pulsa el reset externo ya deja de funcionar de la misma manera, no se queda en el programa principal haciendo el bucle do. A ver si alguien sabe que está pasando? A lo mejor es que al hacer un reset mclr se cambia alguna bandera? O algún estado interno del PIC? Y hace que funcione diferente? O a lo mejor es el sitio donde activo o desactivo las interrupciones, no se.

A ver si me podéis ayudar! Muchas gracias. (Si se puede mejorar algo también agradecería que me lo dijerais).  :oops:

Aquí os adjunto el programa:

#include <18F4550.h>

#use delay(clock=20000000)
#use standard_io(b)
#use standard_io(b)

#bit RB0=0XF81.0
#bit RB1=0XF81.1
#bit RB7=0XF81.7
#bit DB0=0XF83.0
#bit DB1=0XF83.1
#bit DB2=0XF83.2
#bit DB3=0XF83.3
#bit DB4=0XF83.4
#bit DB5=0XF83.5
#bit DB6=0XF83.6
#bit DB7=0XF83.7

#byte port_a=0XF80
#byte port_b=0XF81
#byte port_c=0XF82
#byte port_d=0XF83
#byte port_e=0XF84


#use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7)
#fuses XT,NOWDT,PROTECT,NOLVP,PUT,BROWNOUT
#byte tris_a=0XF92
#byte tris_b=0XF93
#byte tris_c=0XF94
#byte tris_d=0XF95

char estado_sensores='0';
char Comando='0';

#int_rda

void serial_isr() {

    if(kbhit()){

    Comando=getchar();

    if(Comando=='z'){
    putc(estado_sensores);
}
    if(Comando=='!'){
    DB0=1;
    DB1=0;
    }
    if(Comando=='"'){
    DB0=0;
    DB1=1;
    }
    if(Comando=='#'){
    DB1=0;
    DB0=0;
    }
    if(Comando=='%'){
    DB2=1;
    }
    if(Comando=='&'){
    DB2=0;
    }
    if(Comando=='/'){
    DB3=1;
    }
    if(Comando=='('){
    DB3=0;
    }

    disable_interrupts(int_rda);
    disable_interrupts(GlOBAL);

    }

  }
void main(){

tris_a=0XFE;
tris_b=0X00;
tris_c=0X80;
tris_d=0X00;
port_d=0X00;



printf("\r\n\Eperando ordenes (Int)\r\n");


disable_interrupts(int_rda);
disable_interrupts(GlOBAL);



   do{


      if(!input(PIN_A0)&&!input(PIN_A1)&&!input(PIN_A2)&&!input(PIN_A3)&&!input(PIN_A4)){

         estado_sensores='0';

      }
      else if(input(PIN_A0)&&!input(PIN_A1)&&!input(PIN_A2)&&!input(PIN_A3)&&!input(PIN_A4)){

         estado_sensores='1';

      }
      else if(!input(PIN_A0)&&input(PIN_A1)&&!input(PIN_A2)&&!input(PIN_A3)&&!input(PIN_A4)){

         estado_sensores='2';

      }

      else if(input(PIN_A0)&&input(PIN_A1)&&!input(PIN_A2)&&!input(PIN_A3)&&!input(PIN_A4)){

         estado_sensores='3';

      }

      else if(!input(PIN_A0)&&!input(PIN_A1)&&input(PIN_A2)&&!input(PIN_A3)&&!input(PIN_A4)){

         estado_sensores='4';

      }

      else if(input(PIN_A0)&&!input(PIN_A1)&&input(PIN_A2)&&!input(PIN_A3)&&!input(PIN_A4)){

         estado_sensores='5';

      }

      else if(!input(PIN_A0)&&input(PIN_A1)&&input(PIN_A2)&&!input(PIN_A3)&&!input(PIN_A4)){

         estado_sensores='6';

      }

      else if(input(PIN_A0)&&input(PIN_A1)&&input(PIN_A2)&&!input(PIN_A3)&&!input(PIN_A4)){

         estado_sensores='7';

      }

      else if(!input(PIN_A0)&&!input(PIN_A1)&&!input(PIN_A2)&&input(PIN_A3)&&!input(PIN_A4)){

        estado_sensores='8';

      }

      else if(input(PIN_A0)&&!input(PIN_A1)&&!input(PIN_A2)&&input(PIN_A3)&&!input(PIN_A4)){

         estado_sensores='9';

      }

      else if(!input(PIN_A0)&&input(PIN_A1)&&!input(PIN_A2)&&input(PIN_A3)&&!input(PIN_A4)){

         estado_sensores='a';

      }

      else if(!input(PIN_A0)&&input(PIN_A1)&&!input(PIN_A2)&&input(PIN_A3)&&!input(PIN_A4)){

         estado_sensores='b';

      }

      else if(!input(PIN_A0)&&!input(PIN_A1)&&input(PIN_A2)&&input(PIN_A3)&&!input(PIN_A4)){

         estado_sensores='c';

      }

      else if(input(PIN_A0)&&!input(PIN_A1)&&input(PIN_A2)&&input(PIN_A3)&&!input(PIN_A4)){

         estado_sensores='d';
      }

      else if(!input(PIN_A0)&&input(PIN_A1)&&input(PIN_A2)&&input(PIN_A3)&&!input(PIN_A4)){

         estado_sensores='e';

      }

      else if(input(PIN_A0)&&input(PIN_A1)&&input(PIN_A2)&&input(PIN_A3)&&!input(PIN_A4)){

         estado_sensores='f';

      }

      else if(!input(PIN_A0)&&!input(PIN_A1)&&!input(PIN_A2)&&!input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='g';

      }

      else if(input(PIN_A0)&&!input(PIN_A1)&&!input(PIN_A2)&&!input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='h';

      }

      else if(!input(PIN_A0)&&input(PIN_A1)&&!input(PIN_A2)&&!input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='i';

      }

      else if(input(PIN_A0)&&input(PIN_A1)&&!input(PIN_A2)&&!input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='j';

      }

      else if(!input(PIN_A0)&&!input(PIN_A1)&&input(PIN_A2)&&!input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='k';

      }

      else if(input(PIN_A0)&&!input(PIN_A1)&&input(PIN_A2)&&!input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='l';

      }

      else if(!input(PIN_A0)&&input(PIN_A1)&&input(PIN_A2)&&!input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='m';

      }

      else if(input(PIN_A0)&&input(PIN_A1)&&input(PIN_A2)&&!input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='n';

      }

      else if(!input(PIN_A0)&&!input(PIN_A1)&&!input(PIN_A2)&&input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='o';

      }

      else if(input(PIN_A0)&&!input(PIN_A1)&&!input(PIN_A2)&&input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='p';

      }

      else if(!input(PIN_A0)&&input(PIN_A1)&&!input(PIN_A2)&&input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='q';

      }

      else if(input(PIN_A0)&&input(PIN_A1)&&!input(PIN_A2)&&input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='r';

      }

      else if(!input(PIN_A0)&&!input(PIN_A1)&&input(PIN_A2)&&input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='s';

      }

      else if(input(PIN_A0)&&!input(PIN_A1)&&input(PIN_A2)&&input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='t';

      }

      else if(!input(PIN_A0)&&input(PIN_A1)&&input(PIN_A2)&&input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='u';

      }

      else if(input(PIN_A0)&&input(PIN_A1)&&input(PIN_A2)&&input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='v';

      }

enable_interrupts(GLOBAL);
enable_interrupts(int_rda);

   }

while(true);

}


El carácter 'z' es el que te da el estado de las entradas, antes del reset pulsando una vez la 'z' era suficiente, después del reset al pulsar uan vez 'z' me da el estado anterior, y a la siguiente vez que pulso 'z' ya me da el estado correcto. Muchas gracias.

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Funcionamiento diferente pic18f4550 después de un reset AYUDA!
« Respuesta #1 en: 17 de Mayo de 2012, 13:23:23 »
Hola abel

esta linea de codigo verificala:

Código: C
  1. if(Comando=='"'){

Y el putc prueba haciendolo fuera de la interrupcion.

Estudia lo relacionado al watchdog timer.

Verifica en el asm que cuando mueves los registros de las interrupciones, estas queden como deseas, ya me pasó con CCS que modifica registros que no tienen nada que ver.

Verifica que las entradas esten como digitales (PORTA viene con modulo analogico), y que tengan pulso fijo, sea 1 o 0

saludos.
« Última modificación: 17 de Mayo de 2012, 13:25:42 por KALLITOS »
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado abel135

  • PIC10
  • *
  • Mensajes: 42
Re: Funcionamiento diferente pic18f4550 después de un reset AYUDA!
« Respuesta #2 en: 17 de Mayo de 2012, 17:53:10 »
Muchísimas gracias de verdad! Ya me estaba volviendo loco! El problema estaba en las entradas analógicas del Puerto A! Saludos y muchísimas gracias!

Desconectado abel135

  • PIC10
  • *
  • Mensajes: 42
Re: Funcionamiento diferente pic18f4550 después de un reset AYUDA!
« Respuesta #3 en: 17 de Mayo de 2012, 17:56:30 »
Me equivoqué! Aún no estás solucionado, después del reset le tengo que dar dos veces a la 'z' para que salga el valor actualizado, voy a seguir checando tus opciones. Muchas gracias

Desconectado abel135

  • PIC10
  • *
  • Mensajes: 42
Re: Funcionamiento diferente pic18f4550 después de un reset AYUDA!
« Respuesta #4 en: 17 de Mayo de 2012, 18:39:38 »
Ya eh visto más o menos lo que pasa, cuando le doy al reset entra hasta el do, pero es como si las entradas A0, A1, A2, A3, A4 no tuvieran nada declarado y no entra a ningún else if, cuando le das a una tecla hace la interrupción y a la siguiente si que ya funciona normal, pero la primera vez después del reset en el "do" no hace nada, ayuda!

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Funcionamiento diferente pic18f4550 después de un reset AYUDA!
« Respuesta #5 en: 17 de Mayo de 2012, 19:42:03 »
Prueba cambiandolo por

while(true)
{
ta
ta
ta
}
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Funcionamiento diferente pic18f4550 después de un reset AYUDA!
« Respuesta #6 en: 17 de Mayo de 2012, 19:49:47 »
Hola, probalo así:

Código: [Seleccionar]
#include <18F4550.h>

#use delay(clock=20000000)
#use fast_io(ALL)

#bit RB0=0XF81.0
#bit RB1=0XF81.1
#bit RB7=0XF81.7
#bit DB0=0XF83.0
#bit DB1=0XF83.1
#bit DB2=0XF83.2
#bit DB3=0XF83.3
#bit DB4=0XF83.4
#bit DB5=0XF83.5
#bit DB6=0XF83.6
#bit DB7=0XF83.7

#byte port_a=0XF80
#byte port_b=0XF81
#byte port_c=0XF82
#byte port_d=0XF83
#byte port_e=0XF84

#use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7, ERRORS)
#fuses XT,NOWDT,PROTECT,NOLVP,PUT,BROWNOUT
#byte tris_a=0XF92
#byte tris_b=0XF93
#byte tris_c=0XF94
#byte tris_d=0XF95

char estado_sensores='0';
char Comando='0';

#int_rda
void serial_isr() {

    if(kbhit()){
    Comando=getchar();

      switch(Comando){
         case 'z':
            putc(estado_sensores);
         break;
     
         case '!':
            DB0=1;
            DB1=0;
         break;
   
         case '"':
            DB0=0;
            DB1=1;
         break;
   
         case '#':
            DB1=0;
            DB0=0;
         break;
   
         case '%':
            DB2=1;
         break;
   
         case '&':
            DB2=0;
         break;
   
         case '/':
            DB3=1;
         break;
   
         case '(':
            DB3=0;
         break;
   
         default:
         break;
      }
   }
}

void main(){
   char porta_tmp;
   
   tris_a=0XFE;
   tris_b=0X00;
   tris_c=0X80;
   tris_d=0X00;
   port_d=0X00;

   printf("\r\n\Eperando ordenes (Int)\r\n");

   clear_interrupts(int_rda);
   enable_interrupts(int_rda);
   enable_interrupts(GLOBAL);

   do{
      porta_tmp = port_a & 0b00011111;
      if(porta_tmp < 10){
         estado_sensores= '0' + porta_tmp;     
      }else if(porta_tmp < 32){
         estado_sensores= 'a' + porta_tmp - 10;     
      }
   }while(true);
}

"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado abel135

  • PIC10
  • *
  • Mensajes: 42
Re: Funcionamiento diferente pic18f4550 después de un reset AYUDA!
« Respuesta #7 en: 18 de Mayo de 2012, 15:58:53 »
Muchas gracias por todas las respuesta, pero no logro solucionarlo, después del reset todo cambia, cuando le doy a la 'z' para recibir los estados de los sensores no me los da, me da el estado anterior, ya hasta que no le doy dos veces no sale el actual, porqué pasa esto? Puede ser que el reset borre alguna bandera algún registro o alguna cosa?
Os adjunto el proteus y el código. Si alguien me puede ayudar se lo agradeceré toda la vida! Muchas gracias.

#include <18F4550.h> //Declaración de librería del pic que estamos usando.
#use delay(clock=20000000)//Frecuencia en la que trabaja
#use standard_io(b)
//Comentario de prueba perforce
#bit RB0=0XF81.0 // Pone nombre a los registros del cuerpo B.
#bit RB1=0XF81.1
#bit RB7=0XF81.7
#bit DB0=0XF83.0
#bit DB1=0XF83.1
#bit DB2=0XF83.2
#bit DB3=0XF83.3
#bit DB4=0XF83.4
#bit DB5=0XF83.5
#bit DB6=0XF83.6
#bit DB7=0XF83.7

#byte port_a=0XF80
#byte port_b=0XF81 // Este te dice que el nombre port_b es la dirección, así escribiendo port_b ya accedes a el.
#byte port_c=0XF82
#byte port_d=0XF83 // Declaración port d como antes.
#byte port_e=0XF84


#use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7)// Comunicacion serial
#fuses XT,NOWDT,PROTECT,NOLVP,PUT,BROWNOUT // Opciones de configuración
#byte tris_a=0XF92 //Declaramos los puertos como entrada o salida, 0 salida, 1 entrada.
#byte tris_b=0XF93
#byte tris_c=0XF94
#byte tris_d=0XF95

char estado_sensores='0';//La combinación de los sensores activos nos da un caracter el cual se usa como identificación.
char Comando; //Es la tecla pulsada en concreto, depende de la tecla pulsada enviará información o activara otra cosa.

void main(){//Programa principal

tris_a=0XFE; //Declaración de puertos, e/s
tris_b=0X00;
tris_c=0X80;
tris_d=0X00;
port_d=0X00;


enable_interrupts(GLOBAL);//habilito interrupción global
enable_interrupts(int_rda); //habilito interrupción interna

printf("\r\n\Eperando ordenes (Int)\r\n");

   do{


      if(!input(PIN_A0)&&!input(PIN_A1)&&!input(PIN_A2)&&!input(PIN_A3)&&!input(PIN_A4)){

         estado_sensores='0';

      }
      else if(input(PIN_A0)&&!input(PIN_A1)&&!input(PIN_A2)&&!input(PIN_A3)&&!input(PIN_A4)){

         estado_sensores='1';

      }
      else if(!input(PIN_A0)&&input(PIN_A1)&&!input(PIN_A2)&&!input(PIN_A3)&&!input(PIN_A4)){

         estado_sensores='2';

      }

      else if(input(PIN_A0)&&input(PIN_A1)&&!input(PIN_A2)&&!input(PIN_A3)&&!input(PIN_A4)){

         estado_sensores='3';

      }

      else if(!input(PIN_A0)&&!input(PIN_A1)&&input(PIN_A2)&&!input(PIN_A3)&&!input(PIN_A4)){

         estado_sensores='4';

      }

      else if(input(PIN_A0)&&!input(PIN_A1)&&input(PIN_A2)&&!input(PIN_A3)&&!input(PIN_A4)){

         estado_sensores='5';

      }

      else if(!input(PIN_A0)&&input(PIN_A1)&&input(PIN_A2)&&!input(PIN_A3)&&!input(PIN_A4)){

         estado_sensores='6';

      }

      else if(input(PIN_A0)&&input(PIN_A1)&&input(PIN_A2)&&!input(PIN_A3)&&!input(PIN_A4)){

         estado_sensores='7';

      }

      else if(!input(PIN_A0)&&!input(PIN_A1)&&!input(PIN_A2)&&input(PIN_A3)&&!input(PIN_A4)){

        estado_sensores='8';

      }

      else if(input(PIN_A0)&&!input(PIN_A1)&&!input(PIN_A2)&&input(PIN_A3)&&!input(PIN_A4)){

         estado_sensores='9';

      }

      else if(!input(PIN_A0)&&input(PIN_A1)&&!input(PIN_A2)&&input(PIN_A3)&&!input(PIN_A4)){

         estado_sensores='a';

      }

      else if(!input(PIN_A0)&&input(PIN_A1)&&!input(PIN_A2)&&input(PIN_A3)&&!input(PIN_A4)){

         estado_sensores='b';

      }

      else if(!input(PIN_A0)&&!input(PIN_A1)&&input(PIN_A2)&&input(PIN_A3)&&!input(PIN_A4)){

         estado_sensores='c';

      }

      else if(input(PIN_A0)&&!input(PIN_A1)&&input(PIN_A2)&&input(PIN_A3)&&!input(PIN_A4)){

         estado_sensores='d';
      }

      else if(!input(PIN_A0)&&input(PIN_A1)&&input(PIN_A2)&&input(PIN_A3)&&!input(PIN_A4)){

         estado_sensores='e';

      }

      else if(input(PIN_A0)&&input(PIN_A1)&&input(PIN_A2)&&input(PIN_A3)&&!input(PIN_A4)){

         estado_sensores='f';

      }

      else if(!input(PIN_A0)&&!input(PIN_A1)&&!input(PIN_A2)&&!input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='g';

      }

      else if(input(PIN_A0)&&!input(PIN_A1)&&!input(PIN_A2)&&!input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='h';

      }

      else if(!input(PIN_A0)&&input(PIN_A1)&&!input(PIN_A2)&&!input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='i';

      }

      else if(input(PIN_A0)&&input(PIN_A1)&&!input(PIN_A2)&&!input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='j';

      }

      else if(!input(PIN_A0)&&!input(PIN_A1)&&input(PIN_A2)&&!input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='k';

      }

      else if(input(PIN_A0)&&!input(PIN_A1)&&input(PIN_A2)&&!input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='l';

      }

      else if(!input(PIN_A0)&&input(PIN_A1)&&input(PIN_A2)&&!input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='m';

      }

      else if(input(PIN_A0)&&input(PIN_A1)&&input(PIN_A2)&&!input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='n';

      }

      else if(!input(PIN_A0)&&!input(PIN_A1)&&!input(PIN_A2)&&input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='o';

      }

      else if(input(PIN_A0)&&!input(PIN_A1)&&!input(PIN_A2)&&input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='p';

      }

      else if(!input(PIN_A0)&&input(PIN_A1)&&!input(PIN_A2)&&input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='q';

      }

      else if(input(PIN_A0)&&input(PIN_A1)&&!input(PIN_A2)&&input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='r';

      }

      else if(!input(PIN_A0)&&!input(PIN_A1)&&input(PIN_A2)&&input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='s';

      }

      else if(input(PIN_A0)&&!input(PIN_A1)&&input(PIN_A2)&&input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='t';

      }

      else if(!input(PIN_A0)&&input(PIN_A1)&&input(PIN_A2)&&input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='u';

      }

      else if(input(PIN_A0)&&input(PIN_A1)&&input(PIN_A2)&&input(PIN_A3)&&input(PIN_A4)){

         estado_sensores='v';

      }
//delay_ms(3000);
   }

while(true);

}

#int_rda

void serial_isr() {

    if(kbhit()){//Esto espera a que se introduzca un caracter para hacer la interrupción.

    Comando=getchar();// El caracter ecrito se guarda en la variable comando.

    if(Comando=='z'){
    putc(estado_sensores);//En caso de pulsar la letra Z te devuelve un caracter con el estado de los sensores.
}
    if(Comando=='!'){
    DB0=1;
    DB1=0;
    }
    if(Comando=='"'){
    DB0=0;
    DB1=1;
    }
    if(Comando=='#'){
    DB1=0;
    DB0=0;
    }
    //if(Comando=='$'){
    //DB1=0;
    //}
    if(Comando=='%'){
    DB2=1;
    }
    if(Comando=='&'){
    DB2=0;
    }
    if(Comando=='/'){
    DB3=1;
    }
    if(Comando=='('){
    DB3=0;
    }
    //disable_interrupts(GlOBAL);
    //disable_interrupts(int_rda);
        //Comando=0X00;

    }
    //enable_interrupts(GLOBAL);
    //enable_interrupts(int_rda);
  }

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Funcionamiento diferente pic18f4550 después de un reset AYUDA!
« Respuesta #8 en: 18 de Mayo de 2012, 16:15:35 »
Verifica que las entradas esten como digitales (PORTA viene con modulo analogico), y que tengan pulso fijo, sea 1 o 0

No hiciste lo que te sugerí en negrita, creo ke no fuí especifico  :oops:.

Segun tu diagrama, cuando cierras el switch tienen 5v fijo, pero cuando lo abres el pin queda flotando, conecta resistencias pulldown. Aunque yo normalmente uso pullup.

saludos.

A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado abel135

  • PIC10
  • *
  • Mensajes: 42
Re: Funcionamiento diferente pic18f4550 después de un reset AYUDA!
« Respuesta #9 en: 18 de Mayo de 2012, 17:25:42 »
Hola de nuevo! Sí que lo hice ya, cambie el puerto A por el B para que fueran digitales, lo que pasa es que subí todo lo antiguo porqué se me borro, muchas gracias, ya probé y me siguió sin funcionar... :'(

Desconectado diguito_69

  • PIC16
  • ***
  • Mensajes: 136
Re: Funcionamiento diferente pic18f4550 después de un reset AYUDA!
« Respuesta #10 en: 18 de Mayo de 2012, 17:40:53 »
Hola, podrías subir los archivos de proteus.

Saludos.
"Carezco de un don especial. Sólo soy apacionadamente curioso". Albert Einstein.

Desconectado abel135

  • PIC10
  • *
  • Mensajes: 42
Re: Funcionamiento diferente pic18f4550 después de un reset AYUDA!
« Respuesta #11 en: 21 de Mayo de 2012, 10:59:22 »
Aquí os adjunto el proteus y el c. A ver si alguien lo puede probar, pulsando la z tiene que dar el estado de los sensores, pero cuando le doy al reset por primera vez la z solo devuelve puro 0. :( Ya no vuelve a funcionar igual la cosa. Llevo mucho tiempo perdido en esta historia. :5]

Desconectado abel135

  • PIC10
  • *
  • Mensajes: 42
Re: Funcionamiento diferente pic18f4550 después de un reset AYUDA!
« Respuesta #12 en: 21 de Mayo de 2012, 12:35:08 »
Ya encontré la solución, no se si es muy chapuza o que. Aquí os adjunto el código, Al final copié dentro de la interrupción el código. Muchísimas gracias a todos por el esfuerzo desinteresado, sois maravillosos jaja. aa y también utilizé el case.

#include <18F4550.h> // Declaración PIC

#use delay(clock=20000000)//Frecuencia
#use standard_io(b)

#bit DB0=0XF83.0 //Pone nombre a los registros del puerto D.
#bit DB1=0XF83.1
#bit DB2=0XF83.2
#bit DB3=0XF83.3
#bit DB4=0XF83.4
#bit DB5=0XF83.5
#bit DB6=0XF83.6
#bit DB7=0XF83.7

#byte port_a=0XF80 //Pone nombre a todos los puertos y declara su dirección.
#byte port_b=0XF81
#byte port_c=0XF82
#byte port_d=0XF83
#byte port_e=0XF84


#use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7)// Comunicación serial, declaración de pines, velocidad de comunicación, etcétera...

#fuses HSPLL, MCLR,NOWDT,PROTECT,NOLVP,PUT,BROWNOUT, NOVREGEN // Opciones de configuración

#byte tris_a=0XF92 //Declaración de donde se encuentran los tris para hacer a los puertos como entrada o salida.
#byte tris_b=0XF93
#byte tris_c=0XF94
#byte tris_d=0XF95

char estado_sensores;//La combinación de los sensores activos nos da un caracter el cual se usa como identificación.
char Comando; //Es la tecla pulsada en concreto, depende de la tecla pulsada enviará información o activará algun elemento.

void main(){//Programa principal

tris_a=0XFE; //Aquí se declaran los puertos, un 1 es entrada un 0 salida.
tris_b=0XFF;
tris_c=0X80;
tris_d=0X00;
port_d=0X00;


enable_interrupts(GLOBAL);//habilito interrupción global
enable_interrupts(int_rda); //habilito interrupción interna

printf("\r\n\Eperando ordenes (Int)\r\n");

 do{//carácter según el estado de los sensores.


      if(!input(PIN_B0)&&!input(PIN_B1)&&!input(PIN_B2)&&!input(PIN_B3)&&!input(PIN_B4)){

         estado_sensores='0';

      }
      else if(input(PIN_B0)&&!input(PIN_B1)&&!input(PIN_B2)&&!input(PIN_B3)&&!input(PIN_B4)){

         estado_sensores='1';

      }
      else if(!input(PIN_B0)&&input(PIN_B1)&&!input(PIN_B2)&&!input(PIN_B3)&&!input(PIN_B4)){

         estado_sensores='2';

      }

      else if(input(PIN_B0)&&input(PIN_B1)&&!input(PIN_B2)&&!input(PIN_B3)&&!input(PIN_B4)){

         estado_sensores='3';

      }

      else if(!input(PIN_B0)&&!input(PIN_B1)&&input(PIN_B2)&&!input(PIN_B3)&&!input(PIN_B4)){

         estado_sensores='4';

      }

      else if(input(PIN_B0)&&!input(PIN_B1)&&input(PIN_B2)&&!input(PIN_B3)&&!input(PIN_B4)){

         estado_sensores='5';

      }

      else if(!input(PIN_B0)&&input(PIN_B1)&&input(PIN_B2)&&!input(PIN_B3)&&!input(PIN_B4)){

         estado_sensores='6';

      }

      else if(input(PIN_B0)&&input(PIN_B1)&&input(PIN_B2)&&!input(PIN_B3)&&!input(PIN_B4)){

         estado_sensores='7';

      }

      else if(!input(PIN_B0)&&!input(PIN_B1)&&!input(PIN_B2)&&input(PIN_B3)&&!input(PIN_B4)){

        estado_sensores='8';

      }

      else if(input(PIN_B0)&&!input(PIN_B1)&&!input(PIN_B2)&&input(PIN_B3)&&!input(PIN_B4)){

         estado_sensores='9';

      }

      else if(!input(PIN_B0)&&input(PIN_B1)&&!input(PIN_B2)&&input(PIN_B3)&&!input(PIN_B4)){

         estado_sensores='a';

      }

      else if(!input(PIN_B0)&&input(PIN_B1)&&!input(PIN_B2)&&input(PIN_B3)&&!input(PIN_B4)){

         estado_sensores='b';

      }

      else if(!input(PIN_B0)&&!input(PIN_B1)&&input(PIN_B2)&&input(PIN_B3)&&!input(PIN_B4)){

         estado_sensores='c';

      }

      else if(input(PIN_B0)&&!input(PIN_B1)&&input(PIN_B2)&&input(PIN_B3)&&!input(PIN_B4)){

         estado_sensores='d';
      }

      else if(!input(PIN_B0)&&input(PIN_B1)&&input(PIN_B2)&&input(PIN_B3)&&!input(PIN_B4)){

         estado_sensores='e';

      }

      else if(input(PIN_B0)&&input(PIN_B1)&&input(PIN_B2)&&input(PIN_B3)&&!input(PIN_B4)){

         estado_sensores='f';

      }

      else if(!input(PIN_B0)&&!input(PIN_B1)&&!input(PIN_B2)&&!input(PIN_B3)&&input(PIN_B4)){

         estado_sensores='g';

      }

      else if(input(PIN_B0)&&!input(PIN_B1)&&!input(PIN_B2)&&!input(PIN_B3)&&input(PIN_B4)){

         estado_sensores='h';

      }

      else if(!input(PIN_B0)&&input(PIN_B1)&&!input(PIN_B2)&&!input(PIN_B3)&&input(PIN_B4)){

         estado_sensores='i';

      }

      else if(input(PIN_B0)&&input(PIN_B1)&&!input(PIN_B2)&&!input(PIN_B3)&&input(PIN_B4)){

         estado_sensores='j';

      }

      else if(!input(PIN_B0)&&!input(PIN_B1)&&input(PIN_B2)&&!input(PIN_B3)&&input(PIN_B4)){

         estado_sensores='k';

      }

      else if(input(PIN_B0)&&!input(PIN_B1)&&input(PIN_B2)&&!input(PIN_B3)&&input(PIN_B4)){

         estado_sensores='l';

      }

      else if(!input(PIN_B0)&&input(PIN_B1)&&input(PIN_B2)&&!input(PIN_B3)&&input(PIN_B4)){

         estado_sensores='m';

      }

      else if(input(PIN_B0)&&input(PIN_B1)&&input(PIN_B2)&&!input(PIN_B3)&&input(PIN_B4)){

         estado_sensores='n';

      }

      else if(!input(PIN_B0)&&!input(PIN_B1)&&!input(PIN_B2)&&input(PIN_B3)&&input(PIN_B4)){

         estado_sensores='o';

      }

      else if(input(PIN_B0)&&!input(PIN_B1)&&!input(PIN_B2)&&input(PIN_B3)&&input(PIN_B4)){

         estado_sensores='p';

      }

      else if(!input(PIN_B0)&&input(PIN_B1)&&!input(PIN_B2)&&input(PIN_B3)&&input(PIN_B4)){

         estado_sensores='q';

      }

      else if(input(PIN_B0)&&input(PIN_B1)&&!input(PIN_B2)&&input(PIN_B3)&&input(PIN_B4)){

         estado_sensores='r';

      }

      else if(!input(PIN_B0)&&!input(PIN_B1)&&input(PIN_B2)&&input(PIN_B3)&&input(PIN_B4)){

         estado_sensores='s';

      }

      else if(input(PIN_B0)&&!input(PIN_B1)&&input(PIN_B2)&&input(PIN_A3)&&input(PIN_B4)){

         estado_sensores='t';

      }

      else if(!input(PIN_B0)&&input(PIN_B1)&&input(PIN_B2)&&input(PIN_B3)&&input(PIN_B4)){

         estado_sensores='u';

      }

      else if(input(PIN_B0)&&input(PIN_B1)&&input(PIN_B2)&&input(PIN_B3)&&input(PIN_B4)){

         estado_sensores='v';

      }

   }

while(true);

}


#int_rda//interrupción por pulsación de una tecla.

void serial_isr() {

    if(kbhit()){//Esto espera a que se introduzca un caracter para hacer la interrupción.

    Comando=getchar();// El caracter escrito se guarda en la variable comando.



    switch(Comando){

         case 'z':

     do{


      if(!input(PIN_B0)&&!input(PIN_B1)&&!input(PIN_B2)&&!input(PIN_B3)&&!input(PIN_B4)){

         estado_sensores='0';


      }
      else if(input(PIN_B0)&&!input(PIN_B1)&&!input(PIN_B2)&&!input(PIN_B3)&&!input(PIN_B4)){

         estado_sensores='1';

      }
      else if(!input(PIN_B0)&&input(PIN_B1)&&!input(PIN_B2)&&!input(PIN_B3)&&!input(PIN_B4)){

         estado_sensores='2';

      }

      else if(input(PIN_B0)&&input(PIN_B1)&&!input(PIN_B2)&&!input(PIN_B3)&&!input(PIN_B4)){

         estado_sensores='3';

      }

      else if(!input(PIN_B0)&&!input(PIN_B1)&&input(PIN_B2)&&!input(PIN_B3)&&!input(PIN_B4)){

         estado_sensores='4';

      }

      else if(input(PIN_B0)&&!input(PIN_B1)&&input(PIN_B2)&&!input(PIN_B3)&&!input(PIN_B4)){

         estado_sensores='5';

      }

      else if(!input(PIN_B0)&&input(PIN_B1)&&input(PIN_B2)&&!input(PIN_B3)&&!input(PIN_B4)){

         estado_sensores='6';

      }

      else if(input(PIN_B0)&&input(PIN_B1)&&input(PIN_B2)&&!input(PIN_B3)&&!input(PIN_B4)){

         estado_sensores='7';

      }

      else if(!input(PIN_B0)&&!input(PIN_B1)&&!input(PIN_B2)&&input(PIN_B3)&&!input(PIN_B4)){

        estado_sensores='8';

      }

      else if(input(PIN_B0)&&!input(PIN_B1)&&!input(PIN_B2)&&input(PIN_B3)&&!input(PIN_B4)){

         estado_sensores='9';

      }

      else if(!input(PIN_B0)&&input(PIN_B1)&&!input(PIN_B2)&&input(PIN_B3)&&!input(PIN_B4)){

         estado_sensores='a';

      }

      else if(!input(PIN_B0)&&input(PIN_B1)&&!input(PIN_B2)&&input(PIN_B3)&&!input(PIN_B4)){

         estado_sensores='b';

      }

      else if(!input(PIN_B0)&&!input(PIN_B1)&&input(PIN_B2)&&input(PIN_B3)&&!input(PIN_B4)){

         estado_sensores='c';

      }

      else if(input(PIN_B0)&&!input(PIN_B1)&&input(PIN_B2)&&input(PIN_B3)&&!input(PIN_B4)){

         estado_sensores='d';
      }

      else if(!input(PIN_B0)&&input(PIN_B1)&&input(PIN_B2)&&input(PIN_B3)&&!input(PIN_B4)){

         estado_sensores='e';

      }

      else if(input(PIN_B0)&&input(PIN_B1)&&input(PIN_B2)&&input(PIN_B3)&&!input(PIN_B4)){

         estado_sensores='f';

      }

      else if(!input(PIN_B0)&&!input(PIN_B1)&&!input(PIN_B2)&&!input(PIN_B3)&&input(PIN_B4)){

         estado_sensores='g';

      }

      else if(input(PIN_B0)&&!input(PIN_B1)&&!input(PIN_B2)&&!input(PIN_B3)&&input(PIN_B4)){

         estado_sensores='h';

      }

      else if(!input(PIN_B0)&&input(PIN_B1)&&!input(PIN_B2)&&!input(PIN_B3)&&input(PIN_B4)){

         estado_sensores='i';

      }

      else if(input(PIN_B0)&&input(PIN_B1)&&!input(PIN_B2)&&!input(PIN_B3)&&input(PIN_B4)){

         estado_sensores='j';

      }

      else if(!input(PIN_B0)&&!input(PIN_B1)&&input(PIN_B2)&&!input(PIN_B3)&&input(PIN_B4)){

         estado_sensores='k';

      }

      else if(input(PIN_B0)&&!input(PIN_B1)&&input(PIN_B2)&&!input(PIN_B3)&&input(PIN_B4)){

         estado_sensores='l';

      }

      else if(!input(PIN_B0)&&input(PIN_B1)&&input(PIN_B2)&&!input(PIN_B3)&&input(PIN_B4)){

         estado_sensores='m';

      }

      else if(input(PIN_B0)&&input(PIN_B1)&&input(PIN_B2)&&!input(PIN_B3)&&input(PIN_B4)){

         estado_sensores='n';

      }

      else if(!input(PIN_B0)&&!input(PIN_B1)&&!input(PIN_B2)&&input(PIN_B3)&&input(PIN_B4)){

         estado_sensores='o';

      }

      else if(input(PIN_B0)&&!input(PIN_B1)&&!input(PIN_B2)&&input(PIN_B3)&&input(PIN_B4)){

         estado_sensores='p';

      }

      else if(!input(PIN_B0)&&input(PIN_B1)&&!input(PIN_B2)&&input(PIN_B3)&&input(PIN_B4)){

         estado_sensores='q';

      }

      else if(input(PIN_B0)&&input(PIN_B1)&&!input(PIN_B2)&&input(PIN_B3)&&input(PIN_B4)){

         estado_sensores='r';

      }

      else if(!input(PIN_B0)&&!input(PIN_B1)&&input(PIN_B2)&&input(PIN_B3)&&input(PIN_B4)){

         estado_sensores='s';

      }

      else if(input(PIN_B0)&&!input(PIN_B1)&&input(PIN_B2)&&input(PIN_A3)&&input(PIN_B4)){

         estado_sensores='t';

      }

      else if(!input(PIN_B0)&&input(PIN_B1)&&input(PIN_B2)&&input(PIN_B3)&&input(PIN_B4)){

         estado_sensores='u';

      }

      else if(input(PIN_B0)&&input(PIN_B1)&&input(PIN_B2)&&input(PIN_B3)&&input(PIN_B4)){

         estado_sensores='v';

      }
      putc(estado_sensores);
         break;

   }

while(true);

    }
}

    switch(Comando){
         case '!':
         DB0=1;
         DB1=0;}

    switch(comando){
         case'"':
         DB0=0;
         DB1=1;}

    switch(comando){
         case'#':
         DB0=0;
         DB1=0;}

    switch(comando){
         case'$':
         DB2=1;}

    switch(comando){
         case'%':
         DB2=0;}

    switch(comando){
         case'&':
         DB3=1;}

    switch(comando){
         case'/':
         DB3=0;}
}





 

anything