Autor Tema: Como aumentar variable al dejar de presionar boton  (Leído 8653 veces)

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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Como aumentar variable al dejar de presionar boton
« Respuesta #15 en: 07 de Junio de 2015, 02:58:58 »
Eso es redundante.

La idea es que el mismo TMR0 sea el que contenga la variable que se va sumando, y la interrupcion es por si se produce el overflow de ese registro (8 bits y maximo 255). Supongamos que cuando entra a interrupcion incremento la variable llamada "contadortmr0" para indicar ese overflow

Código: C
  1. #int_TIMER0
  2. void  TIMER0_isr(void)
  3. {
  4.  contadortmr0++;
  5. }

Es decir llegan 50 pulsos y vas a tener esto:

TMR0 = 50
contadortmr0 = 0

Si llegan 300 pulsos ( por que pasaron 300 personas ) quiere decir que TMR0 va a sufrir un overflow, entonces quedaria los valores:

TMR0 = 44
contadortmr0 = 1

El numero total de personas es :

 ( contadortmr0 * 256 ) + TMR0 = 300 en ese caso

No creo que superes casi 216 o 65536 personas.
Si queres leer el TMR0 usas:

Código: C
  1. variable = get_timer0();

Buscate el manual de CCS, esta en ingles pero tenes todas las funciones, pone en google "CCS Manual" y creo que es el primer PDF que sale

Con respecto a comparar un dato viejo te doy un ejemplo:

Código: C
  1. int tmrviejo;                 // Valor que tenia el timer 0 en la interrupcion anterior
  2.  
  3. if (input(pin_x) == 1 && get_timer0() == tmrviejo )
  4. {
  5.   vuelta++;          //  Aumento mi variable de los 30seg ya que esta fijo y no se movio para nada el pin, es decir puede estar trabado
  6.   if(vuelta==60)   //si la vuelta da 60, en segundos 30,
  7.   {alarma=1;}     //se activa la alarma porque el sensor esta siendo tapado
  8. }
  9. else
  10. {
  11.    vuelta=0;    // Pongo a 0 la varaible para contar los 30seg
  12.    // Se puede poner o no la alarma a 0 aca depende de como queres que funcione
  13. }
  14.  
  15. tmrviejo = get_timer0();  // Actualizo los valores, sino habian cambiado quedan iguales. Si cambiaron aqui asi se actualizan, y los proximas entradas a esta interrupcion se utiliza el ultimo valor del TMR0.

Es decir si se mantiene SIEMPRE el pin en alto ( sensor presionado ) y no cambia el valor del TMR, entonces cuenta los 30 segundos y activa la alarma.

Esto es por si viene un pulso asi:

        ______                                           ________
____|         |________________________|             |______________

         ^1ra interrupcn                                   ^2da interrupcion

Aunque es BASTANTE improbable que ocurra con 60 seguidos, mejor asegurarse. si ocurre eso como te doy el ejemplo, si vos lees unicamente el pin durante la interrpcion, vas a ver que este no cambio. Pero el valor del TMR0 si lo hizo. por que ya conto 1 mas. Vuelvo a repetir si por alguna casualidad astronomica y milagrosa se repite este escenario 60 veces va a creer que esta trabado cuando no es asi y tu TMR 0 conto esas 60 personas que pasaron cada 0.5seg por el sensor :P

Distintos esto:
         _________________________________________________________
_____|

           ^1ra interrupcion                                ^2da interrupcion

Ahi si observas el pin es igual que el caso anterior, pero esta ves el valor del TMR no cambio para nada.
« Última modificación: 07 de Junio de 2015, 03:07:48 por KILLERJC »

Desconectado jorgec1996

  • PIC10
  • *
  • Mensajes: 11
Re: Como aumentar variable al dejar de presionar boton
« Respuesta #16 en: 08 de Junio de 2015, 02:25:23 »
:0 okei, ya funciono  :lol: creo haber hecho lo que me dijiste sino me corriges, pero según yo funciona bien, intente todos los casos posibles con el sensor, o almenos la mayoría, y creo que ya funciona, dejo el programa aunque ya le metí varias cosas como un menu, lo principal funciona. Gracias:)

Código: [Seleccionar]
#include <16F877A.h>
#device adc=8
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES RESERVED                 //Used to set the reserved FUSE bits
#use delay(clock=4000000)
#FUSES
#define LCD_DB4   PIN_D4
#define LCD_DB5   PIN_D5
#define LCD_DB6   PIN_D6
#define LCD_DB7   PIN_D7
#define LCD_RS    PIN_D2
#define LCD_E     PIN_D3
#include<lcd1.c> //libreria manejo lcd
#include<KBD1.c>
#rom 0x2100={'2','6','1','2'} // escribir en la memoria eeprom
#define use_portb_kbd TRUE


//---------------variables----------------------------------------------------//
LONG personas = 0, pasajeros=0;
short alarma=0;
unsigned int r=1;
int vuelta, ingresos, personastmr, conteo, tmrviejo;
int a, i, j=0;
short enter;
char k; // lectura del teclado
char dato[4],clave[4]; //dato: almacena los digitos, clave: es la contraseña
//----------------Fin variables-----------------------------------------------//
 
 
#int_TIMER1
void  TIMER1_isr(void)
{
if (input(pin_a4) == 1 && get_timer0() == tmrviejo )
{
  vuelta++;
  set_timer1(3036);
  if(vuelta==60)   //si la vuelta da 60, en segundos 30,
  {alarma=1;}     //se activa la alarma porque el sensor esta siendo tapado
}
else
{
   vuelta=0;    // Pongo a 0 la varaible para contar los 30seg
}
tmrviejo = get_timer0();  // Actualizo los valores, sino habian cambiado quedan iguales. Si cambiaron aqui asi se actualizan, y los proximas entradas a esta interrupcion se utiliza el ultimo valor del TMR0.
}

#int_TIMER0
void  TIMER0_isr(void)
{
 conteo++;
}


void menu(){     
}


void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_EXT_H_TO_L|RTCC_DIV_1);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);
   lcd_init ();
   kbd_init();
   port_b_pullups(TRUE);
   set_timer0(0);
   set_timer1(3036);
 
 
 
while(1){
printf(LCD_putc, "\f");

inicio:
//-----------------------clave-----------------------------------------------
printf(LCD_putc, "\f");
lcd_putc("\fIngrese su clave  ");
i=0;
while(i<4){
k=kbd_getc(); // leer la tecla presiono
if(k!=0){
      dato[i]=k;
      i++;
      lcd_gotoxy(i,2); // posicion i de la segunda linea
      lcd_putc('*');
         }
         }
         
   for(i=0;i<4;i++)
   clave[i]=read_eeprom(i); //guarda la constraseña  en el vector clave
   
   if( dato[0]==clave[0] &&  dato[1]==clave[1] && dato[2]==clave[2] && dato[3]==clave[3])
   { 
lcd_gotoxy(1,1);
      printf (lcd_putc,"\fClave correcta");
lcd_gotoxy(1,2);
      printf (lcd_putc,"Adelante!");
      ingresos = ingresos +1;
         delay_ms(2000);
lcd_gotoxy(1,1);
      printf (lcd_putc,"\fHas entrado %u",ingresos);
      lcd_gotoxy(1,2);
      printf (lcd_putc,"veces");
      delay_ms(3000);
     
     
     
     
     
     
      while(1){


 k = kbd_getc();
 if(k!=0){
 if(k=='C'){
 enter=1;}
 if(k=='D'){
 enter=0;}
 if(k=='A'){
 r++;}
 
 if(k=='B'){
 r= r-1;}
 }
if(r>=5)
{r = 1;}

if (enter == 1){
switch (r){
case 1:{

personastmr = get_timer0();
personas = (conteo *256) + personastmr;
pasajeros=personas/2;

lcd_putc("\f");
lcd_gotoxy(1,1);
      printf (lcd_putc,"Sensor %lu",personas);
      lcd_gotoxy(1,2);
      printf (lcd_putc,"Personas: %lu       ",pasajeros);
      delay_ms(100);
break;}


case 2:{
k = kbd_getc();
 if(k!=0){
 if(k=='C'){
 Conteo=0;
 personas=0;
 set_timer0(0);
 enter=0;}
 }
 lcd_putc("\f");
lcd_gotoxy(1,1);
      printf (lcd_putc,"¿Borrar datos?        ",);
      lcd_gotoxy(1,2);
      printf (lcd_putc,"Presione C       ",);
      delay_ms(100);
break;}


case 3:{
lcd_gotoxy(1,1);
      printf (lcd_putc,"--Borrar datos--        ",);
      lcd_gotoxy(1,2);
      printf (lcd_putc,"-->Contraseña<--       ",);
break;}


case 4:{
goto inicio;
break;}
     
}  } 
     
     
     
if (enter == 0)
     {

switch (r){
case 1:{
lcd_gotoxy(1,1);
      printf (lcd_putc,"Menu seleccion        ",);
      lcd_gotoxy(1,2);
      printf (lcd_putc,"---> Conteo <---       ",);
break;}


case 2:{
lcd_gotoxy(1,1);
      printf (lcd_putc,"-----Conteo-----        ",);
      lcd_gotoxy(1,2);
      printf (lcd_putc,"->Borrar datos<-       ",);
break;}


case 3:{
lcd_gotoxy(1,1);
      printf (lcd_putc,"--Borrar datos--        ",);
      lcd_gotoxy(1,2);
      printf (lcd_putc,"-->Contraseña<--       ",);
break;}


case 4:{
lcd_gotoxy(1,1);
      printf (lcd_putc,"---Contraseña---        ",);
      lcd_gotoxy(1,2);
      printf (lcd_putc,"--> Regresar <--       ",);
break;}

}




}




}
     
     
     
     
     
     
   }
   else{
      lcd_putc("\fClave incorrecta ");
      lcd_putc("\n        ");
      j++;
      if(j==3){
      lcd_putc("\f    Teclado ");
      lcd_putc("\n   Bloqueado        ");
      delay_ms(60000);
      j=0;
      }
      delay_ms(2000);
   }

//---------------clave fin------------------------------------------------------
}
}