Autor Tema: donde se encuentran las variables del compilador xc8  (Leído 2619 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado NIN

  • PIC10
  • *
  • Mensajes: 6
donde se encuentran las variables del compilador xc8
« en: 20 de Marzo de 2016, 03:50:59 »
Buenas Tardes.

Supongamos que quiero encender el led, entonces compilo el siguiente codigo :

Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <xc.h> // Librería XC8
 
#define _XTAL_FREQ 4000000 // Indicamos a que frecuencia de reloj esta funcionando el micro
 
// PIC16F648A Configuration Bit Settings
#pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTOSC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
#pragma config BOREN = ON       // Brown-out Detect Enable bit (BOD enabled)
#pragma config LVP = OFF        // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EE Memory Code Protection bit (Data memory code protection off)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)
 
// FUNCION PRINCIPAL
void main ()
{
     TRISB = 0b00000000; // Configuro puerto B como salidas
     while (1) // Bucle infinito
     {
         PORTBbits.RB0 = 0; // Apago pin RB0
         __delay_ms(500);
         PORTBbits.RB0 = 1; // Enciendo pin RB0
         __delay_ms(500);
     }
}

Ok. Ya yo se que las variables son declaradas en el include <xc.h> y (creo) que este include llama a su vez a la biblioteca del PIC16f88 que hay en el compilador.

Pero cuando voy a la Biblioteca del p16f88 me encuentro esta parte :

Código: [Seleccionar]
// Register: PORTB
extern volatile unsigned char           PORTB               @ 0x006;
#ifndef _LIB_BUILD
asm("PORTB equ 06h");
#endif
// bitfield definitions
typedef union {
    struct {
        unsigned RB0                    :1;
        unsigned RB1                    :1;
        unsigned RB2                    :1;
        unsigned RB3                    :1;
        unsigned RB4                    :1;
        unsigned RB5                    :1;
        unsigned RB6                    :1;
        unsigned RB7                    :1;
    };
} PORTBbits_t;
extern volatile PORTBbits_t PORTBbits @ 0x006;
// bitfield macros
#define _PORTB_RB0_POSN                                     0x0
#define _PORTB_RB0_POSITION                                 0x0
#define _PORTB_RB0_SIZE                                     0x1
#define _PORTB_RB0_LENGTH                                   0x1
#define _PORTB_RB0_MASK                                     0x1
#define _PORTB_RB1_POSN                                     0x1
#define _PORTB_RB1_POSITION                                 0x1
#define _PORTB_RB1_SIZE                                     0x1
#define _PORTB_RB1_LENGTH                                   0x1
#define _PORTB_RB1_MASK                                     0x2
#define _PORTB_RB2_POSN                                     0x2
#define _PORTB_RB2_POSITION                                 0x2
#define _PORTB_RB2_SIZE                                     0x1
#define _PORTB_RB2_LENGTH                                   0x1
#define _PORTB_RB2_MASK                                     0x4
#define _PORTB_RB3_POSN                                     0x3
#define _PORTB_RB3_POSITION                                 0x3
#define _PORTB_RB3_SIZE                                     0x1
#define _PORTB_RB3_LENGTH                                   0x1
#define _PORTB_RB3_MASK                                     0x8
#define _PORTB_RB4_POSN                                     0x4
#define _PORTB_RB4_POSITION                                 0x4
#define _PORTB_RB4_SIZE                                     0x1
#define _PORTB_RB4_LENGTH                                   0x1
#define _PORTB_RB4_MASK                                     0x10
#define _PORTB_RB5_POSN                                     0x5
#define _PORTB_RB5_POSITION                                 0x5
#define _PORTB_RB5_SIZE                                     0x1
#define _PORTB_RB5_LENGTH                                   0x1
#define _PORTB_RB5_MASK                                     0x20
#define _PORTB_RB6_POSN                                     0x6
#define _PORTB_RB6_POSITION                                 0x6
#define _PORTB_RB6_SIZE                                     0x1
#define _PORTB_RB6_LENGTH                                   0x1
#define _PORTB_RB6_MASK                                     0x40
#define _PORTB_RB7_POSN                                     0x7
#define _PORTB_RB7_POSITION                                 0x7
#define _PORTB_RB7_SIZE                                     0x1
#define _PORTB_RB7_LENGTH                                   0x1
#define _PORTB_RB7_MASK                                     0x80


Precisamente esa es mi pregunta donde esta ese "PORTBbits.RB0 " y ese "   __delay_ms(500);" que no lo veo en ningun lado ?

Best regards.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:donde se encuentran las variables del compilador xc8
« Respuesta #1 en: 20 de Marzo de 2016, 05:15:20 »
Decis PIC16F88 y el codigo los fuses dice PIC16F648A


en xc.h hay muchas cosas definidas + cosas agregadas , no solo los registros del PIC

el PORTBbits esta definido aca:

Código: C
  1. typedef union {
  2.     struct {
  3.         unsigned RB0                    :1;
  4.         unsigned RB1                    :1;
  5.         unsigned RB2                    :1;
  6.         unsigned RB3                    :1;
  7.         unsigned RB4                    :1;
  8.         unsigned RB5                    :1;
  9.         unsigned RB6                    :1;
  10.         unsigned RB7                    :1;
  11.     };
  12. } PORTBbits_t;
  13. extern volatile PORTBbits_t PORTBbits @ 0x006;

El union ese es PORTBbits_t, y luego declara un volatile con direccion 0x006 ( que es el portB ) y le asigna esa estructura, declarandolo como PORTBbits

No es completamente de C eso, sino ya algo mas propio del compilador de XC8
Al igual __delay_ms() , __delay_us()
Es interno, no vas a encontrar el codigo de eso. Ya que lo realiza internamente el compilador basandose en _delay()

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:donde se encuentran las variables del compilador xc8
« Respuesta #2 en: 20 de Marzo de 2016, 09:50:28 »

Los delay los tienes definidos en pic18.h:

// NOTE: To use the macros below, YOU must have previously defined _XTAL_FREQ
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))
#define __delaywdt_us(x) _delaywdt((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))
#define __delaywdt_ms(x) _delaywdt((unsigned long)((x)*(_XTAL_FREQ/4000.0)))


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:donde se encuentran las variables del compilador xc8
« Respuesta #3 en: 20 de Marzo de 2016, 17:53:03 »
:P Tenes razon planeta son macros, encima dije que se basaban en _delay() , bueno ese si o si es generado internamente por el compilador.

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:donde se encuentran las variables del compilador xc8
« Respuesta #4 en: 20 de Marzo de 2016, 18:38:53 »


Yo para localizar algo en los fuentes, cuando no se por donde para, primero uso el Ctrl+Shift + F que busca en todos los archivos del proyecto. Y si no lo encuentro porque es de alguna librería, entonces echo mano de la utilidad Fileseek para que me busque una cadena de texto dentro de todo los archivos de un directorio y sus subdirectorios. Mano de santo, así no se me escapa nada.

También dependiendo del IDE, posicionando el cursor sobre lo que quieres localizar y dándole al botón derecho del ratón te lo puede encontrar, no se si eso lo hace MPLAB-X, pero ahora que ando haciendo cosas con los ARM STM32 o con Visual Studio para PC, si que lo tienes.


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:donde se encuentran las variables del compilador xc8
« Respuesta #5 en: 20 de Marzo de 2016, 19:30:40 »
Si en MPLAB X, podes ir a la declaracion de las funciones, no se si variables, con click derecho y ahi dice Ir a... Declaracion (y algo mas) Y te abre el archivo donde se encuentra declarado la funcion, no se si funciona con los macros o variables. Pero funciones lo eh usado.


 

anything