10 febrero, 2011

Proteus: Isis se cierra automáticamente






Búsqueda personalizada


 Como siempre: No es tan difícil como parece.


En http://bactering.blogspot.com.es/2015/06/tutoria-proteus8-isis-ares-instalacion.html
Tienes para bajarte la versión Proteus 8.3 Estable. No se cierra

     Al reabrir un esquema guardado con anterioridad el programa se cierra automáticamente. Esto es un gran problema ya que no deja modificar no hacer nada con un esquema que ha llevado horas de trabajo. Esto sucede en programas pirateados.
     Una solución es borrar una carpeta que se crea al guardar el circuito creado.
     Lo primero es hacer una copia de seguridad de la carpeta donde se guarda el esquema. Una vez puesta la copia de seguridad a buen recaudo procedemos borrando el archivo PWI de la carpeta donde esta el DSN. Es decir: La carpeta a borrar se encuentra donde tenemos guardado el esquema que nos da el problema.

23-02-2011 Este archivo se crea al simular un programa con microcontrolador generalmente. Una forma de no tener que ir borrando el archivo cada vez que se guarda y reabre es el siguiente:
     En la carpeta donde está el programa generamos un documento de texto con el mismo nombre que el circuito(terminación txt) y  luego lo guardamos como pwi.



Al guardarlo da el aviso de que el archivo ya existe y si desemanos reemplazarlo. Le decimos que si.


Cerrramos y seleccionamos el archivo creado, boton derecho y porpiedades. En sus  propiedades activamos la casilla de "sólo lectura".



 Con esto ya apodemos abrir, simular, cerrar, reabrir... las veces que queramos sin problemas.



 Como siempre: No es tan difícil como parece.

Gracias por visitar mi blog personal. Si te ha gustado: haz el favor de hacer clic en los anuncios de google que aparecen al principio de cada entrada y date una vuelta por por ellos. Son céntimos lo que aporta pero me ayudas a seguir subiendo cosas. Gracias.

25 enero, 2011

Arranque del módulo Telit

          Esta es una forma sencilla de arrancar el módulo y ha de quedar claro que las variables y llamadas a otros subprogramas puedem quedar en otro lugar. Es un ejemplo que se puede seguir para la puesta en marcha.
          Si se desea el proyecto entero hay que pedirlo al correo electrónico o mediante un comentario. Este procedimiento se corresponde al esquema presentado en el enlace.

>>- - - - - - --
// arranque.c Arranca el módulo Telit
// SE inicia enviando un AT y tiene que responder ok.
void arranca(){
     do {
          inicbuff2(); // Borro buffer.
          puerto_b= 0;
          rcvchar=0x00; // último caracter recibido
          Rxnum=0x00; // Identifica la cantidad de bytes recibidos
          TimerCero=0x00;
          Timer_=0x00; //Variable de tiempo a temporizar en 10miliseg
          Retornos=0x00; //CAntidad de retornos a contar
          VarRetornos=0x00; //CAntidad de retornos a contar
          Desplaza=0x00; //cantidad de puestos que ha de desplazar para leer
          flagcommand=0; // Flag para indicar comando disponible
          flagOK=1;
          flagPrimero=0; //Flag de primer \n
          flagATOK = 1; //Flag de confirmación de interpretación correcta.
          repeat=1; //Repetir la función que se está ejecutando
          NoAutorizado= 1; //Flag de control de telefonos autorizados
// EstadoAlarma=0; //Estado de alarma activa al inicio

          output_high(PIN_C1); //Activa el reset
          delay_ms(610);
          output_low(PIN_C1); //desActiva el reset
          output_high(PIN_C0); //Activa el reset
          delay_ms(1110);
          output_low(PIN_C0); //desActiva el reset
          delay_ms(300); //Fin del reset
//_________________________________
          cargar();
          VarRetornos=2; // Espera la llegada del OK
          Desplaza = 0x07; //posiciona el la O de ok
          printf ("ATE0\r"); //1 Comando de no Eco (con cero al final)
          TempRecibe(300); //activa la temporización en la recepción
          while ((flagATOK) && (flagOK)) ; //Fin de recepción
          procesa();
          if (flagATOK == 0){//1
                    delay_ms(200); //Fin del reset
                    cargar();
                    VarRetornos=2; // Espera la llegada del OK
                    Desplaza = 0x02; //posiciona el la O de ok
                    printf ("AT+CMEE=1\r"); //2 Comando PARA DEVOLUCION DE ERRORES
                    TempRecibe(550); //activa la temporización en la recepción
                    while (flagATOK && flagOK) ; //Fin de recepción
                    procesa();
                    if (flagATOK == 0){//2
                              delay_ms(100); //Fin del reset
                              cargar();
                              VarRetornos=2; // Espera la llegada del OK
                              Desplaza = 0x02; //posiciona el la O de ok
                              printf ("AT+IPR=9600\r"); //3 Comando PARA DEVOLUCION DE ERRORES
                              TempRecibe(2020); //activa la temporización en la recepción
                              while (flagATOK && flagOK) ; //Fin de recepción
                              procesa();
                              if (flagATOK == 0){//3
                                        delay_ms(1000); //Fin del reset
                                        cargar();
                                        VarRetornos=2; // (4)Espera la llegada del OK
                                        Desplaza = 0x02; //posiciona el la O de ok
                                        TempRecibe(2020); //activa la temporización en la recepción
                                        printf ("AT+CPIN\r"); //5 Comando PARA DEVOLUCION DE ERRORES
                                        while (flagATOK && flagOK) ; //Fin de recepción
                                        procesa();
                                        if (flagATOK == 0){//4
                                                  output_high(PIN_B4);
                                                  delay_ms(14000); //Tiempo para que conecte con repetidor
                                                  output_low(PIN_B4);
                                                  do{
                                                            delay_ms(1010); //Fin del reset
                                                            cargar();
                                                            VarRetornos=2; // Espera la llegada del OK
                                                            Desplaza = 0x02; //posiciona el la O de ok
                                                            printf ("AT+CREG\r"); //Comando ESTADO CONEXION
                                                            TempRecibe(2500); //activa la temporización en la recepción
                                                            while (flagATOK && flagOK) ; //Fin de recepción
                                                            procesa();
                                                  }while(repeat);
                                                  delay_ms(500); //Fin del reset
                                                  if (flagATOK == 0){//5
                                                            cargar();
                                                            VarRetornos=4; // Espera la llegada del OK
                                                            Desplaza = 0x02; //posiciona el la O de ok
                                                            printf ("AT+CSQ\r"); //Comando CANTIDAD DE SEÑAL
                                                            TempRecibe(550); //activa la temporización en la recepción
                                                            while (flagATOK && flagOK) ; //Fin de recepción
                                                            procesa();
                                                            delay_ms(500); //Fin del reset
                                                            if (flagATOK == 0){//6
                                                                      cargar();
                                                                      VarRetornos=2; // Espera la llegada del OK
                                                                      Desplaza = 0x02; //posiciona el la O de ok
                                                                      printf ("AT+CMGF=1\r"); //Comando MODO TEXTO
                                                                      TempRecibe(550); //activa la temporización en la recepción
                                                                      while (flagATOK && flagOK) ; //Fin de recepción
                                                                      procesa();
                                                                      delay_ms(500); //Fin del reset
                                                                      if (flagATOK == 0){//7
                                                                                cargar();
                                                                                VarRetornos=2; // Espera la llegada del OK
                                                                                Desplaza = 0x02; //posiciona el la O de ok
                                                                                printf ("AT+CLIP=1\r"); //Comando MODO TEXTO
                                                                                TempRecibe(20000); //activa la temporización en la recepción
                                                                                while (flagATOK && flagOK) ; //Fin de recepción
                                                                                procesa();
                                                                                delay_ms(500); //Fin del reset delay_ms(1201); //Fin del reset
                                                                                if (flagATOK == 0){//8
                                                                                          cargar();
                                                                                          VarRetornos=2; // Espera la llegada del OK
                                                                                          Desplaza = 0x02; //posiciona el la O de ok
                                                                                          printf ("AT+CNMI=1,1,0,0,0\r"); //Configura el SMS
                                                                                          // TempRecibe(5050); //activa la temporización en la recepción
                                                                                          while (flagATOK) ; //Fin de recepción
                                                                                          procesa();
                                                                                } //8 /* */
                                                                      } //7
                                                            } //6
                                                  } //5
                                        } //4
                              } //3
                    } //2
          } //1

// } //O
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
          if (flagATOK == 0) {
                    cargar();
                    VarRetornos=4; // Espera la llegada del OK
                    Desplaza = 0x02; //posiciona el la O de ok
                    //Lo deja preparado para la recepción
                    repeat = 0;
                    output_high(PIN_B7);
          }
          else {
                    repeat = 1;
                    output_high(PIN_B6);
          }
          if( EstadoAlarma==1)
                    output_high(PIN_B4);
                    delay_ms(2000);
          // output_low(PIN_B4);
          inicbuff2();
          }while (repeat); //Secuencia de repeticion constante
} //Fin arranca
//_________________________________________________________
void cargar(void){
          output_high(PIN_B3); //Activa Transmision
          inicbuff2(); // Borro buffer.
          flagPrimero=0 ;
          flagOK = 1;
          flagATOK = 1;
          Rxnum =0 ; //Contador de entrada de bytes
          repeat= 1;
          Retornos=0;
          fagTiempo=1;
          rcvchar=0x00;
          TimerCero=0x00;
          Timer_=0x00; //Variable de tiempo a temporizar en 10miliseg
}
// VarRetornos=0x00; //CAntidad de retornos a contar
// NoAutorizado= 1; //Flag de control de telefonos autorizados
// EstadoAlarma=0; //Estado de alarma activa al inicio
//_______Activa temporización en transmisión______________________
void TempRecibe(long Temp){
          enable_interrupts(int_rtcc);
          disable_interrupts(int_rtcc);; // Habilita Interrupción RDA
          output_low(PIN_B3); //desactiva transmision
          Timer_ = Temp;
          set_rtcc(0); /* Se inicializa el timer a cero */
          enable_interrupts(int_rtcc); // Habilita Interrupción RDA
          flagOK=1;
          fagTiempo=1;
}
//________________________________________________________
void inicbuff2(void){ // Inicia a \0 cbuff -------------------
          int i;
          for(i=0;i
                    cbuff[i]=0x00; // caracteres en el buffer
                    }
          xbuff=0x00; // Inicializo el indice de siguiente
          // caracter
}
//________Identifica si hay o no que enviar el PIN
//_____________________ Tratamiento de errores____________________
void errores (void){
          int i = 15; // situta puntero en el numero de averia
          // disable_interrupts(int_rtcc);;
          switch(cbuff[i]) {
          case '0': { //Comprueba si el primer valor recibido es sincronizacion
          puerto_b=0x00;
          output_high(PIN_B3);
          delay_ms(500);
          // bloqueo();
          }
          case '1': { //Comprueba si el primer valor recibido es sincronizacion
          puerto_b=0x01;
          output_high(PIN_B3);
          delay_ms(500);
          // bloqueo();
          }
          case '2': { //Comprueba si el primer valor recibido es sincronizacion
          puerto_b=0x02;
          output_high(PIN_B3);
          delay_ms(500);
          // bloqueo();
          }
          case '3': { //Comprueba si el primer valor recibido es sincronizacion
          puerto_b=0x03;
          output_high(PIN_B3);
          delay_ms(500);
          // bloqueo();
          }
          case '4': { //Comprueba si el primer valor recibido es sincronizacion
          puerto_b=0x04;
          output_high(PIN_B3);
          delay_ms(500);
          // bloqueo();
          }
          case '5': { //Comprueba si el primer valor recibido es sincronizacion
          puerto_b=0x05;
          output_high(PIN_B3);
          delay_ms(500);
          // bloqueo();
          }
          case '6': { //Comprueba si el primer valor recibido es sincronizacion
          puerto_b=0x06;
          output_high(PIN_B3);
          delay_ms(500);
          // bloqueo();
          }
          case '7': { //Comprueba si el primer valor recibido es sincronizacion
          puerto_b=0x07;
          output_high(PIN_B3);
          delay_ms(500);
          // bloqueo();
          }
          default:flagATOK =1; //error en la transmision
          }
}
//__________ Comprueba si hay señal suficiente para ejecutar el proceso
void senyal (){
          int i= 8; // situta puntero al inicio de la averia
          disable_interrupts(int_rtcc);;
          if ((cbuff[i]>='1')&& (cbuff[i]<='3')&& (cbuff[(i+1)]>='0')&& (cbuff[(i+1)]<='9' )) {
                    flagATOK = 0;
                    }else {
                    flagATOK =1;
                    puerto_b= 0xE0;
                    bloqueo ();
          }
}
//__ Comprueba el estado de la conexion
void conection (){
          int i= 11; // situta puntero al inicio
          disable_interrupts(int_rtcc);;
          output_high(PIN_B7);
          delay_ms(20); // espera la llegada del OK
          switch(cbuff[i]) {
                    case ('0'): { //Comprueba si el primer
                    repeat = 1;
                    } break;
                    case ('1'): { //Comprueba si el primer
                    repeat = 0;
                    } break;
                    case ('2'): { //Comprueba si el primer
                    repeat = 1;
                    } break;
                    default:{
          flagATOK =1; //error en la transmision
          repeat = 1 ; //sale del bucle al tener un error seguramente.
          puerto_b= 0xE0;
          bloqueo();
          }
          }
}
//_____________________________________________________________
void procesa(){
          int i ;
          i= Desplaza;
          disable_interrupts(int_rtcc);; // Habilita Interrupción RDA
          if (flagOK==1){//PP
                    // disable_interrupts(int_rtcc);; // Habilita Interrupción RDA
                    if (cbuff[2]!= '+'){// 1
                              switch(cbuff[i]){
                              case 'O': { //Comprueba si el primer valor recibido es sincronizacion
                              flagATOK =0;
                              } break;
                              case 'R': { // RING Comprueba sI ES UNA LLAMADA
                              delay_ms(500);
                              llamada ();
                              } break;
                              default:flagATOK =1; //error en la transmision
                   }
          }//1
          else{ // sIGNIFICA QUE HA LLEGADO UN + ***************************
                    i= 4; // situta puntero al inicio de la averia
                    switch(cbuff[i]) {
                    case 'P': { //CPI Comprueba si el primer valor recibido es sincronizacion
                    // Enviar a tratamiento del pin
                    verPin ();
                    } break;
                    case 'M': { //CME Comprueba si el primer valor recibido es sincronizacion
                    // Enviara a tratamiento de error
                    // delay_ms(50);
                    errores();
                    } break;
                    case 'S': { //CSQ Comprueba si el primer valor recibido es sincronizacion
                    // Enviara a tratamiento de señal
                    senyal ();
                    } break;
                    case 'R' : { //CRE Comprueba si el primer valor recibido es sincronizacion
                    // Enviara a tratamiento de señal
                    conection ();
                    } break;
                    default:flagATOK =1; //error en la transmision
                    }
          }
          }//PP
}
//__________________________________________________
void verPin(void){
          int i= 9; //Situa al inicio de la palabra P ó S
          disable_interrupts(int_rtcc);;
          if (cbuff[i]== 'R'){ //Significa que es Ready por tanto vuelve sin más
                    flagATOK = 0; //No hace falta hacer nada (no envia pin)
                    delay_ms(700); //Espera a recibir el ok
          }
          else {
                    i=14;
                    delay_ms(700); //Espera a recibir el ok
                    if (cbuff[i]== 'I'){ //Tiene que enviar el Pin
                    cargar(); //Envia el Pin
                    VarRetornos=2; // Espera la llegada del OK
                    Desplaza = 0x02; //posiciona el la O de ok
                    printf ("AT+CPIN=4340\r"); //Comando ENVIA EL CODIGO PIN**
                    TempRecibe(2010); //activa la temporización en la recepción
                    while (flagATOK && flagOK){ //Fin de recepción
          } //Espera a que termine de recibir
          // disable_interrupts(int_rtcc);; // Habilita Interrupción RDA
          i=2;
          if (cbuff[i]== 'O') //Si ha llegado el Ok continua
                    flagATOK = 0; //hA SIDO CORRECTO
                    else flagATOK = 1; // Algo ha fallado en la recpecion del 0k final.
          }
          else {
                    puerto_b= 0xF0; //precisa del PUKV???
                    bloqueo();
          }
}
}

02 diciembre, 2010

Leyes de Morgan

Búsqueda personalizada



 Como siempre: No es tan difícil como parece.


     La negación se verá representada por ~. Se obtiene pulsando Alt-Gr + 4.

La primera ley dice:
          Un producto negado es igual a la suma de las negadas.

     Representamos el primer miembro de la función que es una NAND:
      Ahora representamos el segundo miembro de la función que es una OR con sus entradas negadas:


      Fijándose en las tablas de la verdad, se observa que son iguales. Esto demuestra la la 1ª Ley de        Morgan. Resumiendo:

La segunda ley dice:

     Una suma negada es igual al producto de sus negadas
     Representamos el primer miembro de la función que es una NOR:
     Ahora representamos el segundo miembro de la función que es una AND con sus entradas negadas:

     Fijándose en las dos tablas de la verdad se observa que son iguales. Esto demuestra la 2ª Ley de Morgan.

     Con estas dos leyes se pueden realizar puertas lógicas a partir de otras. Veamos unos ejemplos:
     Para obtener una puerta AND puedes utilizar una puerta NOR con sus entradas negadas
     Para obtener una puerta OR puedes utilizar una puerta NAND con sus entradas negadas:

     Para obtener una puerta NAND utiliza una puerta OR con sus dos entradas negadas, como indica la primera ley de De Morgan:
     Para obtener una puerta NOR utiliza una puerta AND con sus entradas negadas, eso dice la 2º ley de De Morgan
     La puerta XOR tiene la particularidad de entregar un nivel alto cuando una y sólo una de sus entradas se encuentra en nivel alto.
     La ecuación indica las puertas a utilizar:
     Para obtener una puerta EXNOR agregas una compuerta NOT a la salida de la puerta XOR vista anteriormente:
     Para obtener Inversores (NOT) puedes hacer uso de compuertas NOR o compuertas NAND, simplemente uniendo sus entradas.



 Como siempre: No es tan difícil como parece.

Gracias por visitar mi blog personal. Si te ha gustado: haz el favor de hacer clic en los anuncios de google que aparecen al principio de cada entrada y date una vuelta por por ellos. Son céntimos lo que aporta pero me ayudas a seguir subiendo cosas. Gracias.


22 octubre, 2010

Generador de reset al conectar la alimentación

Búsqueda personalizada

 Como siempre: No es tan difícil como parece.


    En ocasiones la electrónica necesita resetearse al iniciarse la alimentación para poder predecir su estado en las salidas. Para poder realizar dicha función vamos a usar un comportamiento del condensador.
     La mayoría de circuitos integrados generan un reset por nivel bajo. Vamos a resetear el 4532 que está alimentado a 12V. 
     Viendo el datasheet se observa que el reset es por nivel bajo. La misión es que la patilla del reset se encuentre a nivel bajo durante un tiempo y después se mantenga a nivel alto. Un condensador descargado es como un cortocircuito (ya se comentó en el detector de flancos) por ello lo conectamos a masa y para que se vaya cargando conectamos una resistencia a nivel alto.
     La entrada de reset no es trigger smith y no podrá definir el tiempo de reset a la conexión. Es decir: cuando se alimenta el circuito el condensador está descargado. En el extremo conectado al reset, como se comporta como un cortocircuito, se refleja su conexión a masa y hay un nivel bajo y empieza a cargarse a través de la resistencia. Sabemos que el condensador se considera cargado transcurridos 5t (cinco tau) y no sabemos claramente cuando cuando tiempo se va mantener el reset. Para tener el tiempo controlado le añadimos un par de puertas inversoras trigger smith.
     La puerta inversora (según el datasheet) verá el nivel alto a los 8,5V. Ya podemos calcular un tiempo de reset. Para ello usaremos la formula:
t = Tiempo
R = Resitencia
C = Capacidad
K = e * V/V-Vc
donde: e = logaritmo neperiano
          V = Tensión
          Vc = Tensión trigger
     La corriente de carga tiene que ser muy pequeña ya que la entrada del CMOS apenas consume. Por ello probaremos con una resistencia elevada a ver que capacidad necesitamos. Determinamos un tiempo de 100us y probamos con una R de 100K:
     Como es un valor que no vamos a encontrar nos vamos al valor superior normalizado que es de 1nF y siempre será más fácil tenerlo en nuetro tallerEl valor de la tensión (11,5) es el valor que consideramos de carga de los 5 tau.
     Por tanto podemos decir que con una R de 100k y un condensador de 1nF tendremos un reset aproximado de 100us. Digo aproximado por el valor del condensador y las tolerancias que vamos a encontrar en los componentes.
     Al desconectar la tensión la descarga del condensador se efectuará con el mismo tiempo que la carga lo que no garantiza un nuevo reset si la desconexión no es grande. Por ello hay que efectuar una descarga rápida del condensador. La descarga rápida se efectúa con un diodo inverso colocado en paralelo a la resistencia. El circuito quedará así:


 Como siempre: No es tan difícil como parece.

Gracias por visitar mi blog personal. Si te ha gustado: haz el favor de hacer clic en los anuncios de google que aparecen al principio de cada entrada y date una vuelta por por ellos. Son céntimos lo que aporta pero me ayudas a seguir subiendo cosas. Gracias.