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

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Limbo

  • PIC10
  • *
  • Mensajes: 44
Re: Mini curso "Programación en XC8"
« Respuesta #105 en: 24 de Junio de 2013, 17:12:43 »
Citar
Saca el archivo de la libreria en source ...ahi solamente pone el main.c  y si queres hacer mas legible el main ...separa los pragma en un archivo diferente ...configuratiob_bits.c ...que ese si lo agregas en el source junto con el main ....desp las librerias las agregas con los #include al rpincipio del main ...ahi te puese un ejemplo ....en el main.c al principio pones #include la libreria.c ...y al principio de la lñibreria pones el #include libreria.h que es donde estan los headers ...que son las definiciones de las funciones ....me explico ....si haces esto y a su ves los agregas en el source ...vas a tener conflictos ...y errores que no vas a saber de donde vienen .....te vuelvo a repetir yo logre compilar bien ..solamente teniendo en el arbol de la izquierda ..en el source ...el main y el config bits ....y nada mas
Solo tengo el main.c en el arbol de la izquierda, intento incluir la libreria en .c y me da errores, en cambio incluyo el MISMO codigo en un archivo .h y me va perfecto... no lo entiendo..
Porcierto ¿como puedo escribir una variable numerica en el LCD?
« Última modificación: 25 de Junio de 2013, 09:43:41 por Limbo »

Desconectado Limbo

  • PIC10
  • *
  • Mensajes: 44
Re: Mini curso "Programación en XC8"
« Respuesta #106 en: 25 de Junio de 2013, 20:28:13 »
Estoy trabajando en un pequeña "libreria", si se le puede llamar así, para leer un teclado 4x4, en principio la estaba haciendo para mi, pero he pensado en subirla y colaborar con el manual. Si la quereis añadir decidmelo, asi la comento más y explico su funiconamiento (Es muy basica)..

Desconectado QIQE

  • PIC18
  • ****
  • Mensajes: 335
Re: Mini curso "Programación en XC8"
« Respuesta #107 en: 26 de Junio de 2013, 12:20:16 »
se podría abrir un hilo de recursos para XC8, y así tenerlos un poco mas ordenados
Muchas gracias por vuestro tiempo.

Saludos desde valencia!!!

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Mini curso "Programación en XC8"
« Respuesta #108 en: 26 de Junio de 2013, 12:25:49 »
hola Qiqe.
          El hilo tiene un índice en el primer post. cada tanto el usuario que lo creo "lmtreser" lo va actualizando.
          La idea es ir poniendo ejemplos y guias sobre los temas sobre los cuales se van generando dudas.- Luego mandarle un mensaje privado a él o al administrador del foro para que lo agreguen al ínidice.
        Saludos.
              Jukinch
« Última modificación: 26 de Junio de 2013, 12:30:01 por jukinch »
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado Limbo

  • PIC10
  • *
  • Mensajes: 44
Re: Mini curso "Programación en XC8"
« Respuesta #109 en: 26 de Junio de 2013, 13:22:51 »
Citar
se podría abrir un hilo de recursos para XC8, y así tenerlos un poco mas ordenados
Pienso yo que para eso esta este tema no?

Lo que si podriamos abrir un tema con ejercicios para hacer en XC8 y poner la solucion en un spoiler de esos desplegables ¿Que os parece?O bueno, podemos usar este mismo tema.

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re: Mini curso "Programación en XC8"
« Respuesta #110 en: 26 de Junio de 2013, 17:06:35 »
  Aquí dejo una librería en para manejo de UART por SoftWare
  Hay que tener en cuenta que no todas las velocidades de comunicación serán posibles en todas las frecuencias de trabajo del microcontrolador. Por ejemplo, con 4MHz no se puede comunicar a una velocidad mayor a 19200
  En el header de la librería están definidos los tiempos y hay una "especie de compensación" según la frecuencia a la que esté trabajando.

  Lo simulé en ISIS con un 16F876A y va bien.


He estado Probando esta libreria que Posteo AngelGris ...y anda perfectamente simulada en proteus , pero a la hora de llevarla al Protoboard ...no funciona ....habra tanta diferencia entre Proteus 8.0 y la realidad ?? porque puede ser que no funcione ? ..estoy llevando los pines a unas placas de rf apc230 las de ctm electronica ...probe antes las placas puenteando txrx y andan perfecto ...es como si el micro no le enviara nada ...no se como verificarlo ...si a alguien se le ocurre algo ??

Gracias

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

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Mini curso "Programación en XC8"
« Respuesta #111 en: 26 de Junio de 2013, 18:15:51 »
  Si tienes un max232 puedes probar comunicación entre el PIC y la PC... también puedes intentar una comunicación a menor velocidad. Postea tu programa y el header de la librería como lo estés utilizando, tal vez hay algún problema.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re: Mini curso "Programación en XC8"
« Respuesta #112 en: 26 de Junio de 2013, 18:26:35 »
  Si tienes un max232 puedes probar comunicación entre el PIC y la PC... también puedes intentar una comunicación a menor velocidad. Postea tu programa y el header de la librería como lo estés utilizando, tal vez hay algún problema.

Gracias AngelGris ...es raro porque anda bien en Proteus ...tengo un programador de la firma RDss que tiene un analizador de uart ..y tampoco me funciona ...es el pic pero no entiendo porque anda en proteus ...es un pic 16f819 el que vengo usando en todo lo que hago ...estaba pensando en ponerle un led que me marque cuando transmite ...bueno mañana seguire experimentando ..desp posteare los resultados ...las conexiones en el proto estan bien ...aparte no son muchas es sencillo ...es evidente que es algo de la programacion ...el tema es que no se como verificarlo porque siempre uso el proteus para eso

Saludos y gracias

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

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re: Mini curso "Programación en XC8"
« Respuesta #113 en: 27 de Junio de 2013, 14:15:26 »
  Si tienes un max232 puedes probar comunicación entre el PIC y la PC... también puedes intentar una comunicación a menor velocidad. Postea tu programa y el header de la librería como lo estés utilizando, tal vez hay algún problema.


AngelGris , posteo el codigo a ver si se te ocurre algo que se me este pasando a mi ....lo estoy probando con un programador de la firma RdSS en funcion UART TOOL ...ya probe la herramienta puenteando txrx y mandando caracteres y anda perfecto ...o sea que con el codigo deberia funcionar ...pero no es asi ..este solamente funciona con PROTEUS 8.0  tanto main como swuart.c estan definidos en el projecto junto con los bits de configuracion

Muchas gracias por la ayuda



main.c

Código: [Seleccionar]
  #define _XTAL_FREQ 8000000

    #include <xc.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <htc.h>
   // #include "i2c.h"
   // #include "BMP085.h"
    #include "swuart.h"
     char mensaje[10] = "Ramiro";
     long temperature;



void init ();



    void main(void)
    {

         
        __delay_ms(1000);
        unsigned char *punterostring;

   
   punterostring = mensaje;
   swinit_uart(); //inicialiso el UART
   
   __delay_ms(10);

   swputch('T');
   swputch('E');
   swputch('M');
   swputch('P');       //mando la palabra Hola letra por letra
   swputch('\r');           //salto de linea
   swputs(mensaje);         //mando la cadena almacenada en mensaje
   swputch('\r');           //salto de linea
   swgets(punterostring);   //recibo una cadena terminada con '\r'
   swputch('\r');           //salto de linea
   swputs(punterostring);   //mando la cadena apuntada por punterostring
                            //(recibida anteriormente)

         //temperature =  bmp085ReadTemp();
         //itoa( mensaje, temperature, 10 );
while(1);


 
         
    }
    void init(void)
   {

    OSCCONbits.IRCF2 = 1; //
    OSCCONbits.IRCF1 = 1; // defino oscilador interno en 8 mhz
    OSCCONbits.IRCF0 = 1; //


       


    ADCON0bits.ADON = 0;  //
    ADCON1bits.PCFG3 = 0; //
    ADCON1bits.PCFG2 = 1; // pongo todas las entradas digitales porta
    ADCON1bits.PCFG1 = 1; //
    ADCON1bits.PCFG0 = 1; //
    ADCON1bits.ADCS2 = 0; //
    TRISA=0;
    PORTA=0;
   // TRISB =1;
  //  PORTB =0;
      //  BMP085_Calibration();

    }


swuart.h

Código: [Seleccionar]
#ifndef SWUART_H
    #define SWUART_H

    #ifndef _XC_H_
    #include <xc.h>
    #endif


    /*******************************************************************************
    *  Parametros configurables por el usuario                                     *
    *******************************************************************************/

    /*
    * El valor de _XTAL_FREQ debe coincidir con el valor definido
    * en el programa principal
    */

    /*
    * En el caso que solo se desee transmitir se debe definir TXONLY
    * En el caso que solo se desee recibir se debe definir RXONLY
    * En el caso de querer transmitir y recibir se debe definir TXRX
    */

    #ifndef _XTAL_FREQ
    #define _XTAL_FREQ 8000000
    #endif

    #define TXPIN PORTBbits.RB0
    #define RXPIN PORTBbits.RB2
    #define TXDIR TRISBbits.TRISB0
    #define RXDIR TRISBbits.TRISB2

    #define SWUARTBAUD 9600
    #define TXRX


    /*******************************************************************************
    *  Parametros internos para los tiempos de cada bit                            *
    *******************************************************************************/

    #define _BitOutDelay (1000000UL/SWUARTBAUD)
    #define StartDelay (1500000UL/SWUARTBAUD)

    #if (_XTAL_FREQ <= 4000000)
    #define BitOutDelay (_BitOutDelay - 24)
    #define BitInDelay (_BitOutDelay - 24)
    #elif (_XTAL_FREQ <= 6000000) && (_XTAL_FREQ > 4000000)
    #define BitOutDelay (_BitOutDelay - 16)
    #define BitInDelay (_BitOutDelay - 16)
    #elif (_XTAL_FREQ <= 8000000) && (_XTAL_FREQ > 6000000)
    #define BitOutDelay (_BitOutDelay - 12)
    #define BitInDelay (_BitOutDelay -12)
    #elif (_XTAL_FREQ <= 10000000) && (_XTAL_FREQ > 8000000)
    #define BitOutDelay (_BitOutDelay - 10)
    #define BitInDelay (_BitOutDelay -9)
    #elif (_XTAL_FREQ <= 12000000) && (_XTAL_FREQ > 10000000)
    #define BitOutDelay (_BitOutDelay - 8)
    #define BitInDelay (_BitOutDelay - 7)
    #elif (_XTAL_FREQ <= 16000000) && (_XTAL_FREQ > 12000000)
    #define BitOutDelay (_BitOutDelay - 6)
    #define BitInDelay (_BitOutDelay - 5)
    #elif (_XTAL_FREQ <= 20000000) && (_XTAL_FREQ > 16000000)
    #define BitOutDelay (_BitOutDelay - 5)
    #define BitInDelay (_BitOutDelay - 4)
    #elif (_XTAL_FREQ <= 26000000) && (_XTAL_FREQ > 20000000)
    #define BitOutDelay (_BitOutDelay - 3)
    #define BitInDelay (_BitOutDelay - 3)
    #elif (_XTAL_FREQ <= 48000000) && (_XTAL_FREQ > 26000000)
    #define BitOutDelay (_BitOutDelay - 2)
    #define BitInDelay (_BitOutDelay - 2)
    #endif


    /*******************************************************************************
    *  Definicion de funciones                                                     *
    *******************************************************************************/

    /*
    * La funcion swgets recibe una cadena que termine con '\r' (decimal 13)
    * la cadena es devuelta a travez del puntero que se le pasa como parametro
    */
    void swinit_uart(void);
    void swputch(unsigned char);
    void swputs(unsigned char *);
    unsigned char swgetch(void);
    void swgets(unsigned char *);

    #endif /* SWUART_H */

swuart.c

Código: [Seleccionar]
#ifndef SWUART_H
    #include "swuart.h"
    #endif

    #if !defined(TXPIN) || !defined(RXPIN) || !defined(TXDIR) || !defined(RXDIR)
    #error No estan definidos los pines
    #else
    #ifndef SWUARTBAUD
    #error Falta definir la velocidad
    #endif

   void swinit_uart(void)
{
#if defined TXONLY
   TXDIR = 0;
#elif defined RXONLY
   RXDIR = 1;
#elif defined TXRX
   TXDIR = 0;
   RXDIR = 1;
#endif
}

void swputch(unsigned char _dato)
{
   unsigned char _bits2 = 8;

   TXPIN = 0;
   __delay_us(BitOutDelay);
   do
   {
TXPIN = _dato & 1;
__delay_us(BitOutDelay);
_dato = _dato >> 1;
_bits2--;
   }
   while (_bits2 > 0);
   TXPIN = 1;
   __delay_us(_BitOutDelay);
}

void swputs(unsigned char *_st)
{
   while (*_st != 0)
   {
swputch(*_st);
_st++;
   }
}

unsigned char swgetch(void)
{
   unsigned char _datain = 0;
   unsigned char _bits2 = 8;

   while (RXPIN == 1);
   __delay_us(StartDelay);
   do
   {
_datain = _datain >> 1;
if (RXPIN == 1) _datain |= 0b10000000;
__delay_us(BitInDelay);
_bits2--;
   }
   while (_bits2 > 0);
   __delay_us(BitOutDelay/2);
   return _datain;
}

void swgets(unsigned char *st)
{
   unsigned char *word;
   unsigned char character;

   word = st;
   do
   {
character = swgetch();
if (character != '\r')
{
   *word = character;
   word++;
}
   }
   while (character != '\r');
   *word = 0;
}
#endif

configurations_bits.c

Código: [Seleccionar]
// PIC16F819 Configuration Bit Settings

#include <xc.h>

// CONFIG
#pragma config FOSC = INTOSCCLK // Oscillator Selection bits (INTRC oscillator; CLKO function on RA6/OSC2/CLKO pin and port I/O function on RA7/OSC1/CLKI pin)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON      // 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 I/O, MCLR internally tied to VDD)
#pragma config BOREN = OFF      // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF        // Low-Voltage Programming Enable bit (RB3/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 (Code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off)
#pragma config CCPMX = RB2      // CCP1 Pin Selection bit (CCP1 function on RB2)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)
Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re: Mini curso "Programación en XC8"
« Respuesta #114 en: 27 de Junio de 2013, 15:48:28 »
Logre que funcione ...es la segunda vez que cometo el mismo error ...la programacion del oscilador !!!!!

    OSCCONbits.IRCF2 = 1; //
    OSCCONbits.IRCF1 = 1; // defino oscilador interno en 8 mhz
    OSCCONbits.IRCF0 = 1; //

estaban fuera del main ...y evidentemente a Proteus no le interesa ....


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

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Mini curso "Programación en XC8"
« Respuesta #115 en: 27 de Junio de 2013, 16:34:32 »
Logre que funcione ...es la segunda vez que cometo el mismo error ...la programacion del oscilador !!!!!

    OSCCONbits.IRCF2 = 1; //
    OSCCONbits.IRCF1 = 1; // defino oscilador interno en 8 mhz
    OSCCONbits.IRCF0 = 1; //

estaban fuera del main ...y evidentemente a Proteus no le interesa ....


Saludos


  Pues no, porque proteus trabaja a la frecuencia que le definas manualmente.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado neto100

  • PIC10
  • *
  • Mensajes: 10
Re: Mini curso "Programación en XC8"
« Respuesta #116 en: 03 de Julio de 2013, 21:17:16 »
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.

Ten cuidado una cosa es LATB y otra muy diferente es PORTB, la primera es colocar datos en el puerto B y la segunda es leer datos del puertoB, oviamente se debe estar configurado el puertoB como salida o sea TRISB = 0; o TRISBbits.TRISB0 = 0, para solo encender el bit 0 del puertoB.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Mini curso "Programación en XC8"
« Respuesta #117 en: 03 de Julio de 2013, 22:06:01 »
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.

Ten cuidado una cosa es LATB y otra muy diferente es PORTB, la primera es colocar datos en el puerto B y la segunda es leer datos del puertoB, oviamente se debe estar configurado el puertoB como salida o sea TRISB = 0; o TRISBbits.TRISB0 = 0, para solo encender el bit 0 del puertoB.

  neto100, no todos los PICs tienen registro LAT. En aquellos que no tienen dicho registro la forma de escribir en el puerto es justamente haciendo

Código: C
  1. PORTB = xxxxx;
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Mini curso "Programación en XC8"
« Respuesta #118 en: 04 de Julio de 2013, 13:47:28 »
Hola.
      Cito post del usuario bigluis en donde comparte dos tutoriales de instalación de Mplab X y XC8,16,y32 en linux
         Saludos.
             Jukinch


Hola amigos en esta ocasion les traigo dos videos. El primero muestra como instalar MPLABX en Linux Mint 14 y el segundo muestra como instalar los compiladores XC8, XC16 Y XC32.

Espero que los Disfruten  :-/


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

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Mini curso "Programación en XC8"
« Respuesta #119 en: 07 de Julio de 2013, 05:45:22 »
PIC: 16F887 a 4Mhz
Solo simulacion: con ISIS 7.10
XC8 v1.12 y MPLABX v1.80

A pesar que el datasheet dice que no es necesario ajustar el registro ANSELH para usar el puerto B como salida...
Código: [Seleccionar]
3.4.1 ANSELH REGISTER
The ANSELH register (Register 3-4) is used to
configure the Input mode of an I/O pin to analog.
Setting the appropriate ANSELH bit high will cause all
digital reads on the pin to be read as ‘0’ and allow
analog functions on the pin to operate correctly.
The state of the ANSELH bits has no affect on digital
output functions. A pin with TRIS clear and ANSELH
set will still operate as a digital output, but the Input
mode will be analog. This can cause unexpected
behavior when executing read-modify-write
instructions on the affected port.


Ha sido necesario ponerlo a 0 para que el siguiente programa corra como debe en la simulacion:
Código: [Seleccionar]

#include <xc.h>

#define _XTAL_FREQ 4000000

// PIC16F887 Configuration Bit Settings
// CONFIG1
#pragma config FOSC = XT        // Oscillator Selection bits (HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = ON       // RE3/MCLR pin function select bit (RE3/MCLR pin function is MCLR)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF      // Brown Out Reset Selection bits (BOR disabled)
#pragma config IESO = ON        // Internal External Switchover bit (Internal/External Switchover mode is enabled)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)
#pragma config LVP = OFF        // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)
// CONFIG2
#pragma config BOR4V = BOR40V   // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT = OFF        // Flash Program Memory Self Write Enable bits (Write protection off)


void main(void)
{
    ANSELH = 0;  //si comentan esto RB5 nunca prende.

    PORTB = 0;  
    TRISB = 0;    

    while (1)
    {
        RB5 = 1;
        RB7 = 1;
        __delay_ms(2000);
        RB5 = 0;
        RB7 = 0;
        __delay_ms(1000);

    }
}

El problema cuando no esta borrado ANSELH es que hace que al ejecutarse RB7=1, este apage al RB5 y por eso nunca lo deja prender.
Talvez sea por que es simulacion o por que no entiendo bien el ingles del datasheet o porque en otra parte dice lo contrario pero esto me ha tenido asi varias horas.

Solo es una advertencia para que no sufran como yo xD, otro dia ya lo probare en fisico.

Porsiacaso lo dejo adjuntado todo para haber si, a los que puedan probarlo, les pasa los mismo en sus proteus.


Por cierto, muy buenos datos que están poniendo por aquí. Se agradece.

Saludos!
« Última modificación: 07 de Julio de 2013, 05:51:23 por jeremylf »


 

anything