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);}

}
}
 

Adjuntos

  • on_off_leds.zip
    17.9 KB · Visitas: 14
Última edición:
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.F0) estado_RB0 = 1;
        if (!PORTB.F1) estado_RB1 = 1;
        if (!PORTB.F2) estado_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;
           }
     }
}
 

Adjuntos

  • on_off_leds.zip
    16.2 KB · Visitas: 7
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...
 
Última edición:
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.
 

Adjuntos

  • MVI_0169.zip
    1.5 MB · Visitas: 9
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.



¿Qué pic me recomiendan?
De preferencia q tenga: bastante memoria, oscilador interno y a lo menos 28 pines.
 
Última edición:
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.
 
Última edición:
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.
 
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
 
Atrás
Arriba