Autor Tema: Mini curso "Programación en XC8"  (Leído 455495 veces)

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

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Mini curso "Programación en XC8"
« Respuesta #30 en: 23 de Mayo de 2013, 15:06:59 »
Rseliman:
       Gracias nuevamente. Lo pude compilar a la primera y funciona perfecto en proteus.
             Saludos.
                Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re: Mini curso "Programación en XC8"
« Respuesta #31 en: 24 de Mayo de 2013, 15:09:02 »
Maldita linea roja


Hola a todos ...aca ando de nuevo , despues de que la linea roja me marcara incansablemente los __delays ....busque porque era ...a pesar de que la compilacion se hacia bien ...y logre sacar el error  con esta linea ...    #define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))  ...es un bugs del compiler ...

Lo saque de un texto en ingles de microchip


Saludos
Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Mini curso "Programación en XC8"
« Respuesta #32 en: 24 de Mayo de 2013, 18:49:08 »
Googleando encontré un comentario que hizo un usuario en el grupo del rtc_argentina con un gran dolor de cabeza a evitar con el uso de la librería del LCD xlcd.h, el cual lo sintetizo a continuación:
 
Por más que integremos el archivo a la carpeta del proyecto con la directiva #include  "xlcd.h" o desde la carpeta del árbol del proyecto, en la carpeta headers files,
 al hacer el #include <xc.h> estamos también incluyendo varios archivos más.
este archivo <xc.h> tiene dentro el  #include <htc.h>  y este archivo a su vez tiene un #include <pic18.h>.
Dentro del archivo <pic18.h>. están estas otras directivas de preprocesado:

                        #if defined _PLIB
                        #include <plib.h>
                        #endif

                       Con lo cual también se incluye al archivo plib.h el cual tiene dentro la directiva #include <xlcd.h>

Todo este trabalengua hace que el compilador utilice el archivo original <xlcd.h> sin tomar en cuenta el que tenemos "xlcd.h" en la carpeta del proyecto, no importando la forma en la que se haya declarado posteriormente el #include  "xlcd.h", esto porque el #include <xc.h> esta primero que el include local #include  "xlcd.h" de la carpeta del proyecto. Y por más que cambiemos de puerto B a puerto D no se reflejarán los cambios.-
 
 
Las soluciones son:
 
Solución  1: Editar directamente el archivo original xlcd.h, en la carpeta C:\Microchip\xc8\v1.12\include\plib (solución peligrosa porque cambiaríamos la librería en uso por otros proyectos. Hacer un backup)
 
Solución 2: En todos los archivos anteriormente mencionados cambiar
#include <pic18.h>
por #include "pic18.h " (solución peligrosa porque cambiaríamos la librería en uso por otros proyectos. hacer un backup)
 
Solución 3: hacer una copia local de la librería xlcd.h con otro nombre para evitar confusión #include  "xlcd_portd.h" y renombrar todos los #defines para que sean diferentes a los de la librería original.-
por ejemplo DATA_PORT cambiarlo por DATA_Puerto
Así por más que se la incluya a la original, los defines que surtirán efecto serán los renombrados.- (solución poco elegante. pero solución al fin)

Solución 4:
               agregar en nuestra librería local las directivas de preprocesado que quiten las definiciones que trae la librería xlcd standard así nuestra librería las puede redefinir:
Código: C
  1. #if defined  DATA_PORT
  2.     #undef   DATA_PORT
  3. #endif
  4.  
  5. #if defined  TRIS_DATA_PORT
  6.     #undef   TRIS_DATA_PORT
  7. #endif
  8.  
  9. #if defined  BIT8
  10.     #undef   BIT8
  11. #endif
  12.  
  13. #if defined  UPPER
  14.     #undef   UPPER
  15. #endif
  16.  
  17. #if defined  LINE_0
  18.     #undef   LINE_0
  19. #endif
  20.  
  21.  
  22. #if defined  NEXT_LINE
  23.     #undef   NEXT_LINE
  24. #endif
  25.  
  26. #if defined  RW_PIN
  27.     #undef   RW_PIN
  28. #endif
  29.  
  30. #if defined  TRIS_RW
  31.     #undef   TRIS_RW
  32. #endif
  33.  
  34. #if defined  RS_PIN
  35.     #undef   RS_PIN
  36. #endif
  37.  
  38. #if defined  TRIS_RS
  39.     #undef   TRIS_RS
  40. #endif
  41.  
  42. #if defined  E_PIN
  43.     #undef   E_PIN
  44. #endif
  45.  
  46. #if defined  TRIS_E
  47.     #undef   TRIS_E
  48. #endif
  49.  
  50. #if defined  DON
  51.     #undef   DON
  52. #endif
  53.  
  54. #if defined  DOFF
  55.     #undef   DOFF
  56. #endif
  57.  
  58. #if defined  CURSOR_ON
  59.     #undef   CURSOR_ON
  60. #endif
  61.  
  62. #if defined  CURSOR_OFF
  63.     #undef   CURSOR_OFF
  64. #endif
  65.  
  66. #if defined  BLINK_ON
  67.     #undef   BLINK_ON
  68. #endif
  69.  
  70. #if defined  BLINK_OFF
  71.     #undef   BLINK_OFF
  72. #endif
  73.  
  74. #if defined  SHIFT_CUR_LEFT
  75.     #undef   SHIFT_CUR_LEFT
  76. #endif
  77.  
  78. #if defined  SHIFT_CUR_RIGHT
  79.     #undef   SHIFT_CUR_RIGHT
  80. #endif
  81.  
  82. #if defined  SHIFT_DISP_LEFT
  83.     #undef   SHIFT_DISP_LEFT
  84. #endif
  85.  
  86. #if defined  SHIFT_DISP_RIGHT
  87.     #undef   SHIFT_DISP_RIGHT
  88. #endif
  89.  
  90. #if defined  FOUR_BIT
  91.     #undef   FOUR_BIT
  92. #endif
  93.  
  94. #if defined  EIGHT_BIT
  95.     #undef   EIGHT_BIT
  96. #endif
  97.  
  98. #if defined  LINE_5X7
  99.     #undef   LINE_5X7
  100. #endif
  101.  
  102. #if defined  LINE_5X10
  103.     #undef   LINE_5X10
  104. #endif
  105.  
  106. #if defined  LINES_5X7
  107.     #undef   LINES_5X7
  108. #endif
  109.  
  110. #if defined  PARAM_SCLASS
  111.     #undef   PARAM_SCLASS
  112. #endif


solución 5:
agregar al prinicipio de nuestro archivo main.c las siguientes dos directivas include:

#include <pic18f4550.h>
#include "xlcd.h" // lo agregamos primero para que el include standard <xlcd.h> no pise nuestro "xlcd.h" modificado.

Esta es la solución menos laboriosa.


modificado: agregué solución 5.
          
« Última modificación: 26 de Mayo de 2013, 12:58:03 por jukinch »
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Mini curso "Programación en XC8"
« Respuesta #33 en: 26 de Mayo de 2013, 00:38:56 »
COMO INTEGRAR PROTEUS A MPLAB X

Encontré un artículo muy interesante sobre como integrar proteus a Mplab. en el sitio http://milindapro.blogspot.com.ar/2012/12/proteus-vsm-viewer-to-debug-mplabx.html y lo traduje al Español para compartirlo en la presente guía.
 Saludos.
          Jukinch

COMO INTEGRAR Proteus VSM para hacer debug en los proyectos de MPLABX con el plugin Proteus VSM viewer.
MPLAB X está basado en la plataforma open-source NetBeans. Por lo tanto soporta plugins de herramientas de terceros.


Paso 1 - Primero debemos instalar el plugin VSM viewer en el IDE MPLABX. Para ello abrimos la ventana de Plugins seleccionando Tools->Plugins desde la barra de menu.




Luego hacemos click en Available plugins, y allí veremos a Proteus VSM viewer dentro de la lista bajo la categoría 'MPLAB DBCore'. (Si proteus vsm viewer no está en la lista hay que presionar en el botón Reload Catalog button para refrescar la lista).



Luego hay que hacer click en Install y seguir los pasos para instalar el plugin en el IDE.
También podemos actualizar o remover los plugins existentes desde esta ventana.




Paso 2 - Una vez instalado el plugin podremos crear nuestros proyectos desde MPLABX y cuando nos pregunte que herramienta queremos utilizar para hacer debug debemos seleccionar Proteus VSM viewer como herramienta de debugging.




También podemos setear como herramienta de debug a Proteus VSM desde un poyecto existente. Para ello hay que editar las propiedades del proyecto haciendo click derecho sobre el proyecto. Luego hacer click en la categoría 'Config: [default]'. Luego seleccionar Proteus VSM desde el list box que se encuentra al costado derecho como se muestra en la siguiente figura.



Paso 3 - Luego debemos compilar el proyecto en modo debug. Una vez hecho esto debemos crear un diseño en ISIS para nuestro proyecto.

Paso 4 - Una vez creado el archivo dsn para nuestro proyecto debemos cargar el programa que utilizará el microcontrolador seleccionando el archivo .cof que se encontrará en la carpeta  \dist\default\debug . Luego grabamos el archivo dsn dentro de la carpeta del proyecto de MPLAB X.

Paso 5 - Y por último deberemos agregar el archivo dsn al proyecto del MPLabX. Vamos a la ventana de las propiedades del proyecto y hacemos click en la categoría Proteus VSM Viewer bajo la categoría Config: [default] y seleccionamos el archivo dsn que hemos creado desde Design File Name: y presionamos en el botón apply.




A partir de este momento podremos utilizar break points en el código y hacer Debug del proyecto con Proteus. Luego MPLabX automáticamente ejecutará el archivo dsn de ISIS simultáneamente con nuestro código.

Una vez abierto el diseño ISIS desde Proteus debemos activar en el menú debug la opción de "Remote Debug Monitor" (Debug->Use Remote Debug Monitor)

Luego podremos abrir ambas ventanas simultaneamente y hacer debug del proyecto como se ve en la figura.



« Última modificación: 07 de Junio de 2013, 00:26:35 por jukinch »
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Mini curso "Programación en XC8"
« Respuesta #34 en: 26 de Mayo de 2013, 01:05:10 »
View Includes Hierarchy:
Mplab X tiene una herramienta muy útil que se activa haciendo botón derecho sobre el editor de código y seleccionando en el menú emergente en la opción Navigate y luego seleccionando View Includes Hierarchy.



Al elegir dicha herramienta se nos abrirá una nueva ventana con un árbol en donde podemos deplegar todos los archivos que se incluyen desde main.c

« Última modificación: 07 de Junio de 2013, 00:24:53 por jukinch »
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Mini curso "Programación en XC8"
« Respuesta #35 en: 26 de Mayo de 2013, 01:22:38 »
View macro expansion

El Mplab X tiene una herramienta que nos permite visualizar el código del archivo que estemos editando con las macros expandidas.
 
para utilizarla hacemos click derecho sobre el editor de código y seleccionando en el menú emergente en la opción Navigate y luego seleccionando View Macro expansion.



Una vez seleccionada nos mostrará una nueva ventana con el código expandido. Y si hacemos doble click en título de la ventana de macro expansion podremos verla a pantalla completa como se ve en la siguiente figura:


Allí se puede ver como el siguiente código:

OpenUSART(USART_TX_INT_OFF &
            USART_RX_INT_ON &       //Activar la interrupcion por la recepcion de dato del buffer de Rx del USART
            USART_ASYNCH_MODE &     //Modo asincrono (fullduplex)
            USART_EIGHT_BIT &       //8 bits de datos
            USART_CONT_RX &         //Recepción continua
            USART_BRGH_HIGH, 51);  //9600 Baudios

fue reemplazado por:

// configuramos el puerto serie
 OpenUSART(0b01111111 &
            0b11111111 &       //Activar la interrupcion por la recepcion de dato del buffer de Rx del USART
            0b11111110 &     //Modo asincrono (fullduplex)
            0b11111101 &       //8 bits de datos
            0b11111111 &         //Recepción continua
            0b11111111, 51);  //9600 Baudios

Luego para volver a la vista anterior volvemos a hacer doble click sobre el título de la ventana.

« Última modificación: 07 de Junio de 2013, 00:19:25 por jukinch »
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Mini curso "Programación en XC8"
« Respuesta #36 en: 26 de Mayo de 2013, 09:22:38 »
Fantástico!!!!

Ahora si que esta muy fácil probar el firmware que estemos desarrollando!!!

Alguien tiene algo de como hacer debug con el ID2 clone? Esa sería la frutilla del postre para mi...

Leo, una consulta, viste lo que estoy haciendo de ARM, viste las CMSIS y viste que esta muy bien documentado cada estructura con sus miembros para configurar cada periférico. En XC8 veo que es parecido, hay algún documento que enumere todos los nombres de registros (aquí no son estructuras, verdad?) agrupados por periférico como esta en el User Manual del uC LPC?

Saludos!
-
Leonardo Garberoglio

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Mini curso "Programación en XC8"
« Respuesta #37 en: 26 de Mayo de 2013, 10:15:30 »
Hola Leo. Vos te referís a los archivos de cabecera como el pic18f4550.h?
ahí se definen todos los registros del pic con los mismos nombres que encontramos en el datasheet.

ejemplo:

// Register: PORTB
extern volatile unsigned char           PORTB               @ 0xF81; // Asocia a PORTB con la dirección de memoria del legistro

y también hace uso de uniones, estructuras y macros para que podamos acceder a los bits del registro en forma individual (PORTBbits.RB0)

// 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;
    };
    struct {
        unsigned INT0                   :1;
        unsigned INT1                   :1;
        unsigned INT2                   :1;
        unsigned                        :2;
        unsigned PGM                    :1;
        unsigned PGC                    :1;
        unsigned PGD                    :1;
    };
    struct {
        unsigned                        :3;
        unsigned CCP2_PA2               :1;
    };
} PORTBbits_t;
extern volatile PORTBbits_t PORTBbits @ 0xF81;

// 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
#define _PORTB_INT0_POSN                                    0x0
#define _PORTB_INT0_POSITION                                0x0
#define _PORTB_INT0_SIZE                                    0x1
#define _PORTB_INT0_LENGTH                                  0x1
#define _PORTB_INT0_MASK                                    0x1
#define _PORTB_INT1_POSN                                    0x1
#define _PORTB_INT1_POSITION                                0x1
#define _PORTB_INT1_SIZE                                    0x1
#define _PORTB_INT1_LENGTH                                  0x1
#define _PORTB_INT1_MASK                                    0x2
#define _PORTB_INT2_POSN                                    0x2
#define _PORTB_INT2_POSITION                                0x2
#define _PORTB_INT2_SIZE                                    0x1
#define _PORTB_INT2_LENGTH                                  0x1
#define _PORTB_INT2_MASK                                    0x4
#define _PORTB_PGM_POSN                                     0x5
#define _PORTB_PGM_POSITION                                 0x5
#define _PORTB_PGM_SIZE                                     0x1
#define _PORTB_PGM_LENGTH                                   0x1
#define _PORTB_PGM_MASK                                     0x20
#define _PORTB_PGC_POSN                                     0x6
#define _PORTB_PGC_POSITION                                 0x6
#define _PORTB_PGC_SIZE                                     0x1
#define _PORTB_PGC_LENGTH                                   0x1
#define _PORTB_PGC_MASK                                     0x40
#define _PORTB_PGD_POSN                                     0x7
#define _PORTB_PGD_POSITION                                 0x7
#define _PORTB_PGD_SIZE                                     0x1
#define _PORTB_PGD_LENGTH                                   0x1
#define _PORTB_PGD_MASK                                     0x80
#define _PORTB_CCP2_PA2_POSN                                0x3
#define _PORTB_CCP2_PA2_POSITION                            0x3
#define _PORTB_CCP2_PA2_SIZE                                0x1
#define _PORTB_CCP2_PA2_LENGTH                              0x1
#define _PORTB_CCP2_PA2_MASK                                0x8
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Mini curso "Programación en XC8"
« Respuesta #38 en: 26 de Mayo de 2013, 12:15:33 »

// 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;
    };
    struct {
        unsigned INT0                   :1;
        unsigned INT1                   :1;
        unsigned INT2                   :1;
        unsigned                        :2;
        unsigned PGM                    :1;
        unsigned PGC                    :1;
        unsigned PGD                    :1;
    };
    struct {
        unsigned                        :3;
        unsigned CCP2_PA2               :1;
    };
} PORTBbits_t;
extern volatile PORTBbits_t PORTBbits @ 0xF81;


Ahí esta lo que buscaba. Primero se crea un tipo de datos (PORTBbits_t) como la union de 3 estructuras una "ensima" de la otra. La primer estructura para los pines RB, la segunda para las interrupciones y PG y la tercera para CCP2.
Luego se crea la variable que todos usan PORTBbits.

Lo importante para mí son estos registros:

Código: [Seleccionar]
// Register: T1CON
extern volatile unsigned char           T1CON               @ 0x010;
#ifndef _LIB_BUILD
asm("T1CON equ 010h");
#endif
// bitfield definitions
typedef union {
    struct {
        unsigned TMR1ON                 :1;
        unsigned TMR1CS                 :1;
        unsigned nT1SYNC                :1;
        unsigned T1OSCEN                :1;
        unsigned T1CKPS                 :2;
        unsigned TMR1GE                 :1;
        unsigned T1GINV                 :1;
    };
    struct {
        unsigned                        :2;
        unsigned T1INSYNC               :1;
        unsigned                        :1;
        unsigned T1CKPS0                :1;
        unsigned T1CKPS1                :1;
        unsigned                        :1;
        unsigned T1GIV                  :1;
    };
    struct {
        unsigned                        :2;
        unsigned T1SYNC                 :1;
    };
} T1CONbits_t;
extern volatile T1CONbits_t T1CONbits @ 0x010;
Con ese registro tenemos acceso, por ejemplo, al timer1.... está bueno, es similar al ARM.
Lo único que no me guta es el nivel de explicacion de los datasheet de microchip vs. el user manual de los ARM, pero será cuestion de acostumbrarce.... voy a ver si arranco a probar con mi próximo proyecto en un 16F883.

Saludos y gracias!
-
Leonardo Garberoglio

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Mini curso "Programación en XC8"
« Respuesta #39 en: 26 de Mayo de 2013, 13:03:09 »
Si garbe. comparto con vos lo de los manuales. Los de ARM son una delicia y los de Microchip son de terror  :5].
Para los timers, etc. tenés la guia pic18_plib.pdf allí tenés librerías para el uso de todos los periféricos.
         
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado yamilongiano

  • PIC10
  • *
  • Mensajes: 37
Re: Mini curso "Programación en XC8"
« Respuesta #40 en: 27 de Mayo de 2013, 18:29:00 »
1.2. ¡Hola mundo! en C (o como hacer destellar un LED)

Hacer destellar un LED es muy sencillo. Tanto como crear un bucle infinito, escribir en un pin, generar una demora y volver a escribir. El ejemplito:

Código: C
  1. /*
  2.  * File:   main.c
  3.  * Author: lucas
  4.  * Created on 1 de abril de 2013, 22:20
  5.  * Microcontrolador: PIC16F648A
  6.  *
  7.  * ¡Hola Mundo! en C (o como hacer destellar un LED)
  8.  */
  9.  
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <xc.h> // Librería XC8
  13.  
  14. #define _XTAL_FREQ 4000000 // Indicamos a que frecuencia de reloj esta funcionando el micro
  15.  
  16. // PIC16F648A Configuration Bit Settings
  17. #pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTOSC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
  18. #pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
  19. #pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
  20. #pragma config MCLRE = OFF      // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
  21. #pragma config BOREN = ON       // Brown-out Detect Enable bit (BOD enabled)
  22. #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)
  23. #pragma config CPD = OFF        // Data EE Memory Code Protection bit (Data memory code protection off)
  24. #pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)
  25.  
  26. // FUNCION PRINCIPAL
  27. void main ()
  28. {
  29.      TRISB = 0b00000000; // Configuro puerto B como salidas
  30.      while (1) // Bucle infinito
  31.      {
  32.          PORTBbits.RB0 = 0; // Apago pin RB0
  33.          __delay_ms(500);
  34.          PORTBbits.RB0 = 1; // Enciendo pin RB0
  35.          __delay_ms(500);
  36.      }
  37. }

* Podríamos hacer el cambio de estado del pin RB0 (toggle) utilizando la siguiente instrucción: PORTBbits.RB0 ^= 1;

hola queria saber como prender mas de un led al mismo tiempo aqui prende un led del puerto b el RB0 ( PORTBbits.RB0 = 0; // Apago pin RB0)

ahora como puedo prender mas de un led en la misma intruccion yo vengo del assembler y me cuesta este lenguaje y no comprendo bien las instrucciones para dominar el pic.

creo que en asembler era algo asi.

        movlw b'00010001' ; rb0 encendido y rb4 encendido.
        movwf portb

envio de datos en forma paralela como para usarlo en un display.

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Mini curso "Programación en XC8"
« Respuesta #41 en: 27 de Mayo de 2013, 18:50:43 »
Hola yamilongiano. Para encender todo el puerto debés hacer referencia a todo el puerto con el identificador PORTB

así:
 
PORTB = b00010001; // Fijate que la sintaxis del valor del entero es diferente al assembler b'00010001'

"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado yamilongiano

  • PIC10
  • *
  • Mensajes: 37
Re: Mini curso "Programación en XC8"
« Respuesta #42 en: 27 de Mayo de 2013, 19:09:14 »
Hola yamilongiano. Para encender todo el puerto debés hacer referencia a todo el puerto con el identificador PORTB

así:
 
PORTB = b00010001; // Fijate que la sintaxis del valor del entero es diferente al assembler b'00010001'



gracias si funciono.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Mini curso "Programación en XC8"
« Respuesta #43 en: 30 de Mayo de 2013, 15:00:26 »
He buscado por muchos sitios y no encuentro cómo definir interrupciones de alta prioridad y de baja prioridad con XC8

Estoy trasladando un programa en c del compilador C18 a XC8 para el micro PIC18F2550.

El original para C18 es este:
Código: [Seleccionar]
#pragma interrupt isr_main
void isr_low_main(void) {
   // Rutina de interrupción
}

#pragma code high_vector=0x08
void isr_high(void) {
   _asm GOTO isr_main  _endasm
}

#pragma code low_vector=0x18
void isr_low(void) {
   _asm GOTO isr_main  _endasm
}


¿Cómo puedo adaptarla?

Esta adaptación para XC8 no me convence porque no distingue el vector alto y el bajo:

Código: [Seleccionar]
void interrupt isr(void) {
   // Rutina de interrupción
}

Saludos

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Mini curso "Programación en XC8"
« Respuesta #44 en: 30 de Mayo de 2013, 15:25:18 »
Hola Picuino.
En los Pic18 las interrupciones en xc8 son por defecto de alta prioridad.
Para crear una interrupción de baja prioridad debes usar además del calificador interrupt  el calificador low_priority.
Fuente: página 189 del manual de xc8.
Ds52053b-page189.

Saludos
        Jukinch
Código: C
  1. void interrupt low_priority tc_clr(void)
  2.  {     if  (TMR1IE && TMR1IF)
  3.         {    TMR1IF=0;  
  4.               tick_count = 0;  
  5.               return;  
  6.          }
  7.  
  8. // poner aquí el código de cualquier otra interrupción de bajá prioridad.
  9.  }
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes