Autor Tema: Alma caritativa que me compruebe este programa con proteus?  (Leído 2672 veces)

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

Desconectado Xelene

  • PIC12
  • **
  • Mensajes: 81
Alma caritativa que me compruebe este programa con proteus?
« en: 10 de Agosto de 2005, 08:44:00 »
Es sencillo, pero ni siquiera tengo instalado el proteus, si alguien lo quiere probar me hará un gran favor...

¿Que quiero que haga el programa?
Tengo tres pulsadores: Marcha, Pausa y Stop.
Al pulsar Marcha iniciará una secuencia que será: Un led encendido 1 min, Apagado 10s, encendido otro led 1 min. Cuando termine, no se repetirá hasta pulsar denuevo. (Realmente no son leds, pero con hacer la comprobacion con led me sirve)
Si se le da a Stop durante la secuencia, pondrá todas las salidas a cero y esperará a que se pulse marcha.
Si se le da a Pausa durante la secuencia pondrá todas las salidas a cero, esperará a q se vuelva pulsar pausa e retomará su tarea donde la dejó.

El programa compila bien, solo necesito que alguien lo simule y me diga si hace lo q creo FlashFlashFlashFlash. Gracias!

PD: Admito sugerencias de mejora Giño

Codigo:
#include <16f84.h>
#use delay(clock=4000000)
#byte port_b = 6   // Identificador asociado al registro de dirección 6
#use fast_io(A)
#use fast_io(B)
#int_rtcc
// Con estas directivas las funciones "input" y "output_bit" no reprograman
// el pin de la puerta cada vez que son utilizadas. Si no se indica el
// modo fast_io se asume por defecto standard_io el cual reprograma el pin
// siempre antes de ser utilizadas estas funciones.

long int cont;
short E1,E2,E3;   //Estados GiroIzq, Pausa y GiroDerecho
short M,P,S;   //Bits de estado Marcha, Pausa o Stop
enable_interrupts(INT_RTCC);

void interrupcion()
{
cont=cont+1;
set_rtcc(0);
}

void pausa()
{
output_low(PIN_B0);
output_low(PIN_B1);
while (input(PIN_A1));
}


main()
{
  set_tris_a(0x0F);  // RA0, RA1, RA2 y RA3 entradas digitales
  set_tris_b(0x00);  // Puerto B como salida digital
  port_b=0;          // Pone a 0 todas las salidas

  setup_counters(RTCC_INTERNAL,RTCC_DIV_256);  //Reloj interno, timer0 div 256
 
   while (1)
      {
      M,P,S==0;   //Variables incialmente todas a 0
      E1,E2,E3==0;
      if (input(PIN_A0))  // Si se pulsa A0
         {
         delay_us(50);  // Introducimos pausa para rebotes
         M==1; // Bit de estado de Marcha
         P==0; // Bit de estado de Pausa
         S==0; // Bit de estado de Stop
         E1==1;        
         }

      if ((M=1)&(E1=1)) // Estado 1, giro izquierdo
         {
         output_high(PIN_B0); // Activa PIN
         cont==0;
         set_rtcc(0);
         while ((cont<920)&(S=0)) //Mientras no termine o pulses boton parada
            {
            while (get_rtcc()!=255);
            interrupcion();
            if (input (PIN_A2))  // Boton de Stop
               {
               S==1;
               M==0;
               }
            if (input (PIN_A1)) // Comprueba el boton de Pausa
               {
               P==1;
               pausa();
               P==0;
               output_high(PIN_B0);
               }
            }
         output_low(PIN_B0);
         E1=0;
         E2=1;
         }
     
      if ((M=1)&(E2=1))
         {
         while ((cont<154)&(S=0)) //Mientras no termine o pulses boton parada
            {
            while (get_rtcc()!=255);
            interrupcion();
            if (input (PIN_A2))  // Boton de Stop
               {
               S==1;
               M==0;
               }
            if (input (PIN_A1)) // Comprueba el boton de Pausa
               {
               P==1;
               pausa();
               P==0;
               }
            }
            E2=0;
            E3=1;
         }
         
      if ((M=1)&(E3=1))
         {
         output_high(PIN_B1);
         cont==0;
         set_rtcc(0);
         while ((cont<920)&(S=0)) //Mientras no termine o pulses boton parada
            {
            while (get_rtcc()!=255);
            interrupcion();
            if (input (PIN_A2))  // Boton de Stop
               {
               S==1;
               M==0;
               }
            if (input (PIN_A1)) // Comprueba el boton de Pausa
               {
               P==1;
               pausa();
               P==0;
               output_high(PIN_B1);
               }
            }
         output_low(PIN_B1);
         }
           
   }
}


Edito:: Interrupciones habilitadas! Gracias MGLSOFT

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
RE: Alma caritativa que me compruebe este programa con proteus?
« Respuesta #1 en: 10 de Agosto de 2005, 14:15:00 »
Xelene:
Debes declarar que interrupcion estas utilizando...
Esto se hace con :

#Int RTCC

o

#Int Timer0  

o algo asi, buscalo y lo encontraras en la ayuda del CCS...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Xelene

  • PIC12
  • **
  • Mensajes: 81
RE: Alma caritativa que me compruebe este programa con proteus?
« Respuesta #2 en: 11 de Agosto de 2005, 07:55:00 »
invasor

Q tal así? (Editado arriba)

Desconectado nordestenica

  • PIC16
  • ***
  • Mensajes: 215
RE: Alma caritativa que me compruebe este programa con proteus?
« Respuesta #3 en: 11 de Agosto de 2005, 10:33:00 »
ola xlene lo abia simulado antes de la interrupcion e haora con la interrupcion e el resultado que me da proteus es igual en ambos casos me esplico


esto es lo que queremos
Al pulsar Marcha iniciará una secuencia que será: Un led encendido 1 min, Apagado 10s, encendido otro led 1 min. Cuando termine, no se repetirá hasta pulsar denuevo

esto es lo que me da el simulador
no responde a ningum pulsadores las salidas B0 e B1 trabajam intermitentes o sea se enciende B0 e se apaga B1 se apaga B1 e se enciende B0 si se pone A0 a +5V ace el ciclo de encendido e apagado mas rapido

no se espero que alguien com mas experiencia que yo te pueda dar otras ayudas e otras respuestas a la simulacion

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
RE: Alma caritativa que me compruebe este programa con proteus?
« Respuesta #4 en: 11 de Agosto de 2005, 14:27:00 »
No me entendiste.
El manejador de interrupciones del CCS se encarga de hacer lo que necesitas.
Pero para ello debe encontrar las etiquetas que marcan que hay una interrupcion activa.
En tu caso lo que has creado es solo una funcion que no devuelve valores, y al no interpretarlo como una interrupcion jamas lo ejecuta, es mas si miras dentro de tu codigo ensamblado veras que como no llamas a esa funcion desde ningun punto del programa ni siquiera la inserta ni la compila por supuesto.
Por lo tanto el PIC no la ejecuta tampoco.

Lo que necesitas hacer es declararla asi:

#Int RTCC
void interrupcion()
{
cont=cont+1;
set_rtcc(0);
}

De esa forma si debe trabajar.
La habilitacion de interrupcion tambien debes hacerla antes del Main{}
y despues de habilitar la interrupcion tambien debes habilitar que haya interrupciones, la instruccion es:
Enable_Interrupts(Global);

Buscalo en la ayuda, sino lo declaras asi no funcionara tampoco...Sonrisa GiganteSonrisa Gigante

Trabajar con interrupciones es hermoso, pero muy embromado para tener el control del desarrollo del programa en tus manos....Sonrisa GiganteSonrisa Gigante




Mil perdones!!!
No habia observado que estas haciendo poolling del valor del RTCC, en todo momento crei que intentabas generar una interrupcion real, pero en realidad tu codigo es el que ejecuta esa funcion llamada interrupcion.
Mil disculpas, no borro lo anterior porque por alli aun te sirve para otra cosa, pero no le hagas caso si no cambias tu codigo.

Marcos
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Xelene

  • PIC12
  • **
  • Mensajes: 81
RE: Alma caritativa que me compruebe este programa con proteus?
« Respuesta #5 en: 12 de Agosto de 2005, 08:17:00 »
Ya he montao una placa con el circuito en cuestión y estoy descubriendo millones de fallos... en fin Llorica

Me voy de vacaciones unos días, cuando vuelva lo retomaré, y cuando todo funcione bien lo pondré x si a alguien le interesa.

Besos, y gracias a tod@s.