Autor Tema: Pausas existentes en PicC  (Leído 3531 veces)

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

Desconectado juanv030

  • PIC10
  • *
  • Mensajes: 14
Pausas existentes en PicC
« en: 29 de Septiembre de 2010, 18:19:31 »
Desde ya queria saludar a todos los miembros de este foro.

Mi duda era esta, queria saber que tipo de pausas habian en PicC porque la verdad que tengo dudas al respecto

Me refiero a pausas con:

delay_ms(x)
delay_us(x)
usleep()

o si hay alguna con respecto a las interrupciones RB0/INT (por ejemplo para que aprietes una tecla y continue con el codigo)

o si hay alguna otra estaba interesado.

desde ya! saludos!!  :)

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Pausas existentes en PicC
« Respuesta #1 en: 29 de Septiembre de 2010, 18:46:25 »
Estas son las que conozco:

asm("nop")
__delay_us(x)
__delay_ms(x)

Hay que definir _XTAL_FREQ, por ejemplo:

#define _XTAL_FREQ=4000000  // 4 MHz

Después si quieres usar un timer, ya es trabajo del programador realizar el código adecuado.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Pausas existentes en PicC
« Respuesta #2 en: 29 de Septiembre de 2010, 22:04:24 »
Hol Juan, si te comprendo bien necesitas chequear una tecla pero que el PIC no se quede detenido en esta función, yo siempre utilizo una función como la siguiente

tecla1();

void tecla1()
{
   if(!bit_test(portb,0) && !ban_tecla)
   {
      ban_tecla = 1   
      instrucciones adicionales
   }
   
   if(bit_test(portb,0) && ban_tecla)
   {
      ban_tecla = 0
   }   
   
}

así se detecta cuando presionan la tecla, en este caso cuando hay un cero, en este momento se activa una bandera que impide que el PIC entre nuevamente a esta rutina, al soltar la tecla se apaga la bandera para que al pulsarla permita entrar a la función.

El PIC puede llamar cuantas funciones haya y no se queda detenido el ninguna.

saludos.

Desconectado juanv030

  • PIC10
  • *
  • Mensajes: 14
Re: Pausas existentes en PicC
« Respuesta #3 en: 08 de Octubre de 2010, 23:05:55 »
Muchas gracias por la ayuda :) . De hecho queria hacer algo parecido, capaz que me puedas ayudar con este problemilla. Queria hacer un teclado de numeros con pulsadores. Queria usar el pic16f877 y un lcd de 20x4. El problema es que si o si tengo que apretar los botones en un orden especifico. Este orden es 123456789.del0-. El tema es que yo queria hacer cada numero independiente y que lo puedas apretar cuantas veces quieras. Este es el codigo:


#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use standard_io(A)
#use standard_io(B)
#use standard_io(C)
#include <stdlib.h>
#include <string.h>
#include <LCD420.C>

int j;
void teclado();
void teclado() {

do{
  if(!input(PIN_A1)){                  //¿se ha pulsado up?
         while(!input(PIN_A1)){} //elimina rebotes
 
         lcd_putc("\n1"); 
        // j=j+1;
       //  printf(lcd_putc,"\nEl numero es %d",j);
       
     }
if (!input(PIN_C2)){                  //¿se ha pulsado up?
         while(!input(PIN_C2)){} //elimina rebotes

         lcd_putc("2");       
         }
   
if(!input(PIN_C3)){                  //¿se ha pulsado up?
         while(!input(PIN_C3)){} //elimina rebotes
         
         lcd_putc("3");
         
         }

if(!input(PIN_C4)){                  //¿se ha pulsado up?
         while(!input(PIN_C4)){} //elimina rebotes
         
         lcd_putc("4");
         
         }
         
if(!input(PIN_C5)){                  //¿se ha pulsado up?
         while(!input(PIN_C5)){} //elimina rebotes
         
         lcd_putc("5");
         
         }

if(!input(PIN_C6)){                  //¿se ha pulsado up?
         while(!input(PIN_C6)){} //elimina rebotes
         
         lcd_putc("6");
         
         }


if(!input(PIN_C7)){                  //¿se ha pulsado up?
         while(!input(PIN_C7)){} //elimina rebotes
         
         lcd_putc("7");
         
         }


if(!input(PIN_B3)){                  //¿se ha pulsado up?
         while(!input(PIN_B3)){} //elimina rebotes
         
         lcd_putc("8");
         
         }

if(!input(PIN_A0)){                  //¿se ha pulsado up?
         while(!input(PIN_A0)){} //elimina rebotes
         
         lcd_putc("9");
         
         }
       
if(!input(PIN_A2)){                  //¿se ha pulsado up?
         while(!input(PIN_A2)){} //elimina rebotes
         
         lcd_putc(".");
         
         }

if(!input(PIN_A3)){                  //¿se ha pulsado up?
         while(!input(PIN_A3)){} //elimina rebotes
         
         lcd_putc("\b");
         
         }

if(!input(PIN_A4)){                  //¿se ha pulsado up?
         while(!input(PIN_A4)){} //elimina rebotes
         
         lcd_putc("0");
         
         }
         
if(!input(PIN_C0)){                  //¿se ha pulsado up?
         while(!input(PIN_C0)){} //elimina rebotes
         
         lcd_putc("-");
         
         }
         

 
 }while(input(PIN_A5));      //apretas enter y..
   while(!input(PIN_A5)){} //elimina rebotes
}

 
 
 


void main() {


set_tris_A(0x3F);
set_tris_B(0x3F);
set_tris_C(0x3F); 

lcd_init();

lcd_putc("Primer digito\n");
teclado();
lcd_putc("\fSegundo digito\n");
teclado();
}
   
 Si o si tengo que apretar los botones en la secuencia de los if. Ese es el problema. Desde ya muchas gracias :)           
             
 

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Pausas existentes en PicC
« Respuesta #4 en: 09 de Octubre de 2010, 12:20:34 »
Hola Juan,

Lo que veo es que en las teclas estás amarrando el PIC y no sale hasta que sueltan la tecla; te recomiendo utilizar banderas para no dejar el PIC anclado y pueda chequear todas las teclas en fracciones de milisegundos, además para los rebotes te recomiendo utilizar un retardo en el barrido de las teclas.

trata de comprender y adaptar este código.

saludos.

Código: [Seleccionar]
///////////////////////////////////////////////////////////////////////////////
void main
{
while(true)
{
delay_ms(10);
tecla1();
tecla2();
tecla3();
}
}
///////////////////////////////////////////////////////////

void tecla1()
{
   if(!input(PIN_A1) && !ban_tecla1)
   {
      ban_tecla1 = 1   
      lcd_putc("1");
   }
   
   if(input(PIN_A1) && ban_tecla1)
   {
      ban_tecla1 = 0
   }   
}
///////////////////////////////////////////////////////////
void tecla2()
{
   if(!input(PIN_A2) && !ban_tecla2)
   {
      ban_tecla2 = 1   
      lcd_putc("2");
   }
   
   if(input(PIN_A2) && ban_tecla2)
   {
      ban_tecla2 = 0
   }
}
///////////////////////////////////////////////////////////
void tecla1()
{
   if(!input(PIN_A3) && !ban_tecla3)
   {
      ban_tecla3 = 1   
      lcd_putc("3");
   }
   
   if(input(PIN_A3) && ban_tecla3)
   {
      ban_tecla3 = 0
   }   
}