TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: juanv030 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!! :)
-
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!
-
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.
-
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 :)
-
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.
///////////////////////////////////////////////////////////////////////////////
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
}
}