Primeros pasos con PIC (MikroC)

Hola amigos:
Estoy intentando hacer un programa para que simplemente parpadee un led, con un 18F2550, con el oscilador interno.
Todo esto mediante el MikroC pero no lo consigo de ninguna manera, por que al compilar (Build) me dice que las variables no estan definidas.
Código:
void main() {
  ANSEL  = 0;            // Configure AN pins as digital
  ANSELH = 0;
  C1ON_bit = 0;          // Disable comparators
  C2ON_bit = 0;

  TRISA = 0x00;          // set direction to be output
  TRISB = 0x00;          //  set direction to be output
  TRISC = 0x00;          // set direction to be output
  TRISD = 0x00;          // set direction to be output

  while(1) {
    PORTA = 0x00;        // Turn OFF LEDs on PORTA
    PORTB = 0x00;        // Turn OFF LEDs on PORTB
    PORTC = 0x00;        // Turn OFF LEDs on PORTC
    PORTD = 0x00;        // Turn OFF LEDs on PORTD
    Delay_ms(1000);      // 1 second delay

    PORTA = 0xFF;        // Turn ON LEDs on PORTA
    PORTB = 0xFF;        // Turn ON LEDs on PORTB
    PORTC = 0xFF;        // Turn ON LEDs on PORTC
    PORTD = 0xFF;        // Turn ON LEDs on PORTD
    Delay_ms(1000);      // 1 second delay
  }
}

Como veis en el programa parpadearán todos los puertos del PIC

Message No. 324 --> Undeclared identifier 'ANSEL' in expression

y lo repite con cada uno de los comandos.
Para vuestra información estoy utilizando la demo que permite programas de 2kB.

Para configurar lo del oscilador interno, le he dado a edit programa y donde poner Oscillator le he puesto "intosc:Usb-hs" a 8Mhz

Un saludo!
 
Que tal:
- El registro ANSEL no existe en este PIC, revisa el datasheet del PIC18F2550.
- En el MikroC y todos los de Mikroelektronika se debe crear proyecto desde la opción "Project > New Project".
- Para 8Mhz interno, configuras en los fuses y dentro del programa debes de configurar el registro OSCCON, los bits (4, 5 y 6).

saludos
 
Muy buenas Axel muchas gracias por contestar.
Si que creo el programa mediante new project. ahí es donde configuro la velocidad del oscilador y donde quiero guardar el proyecto.

Con lo que no me aclaro mucho es con el datasheet del PIC he estado leyéndolo pero no lo entiendo.

El registro ANSEL lo saqué del los examples que lleva el propio MikroC.

Sabía que algo de OSCCON había que poner, pero es que el mayor problema que tengo es que no se como se configura, que comandos tengo que poner, No lo veo en el datasheet.

Me vendría muy bien un programa tipo sabeis de donde podría mirarlo de un 18F2550 en mikroC.

Es que tengo conocimientos de C, pero no encuentro el sitio donde mirar la configuración...

En el Datasheet he visto esto:
Código:
OSCCON: OSCILLATOR CONTROL REGISTER
R/W-0 R/W-1 R/W-0 R/W-0 R(1) R-0 R/W-0 R/W-0
IDLEN IRCF2 IRCF1 IRCF0 OSTS IOFS SCS1 SCS0
bit 7 bit 0
bit 7 IDLEN: Idle Enable bit
1 = Device enters Idle mode on SLEEP instruction
0 = Device enters Sleep mode on SLEEP instruction
bit 6-4 IRCF2:IRCF0: Internal Oscillator Frequency Select bits
111 = 8 MHz (INTOSC drives clock directly)
110 = 4 MHz
101 = 2 MHz
100 = 1 MHz(3)
011 = 500 kHz
010 = 250 kHz
001 = 125 kHz
000 = 31 kHz (from either INTOSC/256 or INTRC directly)(2)
bit 3 OSTS: Oscillator Start-up Time-out Status bit(1)
1 = Oscillator Start-up Timer time-out has expired; primary oscillator is running
0 = Oscillator Start-up Timer time-out is running; primary oscillator is not ready
bit 2 IOFS: INTOSC Frequency Stable bit
1 = INTOSC frequency is stable
0 = INTOSC frequency is not stable
bit 1-0 SCS1:SCS0: System Clock Select bits
1x = Internal oscillator block
01 = Timer1 oscillator
00 = Primary oscillator
Note 1: Depends on the state of the IESO configuration bit.
2: Source selected by the INTSRC bit (OSCTUNE<7>), see text.
3: Default output frequency of INTOSC on Reset
 
Cada PIC o familia de PICs son distintos, se resuelve el problema revisando la hoja de datos...

Cada registro es de 8 bits, se empieza a leer desde el lado derecho empezando con el Bit0 hasta el bit7, entonces por lo general cada bit o grupo de bits en un registro tiene su descripción, por ejemplo escrito en binario:

OSCCON = 0b01110111;

Donde solo el valor 01110111:
Código:
  0      1      1      1      0      1      1      1
bit7 - bit6 - bit5 - bit4 - bit3 - bit2 - bit1 - bit0

Compara este valor con la tabla en el datasheet y veras como está configurado...
> En conjunto los 3 unos (Bits 6, 5 y 4) son del oscilador que lo configura a 8Mhz o si pones 110 lo configuras a 4Mhz, el resto lo explica en el datasheet que también son importantes.

Espero se entienda... :D
saludos
 
Muy buenas, ya lo he probado y me funciona bien:
C:
void main() {
  OSCCON = 0b01110111;

  TRISA = 0x00;          // set direction to be output
  TRISB = 0x00;          //  set direction to be output
  TRISC = 0x00;          // set direction to be output

  while(1) {
    PORTA = 0x00;        // Turn OFF LEDs on PORTA
    PORTB = 0x00;        // Turn OFF LEDs on PORTB
    PORTC = 0x00;        // Turn OFF LEDs on PORTC
    Delay_ms(1000);      // 1 second delay

    PORTA = 0xFF;        // Turn ON LEDs on PORTA
    PORTB = 0xFF;        // Turn ON LEDs on PORTB
    PORTC = 0xFF;        // Turn ON LEDs on PORTC
    Delay_ms(1000);      // 1 second delay
  }
}

Todas las salidas cambian su estado cada 1seg.

ahora he probado ha poner en funcionamiento por separado cada salida con un output_high(PIN_B7) y output_low(PIN_B7) y me dice que undeclared indentifier 'output_high' y lo mismo para el low...
¿Tenéis idea de por que es?
 
Última edición por un moderador:
ahora he probado ha poner en funcionamiento por separado cada salida con un output_high(PIN_B7) y output_low(PIN_B7) y me dice que undeclared indentifier 'output_high' y lo mismo para el low...
¿Tenéis idea de por que es?
Creo que estas comparando con el CCS; se sabe que el CCS tiene funciones pre-establecidas pero también que no sigue mucho del estándar ANSI C.
Es decir que prácticamente el código del CCS no es compatible con el MiKroC por lo que no hay output_high. Para pines es por ejemplo PORTA.B0 = 1; o PORTB.B0 = 0; // El B0 indica Bit0.

Dale una leída al Help del MikroC desde el item mikroC PRO for PIC Language Reference, lo explican todo.

saludos.
 
Muchisimas gracias Axel, ahora lo hago.
Por eso mismo andaba un poco liado, por que la primera prueba que intenté hacer fue con el CCS pensaba que el output_high sería con todos los compiladores.

Agradezco mucho tu paciencia.
Un saludo
 
saludos programadores.
me gustaria saber como configuro el oscilador externo desde el edit project de mikroc pro?

Que PIC estas usando?

Desde la ventana que indicas solo debes de escoger las opciones que se ajusten a lo que quieras... claro que debes de conocer al PIC, para eso revisa su hoja de datos.
 
Buen dia!

Estoy usando el PIC18F4550, lo que pasa es que no quiero utilizar un Oscilador Externo y quiero usar el Interno. Uso el Programa MikroC, en la linea de codigo pongo OSCCON = 0b01110111; pero no funciona, no se si en "Edit Proyect" hay que modificar algo. Pienso que seria en "Oscillator Selection" pero no se que opcion usar.

Gracias por su Atencion!
 
Buen dia!

Estoy usando el PIC18F4550, lo que pasa es que no quiero utilizar un Oscilador Externo y quiero usar el Interno.
Uso el Programa MikroC, en la linea de código pongo OSCCON = 0b01110111; pero no funciona, no se si en "Edit Proyect" hay que modificar algo. Pienso que seria en "Oscillator Selection" pero no se que opción usar.

Gracias por su Atención!
En Edit Project tienes que seleccionar los fuses que se muestran en la imagen adjunta.
La configuración del registro OSCCON para trabajar estable a 8MHz, la tienes bien.

Suerte.
 

Adjuntos

  • mikroC 18F4550 IntOsc Fuses.jpg
    mikroC 18F4550 IntOsc Fuses.jpg
    205.2 KB · Visitas: 118
Gracias D@rkbytes, ya me funciona!!!

Una Pregunta, es recomendable el usar el Oscilador Interno para comunicacion USB e I2C o SPI o es obligatorio utilizar el cristal de 12MHz????

Lo que vi que tambien me falto mover es el Prescalador y el Power-up.

Si decido utilizar el Oscilador Interno de 4MHz el Prescalador tiene que estar en "No prescale"???

Gracias por resolverme el problema!!!

Una imagen adjunta de lo que estoy realizando.

En Edit Project tienes que seleccionar los fuses que se muestran en la imagen adjunta.
La configuración del registro OSCCON para trabajar estable a 8MHz, la tienes bien.

Suerte.
 

Adjuntos

  • DSC_0532[1].jpg
    DSC_0532[1].jpg
    87.1 KB · Visitas: 22
Gracias D@rkbytes, ya me funciona!!!

Una Pregunta, es recomendable el usar el Oscilador Interno para comunicación USB e I2C o SPI o es obligatorio utilizar el cristal de 12MHz????

Lo que vi que también me falto mover es el Prescalador y el Power-up.

Si decido utilizar el Oscilador Interno de 4MHz el Prescalador tiene que estar en "No prescale"???
Nop, con el oscilador interno no puedes usar el módulo USB, las otras funciones si.
Para alcanzar los 48MHz, necesarios para trabajar con el USB, se puede hacer con cristales desde 4MHz hasta 20MHz.

Lee sobre esto en la hoja de datos, ahí están explicados los pasos a seguir.

Saludos.
 
Hola, por necesidad me estoy introduciendo en el mundillo de los pic. y me eh topado de entrada con un problema, espero alguien me pueda dar alguna sugerencia o solución al problemas ... de ante mano muchas gracias.

Al punto. Después de un rato luchando con mikroc y acompañado de un vídeo tutorial logre que código según creo, pero al grabar y montar en la proto el led tiene un intermitencia muy rápida eh irregular..

Desconzco si mi pic se a dañado, o es interferencia.
Uso un transformador de 12v con un 7805 mas 2 condensadores para estabilizar los 5v.

Dejo un video de referencia:

y mi codigo:
PHP:
void main() {
     CMCON=0X07; // Comparadores apagados, Pines RA<3:0> Cumplen la funcione E/S digital
     RB6_bit=0; // Inicializacion, del pin RB6 como apagado
     TRISB6_bit=0; //Pin RB6 como salida,  0 = salida, 1 = entrada
while (1) // Bucle infinito
     {
          RB6_bit=1;   // Pin RB6, Alto o Encendido
          delay_ms(1500); // Retardo en milisegundos
          RB6_bit=0; // Pin RB6, Bajo o Apagado
          delay_ms(1500); // Retardo en milisegundos
     }
}

de antemano muchísimas gracias. :D
 
como tienes configuradotu pic? con oscilador interno? o externo, la pata de reset debe estar a positivo y veo que el led lo tienes conectado al led, mejor ponle una resistencia de 220 homs o 330 homs o 470 homs
 
Hola. Muy buenas noches. Soy nuevo en la comunidad, estoy aprendiendo a programar en mikroc, en realidad voy empezando y hay un problema en el programa que no me deja avanzar, la verdad les agradecería mucho si me pudiesen ayudar.

Mi problema es el siguiente. Estoy haciendo un programa en c, en el cual quiero que al pasar un switch conectado por el puerto b en el bit rb7 (entrada), al presionar enciende rb4 y rb5, y al presionar rb0 apague solamente rb4 y rb5 quede encendido para después continuar con el programa.

Aquí les envío el código que llevo hasta ahora, espero alguien me pueda orientar.

El programa en la simulación lo que hace cuando paso el switch (rb7) rb4 queda apagado y rb5 encendido, y cuando presiono el pulsador (rb0) me enciende rb4 y al soltarlo me lo apaga.

Aquí les coloco el código. Saludos y gracias.
PHP:
bit oldstate;                                    // Old state flag

void main() {
  CMCON = 0X07;                                 //PINES DIGITALES
  TRISB = 10000001;                             //BIT RB0 Y RB7 DECLARADOS COMO ENTRADAS DIGITALES (PULSADORES), EL RESTO COMO SALIDAS
  PORTB = 10000001;
  TRISA = 0;                                    // PUERTO A CONFIGURADO COMO SALIDA
  PORTA = 0;                                    // PINES PUERTO B COMO SALIDA
  oldstate = 0;

   do {                                         // LA CONDICION SE EJECUTA UNA VEZ, ANTES DE LA COMPROBACION EN EL WHILE
   
   if (Button(&PORTB, 7, 300, 0))  {              //SWITCH INICIO PROCESO
   oldstate = 1;
   PORTB.F4 = 1;
   PORTB.F5 = 1;
  }
   if (oldstate && Button (&PORTB, 7, 300, 1)) {     // VACUM  port, puerto donde conecto, pin, bit puerto, time 1ms, 0 logis state
   oldstate = 0;
   PORTB.F4 = 0;
   PORTB.F5 = 0;
    }
   if (PORTB.F0=1){
   oldstate = 1;
   PORTB.F4 = 0;
   
   }
   }   while(1);//Bucle infinito.
   }
 
Mi problema es el siguiente. Estoy haciendo un programa en c, en el cual quiero que al pasar un switch conectado por el puerto b en el bit rb7 (entrada), al presionar enciende rb4 y rb5, y al presionar rb0 apague solamente rb4 y rb5 quede encendido para después continuar con el programa.
Tu planteamiento es muy sencillo y se puede lograr de la siguiente forma.

Programa en C estándar:
PHP:
void main (void)
{
    trisb = 0b11001111;
    portb = 0;
    
    while (1)
    {
        if(portb.7)
        {
            if(!portb.4 && !portb.5)
            {
                portb.4 = 1;
                portb.5 = 1;
            }
        }
        
        if(portb.0)
        {
            if(portb.4 && portb.5)
            {
                portb.4 = 0;
            }
        }
    }
}
Ya nada más falta que determines cuando se debe poner en 0 RB5.
 
BUenas tardes hermanaso muchisimas gracias por ayudarme a salir de esa duda que tenia, yo corri el programa en el simulador aunque no me apagaba el led que encendia el otro switch, segun la estructura que hiciste me pude guiar para poder resolver el problema, de antemano muchas gracias por tu ayuda...
 
Recién he descargado la versión demo de mikroC, hice un programa ejemplo muy simple para enviar una variable a un lcd 16X2. el asunto es la sentencia FOR no funciona, pero si yo elimino la linea de sentencia FOR entonces se despliega el valor de la variable (en el caso del programa se ve un 1). Alguien me puede dar una opinion al respecto, el mismo problema tengo en el compilador CCS.
Saludos
 

Adjuntos

  • programa.jpg
    programa.jpg
    53.8 KB · Visitas: 17
Atrás
Arriba