elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Informática
| |-+  Electrónica
| | |-+  Realizar contador en un período de tiempo. PIC16F886 en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Realizar contador en un período de tiempo. PIC16F886 en C  (Leído 4,375 veces)
shoshonee


Desconectado Desconectado

Mensajes: 547


Ver Perfil
Realizar contador en un período de tiempo. PIC16F886 en C
« en: 26 Mayo 2011, 20:17 pm »

Hola a todos y bienvenidos!

Hace mucho que no entro en este foro debido a cuestiones de tiempo. Me surje una duda y me gustaría que alguien me ayudara lo más rápido posible. El tema es el siguiente:

Estoy haciendo un proyecto con un pic16f886 en C, lo que deseo hacer son unos impulsos a través de un interruptor y que en el primer impulso empiece a contar (con un máximo de 4) y además se active el temporizador. Este contador estará limitado por un temporizador, que también será de no más de 4 segundos. La duda que me surje es ¿cómo puedo hacer esto? Os adjunto el código que llevo hecho:

Código:
#include <16F886.h>
//#include <16F876A.h>
#use delay(clock=4000000)
#use fast_io(C)
#use fast_io(B)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,errors)//Errors posa el error a RS232_ERRORS i els reestableix(reset) que es el que ens interesa.
//En Hexa si val 90H crec que vol dir que no hi ha error. Si acava en 2 crec que hem omplert massa el buffer
//El tema es que el buffer de recepció es de 2 bytes, si n'arriven 3 avans de llegir, peta a no ser que posem 'errors'
//Els altres es perden.
//#use fast_io(C)
//#use fast_io(B)
#byte port_a = 5
#byte port_b = 6
#byte port_c = 7

char  dadas;

/*#INT_RDA                //rutina de interrupcio al rebre dades, no la usem
void rda_int()
{
 dadas=getchar();
 printf("interrupcio %C \n\r",dadas);
}*/


/*void parpadeo (int a);  //això no ho usem a l'exemple
void envchar(char a);*/

void main ()
{
   setup_oscillator(OSC_4MHZ,OSC_STATE_STABLE); // Configurem el quartz intern a 4MHZ i estabilizat per al 16F886
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(SPI_SS_DISABLED);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);//depres el trec
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
 //enable_interrupts(INT_RDA);  //HABILITAR INTERRUPCIO AL REBRE DADES
 //enable_interrupts(GLOBAL);  //habilita totes les interrupcions

int canvi;
int cont;
int tiempo;

set_tris_a(0b00001111); //Port A. RA0 a RA3 com entrades, la resta són sortides
set_tris_c(0b11001110); //Port C. RC2, RC3, RC6 com entrades, la resta són sortides
while (1)
{
cont = 0;
if(input(PIN_A0))
bit_set (port_a, 4); //s'encen el led del pin_A4 quan pin_A0 estigui pulsat
else
bit_clear(port_a,4); //neteja el led quan es deixa de pulsar

if(input(PIN_A2))
bit_set (port_a, 5); //s'encen el led del pin_A5 quan pin_A2 estigui pulsat
else
bit_clear(port_a, 5); //neteja el led quan es deixa de pulsar
//-------------------------------------------------------------

do{
if (input(PIN_A0)) // si pin_A0 està pulsat
    {
        delay_ms(10); // delay antirebot
        if (input(PIN_A0)) // si encara segueix a 1, no ha sigut un rebote.
    {
if(cont == 0)
{
set_timer0 (0);
cont++;
while (input(PIN_A0))
{
delay_ms(200); // cicle tancat fins que no es deixi pin_A0
contarTimer(tiempo);
}
}
else
{
cont++;
        while (input(PIN_A0))
{
delay_ms(200); // cicle tancat fins que no es deixi pin_A0
contarTimer(tiempo);
}
}
    }
if (cont >= 4) //si contador es 4 o més
cont = 4; //entendrem que vol sortir del programa
    }
}while (tiempo < 61);
//s'ha d'enviar cont al port serie
printf ("%d", cont);

//-------------------------------------------------------------
switch (cont)
{
case 1:
output_bit(PIN_C2,1);  //dos intermitencies de 0.5 segon
      delay_ms(250); //
output_bit(PIN_C2,0);  //dos intermitencies de 0.5 segon
      delay_ms(250); //
case 2:
output_bit(PIN_C2,1);  //dos intermitencies de 0.5 segon
      delay_ms(250); //
output_bit(PIN_C2,0);  //dos intermitencies de 0.5 segon
      delay_ms(250); //
output_bit(PIN_C2,1);  //dos intermitencies de 0.5 segon
      delay_ms(250); //
output_bit(PIN_C2,0);  //dos intermitencies de 0.5 segon
      delay_ms(250); //
case 3:
output_bit(PIN_C2,1);  //dos intermitencies de 0.5 segon
      delay_ms(250); //
output_bit(PIN_C2,0);  //dos intermitencies de 0.5 segon
      delay_ms(250); //
output_bit(PIN_C2,1);  //dos intermitencies de 0.5 segon
      delay_ms(250); //
output_bit(PIN_C2,0);  //dos intermitencies de 0.5 segon
      delay_ms(250); //
output_bit(PIN_C2,1);  //dos intermitencies de 0.5 segon
      delay_ms(250); //
output_bit(PIN_C2,0);  //dos intermitencies de 0.5 segon
      delay_ms(250); //
case 4:
output_bit(PIN_C2,1);  //dos intermitencies de 0.5 segon
      delay_ms(250); //
output_bit(PIN_C2,0);  //dos intermitencies de 0.5 segon
      delay_ms(250); //
output_bit(PIN_C2,1);  //dos intermitencies de 0.5 segon
      delay_ms(250); //
output_bit(PIN_C2,0);  //dos intermitencies de 0.5 segon
      delay_ms(250); //
output_bit(PIN_C2,1);  //dos intermitencies de 0.5 segon
      delay_ms(250); //
output_bit(PIN_C2,0);  //dos intermitencies de 0.5 segon
      delay_ms(250); //
output_bit(PIN_C2,1);  //dos intermitencies de 0.5 segon
      delay_ms(250); //
output_bit(PIN_C2,0);  //dos intermitencies de 0.5 segon
      delay_ms(250); //
}
}

int contarTimer (int *tiempo)
{
if (get_timer0() > 200)
{
get_timer0(0);
tiempo++;
}
return tiempo;
}

Lo veis bien, mal... Qué cambiaríais??

Gracias :)


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda sobre realizar o no realizar overclocking en mi processador.
Hardware
MonzterKuki. 4 6,468 Último mensaje 3 Octubre 2011, 22:19 pm
por sagrat
Manejo de tablas mayor de 256 para PIC16F886
Electrónica
Meta 1 4,436 Último mensaje 8 Diciembre 2013, 03:57 am
por Meta
Contador de tiempo en Python
Scripting
duRRR 3 10,418 Último mensaje 27 Mayo 2015, 06:26 am
por 0x5d
Contador de tiempo
Java
Baal_30 4 3,350 Último mensaje 29 Febrero 2016, 06:25 am
por El Benjo
Contador de puntos según el tiempo que llevas jugando
Java
aspiazu 3 1,880 Último mensaje 30 Abril 2016, 17:03 pm
por + 1 Oculto(s)
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines