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

Temas similares

09/09/2012 #1


Programando en C para PICs
ME CONFIESO... Estudié electrónica, nunca me interesaron los circuitos digitales y trabajo es con energía.

Tengo unos meses estudiando microntroladores por mi cuenta y me puse a programalos en C a través de Mikroc y simulo con Proteus... AL MONTARLO EN PROTOBOARD no se comportó como en el Isis

Por ej: en Isis funciona cambiar el estado de un led mediante un pulsador... en protoboard si presiono RB0 RD2 cambia de 0 a 1, no cambia de 1 a 0, luego si presiono RB1 RD3 hace lo mismo pero se apaga RD2, si presiono 2 pulsadores a las vez solo responde uno de los leds.

Supongo q me falta declarar interrupciones y/o registros especiales...

Agradecería a quien pueda orientarme...

anexo alguno de mis código y el fichero de simulación:

//Cambiar estado de un led mediante un pulsador...
//... si el ledx está en 0 cambia a 1 viceversa
//PIC16F917 a 8MHz de oscilador interno

void main(void)
{

ANSEL=0;
INTCON=0;

TRISB=0b11111111; //Los 0 son salida y los 1 son entradas
TRISC=0b00000000; //Las terminales inician en 0
TRISD=0b11000000;

PORTB=0b11111111;
PORTC=0b00000000;
PORTD=0b11000000;

while(1)
{
if(PORTB.F0==0){ //Si se pulsa RB0, cambiará de estado RD2
if(PORTD.F2==0)
PORTD.F2=1;
else
PORTD.F2=0;
while(PORTB.F0==0);}

if(PORTB.F1==0){
if(PORTD.F3==0)
PORTD.F3=1;
else
PORTD.F3=0;
while(PORTB.F1==0);}

if(PORTB.F2==0){
if(PORTC.F4==0)
PORTC.F4=1;
else
PORTC.F4=0;
while(PORTB.F2==0);}

}
}
10/09/2012 #2


Intenta algo asi para los rebotes
Código PHP:
int estado_RB0 0;
int estado_RB1 0;
int estado_RB2 0;

void main(void){
     
ANSEL 0;
     
OPTION_REG.NOT_RBPU 0b0;
     
TRISB 0xFF;
     
TRISC 0x00;
     
PORTC 0x00;

while(
1){
     if (!
PORTB.F0 | !PORTB.F1 | !PORTB.F2){
        
delay_ms(10);
        if (!
PORTB.F0estado_RB0 1;
        if (!
PORTB.F1estado_RB1 1;
        if (!
PORTB.F2estado_RB2 1;
        }
     if (
PORTB.F0 estado_RB0){
           
PORTC.F0 = ~PORTC.F0;
           
estado_RB0 0;
           }
     if (
PORTB.F1 estado_RB1){
           
PORTC.F1 = ~PORTC.F1;
           
estado_RB1 0;
           }
     if (
PORTB.F2 estado_RB2){
           
PORTC.F2 = ~PORTC.F2;
           
estado_RB2 0;
           }
     }

11/09/2012 #3


Ya mismo lo voy a intentar... gracias

Ciertamente con mejoró la estabilidad de los pulsadores y las respuesta en los leds... Pero sigue pasando lo mismo, cuando está RD2 en 0 y pulso RB0 cambia a 1 pero si vuelvo a pulsar RB0 no cambia RD2 a 0 y si presiono RB1 RD3 se pone en 1 y se apaga RD2 y asi sucesivamente...

Ahorita grabo un video y lo subo...
11/09/2012 #4


En formato .3gp bien ligero
Archivos Adjuntos
Tipo de Archivo: zip 11092012031.zip (223,2 KB (Kilobytes), 8 visitas)
11/09/2012 #5


creo que el problema esta en el cableado de tu proyecto. Revice de nuevo el codigo que puse y funciona perfectamente. Talvez si simplificas tu proyecto y pruebas solo esta parte puedas encontrar el error. Te dejo un video corto que hice para comprobar que efectivamente el programa funciona. Use el PIC16F877A que es el unico que tengo, pero el codico es el mismo.
Archivos Adjuntos
Tipo de Archivo: zip MVI_0169.zip (1,54 MB (Megabytes), 9 visitas)
11/09/2012 #6


Quizá los pulsadores no están bien conectados con su resistencia pull-X? Como es el esquema?
11/09/2012 #7


Gracias a todos.

Está bien cableado, de hecho, por eso es q estoy usando pines que están continuos para cablear más fácil. Me temo q es el micro o un detallito gafo q no vea.

Estoy usando una resistecia comun en referencia para no afear el proto pero ya mismo pruebo y si me da chance hasta compro otro pic.

---------- Actualizado después de 6 minutos ----------

¿Qué pic me recomiendan?
De preferencia q tenga: bastante memoria, oscilador interno y a lo menos 28 pines.
11/09/2012 #8


Por cierto... carferper y josemaX ...
¿ambos están usando MikroC?

Ahorita lo estoy montando en otro protoboard y con sólo 4 i/o...
Ya les aviso el resultado q obtenga.
11/09/2012 #9


MikroBasic e intentando pasar a C
11/09/2012 #10


Qué bien... y gracias por ayudarme!
12/09/2012 #11


hola primer_, yo utilizo MikroC o cx8 para proyectos simples aunque a veces me gusta experimentar con JAL. Acerca del micro, depende de lo que necesitas. Si es unicamente para aprendizaje, yo buscaria uno con PWM, ADC, comparadores y algunos protocolos de comunicacion incluidos, asi puedes experimentar muchas cosas con un solo chip. Ahora con lo de tu proyecto, una recomendacion, el puerto B del PIC16F917 que estas utilizanado tiene internamente conexiones a VCC (weak pull-ups) asi que lo unico que debes hacer es activar esa funcion en tu codigo. En el ejemplo que puse seria esta linea: OPTION_REG.NOT_RBPU = 0b0; Esto hace que lo unico que tengas que conectar a los pines del puerto B sean los botones pulsadores, que deben ir a tierra. El codigo trabaja cambiando el estado de los LEDs correspondientes cuando se levanta el pulsador, es decir durante la transicion de 0 a 1. Suerte en tu proyecto.
19/10/2012 #12


Hola a todos.

Disculpen que me haya desaparecido.

Les tengo buenas noticias con respecto al código y al montaje en protoboard. EL PIC ESTABA DAÑADO... así que no era ni el código ni dada extra y cambié el uc por un 16f887.

Gracias carferper. La configuración OPTION_REG.NOT_RBPU = 0b0; es importante.

josemaX no he tenido tiempo de ponerme a programar en basic pero luego lo intentaré.

Además, tengo varios código que hice y ya los probé.

Caulquier ayuda me avisan... :-D
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.