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

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

Desconectado marcoj2560456*

  • PIC10
  • *
  • Mensajes: 20
Re: Mini curso "Programación en XC8"
« Respuesta #315 en: 30 de Septiembre de 2015, 17:54:22 »
bueno por lo menos ya se por que no me daba entonces dices tu que por datasheet ? puedo sacar la comunicacion con la lcd y conexion usb y creo mi propia libreria ? muchas gracias por responder estaba acostumbrado a ccs pero me cambia a xc16 cojn mplab x para la comunicacion usb y acceder mejor a los registros... En ccs se me hizo facil configurar la lcd por la libreria que trae pero pense q la libreria de lcd me serviria pero no tenia acceso a los registros del usb no encontre como y segun he visto xc16 es mejor programa... deberian hacer un foro mini curso " Programacion en XC16" seria bastante ayuda ....... una pregunta entonces para configurar los pines de entrada y salida en el pic24f
Código: [Seleccionar]
#define TRISB TRISB
extern volatile unsigned int  TRISB __attribute__((__sfr__));
typedef struct tagTRISBBITS {
  unsigned TRISB0:1;
  unsigned TRISB1:1;
  unsigned TRISB2:1;
  unsigned TRISB3:1;
  unsigned TRISB4:1;
  unsigned TRISB5:1;
  unsigned :1;
  unsigned TRISB7:1;
  unsigned TRISB8:1;
  unsigned TRISB9:1;
  unsigned TRISB10:1;
  unsigned TRISB11:1;
  unsigned :1;
  unsigned TRISB13:1;
  unsigned TRISB14:1;
  unsigned TRISB15:1;
} TRISBBITS;

lo hago si voy a configurar el pin RB0 como entrada
Código: [Seleccionar]
TRISB = 0x0001;
PORTB = 0;
Romanos 10:9-10

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Mini curso "Programación en XC8"
« Respuesta #316 en: 30 de Septiembre de 2015, 18:20:53 »
Es que XC16 es lo mismo que XC8, es igual. es C. no hay diferencias. la unica diferencia que puede haber es como poner el nombre de una interrupcion o algo asi.
XC8/16/32 ofrece el .h con todos los registros (que creo que al poner el include xc.h ya te lo agrega), por eso mismo podes usar cosas como PORTBbits.PORTB1 y creo que lo que copiaste es justamente eso. Por que en ese .h estan definidos. Pero esto es igual para micros de 8 bits o 16 bits.



Para solucionarte un poco mas la vida y que encontres la solucion. Normalmente en las librerias de los LCD (o podria decir cualquier libreria) podes encontrar lo siguiente:

- 1 funcion de inicio, esto permite una configuracion inicial de los puertos etc. Poner los valores iniciales de los pines y luego iniciar el modulo.

Citar
void lcd_init(void)
{
    unsigned char veces;
  // Set inicial de valores de los pines y configuracion de los mismo
    LCDEN = 0;
    LCDRS = 0;
    LCDRW = 0;
    LCDTRISRS = 0;
    LCDTRISRW = 0;
    LCDTRISEN = 0;


    // Comienzo de inicio del modulo    
    __delay_ms(15);
    
    for (veces = 3; veces > 0; veces--)
    {
    lcd_putini(0x30);
    __delay_ms(5);
    }
#if defined(PROTOCOL8BIT)
    lcd_put(0x38,0);                          // Dos lineas, caracter 5x8
#elif defined(PROTOCOL4BIT)
    lcd_putini(0x20);                         // Protocolo de 4 bits
    lcd_put(0x28,0);                          // Dos lineas, caracter 5x8
#endif
    lcd_put(0x08,0);                          // Apagar display, cursor, blink
    lcd_put(0x01,0);                          // Borrar display
    lcd_put(0x06,0);                          // Incrementa posicion, sin shift
}

- Luego hay 1/2 o 3 funciones que son las encargadas de modificar los puertos, y las demas funciones usan esas, como ves en el caso de lcd_init que usa las funciones lcd_put y lcd_putini.

Las funciones que tocan el puerto son:

lcd_put()
lcd_putini()
lcd_busy()

- Las demas funciones son facilidades para usar el LCD, si vos envias un string esta la funcion lcd_puts() que va a enviar 1 por 1 los caracteres al string, haciendo uso de las funciones que nombre anteriormente.

Entonces si sabes que el codigo funciona, y no funciona por que cambiaste de PIC, lo unico que puede afectar eso es como se manejan los puertos o como se leen, o que no estan configurados realmente como se debe.
De esa forma las unicas funciones que deberias "estudiar" e intentar modificar para adaptarla a el PIC24 son esas 3 que nombre antes, y lcd_init() en la parte de la configuracion si es que necesita de algo mas (ejemplo de pasarlo a digital cuando estaban en analogicas, etc )


Eso ya va a disminuir la cantidad de cosas que tenes que revisar y realmente centrarte en lo que necesitas cambiar. Espero que me entiendas a que me refiero. De tener que hacerlo yo tendria que leerme como funciona los puertos del PIC24 que tenes, y proceder a hacer los cambios, que no son muchos (imagino). Espero que lo que dije disminuya la carga de estudiar todo el codigo y te sirva para saber a donde apuntar para modificarlo.
« Última modificación: 30 de Septiembre de 2015, 18:25:04 por KILLERJC »

Desconectado marcoj2560456*

  • PIC10
  • *
  • Mensajes: 20
Re: Mini curso "Programación en XC8"
« Respuesta #317 en: 01 de Octubre de 2015, 08:53:52 »
muchas gracias KILLERJC gracias por responder me pondre a estudiar esa parte si el include xc.h me permite eso puerdo ver todos los registros de mi pic es un 24fj64gb002
Romanos 10:9-10

Desconectado marcoj2560456*

  • PIC10
  • *
  • Mensajes: 20
Re: Mini curso "Programación en XC8"
« Respuesta #318 en: 02 de Octubre de 2015, 12:38:33 »
//// Que esta ocurriendo cuando en xc8 defino:

 #define _XTAL_FREQ 1000000
 #define delay_ms(x)   _delay((unsigned long)((x)*( _XTAL_FREQ/1000.0)))

//// y me da este error y no puedo usar los delay :

LCD.c:35: error: (1098) conflicting declarations for variable "__delay" (C:\Program Files (x86)\Microchip\xc8\v1.35\include\pic.h:150)
(908) exit status = 1

///// como si el _delay no existiera y le doy ctrl + enter y no hay nada sale error como si al compilador le fatara una libreria pero no tengo idea si me pudieran ayudar




Romanos 10:9-10

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Mini curso "Programación en XC8"
« Respuesta #319 en: 02 de Octubre de 2015, 13:31:04 »
el _delay, se incluye cuando agregas el xc.h (que seguro lo tenes en el main, pero esto no se extiende a la libreria.), creo que es tu libreria el archivo LCD.h, si en tu libreria no esta definida la funcion entonces va a tirar error.
Eso o hay 2 definiciones de lo mismo.

Desconectado marcoj2560456*

  • PIC10
  • *
  • Mensajes: 20
Re: Mini curso "Programación en XC8"
« Respuesta #320 en: 02 de Octubre de 2015, 15:34:18 »
si era eso muchisimas gracias KILLERJC ya me da la simulacion,........ otra preguntica si quiero simular en proteus el pic 24fj64gb002 como hago para descargar las librerias del pic lo estaba buscando y no sale
Romanos 10:9-10

Desconectado marcoj2560456*

  • PIC10
  • *
  • Mensajes: 20
Re: Mini curso "Programación en XC8"
« Respuesta #321 en: 02 de Octubre de 2015, 15:47:53 »
estoy utilizando: ISIS Profesional = labcenter electronics 1989-2010. Release 7.9 SP1 (Build 11535) with Advanced Simulation
Romanos 10:9-10

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Mini curso "Programación en XC8"
« Respuesta #322 en: 02 de Octubre de 2015, 15:48:39 »
No se como actualizar las VSM de Proteus sin necesidad de instalar la ultima version de las mismas. Podrias buscar en internet si hay forma de actualizarlas ( suponiendo que no pida exactamente la nueva version )

Desconectado marcoj2560456*

  • PIC10
  • *
  • Mensajes: 20
Re: Mini curso "Programación en XC8"
« Respuesta #323 en: 02 de Octubre de 2015, 16:34:20 »
una pregunta para que sirve este comando :

ANSEL = 0x00;

xq si le quito eso no me da la simulacion en la lcd y si lo pongo si da ue tiene q ver ese comando
Romanos 10:9-10

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Mini curso "Programación en XC8"
« Respuesta #324 en: 02 de Octubre de 2015, 16:49:52 »
En algunos PIC el registro ANSEL sirve para seleccionar si la entrada es digital o analogica.

Y puede incluso funcionar distinto entre PICs, hay PIC que con solo configurar el TRIS como salida ya no hace falta mas nada.
En otros es necesario si o si modificar el ANSEL para que quede como digital.
En tu PIC es distinto:

Citar
10.2     Configuring Analog Port Pins

The AD1PCFG and TRIS registers control the operation of the A/D port pins. Setting a port pin as an analog input also requires that the corresponding TRIS bit be set. If the TRIS bit is cleared (output), the digital output level (VOH or VOL) will be converted.
When reading the PORT register, all pins configured as analog input channels will read as cleared (a low level). Pins configured as digital inputs will not convert an analog input. Analog levels on any pin that is defined as a digital input (including the ANx pins) may cause the
input buffer to consume current that exceeds the device specifications

El regisotr AD1PCFG esta en el pagina 261

1 =  Pin for corresponding analog channel is configured in Digital mode; I/O port read enabled
0 =  Pin configured in Analog mode; I/O port read disabled, A/D samples pin voltage

Y comienza con valores en 0. es decir si esta como entrada ( TRIS en 1 ), va a estar en modo analogico y si lees el PORT vas a leer un 0 siempre, para pasarlo a digital tenes que poner un 1 en el bit que corresponda de ese registro

o ponerlos todos digital con

AD1PCFG |= 0xFFF;

Desconectado marcoj2560456*

  • PIC10
  • *
  • Mensajes: 20
Re: Mini curso "Programación en XC8"
« Respuesta #325 en: 02 de Octubre de 2015, 17:19:44 »
muchismasssss gracias  :-/ KILLERJC ya vi el registro no lo habia visto lo probare por esa razon seguro no leia los puertos como digitales lo probare
Romanos 10:9-10

Desconectado marcoj2560456*

  • PIC10
  • *
  • Mensajes: 20
Re: Mini curso "Programación en XC8"
« Respuesta #326 en: 05 de Octubre de 2015, 11:08:32 »
buenisimo KILLERJC ese era el error ya me funciona la lcd pero encontre otro problema que como yo configuro que funcione a 48MHZ para el usb no funcionaba la lcd asi que fui acomodando los delay hasta q me mostrara el mensaje en pantalla si hice eso se desconfiguro los 48 MHZ ?

mis configuraciones del clock
Código: [Seleccionar]
#pragma config POSCMOD = HS               // Primary Oscillator Select (HS Oscillator mode selected)
#pragma config FCKSM = CSDCMD     
#pragma config FNOSC = PRIPLL           // Initial Oscillator Select (Primary Oscillator with PLL module (XTPLL, HSPLL, ECPLL))
#pragma config PLL96MHZ = ON            // 96MHz PLL Startup Select (96 MHz PLL Startup is enabled automatically on start-up)
#pragma config PLLDIV = DIV5            // USB 96 MHz PLL Prescaler Select (Oscillator input divided by 5 (20 MHz input))
#pragma config IESO = OFF               // Internal External Switchover (IESO mode (Two-Speed Start-up) disabled)
modificacion del delay para que mostrara la lcd el mensaje
Código: [Seleccionar]
#define _XTAL_FREQ 20000000
#define __delay_ms(x) __delay32((unsigned long)((x)*(_XTAL_FREQ/800.0)))
#define __delay_us(x) __delay32((unsigned long)((x)*(_XTAL_FREQ/800000.0)))
Romanos 10:9-10

Desconectado marcoj2560456*

  • PIC10
  • *
  • Mensajes: 20
Re: Mini curso "Programación en XC8"
« Respuesta #327 en: 05 de Octubre de 2015, 12:39:37 »
ahora estoy tratando de configurar la cominicacion spi compre un modulo enc28j60 spi - ethernet y quiero configurar mi pic24fj64gb002 para enviarle un dato a un PLC allen bradley si alguien lo ha hecho antes me podria guiar por donde ? descargue las librerias de MLA de microchip y salen unas de tcp/ip pero no se usarlas
Romanos 10:9-10

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Mini curso "Programación en XC8"
« Respuesta #328 en: 05 de Octubre de 2015, 18:07:28 »
Primero que nada, felicidades por haber logrado portar la libreria, parece algo simple, tal ves no lo es, pero esto te va a ayudar en cualquier otra libreria


Tu codigo original
Código: C
  1. #define _XTAL_FREQ 20000000
  2. #define __delay_ms(x) __delay32((unsigned long)((x)*(_XTAL_FREQ/10000.0)))  
  3. #define __delay_us(x) __delay32((unsigned long)((x)*(_XTAL_FREQ/10000000.0)))


Bueno no voy a meterme demasiado con el tema del oscilador.
En el PLL debe entrar 4Mhz, asi que supongo que tenes un cristal de 20Mhz. Esto general 96Mhz los cuales tenes 48Mhz para el USB y como maximo 32Mhz en tu CPU
Esos 32 es por hay hay un postscaler fijo de 1:3 ( divido 3 )

http://ww1.microchip.com/downloads/en/DeviceDoc/39700c.pdf

Entonces por un lado el USB tiene 48Mhz, por el otro tu CPU tiene 32Mhz (suponiendo que no lo dividas aun mas, y que es el maximo), esto quiere decir que la frecuencia que entra a la CPU es:

Código: C
  1. #define _XTAL_FREQ 32000000

Y solo eso deberias cambiar (entonces cuando cambias de frecuencia en tu programa solo tocas eso). Microchip provee las funcion __delay_ms() y __delay_us().
Lo primero que haria es comentar esos 2 macros y probarlo. Si aun asi no funciona. Vamos a crear los macros para estos PICs

Una instruccion en un PIC16/18 tarda 4/Fosc , en ejecutarse, mientras que en un PIC24/dsPIC lo hace en 2/Fosc.
Entonces para 32Mhz, 1us en ciclos seria:

1us / ( 2/Fosc) = 16 ciclos
3us  = 16 ciclos * 3 =48 ciclos

Podriamos modificar un poco mas nuestra formula, ya que 1us y 2 son constantes, y nuestra unica "variable" seria Fosc

1us / (2/Fosc) = 1*10^-6 / ( 2/Fosc ) = Fosc / 2*1*10^6 = Fosc / 2000000
Eso por cada microsegundos

Código: C
  1. #define __delay_us(x) __delay32((unsigned long)((x)*(_XTAL_FREQ/2000000.0)))

Si usamos la formula y quiero 3 microsegundos quedaria:   3  *( 32000000 / 2000000.0)   =   3 *  ( 16 ) = 48, que es exactamente lo que necesitabamos y decirle con __delay32() que espere 48 ciclos.
De la misma forma podemos hacer la otra para los milisegundos, en ese caso lo unico que cambia es nuestra formula que tenemos 1ms ( 1*10^-3 ) en ves de 1us, la relacion entre 1ms/1us = 1000
Por lo tanto lo unico que cambia es que no vamos a tener 2.000.000 sino 2.000 en el denominador

Código: C
  1. #define __delay_us(x) __delay32((unsigned long)((x)*(_XTAL_FREQ/2000.0)))

Felicidades si es que Microchip no te dio las funciones, ( que creo que te las da por que __delay32 es una de ellas) entonces podes crear tus propias.
Solo recordar que _delay32 no acepta menos de 12 ciclos.

--------------------------------

Si por alguna razon decidis dividir la frecuencia que entra a la CPU o por ejemplo utilizas un cristal de 20Mhz directo por que no te importa el USB, lo unico que debes cambiar es
Código: C
  1. #define _XTAL_FREQ 20000000

Por la frecuencia que entra en la CPU.
« Última modificación: 05 de Octubre de 2015, 18:52:05 por KILLERJC »

Desconectado marcoj2560456*

  • PIC10
  • *
  • Mensajes: 20
Re: Mini curso "Programación en XC8"
« Respuesta #329 en: 05 de Octubre de 2015, 18:53:04 »
que excelente gracias por la explicación KILLERJC gracias por toda la ayuda de verdad ...  :-/
Romanos 10:9-10


 

anything