problema con PIC16F84A y mikro C

Buenas gente, estoy empezando en el mundillo de la microelectronica aprendiendo poco a poco sin saturarme pero me gusta esto.

Os comento, estoy intentando hacer el archivo .HEX con el mikroC pero al darle al F11 se pone y se quita la pantalla, lo que he pensado es que el codigo no esté bien y como también estoy empezando con C quería si me pudieseis ayudar, aquí os adjunto el codigo:

Código:
#INCLUDE <16F84A.h>
    #FUSES XT,NOWDT,NOPROTECT,PUT
    #use delay (clock=8000000)
   

void main(void)
{

   
   set_tris_b(0x00);   //Todo PORTB como salida.
   disable_interrupts(GLOBAL);   //todas las interrupciones desactivadas
   do{
      if(output(PIN_MLCR)){           //Si elpulsador esta en alto...
         output_high(PIN_B0);
         output_high(PIN_B1);
         output_high(PIN_B2);
         output_high(PIN_B3);
         output_high(PIN_B4);
         output_high(PIN_B5);
         output_high(PIN_B6);
         output_high(PIN_B7); } //enciendo el LED.
      else {                    //Caso contrario...
         output_low(PIN_B0);
         output_low(PIN_B1);
         output_low(PIN_B2);
         output_low(PIN_B3);
         output_low(PIN_B4);
         output_low(PIN_B5);
         output_low(PIN_B6);
         output_low(PIN_B7); }  //lo apago.
   }while(TRUE);            //Repito el bucle

  
   set_tris_b(0x00);             //Todo PORTB como salida.
   disable_interrupts(GLOBAL);   //todas las interrupciones desactivadas
   do{
      if(input (PIN_A1)){     //Si elpulsador está apretado
      portb = 0x01;   //Enciendo solo el LED 0
      delay_ms(500);  //Espero medio segundo
      portb = 0x02;   //Enciendo solo el LED 1
      delay_ms(500);  //Espero medio segundo
      portb = 0x04;   //Enciendo solo el LED 2
      delay_ms(500);  //Espero medio segundo
      portb = 0x08;   //Enciendo solo el LED 3
      delay_ms(500);  //Espero medio segundo
      portb = 0x10;   //Enciendo solo el LED 4
      delay_ms(500);  //Espero medio segundo
      portb = 0x20;   //Enciendo solo el LED 5
      delay_ms(500);  //Espero medio segundo
      portb = 0x40;   //Enciendo solo el LED 6
      delay_ms(500);  //Espero medio segundo
      portb = 0x80;   //Enciendo solo el LED 7
      delay_ms(500); }  //Espero medio segundo
      else {               //Caso contrario...
      output_low(PIN_B0);
      output_low(PIN_B1);
      output_low(PIN_B2);
      output_low(PIN_B3);
      output_low(PIN_B4);
      output_low(PIN_B5);
      output_low(PIN_B6);
      output_low(PIN_B7); }  //lo apago.
   }while(TRUE);      //Repito el bucle

}

seguramente haya algo mal pero como no estoy muy puesto en C (algo he leido) pues espero si me podeis ayudar.

un saludo y muchisimas gracias.

PD: plis si me podeis explicar el porque lo he hecho mal cierta linea o lo que sea mejor, así aprendo.
 
pues es que error error no me sale nada de error, el caso es que a darle a F11, que segun MikroC es para programar, es decir, guardar el .HEX y tal, sale la pantallita y se quita, y ya no pasa nada más.

que programa me recomiendas?
 
Que raro. Hacele doble clic al primer error que te va a situar la linea que presenta error. Con respecto al programa, no estoy seguro. Dime en donde se situa.
 
bueno he descubierto que los errores que aparecen arriba de los portb, es por lo de PIN_MCLR pero si lo cambio a PIN_A3 (por ejemplo) todos esos errores desaparecen, quedando solo los errores de portb.

EDITO: El error del pin ya no me sale y de los dos errores que pone que se necesita una expresion numérica solo em aparece uno, y ese se refiere a la linea de "else {", los errores de portb se van con #DEFINE portb pero me sale que en todos ellos tengo que poner una expresión numérica
 
hola joshka, te cuento que yo utilizo el mikroc desde hace un buen tiempo en CCS no mucho solo un ejemplito basico, respecto a lo que comentas pues en F11 es para programar en el chip si tienes el grabado de mikroelectronica, creo que lo que quieres hacer es compilar tu programa y para eso tienes que presionar Ctrl + F9 eso es para compilar y asi te generara el .HEX. De tu programa no entiendo bien lo que quieres hacer.....parece que quieres conectarle un pulsador a tu reset en este micro pic16f84A no se puede hacer, ciertamenteen otros modelos si se lo puede hacer, y otro pulsador en el RA0 eso si se puede..de todas maneras aqui te mando un programita y archivito de simulacion de proteus, aver si te sirve, personalmente creo que el mikroc es muy sencillo, sumamente sencillo me han comentado por ahi y mas de una vez que es mejor programar en CCS porque su codigo es mas liviano, algun dia aprendere.....
 

Adjuntos

  • joshka_768.rar
    41.7 KB · Visitas: 285
joshka dijo:
bueno he descubierto que los errores que aparecen arriba de los portb, es por lo de PIN_MCLR pero si lo cambio a PIN_A3 (por ejemplo) todos esos errores desaparecen, quedando solo los errores de portb.

EDITO: El error del pin ya no me sale y de los dos errores que pone que se necesita una expresion numérica solo em aparece uno, y ese se refiere a la linea de "else {", los errores de portb se van con #DEFINE portb pero me sale que en todos ellos tengo que poner una expresión numérica

todo esa comfiguracion de los puertos y demas al utlizar CCS es mucho mas facil cuando creas el proyecto te sale una vbentana donde pueden configurar todo los puertos de entrada salida,interrupciones etc...
 
#INCLUDE <16F84A.h>
#FUSES XT,NOWDT,NOPROTECT,PUT
#use delay (clock=8000000)

esto esta demas , se pone al momento de crear el proyecto no en el codigo.

el compilador tiene una nomenclatura distinta al CCS que es el codigo que esta el programa (otros comandos por ejemplo para tratar los puertos).
 
Buenas gente, estoy empezando en el mundillo de la microelectronica aprendiendo poco a poco sin saturarme pero me gusta esto.

Os comento, estoy intentando hacer el archivo .HEX con el mikroC pero al darle al F11 se pone y se quita la pantalla, lo que he pensado es que el codigo no esté bien y como también estoy empezando con C quería si me pudieseis ayudar, aquí os adjunto el codigo:

Código:
#INCLUDE <16F84A.h>
    #FUSES XT,NOWDT,NOPROTECT,PUT
    #use delay (clock=8000000)
   

void main(void)
{

   
   set_tris_b(0x00);   //Todo PORTB como salida.
   disable_interrupts(GLOBAL);   //todas las interrupciones desactivadas
   do{
      if(output(PIN_MLCR)){           //Si elpulsador esta en alto...
         output_high(PIN_B0);
         output_high(PIN_B1);
         output_high(PIN_B2);
         output_high(PIN_B3);
         output_high(PIN_B4);
         output_high(PIN_B5);
         output_high(PIN_B6);
         output_high(PIN_B7); } //enciendo el LED.
      else {                    //Caso contrario...
         output_low(PIN_B0);
         output_low(PIN_B1);
         output_low(PIN_B2);
         output_low(PIN_B3);
         output_low(PIN_B4);
         output_low(PIN_B5);
         output_low(PIN_B6);
         output_low(PIN_B7); }  //lo apago.
   }while(TRUE);            //Repito el bucle

  
   set_tris_b(0x00);             //Todo PORTB como salida.
   disable_interrupts(GLOBAL);   //todas las interrupciones desactivadas
   do{
      if(input (PIN_A1)){     //Si elpulsador está apretado
      portb = 0x01;   //Enciendo solo el LED 0
      delay_ms(500);  //Espero medio segundo
      portb = 0x02;   //Enciendo solo el LED 1
      delay_ms(500);  //Espero medio segundo
      portb = 0x04;   //Enciendo solo el LED 2
      delay_ms(500);  //Espero medio segundo
      portb = 0x08;   //Enciendo solo el LED 3
      delay_ms(500);  //Espero medio segundo
      portb = 0x10;   //Enciendo solo el LED 4
      delay_ms(500);  //Espero medio segundo
      portb = 0x20;   //Enciendo solo el LED 5
      delay_ms(500);  //Espero medio segundo
      portb = 0x40;   //Enciendo solo el LED 6
      delay_ms(500);  //Espero medio segundo
      portb = 0x80;   //Enciendo solo el LED 7
      delay_ms(500); }  //Espero medio segundo
      else {               //Caso contrario...
      output_low(PIN_B0);
      output_low(PIN_B1);
      output_low(PIN_B2);
      output_low(PIN_B3);
      output_low(PIN_B4);
      output_low(PIN_B5);
      output_low(PIN_B6);
      output_low(PIN_B7); }  //lo apago.
   }while(TRUE);      //Repito el bucle

}

seguramente haya algo mal pero como no estoy muy puesto en C (algo he leido) pues espero si me podeis ayudar.

un saludo y muchisimas gracias.

PD: plis si me podeis explicar el porque lo he hecho mal cierta linea o lo que sea mejor, así aprendo.

Hola joshka... bueno me he dado cuenta que tu estas programando en MikroC y me he tomado la libertad de hacerte un programa en MikroC con las mismas especificaciones de tu programa anterior... si quieres puedes hacer comparaciones y ya podras tu encontrar el error que mencionaste anteriormente:

Código:
void main()
{
TRISB=0;    /*Seteo todos los pines del Puerto B como salidas*/
TRISA=3;    /*Seteo los pines PORTA.F0 y PORTA.F1 como entradas*/
PORTB=0;    /*Aclaro que inicialmente el Puerto B sera cero*/
while(1)    /*Hago un ciclo infinito para correr el programa*/
{
if(PORTA.F0==1) /*Mi primera condicion*/
PORTB=255;      /*Todos los pines del Puerto B seran 1*/
else            /*Si mi primera condicion no se cumple*/
PORTB=0;        /*Todos los pines del Puerto B seran 0*/
while(PORTA.F0==1)
{
}
if(PORTA.F1==1)  /*Mi segunda condicion*/
{
PORTB=1;         /*Se enciende solo el primer pin del Puerto B*/
delay_ms(500);   /*Espera 500 milisegundos*/
PORTB=2;         /*Se enciende solo el segundo pin del Puerto B*/
delay_ms(500);   /*Espera 500 milisegundos*/
PORTB=4;         /*Se enciende solo el tercer pin del Puerto B*/
delay_ms(500);   /*Espera 500 milisegundos*/
PORTB=8;         /*Se enciende solo el cuarto pin del Puerto B*/
delay_ms(500);   /*Espera 500 milisegundos*/
PORTB=16;        /*Se enciende solo el quinto pin del Puerto B*/
delay_ms(500);   /*Espera 500 milisegundos*/
PORTB=32;        /*Se enciende solo el sexto pin del Puerto B*/
delay_ms(500);   /*Espera 500 milisegundos*/
PORTB=64;        /*Se enciende solo el septimo pin del Puerto B*/
delay_ms(500);   /*Espera 500 milisegundos*/
PORTB=128;       /*Se enciende solo el octavo pin del Puerto B*/
delay_ms(500);   /*Espera 500 milisegundos*/
}
else             /*Si mi segunda condicion no se cumple*/
PORTB=0;         /*Todos los pines del Puerto B seran 0*/
}
}



Perdon si le puse muchas instrucciones pero las puse para que se pueda comprender
mas rapido el programa!! espero haberte ayudado en algo... cuando quieras puedo ayudarte en lo que sea en MikroC


Saludos
Estos son los registros que utilice en el programa para el PIC que mencionas (PIC16F84A):
 

Adjuntos

  • Registros PIC16F84A.zip
    25.7 KB · Visitas: 168
Una pregunta ajena al tema pero con respecto al mikroC........estoy crando un proyecto y el proyecto es largo...pero llevo usado el 33% de la rom y 47% de la ram......y cuando trato de crar mas codigo el compiladro mikroC no me deja crear mas codigo me dice q la RUTINA ES MUY LARGA.. o a veces no me logra crear el archivo.hex..........

A q se deve el problema ,....siendo q me qda bastante en la rom.....a q se debe q no puedo crear mas codigo....

Pd: estoy usando un pic16f877a..

Gracias,
 
Hola chalo_gomu


Bueno mira a lo que te entendi puedo ver que no te deja compilar el programa ya que por lo que veo en los datos 33% de la rom y 47% de la ram me imagino que haces muchas rutinas para tu programa, mira lo mas obvio que puedo decirte es que si utilizas MikroC puede que tengas el demo, ya que este no deja compilar mas del 50% de la capacidad del PIC si mas bien lo recuerdo, otra cosa, bueno por si acaso haces algunas rutinas repetidas (aunque creo que no); como por ejemplo un contador, ya sea que lo utilices mas de 3 veces en tu programa y lo reescribes cada vez que lo necesitas, te recomendaria que hagas tu programa dentro de un void ej:

Código:
void contador()
{
/*tus lineas para tu contador*/
} 
void main()
{
/*tu programa principal y cuando necesites el contador solo puedes
llamarlo poniendo contador();*/


bueno pero me imagino que tu ya sabes todo eso, lo pongo solo para que mi idea quede mas clara! revisa tu programa y me cuentas!! cualquier cosa yo tratare de ayudar!!

Saludos!
 
Hola, tambien tengo un problema con el pic 16f877a cuando quiero encender varios leds al mismo tiempo. Esta es la instrucción que he generado:

Código:
int velocity = 1000, cCount = 0;
void main(){

     PORTC = 0;
     TRISC = 0;
     PORTD = 0;
     TRISD = 0;

           while(1) {

           cCount++;
           if ( cCount == 1 ) {
                    PORTD = 128;
                    PORTD = 64;
                    PORTD = 32;
                    PORTD = 16;
                    PORTC = 128;
                    vDelay_ms(velocity);
                    cCount++;
           }
           if ( cCount == 2 ) {
                    PORTC = 64;
                    PORTC = 32;
                    PORTC = 16;
                    PORTD = 8;
                    vDelay_ms(velocity);
                    cCount++;
           }
           if ( cCount == 3 ) {
                    PORTD = 4;
                    PORTC = 1;
                    PORTC = 4;
                    PORTC = 8;
                    PORTD = 1;
                    vDelay_ms(velocity);
                    cCount=0;
           }
           }
}

Sin embargo cuando armo el circuito solo prenden la pareja de puertos D4C7, C4D3 y D0C3 haciendo la secuencia. Pudieran decirme en que estoy mal, por que no se encienden el conjunto de leds que especifique para cada if?
 
Última edición por un moderador:
Hola luismartelo:
Tu código está bien, tal y como está hace bien lo tu crees que es un error.
Lo principal es, porque pones otro valor a PORTD o PORTC tan rápido y seguido?.
Ya que aunque pongas varios valores seguidos a PORTD o PORTC siempre se van a quedar
con el último cargado, es decir por ejemplo al poner PORTD = 16; luego vDelay_ms(velo);, se
mantiene el D4 activo durante el tiempo que dure vDelay();, entonces no aparece el efecto que quieres hacer.

Si lo que quieres es hacer que se encienda un LED secuencial, debes poner el vDelay por cada cambio que le hagas al PORTD o PORTC.

PORTD = 128; // binario = 10000000 = D7
vDelay(velo);
PORTD = 64; // binario = 01000000 = D6
vDelay(velo);
//... etc


De esa forma si se va a notar cada led individualmente o hacerlo por grupos, LED del D7,D6,D5,D4 encendidos seria para cargar el valor 240 en en PORTD.
 
Hola luismartelo

Mira tambien si pones else if a tu programa seria mas dinamico... a mi me han dado errores si solo pongo if es por eso que te lo recomiendo:

Código:
int velocity = 1000, cCount = 0;
void main(){

     PORTC = 0;
     TRISC = 0;
     PORTD = 0;
     TRISD = 0;

           while(1) {

           cCount++;
           if ( cCount == 1 ) {
                    PORTD = 128;
                    vDelay_ms(velocity);
                    PORTD = 64;
                    vDelay_ms(velocity);
                    PORTD = 32;
                    vDelay_ms(velocity);
                    PORTD = 16;
                    vDelay_ms(velocity);
                    PORTC = 128;
                    vDelay_ms(velocity);
                    cCount++;
           }
           else if ( cCount == 2 ) {
                    PORTC = 64;
                    vDelay_ms(velocity);
                    PORTC = 32;
                    vDelay_ms(velocity);
                    PORTC = 16;
                    vDelay_ms(velocity);
                    PORTD = 8;
                    vDelay_ms(velocity);
                    cCount++;
           }
           else if ( cCount == 3 ) {
                    PORTD = 4;
                    vDelay_ms(velocity);
                    PORTC = 1;
                    vDelay_ms(velocity);
                    PORTC = 4;
                    vDelay_ms(velocity);
                    PORTC = 8;
                    vDelay_ms(velocity);
                    PORTD = 1;
                    vDelay_ms(velocity);
                    cCount=0;
           }
           }
}

Saludos...
 
Muchas gracias, con sus sugerencias ya esta funcionando muy bien el pic, ahora solo tengo que solucionar el problema de la corriente que le esta entrando al pic ya que este lo tengo que conectar a un escalador de voltaje 12 a 5 V y al parecer el circuito que diseñe para esta funcion solo me esta arrojando 2mA. Creo que el problema esta en que use unas resistencias del orden de los KOhms y ademas de 0.5Watts debido a que no consegui las de 0.25. Este circuito que les muestro es como lo voy a construir bajando las resistencia de kOhms a solo Ohms, ustedes creen que si hago esto es posible aumentar la corriente?

Saludos
 

Adjuntos

  • 12-5.JPG
    12-5.JPG
    64.4 KB · Visitas: 26
Atrás
Arriba