Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

15/03/2016 #1


programa switch que no funciona
Buenos días a todos. Tengo un pequeño problema con mi PIC16F690 montado en una protoboard.
¿Hay alguien que le pueda echar un vistazo rápido al código y decirme por qué no funciona?

Sólo consigo que se haga la lectura del 0 en la entrada que he declarado.
Vengo de arduino y este es uno de los primeros códigos que escribo en PIC.

Gracias. Aquí el código:

Código:
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>


// CONFIG
#pragma config FOSC = INTRCCLK  // Oscillator Selection bits (INTOSC oscillator: CLKOUT function on RA4/OSC2/CLKOUT pin, I/O function on RA5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF       // MCLR Pin Function Select bit (MCLR pin function is MCLR)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF      // Brown-out Reset Selection bits (BOR disabled)
#pragma config IESO = OFF       // Internal External Switchover bit (Internal External Switchover mode is disabled)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)



#define _XTAL_FREQ 2000000

void main (void){
 
    TRISAbits.TRISA0 = 0;
    TRISCbits.TRISC0 = 1;


        if ( PORTCbits.RC0 == 0)
           {__delay_ms(50);
               if (PORTCbits.RC0 == 0)
                 { PORTAbits.RA0 = 0;
                      __delay_ms(50);
                        PORTAbits.RA0 = 1;
                               __delay_ms(50);
                                                }
                                                    }
           else
               if ( PORTCbits.RC0 == 1)
               {  __delay_ms(250);
                   if (PORTCbits.RC0 == 1)
                   {PORTAbits.RA0 = 0;
                                                }
                                                    }       
                             
                                                           }
Gracias.
15/03/2016 #2

Avatar de TRILO-BYTE

no se que que quieres hacer para empezar quita esos delay que no hacen mas que estorbar a la hora de pisar el boton.

no se que diferencia hay entre Arduino y PIC para mi no existe diferencia se le llama saber programar si no sabes programar pues vas a ver una diferencia abismal entre diferentes plataformas.


ahora tu programa tiene el siguiente problema los marcare con ROJO tus problemas


lees boton
esperas 50ms
vuelves a preguntar el estado del boton
esperas
prendes el puerto A
esperas nuevamente
apagas el puerto A

si no es asi
vuelves a preguntar el estado del boton y si "no esta pisado"
esperas una eternidad
apagas puerto A


en esencia vas mas o menos con el algoritmo pero tienes problemas con los delay

¿por que?

por que cuando termina de hacer la pregunta se va directamente al delay y cuando tu pisas el boton no esta respondiendo por que se queda en el delay

cuando acaba el delay deberias pisar el boton en ese mismo y exacto momento para que lea tu boton.
pero si te tardas en lo que acaba la pregunta se queda nuevamente en el delay.

ese es el problema.
15/03/2016 #3

Avatar de palurdo

Y digo yo, si quieres hacer que se encienda y apague un LED con un switch no debería haber un bucle en algún sitio para explorar la entrada? Lo digo porque tu programa tal cual está termina de ejecutarse 100ms después de encender el PIC.

Por otro lado, si las entradas no van, revisa si ese pin tiene función compartida con otro periférico. Apaga todos los periféricos que no uses, ADCs, PWM, Timers, Interrupciones, comparadores, etc. Mira como hacerlo en el datasheet del micro.

Por último, creo que estas intentando hacer una especie de antirrebotes, pero yo no lo haría así. Explica un poco que es lo que quieres hacer. Por ejemplo, para hacer un latch on/off yo haría esto:

Código:
TRISAbits.TRISA0 = 0; //RA0 salida
TRISCbits.TRISC0 = 1; //RC0 entrada

while(1){ //bucle infinito
while(!PORTCbits.RC0); //no hacer nada mientras no se pulsa botón
PORTAbits.RA0=(PORTAbits.RA0)?0:1; //cambia estado de la salida, se puede hacer de muchas formas.
do{ __delay_ms(100); } while(PORTCbits.RC0); //retardo antirrebotes mientras boton pulsado.
__delay_ms(100); //antirrebotes para cuando se suelta el boton
}
15/03/2016 #4


gracias
gracias por la respuesta tan pronta. lo que quiero hacer es parpadear un led mediante un botton. Yo pensaba que es facil leer el programa que envie..declarar puerto de salida, el otro de entrada, pulsar un boton en el puerto entrada y esperar, leer de nuevo y si es asi que parpadee el LED, si no, que se quede apagado. Me queda un mundo para aprender y se programar un poco en arduino(he construido un controlador de humedad y temperatura con cuatro relees que abren y cieran ventiladores, humidificador y una resistencia electrica con un par de instrucciones basicas), lo que quiero es aprender para los PIC y detras de una pantalla no creo que sea tan facil cuando surgen dudas y no hay nadie para aclararlas. Gracias de nuevo por la respuesta pero sigo sin saber cual es la manera correcta de que elpic haga la diferencia entre un 0 y un 1 montando un resistencia pull-up.. Lo he intentado tambien con una instruccion "for( contad =0; contador < 100; contador ++) entre las dos lecturas del boton pero me sigue sin funcionar...
15/03/2016 #5

Avatar de palurdo

El PIC se comporta como cualquier otro microcontrolador con las entradas siempre que estén bien configuradas (revisa desactivar todos los dispositivos que influyan en el puerto). Con o sin Pull-ups, si en el pin de RA0 tienes 5V, el puerto lee un 1, y si tienes 0V, lees un 0. Activando las Pull-ups, pones por defecto 5V en el puerto sin que tengas nada conectado.
15/03/2016 #6


gracias palurdo
..muchas gracias palurdo, revisare el datasheet con cuidadito y desactivare las otras funciones compartidas del pin. Espero que me funcione en un final, tu codigo lo compila bien pero sigo con el mismo resultado..la primera respuesta no era para ti, si no para el anterior forofo que me respondio y casi me arrea. Da gusto encontrar perosnas que quieren ensenar y compartir conocimiento..he apuntado una secuencia de codigo que me enviaste(equivalenia a If;else),le avisare cuando lo hago funcionar ,porque lo hare.. saludos!
17/03/2016 #7

Avatar de TRILO-BYTE

arrea suena a que alguien desguro Trilobyte es algo regañon pero lo que pasa es que
he tratado muchas muchas veces en el foro acerca de ANTIRREBOTES

he incluso hay librerias perfectamente funcionales para eso.

si puedes ver este LINK se vera perfectamente como se trata muy bien un rebote.

es decir sin atorar el micro y lo mejor de todo sin rebotes

Alternativa al Delay
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.