TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Suky en 10 de Agosto de 2010, 22:17:56

Título: Tutorial C18
Publicado por: Suky en 10 de Agosto de 2010, 22:17:56
He re-diseñado el tutorial básico de C18 para mejorar la presentación del pdf, dado que el anterior era creado a partir de lo escrito en el foro (Copy&Paste) :mrgreen: También he agregado algunos conceptos nuevos como para que se entienda un poco mejor como trabajar con este compilador.  ;-)


(http://a.imageshack.us/img248/4865/revista02.png) (http://www.mediafire.com/file/s4vijzsxyn857ba/Tutorial_C18.pdf)

... Descarga ... (http://www.mediafire.com/file/s4vijzsxyn857ba/Tutorial_C18.pdf)

Saludos!

PD: Dentro de lo mejor que hay, es la presentación!  :D :D
Título: Re: Tutorial C18
Publicado por: migsantiago en 10 de Agosto de 2010, 22:38:25
Muy bueno Suky. Ahora el que no sabe C18 es porque no quiere.  :mrgreen:
Título: Re: Tutorial C18
Publicado por: jhozate en 10 de Agosto de 2010, 22:47:54
al rato lo descargo, muchas gracias suky, he tenido cierto recelo de probar el C18 porque no si voy a encontrar la comodidad a la que me acostumbŕe con las librerias de ccs  :oops: :(
En todo caso :-/ :-/ :-/
Título: Re: Tutorial C18
Publicado por: willynovi en 10 de Agosto de 2010, 22:59:49
gracias Suky, resulta mas cómodo la versión PDF  ;-)

Lo vi por arriba y se ve completo, tengo pendiente el tema del uso del LCD que no he logrado hacerlo andar, ya creo que es problema del LCD y no de firmware.
Voy a estudiar el ejemplo que das a ver que sale.

Saludos,
Título: Re: Tutorial C18
Publicado por: Marioguillote en 10 de Agosto de 2010, 23:05:33
Gracias Maestro!  :)

Saludos!
Mario
Título: Re: Tutorial C18
Publicado por: Suky en 10 de Agosto de 2010, 23:09:17
gracias Suky, resulta mas cómodo la versión PDF  ;-)

Lo vi por arriba y se ve completo, tengo pendiente el tema del uso del LCD que no he logrado hacerlo andar, ya creo que es problema del LCD y no de firmware.
Voy a estudiar el ejemplo que das a ver que sale.

Saludos,

Willinovi, por aquí (http://www.todopic.com.ar/foros/index.php?topic=17017.msg251661#msg251661) realicé una librería para LCD al estilo CCS, puedes configurar cualquier pin para trabajar con él  ;-)


Saludos y muchas gracias a todos!  ;-)
Título: Re: Tutorial C18
Publicado por: AKENAFAB en 11 de Agosto de 2010, 00:18:18

Gracias!  :-/ :-/
Título: Re: Tutorial C18
Publicado por: El_cuarenton en 11 de Agosto de 2010, 00:32:57
Suky, gracias por compartir tu trabajo.
Título: Re: Tutorial C18
Publicado por: Veguepic en 11 de Agosto de 2010, 01:38:06
Gracias Suky!
Título: Re: Tutorial C18
Publicado por: gary_servin en 11 de Agosto de 2010, 01:49:01
Excelente manual Suky! Ahora mismo lo bajo! Muchas Gracias!
Título: Re: Tutorial C18
Publicado por: bmb en 11 de Agosto de 2010, 10:38:38
Muchas gracias Suki, se ve muy interesante y completo el manual.

Saludos!
Título: Re: Tutorial C18
Publicado por: dogflu66 en 11 de Agosto de 2010, 11:23:36
Gracias suky, ya estoy revisando la actualización.
Título: Re: Tutorial C18
Publicado por: RALF2 en 11 de Agosto de 2010, 11:38:10
Gracias SUKY excelente material!  :mrgreen:
Título: Re: Tutorial C18
Publicado por: Cryn en 17 de Agosto de 2010, 10:15:23
Como siempre luciéndote con los aportes suky!

gracias mil!!!!!

 :-/ :-/
Título: Re: Tutorial C18
Publicado por: fabianjsm en 18 de Agosto de 2010, 00:52:37
Muy bueno Suky, felicitaciones!
Parece que te tomaste el trabajo de editarlo en LaTeX, puede ser?
Título: Re: Tutorial C18
Publicado por: Suky en 18 de Agosto de 2010, 04:13:21
Muy bueno Suky, felicitaciones!
Parece que te tomaste el trabajo de editarlo en LaTeX, puede ser?

Sip... Mi practica de latex  :mrgreen:


Saludos!
Título: Re: Tutorial C18
Publicado por: Nocturno en 18 de Agosto de 2010, 04:19:39
Magnífico trabajo, Suky. Felicidades y gracias por compartirlo.
Título: Re: Tutorial C18
Publicado por: Palomino86 en 25 de Agosto de 2010, 22:22:25
He estado tratando de hechar a andar el ejemplo con LCD paralelo pero mis intentos han sido fallidos.... :(

me marca este error y no se a que se deba

Error - could not find definition of symbol 'ComandXLCD' in file 'C:\Micro_c\Objects\lcd_paralelo.o'.


Título: Re: Tutorial C18
Publicado por: Suky en 25 de Agosto de 2010, 23:33:17
He estado tratando de hechar a andar el ejemplo con LCD paralelo pero mis intentos han sido fallidos.... :(

me marca este error y no se a que se deba

Error - could not find definition of symbol 'ComandXLCD' in file 'C:\Micro_c\Objects\lcd_paralelo.o'.




Por lo visto has declarado la función ComandXLCD pero en ningún lado la definiste (Las instrucciones que la componen).


Saludos!
Título: Re: Tutorial C18
Publicado por: Palomino86 en 26 de Agosto de 2010, 15:12:44
tuve que realizar lo siguiente para que me funcionara....

#include <p18f4610.h>
#include <delays.h>
#include <xlcd.h>

#pragma config OSC=HS,FCMEN=OFF,IESO=OFF
#pragma config PWRT=ON,BOREN=OFF,BORV=0,WDT=OFF,WDTPS=32768
#pragma config MCLRE=ON,LPT1OSC=OFF,PBADEN=OFF,CCP2MX=PORTBE
#pragma config STVREN=OFF,LVP=OFF,XINST=OFF,DEBUG=OFF
#pragma config CP0=OFF,CP1=OFF,CP2=OFF,CP3=OFF,CPB=OFF
#pragma config WRT0=OFF,WRT1=OFF,WRT2=OFF,WRT3=OFF,WRTB=OFF,WRTC=OFF
#pragma config EBTR0=OFF,EBTR1=OFF,EBTR2=OFF,EBTR3=OFF,EBTRB=OFF

void DelayFor18TCY(void);
void DelayPORXLCD(void);
void DelayXLCD(void);
void gotoxyXLCD(unsigned char x,unsigned char y);

void main(void)
{
    ADCON1=15;
    OpenXLCD(FOUR_BIT & LINE_5X10);      //Iniciamos el LCD
    BusyXLCD();
    WriteCmdXLCD(0X06);               //Nos aseguramos incremento de direccion, display fijo
    BusyXLCD();
    WriteCmdXLCD(0X0C);               //Encendemos LCD
    gotoxyXLCD(1,1);
    putrsXLCD("Probando Lcd");
   gotoxyXLCD(1,2);               //Pasamos a la linea 2
   putrsXLCD("Por Palomino");
   while(1)
   {
    }
}


void DelayFor18TCY(void)
{
   Delay10TCYx(2);
}
void DelayPORXLCD(void)
{
   Delay1KTCYx(15);
}
void DelayXLCD(void)
{
   Delay1KTCYx(2);
}
void gotoxyXLCD(unsigned char x,unsigned char y)      //Ubica cursor en (x=Posicion en linea; y= Numero de Linea)
{
   unsigned char direccion;
   
   if (y != 1)
      direccion=0x10;
   else
      direccion=0;

   direccion += x-1;
   WriteCmdXLCD(0x80 | direccion);
}
Título: Re: Tutorial C18
Publicado por: Palomino86 en 26 de Agosto de 2010, 15:17:22
Declare pero no defini.....

Segun yo ya estan definidas en las librerias. Adjunto una imagen de como tengo las librerias...

Saludos
Título: Re: Tutorial C18
Publicado por: Suky en 26 de Agosto de 2010, 15:32:34
En el mensaje de error dice que dentro del archivo lcd_paralelo.c no esta definida la función CommandXLCD.. Seguramente en algún lado del programa la llamabas y está no existía.


Saludos!
Título: Re: Tutorial C18
Publicado por: Palomino86 en 26 de Agosto de 2010, 15:57:36
Si tienes razon... jejeje ya me di cuenta donde estaba el problema

Gracias
Título: Re: Tutorial C18
Publicado por: Palomino86 en 31 de Agosto de 2010, 20:00:57
Hola que tal;

Alguien me podría echar la mano con el ejemplo de Modificación de la librerías..... ya tengo rato batallando y no logro cambiarlo del puerto B al puerto D, estoy usando un pic18F4610.... y me queda de la siguiente manera

Codigo:

#include <p18f4610.h>
#include <delays.h>
#include <xlcd.h>

#pragma config OSC=HS,FCMEN=OFF,IESO=OFF
#pragma config PWRT=ON,BOREN=OFF,BORV=0,WDT=OFF,WDTPS=32768
#pragma config MCLRE=ON,LPT1OSC=OFF,PBADEN=OFF,CCP2MX=PORTBE
#pragma config STVREN=OFF,LVP=OFF,XINST=OFF,DEBUG=OFF
#pragma config CP0=OFF,CP1=OFF,CP2=OFF,CP3=OFF,CPB=OFF
#pragma config WRT0=OFF,WRT1=OFF,WRT2=OFF,WRT3=OFF,WRTB=OFF,WRTC=OFF
#pragma config EBTR0=OFF,EBTR1=OFF,EBTR2=OFF,EBTR3=OFF,EBTRB=OFF

void DelayFor18TCY(void);
void DelayPORXLCD(void);
void DelayXLCD(void);
void gotoxyXLCD(unsigned char x,unsigned char y);
void comandXLCD(unsigned char a);

void main(void)
{
    ADCON1=15;
    OpenXLCD(FOUR_BIT & LINE_5X10);      //Iniciamos el LCD
    comandXLCD(0x06);
    comandXLCD(0x0C);
    gotoxyXLCD(1,1);
    putrsXLCD("Lcd");
   gotoxyXLCD(1,2);               //Pasamos a la linea 2
   putrsXLCD("Palomino");
   while(1)
   {
    }
}

void DelayFor18TCY(void)
{
   Delay10TCYx(2);
}
void DelayPORXLCD(void)
{
   Delay1KTCYx(15);
}
void DelayXLCD(void)
{
   Delay1KTCYx(2);
}

void comandXLCD(unsigned char a)
{
   BusyXLCD();
   WriteCmdXLCD(a);
}

void gotoxyXLCD(unsigned char x,unsigned char y)      //Ubica cursor en (x=Posicion en linea; y= Numero de Linea)
{
unsigned char direccion;
   
   if (y != 1)
      direccion=0x10;
   else
      direccion=0;

   direccion += x-1;
   WriteCmdXLCD(0x80 | direccion);
}

Librería:

#define UPPER

/* DATA_PORT defines the port to which the LCD data lines are connected */
#define DATA_PORT      PORTD
#define TRIS_DATA_PORT TRISD
   
/* CTRL_PORT defines the port where the control lines are connected.
 * These are just samples, change to match your application.
 */
#define RW_PIN   LATDbits.LATD1   /* PORT for RW */
#define TRIS_RW  TRISDbits.TRISD1    /* TRIS for RW */
#define RS_PIN   LATDbits.LATD0   /* PORT for RS */
#define TRIS_RS  TRISDbits.TRISD0    /* TRIS for RS */
#define E_PIN    LATDbits.LATD2   /* PORT for D  */
#define TRIS_E   TRISDbits.TRISD2    /* TRIS for E  */



Saludos
Título: Re: Tutorial C18
Publicado por: Suky en 31 de Agosto de 2010, 20:14:39
Cargaste los archivos fuentes al proyecto para re-generar los archivos objects?


Título: Re: Tutorial C18
Publicado por: ASTROCAR en 31 de Agosto de 2010, 20:45:51
Hola Suky, Acabo de bajar tu tutorial sobre c18 me parece muy bien de tu parte y grascias por tu tiempo dedicado a ayudar a todos en el foro yo no trabajo con c pero hoy buscare el instalador de c18 para hacer mis primeros ejemplo con ese compilador.

Saludos y proton les comento mis avances.
Atten.
Alexander Santana.
Barcelona-Venezuela.
Título: Re: Tutorial C18
Publicado por: Palomino86 en 01 de Septiembre de 2010, 13:03:46
Tienes razón Suky, Gracias

Adjunto el  programa de ejemplo pero con el pic18f4610 con las siguientes notas para que quede para la posteridad. Saludos

Nota: Por default los pines del Puerto B son los que se utilizan para
la comunicacion del display paralelo. Para cambiar de puerto se deben
realizar los siguientes pasos:

1.- En la librería xlcd.h se descomenta la parte "#define UPPER"

2.- Se cambian los siguientes parametros por el puerto a utilizar:
#define DATA_PORT      PORTx
#define TRIS_DATA_PORT TRISx
#define RW_PIN   LATxbits.LATx0      (PORT for RW)
#define TRIS_RW  TRIxbits.TRISx0    (TRIS for RW)
#define RS_PIN   LATxbits.LATx1      (PORT for RS)
#define TRIS_RS  TRISxbits.TRISx1    (TRIS for RS)
#define E_PIN    LATxbits.LATx2      (PORT for D)
#define TRIS_E   TRISxbits.TRISx2    (TRIS for E)
-donde "x" es el puerto a utilizar

3.- Agregar los siguientes archivos en Source File:
*busyxlcd.c *openxlcd.c *putsxlcd.c *readaddr.c *readdata.c
*setcgram.c *setddram.c *wcmdxlcd.c *writdata.c
que se encuentran en C:\MCC18\src\pmc_common\XLCD
Título: Re: Tutorial C18
Publicado por: Suky en 01 de Septiembre de 2010, 13:39:42
Tienes razón Suky, Gracias

Hay que leer más detenidamente el tutorial, sino no tiene razón de ser!  :mrgreen:


Saludos!
Título: Re: Tutorial C18
Publicado por: meledu en 01 de Septiembre de 2010, 14:23:03
como dogflu tu tambien? pero si tu haces marabillas con el pic basic del psi


Gracias suky, ya estoy revisando la actualización.
Título: Re: Tutorial C18
Publicado por: Suky en 01 de Septiembre de 2010, 14:24:59
como dogflu tu tambien? pero si tu haces marabillas con el pic basic del psi


Gracias suky, ya estoy revisando la actualización.

Hay que expandir conocimientos y no considerar que has alcanzado tu limite  ;-)

Saludos!
Título: Re: Tutorial C18
Publicado por: meledu en 01 de Septiembre de 2010, 14:26:15
Hola muchacho , buen dia ,saben he descargado el manual pero al tratar de abrirlo me dice que esta dañado.
Título: Re: Tutorial C18
Publicado por: Suky en 01 de Septiembre de 2010, 15:27:43
Hola muchacho , buen dia ,saben he descargado el manual pero al tratar de abrirlo me dice que esta dañado.
De muchacho a muchacho: Intenta nuevamente, puede ser algún error del servidor.


Saludos!
Título: Re: Tutorial C18
Publicado por: meledu en 02 de Septiembre de 2010, 10:33:31
Perdoname amigo (si esque te puedo llamar amigo) no fue mi intencion pasarme de la confianza o faltar el respeto, lo que en verdad queria decir o escribir era HOLA MUCHACHOS , hablandoles a todos en general , puesto que somos una comunidad quize escribirles con algo de confianza pero repito no fue mi intencion faltar el respeto.
en cuanto al pdf , tube que cambiarle el nombre y ponerle el .pdf al final y alli si lo abrio sin problemas .
PD. espero ya no comerme las letras
Título: Re: Tutorial C18
Publicado por: Suky en 02 de Septiembre de 2010, 11:20:34
No hay problema  ;-)


Saludos!
Título: Re: Tutorial C18
Publicado por: meledu en 02 de Septiembre de 2010, 16:54:26
Amigo Suky una pregunta, estoy leyendo tu manual y he instalado el c18 he copiado y pegado el codigo del primer ejemplo, pero no se como hacer para compilarlo, tambien quisiera saber en que carpeta me va a poner el .hex gracias
me sale este mensaje pero nose que significa.

Release build of project `C:\proyectosC18\ejemplo01.mcp' started.
Thu Sep 02 15:08:01 2010
----------------------------------------------------------------------
Clean: Deleting intermediary and output files.
Clean: Done.
Build aborted.  The project contains no source files.
----------------------------------------------------------------------
Release build of project `C:\proyectosC18\ejemplo01.mcp' failed.
Thu Sep 02 15:08:01 2010
----------------------------------------------------------------------
BUILD FAILED
Título: Re: Tutorial C18
Publicado por: Suky en 02 de Septiembre de 2010, 17:19:40
Amigo Suky una pregunta, estoy leyendo tu manual y he instalado el c18 he copiado y pegado el codigo del primer ejemplo, pero no se como hacer para compilarlo, tambien quisiera saber en que carpeta me va a poner el .hex gracias
me sale este mensaje pero nose que significa.

Release build of project `C:\proyectosC18\ejemplo01.mcp' started.
Thu Sep 02 15:08:01 2010
----------------------------------------------------------------------
Clean: Deleting intermediary and output files.
Clean: Done.
Build aborted.  The project contains no source files.
----------------------------------------------------------------------
Release build of project `C:\proyectosC18\ejemplo01.mcp' failed.
Thu Sep 02 15:08:01 2010
----------------------------------------------------------------------
BUILD FAILED


Hay que seguir los pasos del primer capitulo para crear un proyecto. Ayúdense con las imágenes. El Hex se genera en la carpeta del proyecto, o si se crea una carpeta en Directories ans Search Paths/Output Directory, se creará allí.

Saludos!
Título: Re: Tutorial C18
Publicado por: meledu en 02 de Septiembre de 2010, 17:29:28
si tienes razon no havia seguido bien los pasos pero ahora me ha salido otro problema te lo muestro aver si me puedes ayudar


Release build of project `C:\proyectosC18\ejemplo01.mcp' started.
Thu Sep 02 15:27:59 2010
----------------------------------------------------------------------
Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "C:\MCC18\bin\mcc18.exe" -p=18F2550 /i"C:\MCC18\h" "primerC.c" -fo="primerC.o" -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
Executing: "C:\MCC18\bin\mplink.exe" /l"C:\MCC18\lib" /k"C:\MCC18\lkr" "primerC.o" /z__MPLAB_BUILD=1 /o"ejemplo01.cof" /M"ejemplo01.map" /W
MPLINK 4.1, Linker
Copyright (c) 2006 Microchip Technology Inc.
Error - linker command file required.
Errors    : 1

Link step failed.
----------------------------------------------------------------------
Release build of project `C:\proyectosC18\ejemplo01.mcp' failed.
Thu Sep 02 15:28:00 2010
----------------------------------------------------------------------
BUILD FAILED
Título: Re: Tutorial C18
Publicado por: Suky en 02 de Septiembre de 2010, 18:08:48
Puede ser que como estás usando una versión vieja de C18, tengas que agregar el proyecto el archivo *.lkr. En el tutorial también se explica como.


Saludos!
Título: Re: Tutorial C18
Publicado por: meledu en 02 de Septiembre de 2010, 18:39:07
tengo el c18 3.10 y esa parte no la entendi bie , te agradeceria me ayudes con un poco de detalle.
Título: Re: Tutorial C18
Publicado por: Suky en 02 de Septiembre de 2010, 21:17:41
tengo el c18 3.10 y esa parte no la entendi bie , te agradeceria me ayudes con un poco de detalle.

Vas a View/Project. Aparece una nueva ventana donde indica la estructura de tu proyecto con los archivos que contiene, en un principio deberia aparecer algo como la primer imagen. En esa ventana vas a Linker Scrip, click con el botón derecho del mouse, y add Files. Alli vas a C:/MCC18/Lkr y seleccionar el microcontrolador que estas utilizando. Ahora debería quedar como la segunda imagen.

Con eso ya debería de compilar.


Saludos!
Título: Re: Tutorial C18
Publicado por: meledu en 03 de Septiembre de 2010, 18:18:29
Perdonen pero otra vez yo, ya he logrado compilar bien los ejemplos pero aun me quedan algunas otras dudas, como cambio la velocidad del reloj?? no he podido darme cuenta aun en que parte esta definida la velocidad, solo he visto que defines xt_xt,
otra cosa mas que debo saber para que c18 nomse sea muy lioso, esque de los registros del pic estoy bien verde, yo siempre he usado pic simulator ide y me ha ido bien pero veo que en los tutos de c18 manejan varios registros y posiciones de memoria.
Título: Re: Tutorial C18
Publicado por: Suky en 03 de Septiembre de 2010, 20:23:33
Perdonen pero otra vez yo, ya he logrado compilar bien los ejemplos pero aun me quedan algunas otras dudas, como cambio la velocidad del reloj?? no he podido darme cuenta aun en que parte esta definida la velocidad, solo he visto que defines xt_xt,
otra cosa mas que debo saber para que c18 nomse sea muy lioso, esque de los registros del pic estoy bien verde, yo siempre he usado pic simulator ide y me ha ido bien pero veo que en los tutos de c18 manejan varios registros y posiciones de memoria.

¿Para que necesitas definir la velocidad que trabaja tu microcontrolador? Pues hay entre algunas cosas de ellas es para realizar demoras, calcular el registro para determinar la velocidad de Baud Rate, ect. Pues eso en C18 lo controla por completo el programador, debe desempolvar la calculadora y hacer algunos cálculos.  ;-)

Respecto al tema del uso de registros, C18 define cada bit de los registros SFR mediante una estructura, otorgando pleno control del microcontrolador al programador.   Pero por lo general se usa cuando se trabaja con las salidas I/O del microcontrolador, después para configuración de perifericos hay muchas funciones implementadas. Documentación de éstas se puede encontrar en MCC18/doc/periph-lib.


Saludos!
Título: Re: Tutorial C18
Publicado por: meledu en 04 de Septiembre de 2010, 11:53:47
Osea yo me refiero a la frecuencia del xtal por ejemplo si quiero trabajar con un cristal de 12 Mhz o tal vez uno de 20 MHz,
en basic lo definia con DEFINE CLOCK_FREQUENCY = 20 si voy a trabajar con un cristal de 20 Mhz,esoq uiero saber en c18 como hacerlo, porque por ejemplo como se a que frecuencia ponerle en el preoteus,talves este muy calro el manual pero supongo que hago tanta preguntas ya que apenas llevo 3 dias con esto del C
Título: Re: Tutorial C18
Publicado por: Suky en 04 de Septiembre de 2010, 13:51:04
Es que en C18 no defines a que frecuencia trabaja el microcontrolador. Eso lo sabes tu, el que programa y puedes manejarlo a gusto.

Creo que es una mala costumbre de otros compiladores  :mrgreen:

Lo que si puedes hacer es por ejemplo definir tu la frecuencia con el nombre que te guste, por ejemplo:

Código: C
  1. #include <delays.h>
  2. #define FCY 20000000UL
  3. #define __delay_100us()         Delay100TCYx(FCY/4000000UL)
  4. #define __delay_2ms()           Delay1KTCYx(FCY/2000000UL)

o

Código: C
  1. #include <delays.h>
  2. #define GetSystemClock()                20000000UL
  3. #define __delay_100us()         Delay100TCYx(GetSystemClock()/4000000UL)
  4. #define __delay_2ms()           Delay1KTCYx(GetSystemClock()/2000000UL)

Pero todo lo controlas vos. No lo hace por si solo el compilador.


Saludos!
Título: Re: Tutorial C18
Publicado por: Palomino86 en 06 de Septiembre de 2010, 20:05:33
Hola a todos;

Tengo una duda con respecto a la comunicación serial..... Es posible enviar y recibir datos por medio de otros pines que no sean RC6 y RC7 del PIC18f4610?

Y si es posible como se hace?

Saludos
Título: Re: Tutorial C18
Publicado por: Suky en 06 de Septiembre de 2010, 20:41:53
Hola a todos;

Tengo una duda con respecto a la comunicación serial..... Es posible enviar y recibir datos por medio de otros pines que no sean RC6 y RC7 del PIC18f4610?

Y si es posible como se hace?

Saludos

Tienes la librería sw_uart. Para seleccionar que pines utilizar en la comunicación debes agregar a tu proyecto todos los archivos fuentes y modificarlos, en el inicio está la definición de cada pin.


Saludos!
Título: Re: Tutorial C18
Publicado por: Palomino86 en 06 de Septiembre de 2010, 21:46:01
Me van a decir que que pregunton soy jejeje pero mas vale preguntar que quedarse con la duda....

Agrege los archivos como me dijiste Suky; pero me marca el siguiente error.....

Make: The target "C:\Micro_c\Objects\Minsa.o" is out of date.
Executing: "C:\MCC18\bin\mcc18.exe" -p=18F4610  /i"C:\MCC18\h" "Minsa.c" -fo="C:\Micro_c\Objects\Minsa.o" -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
C:\Micro_c\MINSA\Minsa.c:23:Warning [2066] type qualifier mismatch in assignment
Make: The target "C:\Micro_c\Objects\getsuart.o" is out of date.
Executing: "C:\MCC18\bin\mcc18.exe" -p=18F4610  /i"C:\MCC18\h" "C:\MCC18\src\pmc_common\SW_UART\getsuart.c" -fo="C:\Micro_c\Objects\getsuart.o" -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
Make: The target "C:\Micro_c\Objects\putsuart.o" is out of date.
Executing: "C:\MCC18\bin\mcc18.exe" -p=18F4610  /i"C:\MCC18\h" "C:\MCC18\src\pmc_common\SW_UART\putsuart.c" -fo="C:\Micro_c\Objects\putsuart.o" -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
Make: The target "C:\Micro_c\Objects\openuart.o" is out of date.
Executing: "C:\MCC18\mpasm\mpasmwin.exe" /q /p18F4610 "C:\MCC18\src\pmc_common\SW_UART\openuart.asm" /l"C:\Micro_c\Outputs\openuart.lst" /e"C:\Micro_c\Objects\openuart.err" /o"C:\Micro_c\Objects\openuart.o"
Make: The target "C:\Micro_c\Objects\readuart.o" is out of date.
Executing: "C:\MCC18\mpasm\mpasmwin.exe" /q /p18F4610 "C:\MCC18\src\pmc_common\SW_UART\readuart.asm" /l"C:\Micro_c\Outputs\readuart.lst" /e"C:\Micro_c\Objects\readuart.err" /o"C:\Micro_c\Objects\readuart.o"
Make: The target "C:\Micro_c\Objects\uartdata.o" is out of date.
Executing: "C:\MCC18\mpasm\mpasmwin.exe" /q /p18F4610 "C:\MCC18\src\pmc_common\SW_UART\uartdata.asm" /l"C:\Micro_c\Outputs\uartdata.lst" /e"C:\Micro_c\Objects\uartdata.err" /o"C:\Micro_c\Objects\uartdata.o"
Make: The target "C:\Micro_c\Objects\writuart.o" is out of date.
Executing: "C:\MCC18\mpasm\mpasmwin.exe" /q /p18F4610 "C:\MCC18\src\pmc_common\SW_UART\writuart.asm" /l"C:\Micro_c\Outputs\writuart.lst" /e"C:\Micro_c\Objects\writuart.err" /o"C:\Micro_c\Objects\writuart.o"
Make: The target "C:\Micro_c\Outputs\MINSA.cof" is out of date.
Executing: "C:\MCC18\bin\mplink.exe" /l"C:\MCC18\lib" /k"C:\MCC18\bin\LKR" "C:\MCC18\lkr\18f4610.lkr" "C:\Micro_c\Objects\Minsa.o" "C:\Micro_c\Objects\getsuart.o" "C:\Micro_c\Objects\putsuart.o" "C:\Micro_c\Objects\openuart.o" "C:\Micro_c\Objects\readuart.o" "C:\Micro_c\Objects\uartdata.o" "C:\Micro_c\Objects\writuart.o" /o"C:\Micro_c\Outputs\MINSA.cof" /M"C:\Micro_c\Outputs\MINSA.map" /W
MPLINK 4.30.01, Linker
Copyright (c) 2009 Microchip Technology Inc.
Error - could not find definition of symbol 'DelayRXHalfBitUART' in file 'C:\Micro_c\Objects\openuart.o'.
Errors    : 1

Link step failed.
BUILD FAILED: Mon Sep 06 18:38:02 2010

Y tengo otra duda.... Como configuro los baudios para con el UART... es igual que el USART?


Me siento muy novato en c18... :(
Saludos
Título: Re: Tutorial C18
Publicado por: Suky en 06 de Septiembre de 2010, 21:57:48
Como es por software, la espera para fijar el valor de un bit de la trama o leerlo debes generarlo el usuario segun el baudrate elegido. Esto está explicado en los archivos fuentes:
Código: ASM
  1. ;************************************************************************
  2. ;*      Function Name:  ReadUART                                        *
  3. ;*      Return Value:   char: received data                             *
  4. ;*      Parameters:     void                                            *
  5. ;*      Description:    This routine waits for a start bit, and then    *
  6. ;*                      reads all 8-bits.                               *
  7. ;*      Special Note:   The user must provide two routines:             *
  8. ;*                      DelayRXHalfBit():                               *
  9. ;*                        DelayRXHalfBit should have:                   *
  10. ;*                              5 Tcy for overhead                      *
  11. ;*                              2 Tcy call to DelayRXHalfBit            *
  12. ;*                              ? Tcy                                   *
  13. ;*                              2 Tcy for return from DelayRXHalfBit    *
  14. ;*                              = (((2*OSC_FREQ)/(8*BAUDRATE))+1)/2 Tcy *
  15. ;*                      DelayRXBit():                                   *
  16. ;*                        DelayRXBit should have:                       *
  17. ;*                              10 Tcy for overhead                     *
  18. ;*                              2 Tcy call to DelayRXBit                *
  19. ;*                              ? Tcy                                   *
  20. ;*                              2 Tcy for return from DelayRXBit        *
  21. ;*                              = (((2*OSC_FREQ)/(4*BAUDRATE))+1)/2 Tcy *
  22. ;************************************************************************
  23. ;************************************************************************
  24. ;*      Function Name:  WriteUART                                       *
  25. ;*      Return Value:   void                                            *
  26. ;*      Parameters:     data: byte to send out the UART                 *
  27. ;*      Description:    This routine sends a byte out the TXD pin.      *
  28. ;*      Special Note:   The user must provide a routine:                *
  29. ;*                      DelayTXBit():                                   *
  30. ;*                        DelayTXBit should have:                       *
  31. ;*                              8 Tcy for overhead                      *
  32. ;*                              2 Tcy call to DelayTXBit                *
  33. ;*                              ? Tcy                                   *
  34. ;*                              2 Tcy for return from DelayTXBit        *
  35. ;*                      = (((2*OSC_FREQ)/(4*BAUDRATE))+1)/2  Tcy        *
  36. ;************************************************************************


Entonces en el main.c o en el archivo principal, al igual que para la librería de XLCD, tienes que hacer:

Código: C
  1. void DelayTXBit(){
  2.      // Generar delay correspondiente.
  3. }
  4.  
  5. void DelayRXBit(){
  6.      // Generar delay correspondiente.
  7. }
  8.  
  9. void DelayRXHalfBit(){
  10.      // Generar delay correspondiente.
  11. }


Saludos!
Título: Re: Tutorial C18
Publicado por: migsantiago en 07 de Septiembre de 2010, 10:42:28
Genial eso del UART por software.  :-/
Título: Re: Tutorial C18
Publicado por: Palomino86 en 07 de Septiembre de 2010, 20:49:33
Hola;

Estoy usando las formulas para darle el correspondiente valor al delay para que funcione bien el puerto UART pero me arroja basura......

Estoy usando un cristal de 20 Mhz y los baudios son 9600, pero no logro hecharlo a andar... me arroja basura.... Hay algo mas que tenga que considerar en los calculos?

Saludos
Título: Re: Tutorial C18
Publicado por: Suky en 07 de Septiembre de 2010, 22:00:09
Hola;

Estoy usando las formulas para darle el correspondiente valor al delay para que funcione bien el puerto UART pero me arroja basura......

Estoy usando un cristal de 20 Mhz y los baudios son 9600, pero no logro hecharlo a andar... me arroja basura.... Hay algo mas que tenga que considerar en los calculos?

Saludos

Puedes simularlo en MPLAB SIM o Proteus para ver que hayas generado correctamente las demoras.


Saludos!
Título: Re: Tutorial C18
Publicado por: komun_roji en 08 de Septiembre de 2010, 05:01:57
Hola a todos!!!

Era para haceros una pregunta sobre las funciones de comunicación del c18 mediante el puerto serie rs-232; la usart.h.

He andao cacharreando con ellas, y mas o menos las domino ya todas, pero me surge un problema con la getUSART, le tienes q pasar una direccion para q guarde el array que va a leer y un numero de caracteres concreto para ella.

Ando detras de un proyecto en el q los datos a leer por el micro dependeran de la respuesta de un modem a un comandos AT, es decir, que el numero de caracteres sera variable, estoy intentando inventarme una función q cuando llegue al fin de linea me delimite el nº pero tengo un problema con el numero de datos no es correcto, como vereis en el programa cuando hago el paso de int a unsigned char me parece q no se correcto. Creo q hay esta uno de los problemas, q seguro q he metido mas la pata,pero eso como lo podria hacer?¿ Ando trabajando con la HPC EXLPLORER BOARD. Aqui os dejo el programa:

//*main*//
void main(void){
char array_main[];
int i;
unsigned char p;
ADCON1=0x0F; 
TRISD = 0;
PORTD=0xFF;
Open1USART( USART_TX_INT_OFF  &    //sin interrupciones de transmision
             USART_RX_INT_OFF  &   //interrupciones on / off   
             USART_ASYNCH_MODE &   //modo asincrono
             USART_EIGHT_BIT   &   //8bit
             USART_CONT_RX     &   //recepcion-envio continuo
             USART_BRGH_HIGH,51 );
// velocidad oscilador 8mhz, baud =9600//
while (1){
if (Busy1USART()==0){
       putrs1USART("\na la espera de datos\n");
         while (Read1USART()!=0x0A){
         i++;
          }
       PORTD = i;  //para q se me iluminen los led con el numero de datos
       p = (unsigned char) i;
       putrs1USART("\nnumero de caracteres recibido\n");
       gets1USART(array_main, p);
       putrs1USART("\nconexion valida\n");
                 puts1USART(array_main);
     
      }
}
}

Gracias por adelantado!!
Título: Re: Tutorial C18
Publicado por: Khronos_Nieto en 08 de Septiembre de 2010, 07:38:20
Muchas gracias amigo Suky por compartir este valioso manual.. :-/ :-/ :-/!!!

Me he imprimido el libro completo y es una maravilla, estoy aprendiendo perfectamente C18 desde cero gracias a tu ayuda.

Un saludo y enhorabuena....!!

Título: Re: Tutorial C18
Publicado por: Suky en 08 de Septiembre de 2010, 09:58:27
komun_roji, el módem como final de transmisión te envía un 0x0A o 0x0D? Puedes quedarte en un while hasta recibir alguno de estos caracteres.


Saludos!
Título: Re: Tutorial C18
Publicado por: Palomino86 en 08 de Septiembre de 2010, 13:13:38
Que tal Suky?

Aqui molestando nuevamente con preguntas, mira ya lo pude hechar a andar la comunicacion serie con las siguientes demoras en Proteus:

void DelayTXBitUART(void)
{
   Delay10TCYx(50);
}
 
void DelayRXHalfBitUART(void)
{
     Delay10TCYx(25);
}

void DelayRXBitUART(void)
{
    Delay10TCYx(50);
}


Pero al momento de correrlo en fisico me arroja basura en el display...

Estoy demasiado acostumbrado a usar PBP y en ese lenguaje si he podido echarlo a andar... Voy a ponder el ejemplo de como lo hago en Basic para ver si alguien puede resolver mi duda...

En Basic:

DIS_SER                VAR PORTB.4           'Pin de comunicacion serial
N9600                    CON 16468               'Velocidad de 9,600 bps para el display serie LCD de 4 X 20.   (En fisico me corre con esta configuración)
'N9600                   CON 84                    ' (En Proteus me corre con esta configuración)

SEROUT2 DIS_SER,N9600,["Hola Mundo"]


Con la constante de  84 se corre perfectamente en proteus y con la constante 16468 se corre perfectamente en fisico...

Saludos
Título: Re: Tutorial C18
Publicado por: Suky en 08 de Septiembre de 2010, 14:05:08
Que cristal estas usando? Dado que para esto debería de andar tanto en Proteus como en lo real, salvo que configures algo mal, o proteus o el hardware.


Saludos!
Título: Re: Tutorial C18
Publicado por: Palomino86 en 08 de Septiembre de 2010, 14:32:50
Estoy usando un cristal de 20MHz y estoy configurando de esta manera el pic:

#pragma config OSC=HS,FCMEN=OFF,IESO=OFF
#pragma config PWRT=ON,BOREN=OFF,BORV=0,WDT=OFF,WDTPS=32768
#pragma config MCLRE=ON,LPT1OSC=OFF,PBADEN=OFF,CCP2MX=PORTBE
#pragma config STVREN=OFF,LVP=OFF,XINST=OFF,DEBUG=OFF
#pragma config CP0=OFF,CP1=OFF,CP2=OFF,CP3=OFF,CPB=OFF
#pragma config WRT0=OFF,WRT1=OFF,WRT2=OFF,WRT3=OFF,WRTB=OFF,WRTC=OFF
#pragma config EBTR0=OFF,EBTR1=OFF,EBTR2=OFF,EBTR3=OFF,EBTRB=OFF
Título: Re: Tutorial C18
Publicado por: Suky en 08 de Septiembre de 2010, 15:41:36
En teoría debería ser:

Delay10TCYx(52);

y

Delay10TCYx(26);


Luego como siempre hay que utilizar OpenUart para inicializar los pines y luego enviar/recibir datos.

Más vueltas que esas no hay, quedará revisar hardware o configuración del soft que recibe los datos por parte de la PC.

Saludos!
Título: Re: Tutorial C18
Publicado por: Palomino86 en 08 de Septiembre de 2010, 16:41:05
Mi codigo queda de la siguiente manera:

#include <p18f4610.h>

#include <delays.h>      //Libreria para los retardos
#include <stdlib.h>      //Libreria para conversiones a string
#include <stdio.h>
#include <sw_uart.h>

#pragma config OSC=HS,FCMEN=OFF,IESO=OFF
#pragma config PWRT=ON,BOREN=OFF,BORV=0,WDT=OFF,WDTPS=32768
#pragma config MCLRE=ON,LPT1OSC=OFF,PBADEN=OFF,CCP2MX=PORTBE
#pragma config STVREN=OFF,LVP=OFF,XINST=OFF,DEBUG=OFF
#pragma config CP0=OFF,CP1=OFF,CP2=OFF,CP3=OFF,CPB=OFF
#pragma config WRT0=OFF,WRT1=OFF,WRT2=OFF,WRT3=OFF,WRTB=OFF,WRTC=OFF
#pragma config EBTR0=OFF,EBTR1=OFF,EBTR2=OFF,EBTR3=OFF,EBTRB=OFF

void DelayTXBitUART(void);
void DelayRXBitUART(void);
void DelayRXHalfBitUART(void);

//char x='a';
char x[20];

void main(void)
{
x[0]='H';x[1]='O';x[2]='L';x[3]='A';x[4]=' ';x[5]='M';x[6]='U';x[7]='N';x[8]='D';x[9]='O';x[10]=' ';
   OpenUART();
   Delay1KTCYx(200);
   putsUART(x);
   //WriteUART(x);
   //putsUSART("Hola Mundo");
   while(1){}
}

void DelayTXBitUART(void)
{
   Delay10TCYx(52);
}
 
void DelayRXHalfBitUART(void)
{
     Delay10TCYx(26);
}

void DelayRXBitUART(void)
{
    Delay10TCYx(52);
}

 

Si lo anterior esta bien...no se entonces que este haciendo mal.... Lo mas seguro es que sea algo que se me este olvidando configurar en el display como dices tu Suky. Cheque cuales son las diferencias en basic entre trabajar con una constante de 84 y 16468 y la diferencia esta entre lo que llaman Bit 14 (Conversion).

Saludos!!

Y gracias Suky por todas las atenciones jejeje siento que te he estado dando mucha lata por aqui. Saludos
Título: Re: Tutorial C18
Publicado por: Palomino86 en 08 de Septiembre de 2010, 19:44:34
Hola que tal Suky;

Ya se que esta pasando pero no se como solucionarlo.

He estado checando el programa por Hyperterminal y los datos me llegan perfectamente bien y pues en proteus la simulación ni se diga. Lo que pasa que el display que estoy usando de es comunicación serial pero ocupo que trabaje en modo invertido, con esto te quiero decir que no ocupo MAX232 para que me realice los cambios de estados, el problema es que no se como hacerlo por software.

Saludos
Título: Re: Tutorial C18
Publicado por: Suky en 08 de Septiembre de 2010, 20:28:13
Hola que tal Suky;

Ya se que esta pasando pero no se como solucionarlo.

He estado checando el programa por Hyperterminal y los datos me llegan perfectamente bien y pues en proteus la simulación ni se diga. Lo que pasa que el display que estoy usando de es comunicación serial pero ocupo que trabaje en modo invertido, con esto te quiero decir que no ocupo MAX232 para que me realice los cambios de estados, el problema es que no se como hacerlo por software.

Saludos

Uff! En ese caso hay que cambiar el código fuente, o a cada dato que se envie hacerle un ~  para invertir la lógica de sus bits.

O sea:

x=0x5A;
WriteUART(~x);

Envía un 0xA5.

Saludos!
Título: Re: Tutorial C18
Publicado por: Palomino86 en 09 de Septiembre de 2010, 14:48:26
Alguien sabe como usar la configuracion invertida de TTL para el puerto UART?

Saludos
Título: Re: Tutorial C18
Publicado por: Palomino86 en 09 de Septiembre de 2010, 16:13:04
Si lo invierto me marca error....


Código:
#include <p18f4610.h>

#include <delays.h>      //Libreria para los retardos
#include <stdlib.h>      //Libreria para conversiones a string
#include <stdio.h>
#include <sw_uart.h>
#include <string.h>

#pragma config OSC=HS,FCMEN=OFF,IESO=OFF
#pragma config PWRT=ON,BOREN=OFF,BORV=0,WDT=OFF,WDTPS=32768
#pragma config MCLRE=ON,LPT1OSC=OFF,PBADEN=OFF,CCP2MX=PORTBE
#pragma config STVREN=OFF,LVP=OFF,XINST=OFF,DEBUG=OFF
#pragma config CP0=OFF,CP1=OFF,CP2=OFF,CP3=OFF,CPB=OFF
#pragma config WRT0=OFF,WRT1=OFF,WRT2=OFF,WRT3=OFF,WRTB=OFF,WRTC=OFF
#pragma config EBTR0=OFF,EBTR1=OFF,EBTR2=OFF,EBTR3=OFF,EBTRB=OFF

void DelayTXBitUART(void);
void DelayRXBitUART(void);
void DelayRXHalfBitUART(void);
void init(void);
void inicia_LCD(void);

char x[20];

void main(void)
{
   x[0]='H';x[1]='O';x[2]='L';x[3]='A';x[4]=' ';x[5]='M';x[6]='U';x[7]='N';x[8]='D';x[9]='O';x[10]=' ';
   Delay1KTCYx(3000);
    OpenUART();
   putsUART(~x);
   //WriteUART(~x);
   while(1){}
}

void DelayTXBitUART(void)
{
   //Delay10TCYx(52);
   Delay10TCYx(52);
}
 
void DelayRXHalfBitUART(void)
{
     //Delay10TCYx(26);
   Delay10TCYx(26);
}

void DelayRXBitUART(void)
{
    //Delay10TCYx(52);
   Delay10TCYx(52);
}
 

Error:

Make: The target "C:\Micro_c\Objects\Minsa.o" is out of date.
Executing: "C:\MCC18\bin\mcc18.exe" -p=18F4610  /i"C:\MCC18\h" "Minsa.c" -fo="C:\Micro_c\Objects\Minsa.o" -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
C:\Micro_c\MINSA\Minsa.c:30:Error [1140] integer type required for bitwise NOT operator
Halting build on first failure as requested.
BUILD FAILED: Thu Sep 09 13:11:49 2010
Título: Re: Tutorial C18
Publicado por: meledu en 09 de Septiembre de 2010, 17:57:22
Haola amigos nuevamente yo, me pueden decir que es exactamente isr, esque estoy en la parte de las interrupciones y he encontrado esto   ext_isr(){      dice que es una funcion de interrupcion externa, pero porque pone ISR.
Título: Re: Tutorial C18
Publicado por: Suky en 09 de Septiembre de 2010, 18:02:44
Si lo invierto me marca error....

La inversión es a una variable, no a un string, como intentas hacer en este caso. Lo correcto sería x[0]=~x[0];



Haola amigos nuevamente yo, me pueden decir que es exactamente isr, esque estoy en la parte de las interrupciones y he encontrado esto   ext_isr(){      dice que es una funcion de interrupcion externa, pero porque pone ISR.
Rutina de Servicio de Interrupcion.  ;-)

Saludos!
Título: Re: Tutorial C18
Publicado por: Palomino86 en 09 de Septiembre de 2010, 21:53:26
Esta comunicación serial del puerto UART con TTL invertido me esta dando un dolor de cabeza......

Aun no logro hacerla funcionar...
Título: Re: Tutorial C18
Publicado por: Palomino86 en 10 de Septiembre de 2010, 13:45:23
Como invertir la señal TTL por medio de software? :-/......
Título: Re: Tutorial C18
Publicado por: Suky en 10 de Septiembre de 2010, 13:52:41
Como invertir la señal TTL por medio de software? :-/......

Para invertir la lógica es con ~
Título: Re: Tutorial C18
Publicado por: Palomino86 en 10 de Septiembre de 2010, 16:42:49

Creo que no me estoy dando a entender con lo que quiero hacer jejeje..... y disculpen las molestias que les he ocasionado; pero ahora voy tratar de decirlo con mas calma; ya que me siento bien frustraado de no hacer jalar mi display en C cuando en Basic si lo logro hacer; pero el problema es que me pidieron cambiar de lenguaje y pos lo tengo que hacer en C jejeje.

Ahi les va mas o menos lo que quiero hacer.

Lo que pasa que con el puerto Uart configurado por software si logro realizar la comunicación serial en Proteus, de hecho lo visualizo en una Terminal Virtual. A esa terminal la configuro en modo normal y me despliega bien el mensaje. Hasta ahi no hay ningun problema. El problema es que el display me trabaja de diferente manera.

Lo que yo busco hacer es que cuando configure la Terminal Virtual en modo Inverted me despliegue perfectamente el mensaje que le estoy enviando, ya que con esto aseguro el correcto funcionamiento del display.

En Basic si hago lo siguiente:


S9600 CON 84  (Configuracion a 9600 baudios en modo normal del terminal virtual)

SEROUT2 DIS_SER,S9600,["Hola Mundo"]  (Despliega el Hola Mundo en modo normal del terminal virtual)



y con esto:

N9600 CON 16468  (Configuracion a 9600 baudios en modo inverted del terminal virtual)

SEROUT2 DIS_SER,N9600,["Hola Mundo"]  (Despliega el Hola Mundo en modo inverted del terminal virtual)



Ahora si creo que plasme bien la idea jeejeje

Suky lo he intentado con ~ y no me funciona... habra alguna manera para hacer lo que cito en este mensaje en C18 ejejejje me siento frustrado... un display me esta ganando jeje
Título: Re: Tutorial C18
Publicado por: Palomino86 en 11 de Septiembre de 2010, 12:29:09
Hola que tal aqui les dejo en imagenes lo que busco realizar:

La primer imagen es lo que se realiza en C18 con el puerto UART y la segunda es lo que prentendo hacer.

Saludos
Título: Re: Tutorial C18
Publicado por: Suky en 11 de Septiembre de 2010, 14:57:46
Como es algo especial, te toca modificar el código fuente de la librería por software de Usart. Donde se coloca un 1, poner un 0 y viceversa.


Saludos!
Título: Re: Tutorial C18
Publicado por: Palomino86 en 13 de Septiembre de 2010, 16:12:54
Hola Suky;

No tendras un programa de ejemplo de comunicacion de bit a bit en C18?

Saludos
Título: Re: Tutorial C18
Publicado por: Suky en 13 de Septiembre de 2010, 18:53:16
La lógica sería totalmente invertida? Si es así, puedes realizar una copia de seguridad de OpenUART.asm, writeUART.asm y readUART.asm, y reemplazarlo por:

Código: ASM
  1. include <P18CXXX.INC>
  2.  
  3. SWTXD           equ     PORTB           ; Transmit pin port and pin
  4. SWTXDpin        equ     4
  5. TRIS_SWTXD      equ     TRISB           ; Transmit pin tris and pin
  6. SWRXD           equ     PORTB           ; Receive pin port and pin
  7. SWRXDpin        equ     5
  8. TRIS_SWRXD      equ     TRISB           ; Receive pin tris and pin
  9.  
  10.         EXTERN  DelayRXHalfBitUART
  11.         EXTERN  DelayRXBitUART
  12.         EXTERN  DelayTXBitUART
  13.         EXTERN  uartdata
  14.         EXTERN  BitCount
  15.  
  16. UARTCODE        CODE
  17. ;********************************************************************
  18. ;*      Function Name:  OpenUART                                    *
  19. ;*      Return Value:   void                                        *
  20. ;*      Parameters:     void                                        *
  21. ;*      Description:    This routine configures the I/O pins for    *
  22. ;*                      software UART.                              *
  23. ;********************************************************************
  24. OpenUART
  25.  
  26.         banksel SWTXD
  27.         bcf             TRIS_SWTXD,SWTXDpin     ; Make TXD an output
  28.         bcf             SWTXD,SWTXDpin          ; Make TXD high
  29.         banksel SWRXD
  30.         bsf             TRIS_SWRXD,SWRXDpin     ; Make RXD an input
  31.         bcf             SWRXD,SWRXDpin          ; Make RXD high
  32.         return
  33.  
  34.         GLOBAL  OpenUART
  35.        
  36.         END


Código: ASM
  1. include <P18CXXX.INC>
  2.  
  3. SWTXD           equ     PORTB           ; Transmit pin port and pin
  4. SWTXDpin        equ     4
  5. TRIS_SWTXD      equ     TRISB           ; Transmit pin tris and pin
  6. SWRXD           equ     PORTB           ; Receive pin port and pin
  7. SWRXDpin        equ     5
  8. TRIS_SWRXD      equ     TRISB           ; Receive pin tris and pin
  9.  
  10.         EXTERN  DelayRXHalfBitUART
  11.         EXTERN  DelayRXBitUART
  12.         EXTERN  DelayTXBitUART
  13.         EXTERN  uartdata
  14.         EXTERN  BitCount
  15.  
  16. UARTCODE        CODE
  17. ;************************************************************************
  18. ;*      Function Name:  WriteUART                                       *
  19. ;*      Return Value:   void                                            *
  20. ;*      Parameters:     data: byte to send out the UART                 *
  21. ;*      Description:    This routine sends a byte out the TXD pin.      *
  22. ;*      Special Note:   The user must provide a routine:                *
  23. ;*                      DelayTXBit():                                   *
  24. ;*                        DelayTXBit should have:                       *
  25. ;*                              8 Tcy for overhead                      *
  26. ;*                              2 Tcy call to DelayTXBit                *
  27. ;*                              ? Tcy                                   *
  28. ;*                              2 Tcy for return from DelayTXBit        *
  29. ;*                      = (((2*OSC_FREQ)/(4*BAUDRATE))+1)/2  Tcy        *
  30. ;************************************************************************
  31. WriteUART
  32.         banksel uartdata
  33.         ; Retrieve character from stack.
  34.         movlw   0xFF
  35.         movff   PLUSW1,uartdata
  36.  
  37.         movlw   0x09                    ; Set bit counter for 9 bits
  38.         movwf   BitCount
  39.         bcf     STATUS,C        ; Send start bit (carry = 0)
  40.         banksel SWTXD
  41.         goto    SendStart
  42. SendBit
  43.         banksel uartdata
  44.         rrcf    uartdata,F              ; Rotate next bit into carry
  45. SendStart
  46.         banksel SWTXD
  47.         btfss   STATUS,C                ; Set or clear TXD pin according
  48.         bsf     SWTXD,SWTXDpin  ; to what is in the carry
  49.         btfsc   STATUS,C
  50.         bcf     SWTXD,SWTXDpin
  51.         call    DelayTXBitUART          ; Delay for 1 bit time
  52.         banksel BitCount
  53.         decfsz  BitCount,F              ; Count only 9 bits
  54.         goto    SendBit
  55.         banksel SWTXD
  56.         bcf     SWTXD,SWTXDpin  ; Stop bit is high
  57.         call    DelayTXBitUART          ; Delay for stop bit
  58.         return
  59.  
  60.         GLOBAL  WriteUART
  61.  
  62.         END


Código: ASM
  1. include <P18CXXX.INC>
  2.  
  3. SWTXD           equ     PORTB           ; Transmit pin port and pin
  4. SWTXDpin        equ     4
  5. TRIS_SWTXD      equ     TRISB           ; Transmit pin tris and pin
  6. SWRXD           equ     PORTB           ; Receive pin port and pin
  7. SWRXDpin        equ     5
  8. TRIS_SWRXD      equ     TRISB           ; Receive pin tris and pin
  9.  
  10.         EXTERN  DelayRXHalfBitUART
  11.         EXTERN  DelayRXBitUART
  12.         EXTERN  DelayTXBitUART
  13.         EXTERN  uartdata
  14.         EXTERN  BitCount
  15.  
  16. UARTCODE        CODE
  17. ;************************************************************************
  18. ;*      Function Name:  ReadUART                                        *
  19. ;*      Return Value:   char: received data                             *
  20. ;*      Parameters:     void                                            *
  21. ;*      Description:    This routine waits for a start bit, and then    *
  22. ;*                      reads all 8-bits.                               *
  23. ;*      Special Note:   The user must provide two routines:             *
  24. ;*                      DelayRXHalfBit():                               *
  25. ;*                        DelayRXHalfBit should have:                   *
  26. ;*                              5 Tcy for overhead                      *
  27. ;*                              2 Tcy call to DelayRXHalfBit            *
  28. ;*                              ? Tcy                                   *
  29. ;*                              2 Tcy for return from DelayRXHalfBit    *
  30. ;*                              = (((2*OSC_FREQ)/(8*BAUDRATE))+1)/2 Tcy *
  31. ;*                      DelayRXBit():                                   *
  32. ;*                        DelayRXBit should have:                       *
  33. ;*                              10 Tcy for overhead                     *
  34. ;*                              2 Tcy call to DelayRXBit                *
  35. ;*                              ? Tcy                                   *
  36. ;*                              2 Tcy for return from DelayRXBit        *
  37. ;*                              = (((2*OSC_FREQ)/(4*BAUDRATE))+1)/2 Tcy *
  38. ;************************************************************************
  39. ReadUART
  40.  
  41.         banksel BitCount
  42.         movlw   0x08                    ; Count 8-bits
  43.         movwf   BitCount
  44.         banksel SWRXD
  45. WaitChar
  46.         btfss   SWRXD,SWRXDpin          ; Detect a start bit (low)
  47.         goto    WaitChar
  48.         call    DelayRXHalfBitUART      ; Delay until middle of start bit
  49.         banksel SWRXD
  50.         btfss   SWRXD,SWRXDpin          ; If not still low, then go back
  51.         goto    WaitChar                ; and wait for start bit
  52. GetChar                                 ; Loop to get all 8-bits
  53.         call    DelayRXBitUART          ; Delay a full bit for middle of
  54.         banksel SWRXD
  55.         btfsc   SWRXD,SWRXDpin          ; Set or clear the carry bit
  56.         bcf             STATUS,C        ; according to the state of the
  57.         btfss   SWRXD,SWRXDpin          ; RXD I/O pin
  58.         bsf             STATUS,C
  59.         banksel uartdata
  60.         rrcf    uartdata,F              ; Rotate the carry into data
  61.         decfsz  BitCount,F              ; Loop for 8-bits
  62.         goto    GetChar
  63.         call    DelayRXBitUART          ; Delay a full bit time, middle of start bit
  64.         call    DelayRXHalfBitUART      ; Delay half bit for end of start bit
  65.         nop
  66.         banksel uartdata
  67.         movf   uartdata,W,BANKED
  68.         return                          ; Return received character
  69.  
  70.         GLOBAL  ReadUART
  71.  
  72.         END


Saludos!



Título: Re: Tutorial C18
Publicado por: Miquel_S en 17 de Septiembre de 2010, 12:38:56
Hola compañeros, estoy empezando con C18 y leyendo el tutorial de Suky me encuentro con cosas que no entiendo exactamente para que se usan:
 
k=0xA5;
a=0xF0 & k;  // a=0xA0; k=0xA5

k=0x03;
a=0x40 | k;  // a=0x43; k=0x43

¿No podemos declarar a con el valor deseado desde un principio?

Perdon por la torpeza, pero si empiezo a dejar misterios al principio mal andamos.

Gracias
            Miquel_S
Título: Re: Tutorial C18
Publicado por: Suky en 17 de Septiembre de 2010, 13:27:52
Es un ejemplo, cuando quieres cargar un una variable en 2 puertos, por ejemplo: Cargar la variable Data, haciendo que el nible bajo se cargue en b0-b3 y el nible alto en c4-c7.

Como lo harías? Una forma es usando mascaras como las propuestas:

Código: C
  1. LATB=PORTB|(Data&0x0F);
  2. LATC=PORTC|(Data&0xF0);

Entre otras muchas utilidades.


Saludos!
Título: Re: Tutorial C18
Publicado por: Miquel_S en 17 de Septiembre de 2010, 13:36:13
Gracias Suky ya lo empiezo a ver mas claro  :mrgreen:
Título: Re: Tutorial C18
Publicado por: dhmejia en 26 de Septiembre de 2010, 15:10:47
Hola suky, excelente el manual de C18, muchas gracias.

Ahora mismo necesito declarar un char de 256 bytes para un buffer de entrada de datos seriales (char buffer[256];), en el tema "2.8. SECCIONES" del manual explicas claramente como hacerlo pero no entiendo la advertencia final que haces después del ejemplo en la página 26, cito:

"ATENCIÓN: Se debe tener precaución al trabajar de esta manera, ya que, una variable multi byte no puede pertenecer a dos bancos consecutivos".

La verdad no entiendo la advertencia, de que otra manera maneja el compilador las variables de más de 256 bytes si no es uniendo dos bancos consecutivos de RAM?

gracias por la ayuda.

saludos.
Título: Re: Tutorial C18
Publicado por: Suky en 26 de Septiembre de 2010, 16:11:56
El problema surge cuando modificamos los bancos creados en el linker, y unimos dos o más. Si no tenemos cuidado y una variable int, short o long queda por ejemplo:

Código: C
  1. long 0x15367580;

Y en la memoria de ram queda:

Código: [Seleccionar]
0x80  -->  0x00FF
0x75  -->  0x0100
0x36  -->  0x0101
0x15  -->  0x0102

Ocupa dos bancos consecutivos. Al trabajarlo en el código, seguro habrá problemas  :?


Saludos!
Título: Re: Tutorial C18
Publicado por: dhmejia en 27 de Septiembre de 2010, 21:59:27
me queda claro, gracias por la respuesta.  Aunque al declarar la nueva zona de memoria como PROTECT imagino que el problema se elimina.

saludos,
Título: Re: Tutorial C18
Publicado por: Suky en 27 de Septiembre de 2010, 22:04:23
Con protect solo el usuario podrá asignar el espacio de memoria, pero si crea una estructura y pasa lo mismo, ocurrirá el problema.


Saludos!
Título: Re: Tutorial C18
Publicado por: PICYO en 29 de Septiembre de 2010, 19:17:57

Hola! recién he decidido manejar el C18. Usaba - y uso- como no CCS. Pero quiero aprender a usar este compilador. La verdad es que para hacer cualquier cosa es el dole de complicado ( mas que nada por buscar la información) y menos mal de este manual que he visto por aqui !

Pues como no, quiero implementar el C18 en el Proteus. Ya lo tengo implementado en el CCS,  y ahora le toca al C18. He visto la herramienta de debugger en MpLab, pero no me hace caso ( también cabe la posibilidad que haga algo mal en el programa... pero es raro ya que he cojido trozos de ejemplo del manual de presente hilo).
Como no me hace caso el debugger, pues quiero usar mi Proteus separado, e integrarlo como otra gente de otro hilo en esta foro, hizo con el CCS. Pero me faltan datos de todo... ¿ Cómo se integra ?
Gracias!
Título: Re: Tutorial C18
Publicado por: Suky en 29 de Septiembre de 2010, 19:32:02
En proteus desarrollas el esquema, lo guardas en la carpeta del proyecto, y en MPLAB en debugger seleccionas Proteus VSM. Luego allí queda cargar el esquema que ya has desarrollado y listo.


Saludos!
Título: Re: Tutorial C18
Publicado por: PICYO en 29 de Septiembre de 2010, 22:16:50
pues sigue sin irme... lo que pretendo es lo mas simple del mundo, encender 4 leds del puerto A, en el que tambien pongo un pulsador:

Código: C
  1. #include <p18f4550.h>
  2. #include <stdio.h>
  3. /////////////////////////////////////FUSES/////////////////////////////////
  4. #pragma config FOSC = HS
  5. #pragma config CPUDIV = OSC1_PLL2
  6. #pragma config VREGEN = OFF
  7.  
  8.  
  9. void main(void){
  10.  
  11. PORTA=0xF80;
  12. TRISA=0b00001000;          // RA4 es input
  13.  
  14.  
  15.   while(1){  
  16.        
  17.  
  18.    
  19.  
  20.    if (PORTAbits.RA4==1)
  21.         {
  22.                 PORTAbits.RA0=1;
  23.                 PORTAbits.RA1=1;
  24.                 PORTAbits.RA2=1;
  25.                 PORTAbits.RA3=1;
  26.        
  27.  
  28.      }
  29.  
  30.  }
  31. }
Los #fuses ( #pragma config en C18) he puesto esos, ya que no quiero usar nada del USB ( por cierto mi pic es el 18f4550). Al simular con proteus ( al menos asi lo veia cuando lo hacia con CCS) no hace mucho caso de eso, ya que directamente es uno el que ha de poner la F de oscilación del pic en el Proteus ( en opciones del pic). Asi que , aun mas... no entiendo que no se encienda ni un led...
Título: Re: Tutorial C18
Publicado por: Suky en 29 de Septiembre de 2010, 23:47:20
Hay que configurar el módulo analógico para dejar los pines como digitales, creo que es lo que está faltando.

Saludos!
Título: Re: Tutorial C18
Publicado por: PICYO en 30 de Septiembre de 2010, 19:52:27
Si ;)
Además me he vuelto loco por poner LATA=0 y debajo LAT=1 ( bueno... era el isis quien se volvía loco realmenet). Lo que me ha aparecido una duda:

Qué diferencia hay entre LATA=0 y PORTA=0 ?
He leído en el data que PORTA "se usa" para averiguar el estado del puerto, y LATA para modificarlo. La verdad, no he entendido muy bien que eso fuera así, y como se ve, he modificado el programa para hacer tanto con LATA=0  y después PORTA=0. Obtengo el mismo resultado, y no entiendo muy bien por qué.
Código: C
  1. #include <p18f4550.h>
  2. #include <stdio.h>
  3. /////////////////////////////////////FUSES///////////////////////////////// #pragma config  -> las opciones se ven en el help del C18, y luego en el ìc apropiado
  4. #pragma config FOSC = HS
  5. #pragma config CPUDIV = OSC1_PLL2
  6. #pragma config VREGEN = OFF
  7.  
  8.  
  9. void main(void){
  10. //////// Direccionamiento de registros pic
  11. //PORTA=0xF80
  12. PORTA=0x00;
  13. //LATA=0;
  14. PORTD=0xF83;
  15. ADCON1=0x0F;
  16. TRISA=0b00010000;          // RA4 es input
  17. TRISB=0;
  18. TRISD=0b00010000;
  19. ADCON1=0xFF;
  20.  
  21. PORTAbits.RA0=0;
  22. PORTAbits.RA1=0;
  23. PORTAbits.RA2=0;
  24. PORTAbits.RA3=0;
  25.  
  26. PORTDbits.RD0=0;
  27. PORTDbits.RD1=0;
  28. PORTDbits.RD2=0;
  29. PORTDbits.RD3=0;
  30.  
  31.   while(1){  
  32.      
  33.    if (PORTDbits.RD4==0)
  34.         {
  35.        //LATAbits.LATA1=1;
  36.                 PORTDbits.RD0=1;
  37.                 PORTDbits.RD1=1;
  38.                 PORTDbits.RD2=1;
  39.                 PORTDbits.RD3=1;
  40.      }
  41.    else{
  42.         PORTDbits.RD0=0;
  43.                 PORTDbits.RD1=0;
  44.                 PORTDbits.RD2=0;
  45.                 PORTDbits.RD3=0;
  46.     }
  47.  
  48. if (PORTAbits.RA4==0)
  49.         {
  50.                         PORTAbits.RA0=1;
  51.                 PORTAbits.RA1=1;
  52.                 PORTAbits.RA2=1;
  53.                 PORTAbits.RA3=1;
  54.      }
  55.    else{        
  56.                 PORTAbits.RA0=0;
  57.                 PORTAbits.RA1=0;
  58.                 PORTAbits.RA2=0;
  59.                 PORTAbits.RA3=0;
  60.     }
  61.  }
  62. }

otra cosa. Tal como uso CCS, hago tal como " #byte PORTA=0xF80 para direccionar la variable con la dirección ( valga la redundancia) real del pic. Aqui lo de PORTA=0xF80 seria dar un valor de inicio al registro bastante raro ( seguramente por eso también se enecendian y apagaban los leds a lo loco). He ido a ver qué dirección hay en el archivo de cabecera.. y no veo ninguna dirección! Si que está la estructura montada de cada puerto, pero no veo direcciones. Cómo direcciona pues C18 ?
Título: Re: Tutorial C18
Publicado por: Suky en 30 de Septiembre de 2010, 22:51:27
Como bien dice el datasheet, para leer el estado del puerto se debe usar PORTx y para escribir LATx. Puede que para modificar el puerto sea casi igual usar uno u otro, pero no para la lectura, el valor correcto será el que se encuentre en PORTx.
Por lo que tengo entendido, al escribir usando PORTx, para saber el actual valor del puerto hay que esperar un ciclo, y esto no pasa usando LATx.

mmm.. Las direcciones se encuentran en C:\MCC18\src\traditional\proc, pero ¿porqué definir algo que ya está definido? ¿Y si además se puede acceder a todos sus bit?


Saludos!
Título: Re: Tutorial C18
Publicado por: PICYO en 01 de Octubre de 2010, 11:51:54
Ok ! No creí que fuera en esa carpeta!

Aprendí a gestionar los puertos  a través de la memoria RAM. Defino los registros PORTx y TRISx  y PORTx como #byte y se almacenan esas variables en la RAM, en la dirección real del PIC.

Veo que en C18 no hace falta hacerlo asi, como dices, ya está definido. En cuanto a LATx, quizás en mas interesante un cambio inmediato, y usar pues LATA en vez de PORTA.
Título: Re: Tutorial C18
Publicado por: PICYO en 01 de Octubre de 2010, 14:28:58
brrr! Tengo un problema al simular en el Proteus cuando cargo el LCD. Los leds funcionan perfecto al pulsar el switch, pero cuando configuro el LCD, se bloquea el simulador, lo he compriobadop al pulsar sobre el switch y no obtener respuesta.
No he querido cambiar el puerto ( de momento), asi que uso el puerto B. Me he bajado el PDF de Microchip C18 Libraries, y desde ahí he tratado de hacerlo solo, viendo que te dan las funciones del XLCD y sus prototipos. Bueno, no cabe decir que ha ido mal... así que he usado el otro PDF, el manual SUky. Y directamente, he propuesto hacer lo mismo, pero el resultado ha sido bastante pobre. Se sigue bloqueando y no le encuentro lógica.
Código: C
  1. #include <p18f4550.h>
  2. #include <stdio.h>
  3. #include <delays.h>
  4. #include <xlcd.h>
  5.  
  6. /////////////////////////////////////FUSES///////////////////////////////// #pragma config  -> las opciones se ven en el help del C18, y luego en el ìc apropiado
  7. #pragma config FOSC = HS
  8. #pragma config CPUDIV = OSC1_PLL2
  9. #pragma config VREGEN = OFF
  10. #pragma config WDT = OFF
  11. #pragma configWDT = ON
  12. #pragma PBADEN = OFF
  13.  
  14.  
  15. /////////// //////////////////////// funciones ///////////////////////////
  16.  
  17. void DelayFor18TCY( void )
  18. {
  19. Delay10TCYx(2);
  20. }
  21.  
  22. void DelayPORXLCD (void)
  23. {
  24. Delay1KTCYx(15); // Delay of 15ms
  25. // Cycles = (TimeDelay * Fosc) / 4
  26. // Cycles = (15ms * 16MHz) / 4
  27. // Cycles = 60,000
  28. return;
  29. }
  30.  
  31. void DelayXLCD(void){
  32.         Delay1KTCYx(2);
  33. }
  34. void comandXLCD(unsigned char a){
  35.         BusyXLCD();
  36.         WriteCmdXLCD(a);
  37. }
  38.  
  39. void gotoxyXLCD(unsigned char x,unsigned char y)      //Ubica cursor en (x=Posicion en linea; y= Numero de Linea)
  40. {
  41.    unsigned char direccion;
  42.    
  43.    if (y != 1)
  44.       direccion=0x40;
  45.    else
  46.       direccion=0;
  47.  
  48.    direccion += x-1;
  49.    WriteCmdXLCD(0x80 | direccion);
  50. }
  51.  
  52.  
  53. void main(void){
  54.  
  55. PORTA=0x00;
  56. ADCON1=0x0F;
  57. TRISA=0b00010000;          // RA4 es input
  58.  
  59.  
  60. TRISB=0b11111111; // todos inputs para lcd
  61. ADCON1=0xFF;
  62.  
  63.    OpenXLCD(FOUR_BIT & LINES_5X7);      //Iniciamos el LCD
  64.     comandXLCD(0X06);               //Nos aseguramos incremento de direccion, display fijo
  65.     comandXLCD(0x0C);      //Encendemos LCD
  66.                    
  67.     //gotoxyXLCD(1,1);
  68.     putrsXLCD("Probando Lcd");
  69.    gotoxyXLCD(1,2);               //Pasamos a la linea 2
  70.    putrsXLCD("Linea 2");
  71.  
  72.   while(1){    
  73.    if (PORTAbits.RA4==0)
  74.         {
  75.        //LATAbits.LATA1=1;
  76.                 PORTAbits.RA0=1;
  77.                 PORTAbits.RA1=1;
  78.                 PORTAbits.RA2=1;
  79.                 PORTAbits.RA3=1;
  80.      }
  81.    else{
  82.         PORTAbits.RA0=0;
  83.                 PORTAbits.RA1=0;
  84.                 PORTAbits.RA2=0;
  85.                 PORTAbits.RA3=0;
  86.     }
  87.  }
  88. }
Título: Re: Tutorial C18
Publicado por: Suky en 01 de Octubre de 2010, 14:35:26
Se queda esperando alguna respuesta del LCD?
Título: Re: Tutorial C18
Publicado por: PICYO en 01 de Octubre de 2010, 15:53:44
Pues..tiene pinta de algo asi, yo suponia que era tema de delays, que he puesto delays un poco a ojo... por eso he copiado directamente los del manual, a ver como se desarrollaba. he pensado que quizas podría ser la configuracion de los pins, dentro de la libreria XLC, pero he decidido usar tambien 4 pines, y no descomentar el de 8 bits ( en un principio queria usar los 8 bits)... no se que mas podria ser..
saludos!
Título: Re: Tutorial C18
Publicado por: Suky en 01 de Octubre de 2010, 15:58:49
Y están ubicados correctamente? Porque si se usa el R/W, se queda a la espera de una respuesta de desocupado por parte del LCD, puede que esté mal y pase algo de eso. La manera de trabajar cuando no funciona es hacer debug, y ver donde falla, si las variables cargadas son correctas, hay algo mal en el algoritmo, porque falla!, ect. Sino se depende mucho de otras personas  ;-)


Saludos!
Título: Re: Tutorial C18
Publicado por: PICYO en 02 de Octubre de 2010, 20:19:42
Bueno disculpa mi torpeza.
hago debugg y por culpa de poner ADCON1=0xFF ( para poner todos los pines I/O digitales) entorpece al LCD, ya que veo que internamente el TRISB ( por lo que has dicho del pin RW, que entrada y salida) va variando el registro TRISB. Si trabajar con puerto A para entradas digitales, con puerto B en LCD es un problema, la solucion seria bastante fácil, cambiar el puerto de leds y ya está. De todos modos, al margen de si los leds se fastidian al no poner la linea de codigo ADCON1=0xFF ( la comento), el programa sigue en un delay permanente.
He visto varias cosas, por ejemplo el error que me dice el debugger es :
Código: C
  1. CORE-W0015: Out of bounds Memory Access (at address 0x046800 on 0x000001 bytes)
  2. CORE-W0015: Out of bounds Memory Access (at address 0x046000 on 0x000001 bytes)
  3. CORE-W0015: Out of bounds Memory Access (at address 0x046800 on 0x000001 bytes)
  4. CORE-W0015: Out of bounds Memory Access (at address 0x046000 on 0x000001 bytes)
Busco esa dirección de memoria y no la encuentro( sólo hay hasta 0x007FFE), bueno más bien lo que quiero encontrar es qué ha de contener esa dirección de memoria, pero no lo veo, asi que no sé que pasa, sólo sé lo que pone, 1 byte se "escapa" porqué lo lo manda a fuera de rango de la memoria.

Donde se queda clavado, es en :
Código: C
  1. 03A2    2EE7     DECFSZ 0xfe7, F, ACCESS
  2.   03A4    EFD1     GOTO 0x3a2
Bueno, con ASM hemos topado... Eso pertenece a C:\MCC18\src\traditional\delays\d10ktcyx.asm, una funcion que no creo que deba ( o debiera ) tocar para nada, así que el "culpable" que el fallo se aloje en esa función, es otro.  hasta aqui voy dando palos de ciego, solo soy un mero observador. Ahora veo un poco mas, más claro quiero decir.
en mi programa, donde yo meto mis cosas, veo que en cuanto llamo a la función OpenXLCD, ésta llama a su vez a la siguiente función, donde se introduce manualmente en la cabecera del programa ( como he visto en tu manual y en la guia de funciones de Microchip):

Código: C
  1. void DelayPORXLCD (void)
  2. {
  3. Delay1KTCYx(15); // Delay of 15ms
  4. return;}
, concretamente, el fallo estará ( después de todas estas suposiciones) en  Delay1KTCYx(15). La conexión entre eso y "out of bonds" se me escapa por completo... Asi que veo cómo esta hecho ese delay, y en el archivo delays.h, veo lo siguiente :
Código: C
  1. /* Delay1KTCYx
  2.  * Delay multiples of 1000 Tcy
  3.  * Passing 0 (zero) results in a delay of 256,000 cycles.
  4.  * The full range of [0,255] is supported. */
  5. void Delay1KTCYx(PARAM_SCLASS unsigned char);

El parámetro a pasar esta comprendido entre 0 y 255. Esa variable " máxima", ocupa 1 byte ( de 0 a 255, ó 0xFF, ó  0b11111111). Siendo una función por paso de valor, esa copia de la variable ( byte) no sé dónde la guarda, o dónde debiera guardarla mejor dicho, pero creo que la guarda en un sitio donde no debe. Digo esto por sacar una conclusión acerca de esto último y el "out of bounds(...) 1 byte" del principio. Y aquí llega mi conclusión, si el fallo que describo es correcto, no tengo ni idea de cómo solucionarlo, y si la explicación dada para tratar de resolver el fallo, es errónea, pues lo tengo peor ...¿  Qué hago con ese delay ?




Título: Re: Tutorial C18
Publicado por: Suky en 02 de Octubre de 2010, 21:19:33
Adjuntame el proyecto completo, o sea comprime la carpeta, así le doy un vistazo.  ;-)


Saludos!
Título: Re: Tutorial C18
Publicado por: PICYO en 03 de Octubre de 2010, 08:23:29
ok! Aquí te lo adjunto. Me da que en 5 minutos sabrás el porqué ( miénteme y dime que has tardado horas!! jeje!)
Hasta luego!
Título: Re: Tutorial C18
Publicado por: Suky en 03 de Octubre de 2010, 12:17:30
Bueno, al realizar el debug en MPLAB SIM se queda a la espera de la condición de busy, si realizamos un estimulo fijando a 0 el valor de RB3 (D7 de  LCD) sigue la ejecución como debe ser.

Ahora en proteus, veo que está un 18F4450, y debería ser un 18F4550, sino hay errores. Solucionado eso, no se mostró nada en lcd  :shock: Voy a ver el assembler generado y hay sectores donde está incompleto  :shock: (Esta es la librería pre-compilada que nos entrega Microchip) Para solucionarlo en Header File, voy a C:\MCC18\h y agrego al proyecto xlcd.h. Luego en Source File voy a C:\MCC18\src\pmc_common\XLCD y agrego todos los archivos fuentes. Esto lo realizo para que se re-compilen los archivos  :? Y... Ahora si funciona!!!  :? Me llama la atención lo que paso! Está mal compilada la librería que nos entrega Microchip en la versión 3.31?  :shock: 

Saludos!
Título: Re: Tutorial C18
Publicado por: PICYO en 03 de Octubre de 2010, 22:01:02
Hola! gracias!!
Ups, si el pic del Proteus tenía que ser el 18F4550. Si que han pasado cosas raras... He leido esta tarde tu contestación y he agregado manualmente todos los archivos. Pero, no bastaría con los de XLCD.h ( mas delay, claro)? Bueno, he compilado y decía que me faltaba un archivo .cof. Bueno, supongo que debo cargar el COF al pic. Así lo he hecho y..no ha funcionado!!?? Uhm... mira en ese momento daban una peli histórica bastante interesante, de paso me relajo y... hasta estos momentos. He vuelto a hacer los pasos y...funciona!! (el Windows está ligado al Reset...) ya me puedo ir a dormir tranquilo :)

Bueno, las suposiciones de mi cita anterior, veo que no estaban desencaminadas pues... estaban absolutamente perdidas!
Otra pregunta, ya que estamos... Miraste los sectores incompletos  del assembler generado. Bueno, sigo tus pasos y miro el "Dissasembly Listing"... y mis pasos se quedan ahí :P Quiero decir, qué trozo de código no está completo, cómo puedo saberlo para otras ocasiones? Perdona que me ponga preguntón con esto, pero es para sacarle partido al error.
Hasta luego!
Título: Re: Tutorial C18
Publicado por: Suky en 03 de Octubre de 2010, 23:55:25
En proteus es más sencillo de verlo, cargas el .coff y haces CTRL + D. Verás que están las instrucciones de C, pero no hay lineas de assembler  :shock:


Saludos!
Título: Re: Tutorial C18
Publicado por: Palomino86 en 05 de Octubre de 2010, 13:11:56
Alguien sabe donde podría ver información acerca de grabar datos en la memoria interna del microcontrolador en C18? o con que instrucciones lo realizo? :-/

Saludos
Título: Re: Tutorial C18
Publicado por: Suky en 05 de Octubre de 2010, 14:47:00
En C:\MCC18\doc\periph-lib\EEPROM.htm


Saludos!
Título: Dudas con el USART de C18
Publicado por: Palomino86 en 09 de Noviembre de 2010, 16:12:16
Hola que tal;


Aquí de nuevo con una duda, lo que pasa que estoy tratando de mandar una trama o cadena de caracteres a una impresora para leer su estatus. Estoy realizando la comunicación USART y lo configuro de la siguiente manera para un PIC18F4610 y un cristal de 20 MHz.

Código: [Seleccionar]
OpenUSART(USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH,129);

Lo anterior esta correcto

Entonces yo me dispongo a mandar una cadena con los siguientes caracteres: GS (Group Separator), 'a', Null, GS,'a','&'

y en mi codigo lo acomodo de la siguiente manera para transmitir:
Código: [Seleccionar]
putcUSART(29);
putcUSART('a');
putcUSART(0);
putcUSART(29);
putcUSART('a');
putcUSART('&');
Delay_seg(1);

Al momento de correrlo en proteus solamente me transmite este carácter '&', alguien podria decirme porque pasa este comportamiento y no me esta transmitiendo los demas? o cual es la forma correcta de realizar tal comunicacion?
segun yo me debería de visualizar por el puerto lo siguiente: aa&


Saludos
Título: Re: Tutorial C18
Publicado por: Suky en 09 de Noviembre de 2010, 16:16:47
Revisa la ayuda, y dale una revisada a BusyUSART


Saludos!
Título: Re: Tutorial C18
Publicado por: Palomino86 en 09 de Noviembre de 2010, 16:17:53
Ok  dejame checar esa parte.

Saludos
Título: Re: Tutorial C18
Publicado por: Palomino86 en 09 de Noviembre de 2010, 16:33:00
Ok he leído la ayuda.

La ayuda me dice que es una función la cual me determina el estado del buffer de transmisión. Nos retorna un "1" si es esta ocupado enviando datos o un "0" si se encuentra disponible.
También dice que esta función se debe de anteponer o debe usarse antes de comenzar una nueva transmisión. Y nos maneja este codigo de ejemplo
Código: [Seleccionar]
while (BusyUSART());
Entonces si entendí correctamente lo anterior mi código debería de quedar de la siguiente manera:

Código: [Seleccionar]
while (BusyUSART());
putcUSART(29);
while (BusyUSART());
putcUSART('a');
while (BusyUSART());
putcUSART(0);
while (BusyUSART());
putcUSART(29);
while (BusyUSART());
putcUSART('a');
while (BusyUSART());
putcUSART('&');
Delay_seg(1);

Con esto según yo checo primeramente si el puerto esta disponible y si lo esta paso a la siguiente instrucción que es la de escritura y así sucesivamente, lo probe el proteus y al parecer si me corrió bien. Entonces... Si es correcto de la forma que lo hice? o hay alguna forma mas optima de realizarlo?

Saludos
Título: Re: Tutorial C18
Publicado por: Suky en 09 de Noviembre de 2010, 16:46:56
A probarlo sin dar vueltas!!!  :)
Título: Re: Tutorial C18
Publicado por: Palomino86 en 09 de Noviembre de 2010, 17:06:00
De lo siguiente me surge otra duda jejeje  :oops:

Estaba viendo en tu tutorial que la recepción de datos la realizas por medio de interrupción.....

Entonces me puse a checar la función
Código: [Seleccionar]
DataRdyUSART();
Esta sirve para detectar si hay algun dato en el buffer de recepción y esto lo hace apartir de la bandera de RCIF en el registro PIR....

Entonces mi pregunta es tengo que hacer referencia a tal registro como tu lo haces en el tuto a pesar de que no es por medio de interrupción o me bastaria con usar la funcion de esta manera
Código: [Seleccionar]
while (!DataRdyUSART()); para cachar los bytes de datos?

Saludos
Título: Re: Tutorial C18
Publicado por: Palomino86 en 09 de Noviembre de 2010, 17:11:53
Bueno lo probe asi y me funciono jejejej

Código: [Seleccionar]
while(!DataRdyUSART());
Dato[0]=getcUSART();
while(!DataRdyUSART());
Dato[1]=getcUSART();
while(!DataRdyUSART());
Dato[2]=getcUSART();
while(!DataRdyUSART());
Dato[3]=getcUSART();
return (Dato[2]);
Título: Re: Tutorial C18
Publicado por: Palomino86 en 09 de Noviembre de 2010, 23:27:39
Creo que no es la forma correcta... se me esta trabando la impresora...
Título: Re: Tutorial C18
Publicado por: Palomino86 en 09 de Noviembre de 2010, 23:58:45
O ya supe cual es el problema, mi problema se corrigio abriendo y cerrando el puerto solamente cuando lo necesito utilizar jejejeej

Saludos
Título: Re: Tutorial C18
Publicado por: falflores en 17 de Enero de 2011, 05:23:04
Hola amigos de TodoPIC, hola suki, muchas gracias por el tutorial de C18, pero tengo una duda que por más que busco no logro responder:

Hace tiempo que quiero incursionar con los PICs 18FXXX, y he investigado sobre las diferencias en el compilador, y todos concuerdan que para seguir usando CCS se debe pasar al C18, pero estoy viendo que mi compilador que he usado de toda la vida para programar mis PICs 16FXXX tambien soporta los PICs 18:

(http://img413.imageshack.us/img413/3661/mplab1.jpg)
En la lista de dispositivos figuran los 18FXXX

Al abrir un nuevo proyecto con un 18 y mirar el archivo header de dicho pic, se anexa normalmente con #include<18F2550.h>
y no con #include<P18F2550.h> como dice en el manual de C18

(http://img209.imageshack.us/img209/4522/mplab3.jpg)
Los fuses se configurarían de la misma forma y no con #pragma


Y también al seleccionar el compilador, dice que soporta los 12/16/18/24........

(http://img255.imageshack.us/img255/222/mplab2.jpg)

Asi que en conclusión que diferencia hay entre programar los PICs 18 con las instrucciones normales que usan los 16, claro con la diferencia que estos traen más instrucciones y módulos; a programarlos usando el compilador especial de C18 que trae las instrucciones diferentes?.
Título: Re: Tutorial C18
Publicado por: Suky en 17 de Enero de 2011, 09:17:10
Yo creo la respuesta es depende... Un usuario que es hobbysta CCS (con sus bug y limitaciones) es más que suficiente. Pero si se quiere trabajar con varias arquitecturas o marcas, lo mejor es usar un lenguaje portable, o sea Ansi C, y CCS no lo es. Así siempre se trabaja con una misma estructura y las librerias sirven para el caso general, con pequeñas modificaciones.

Y bueno, luego vienen los detalles entre cada compilador, y para ello hay que usarlos y decidir uno mismo  ;-)


Saludos!
Título: Re: Tutorial C18
Publicado por: jorgab_spt en 27 de Junio de 2012, 17:46:52
Hola a todos, por favor si me pueden ayudar tengo un problema con el texto de mi comunicación serial, al momento de enviar un mensaje o un dato, en la simulación en proteus con el virtual terminal me sale los mensajes uno a continuación del otro, asi:

Comunicación serial    El valor es= 573

y yo quisiera asi:

Comunicación serial   
El valor es= 573
 

y no se que instruccion o como configurar para que me salga el mensaje en cada línea, por favor q
Título: Re: Tutorial C18
Publicado por: jorgab_spt en 27 de Junio de 2012, 17:48:48
Hola a todos, por favor si me pueden ayudar tengo un problema con el texto de mi comunicación serial, al momento de enviar un mensaje o un dato, en la simulación en proteus con el virtual terminal me sale los mensajes uno a continuación del otro, asi:

Comunicación serial    El valor es= 573

y yo quisiera asi:

Comunicación serial   
El valor es= 573
 

y no se que instruccion o como configurar para que me salga el mensaje en cada línea, por favor si alguien me puede ayudar con este problema, gracias

Mi programa es:

#include <p18f25k20.h>
#include <delays.h>
#include "lcd.h"
#include <stdlib.h>
#include <stdio.h>
#include <usart.h>

//**********Declaración de funciones**********
void low_isr(void);
void high_isr(void);
void interrupcion_timer(void);
void interrupcion_externa1(void);
void interrupcion_1(void);

//**********Declaración de variables***********
unsigned int contador2;
unsigned int var;
unsigned int contador;
int varia;
char str[7];            //para pasar de entero a string
volatile char Data;         //para almacenar la tecla que presiono del computador
//*********************************************

#pragma romdata CONFIG1H = 0x300001
            const rom unsigned char config1H = 0b00001000;      // interno oscillator
#pragma romdata CONFIG2L = 0x300002
        const rom unsigned char config2L = 0b00011111;      // Brown-out Reset Enabled in hardware @ 2.0V, PWRTEN disabled
#pragma romdata CONFIG2H = 0x300003
const rom unsigned char config2H = 0b00000000; // HABILITADO EL WATCH DOG
#pragma romdata CONFIG3H = 0x300005
        const rom unsigned char config3H = 0b00000000;      //MCLRE_ON & espera sistema hasta estabilizar HFINTOSC & TMR1 a potencia superior & PORTB digital & CCP2 en RB3

//********Configuración de baja prioridad************

#pragma code low_vector=0x18
void interrupt_at_low_vector(void)
{
_asm GOTO low_isr _endasm
}
#pragma code
#pragma interruptlow low_isr
void low_isr (void)

{
if(PIR1bits.RCIF=1)           // si es por recepción de datos
   {
      interrupcion_1();
    }
}

//*************Configuración para alta prioridad***********
#pragma code high_vector=0x08
void interrupt_at_high_vector(void)
{
_asm GOTO high_isr _endasm
}
#pragma code
#pragma interrupt high_isr
void high_isr (void)
{

if (PIR1bits.TMR1IF==1)            //se se levanta la bandera de desbordamiento del TIMER1
{
   interrupcion_timer();
}   


}

//*********************lcd**************************
char buf[15];

void DelayFor18TCY(void)
{
Delay10TCYx (2);
}

void DelayPORXLCD (void)
{
Delay1KTCYx(15); // Delay of 15ms
// Cycles = (TimeDelay * Fosc) / 4
// Cycles = (15ms * 16MHz) / 4
// Cycles = 60,000

}
void DelayXLCD (void)
{
Delay1KTCYx(2); // Delay of 5ms
// Cycles = (TimeDelay * Fosc) / 4
// Cycles = (5ms * 16MHz) / 4
// Cycles = 20,000
}

void comandXLCD(unsigned char a) // Envia comando al LCD
{
   BusyXLCD();      
   WriteCmdXLCD(a);
}



// Ubica cursor en (x = Posicion en linea, y = nº de linea)
void gotoxyXLCD(unsigned char x, unsigned char y)
{
   unsigned char direccion;
   if(y != 1)
      direccion = 0x40;
   else
      direccion=0;   
   direccion += x-1;
   comandXLCD(0x80 | direccion);
}

//*********************************************************

void main()
{
   ANSEL=0;                  //deshabilita las entradas analogas en puerto A
   //ANSELH=0b00000001;
   OSCCON=0b01110111;            //frecuencia interna  a 16 MHrz
   OSCTUNEbits.PLLEN=0 ;         //desactivo el multiplicador *4 del oscilador
   
   //***********Configuración de puertos******************
   
   TRISB=0b00000110;         //Entrada de la INT1 y de el ADC
   PORTB=0;
   //*************ADC**********************
   ANSELH=0b00000001;      //Solo RB2 como entrada análoga
   ADCON2=0b10101001;      //Selecciono A/D conversion clock, 12 TAD,result format
   ADCON0=0b00100001;      //Selecciono AN8 como mi entrada análoga, habilito el ADC
   ADCON1=0b00000000;      //Referencia interna Vss, Referencia externa positiva Vdd
   
   //**************************************

   //********configuracion del timer 1 interrupcion cada 10 ms********************
   T1CON=0b11110101;   //habilitado TMR1 / formato de 16 bit/interna (FOSC/4)/prescaler 8 /oscilador apagado
   PIE1bits.TMR1IE=1; //habilitada interrupcion de sobreflujo
             
   //************63035=1111011000111011=2^16*************************
   TMR1H=0b11110110;            //byte más significativo
   TMR1L=0b00111011;            //byte menos significativo   

   //****************************************************************

   INTCONbits.GIEH = 1;       //Habilita todas las interrupciones
   INTCONbits.GIEL = 1;       //Habilita interrupciones de baja prioridad
   
   //************Comunicacion serial******************************

   TRISCbits.TRISC6=0;             // salida de transmisión
   TRISCbits.TRISC7=1;   

   RCSTAbits.SPEN=1;            // puerto serial (EUSART) habilitado
   TXSTAbits.SYNC=0;            // modo asincronico
   TXSTAbits.TXEN=1;            // habilitar transmisor
   TXSTAbits.TX9=0;            // transmision para 8 bits

   RCSTAbits.CREN=1;            //habilita recepcion continua
   RCSTAbits.RX9=0;            //recepcion para 8 bits


   TXSTAbits.BRGH=0;            // baja velocidad del generador de bauds
   SPBRG=12;                  // generador a 9600 bauds con osc de 16MHz

   
   //************CONFIGURACION DE INTERRUPCIONES********************

   //TCONbits.INT0IE = 1;         //habilito interrupcion externa INT0
   //INTCON3bits.INT1IE = 1;       //habilito interrupcion externa INT1
   //TCON2bits.INTEDG0 = 0;      //por flanco de bajada INT0
   //INTCON2bits.INTEDG1 = 0;      //por flanco de bajada INT1
   //INTCON2bits.RBPU = 1;         //activo Pull-up del puerto B
   //INTCON3bits.INT1IP= 0;        //Habilito la INT1 como baja prioridad
   RCONbits.IPEN=1;            //Habilito las interrupciones por prioridad
   INTCONbits.GIEL = 1;          //Habilita interrupciones de baja prioridad
   INTCONbits.GIEH = 1;          //Habilita todas las interrupciones
   IPR1bits.TMR1IP=1;            //Pongo en alta prioridad al timer1 por desbordamiento
   IPR1bits.RCIP=0;            //Interrupcion de recepción del EUSART con prioridad baja
   IPR1bits.TXIP=0;            //Interrupcion de transmisión del EUSART con prioridad baja
   PIE1bits.RCIE=1;            // habilita interrupcion por recepcion
   
   OpenXLCD( FOUR_BIT & LINES_5X7 );

   
    comandXLCD(0x06);             // Nos aseguramos incremento de direccion, display fijo
   comandXLCD(0x0C);            // Encendemos LCD


putrsUSART("COMUNICACION SERIAL   ");      // Escribo un texto en la pantalla
putrsUSART("EL VALOR DE LA VARIABLE ES:   ");
varia=10;
ultoa( varia, str );                // convierto a string la variable "var"
putsUSART( str );

   
contador=0;

while(1)
   {
   
   _asm CLRWDT   _endasm         //resetear WDT
   if(PIR1bits.ADIF)
   {
      
      if(ADRES>=600)
      {
         PORTBbits.RB6=1;
      }   
      
      else
      {
      PORTBbits.RB6=0;
      }
         
         
      PIR1bits.ADIF=0;      //Encero la bandera que me indica si la conversión está lista
      var=ADRES;            //En ADRES se encuentran los 10 bits de la conversión
   }   
       
   sprintf(buf, "el valor=   %d", var);      //Guardo los caracteres en la variable buf
               
   

if(contador>=100)
{   
   ADCON0bits.GO_DONE=1;      //Mando a hacer la conversión
   contador=0;               //Encero el contador
   comandXLCD(0x01);         // Borra pantalla y vuelve al origen.-
   gotoxyXLCD(1,1);
   putrsXLCD("CONVERSION ADC");   
   gotoxyXLCD(1,2);
   putsXLCD(buf);            //Muestro la variable "buf" (contiene los 10bits de la conversión) por al LCD
   putsUSART( buf );
}   

}         

}

void interrupcion_timer()
{
   contador++;               
   PIR1bits.TMR1IF=0;
   TMR1H=0b11110110;
   TMR1L=0b00111011;
   
}   



void interrupcion_1()
{

   Data=getcUSART();             // leemos dato recibido
   
   while(1){
      Data=getcUSART();
   
    switch(Data){
       case 'a':               // tambien se puede poner en ASCII 0x61 hexadecimal o se puede escribir en decimal 97
         PORTBbits.RB5=1;      // prendo led
         break;
       case 'b':                
         PORTBbits.RB5=0;      // apago led
         break;
   PIR1bits.RCIF=0;            // Ensero la bandera de interrupción del EUSART
            }
         }
}

Título: Re: Tutorial C18
Publicado por: jukinch en 27 de Junio de 2012, 18:05:06
Hola jorgab_spt:
       Para comprender tu inquietud debés estudiar "secuencias de escape en c".

\n               0x0A         LF           Saltar una línea (linefeed)

 \r                0x0D         CR           Retorno de carro (carriage return)

agregalas en tu código así:

putrsUSART("EL VALOR DE LA VARIABLE ES:   \r\n");
   
            Saludos.
               Jukinch
Título: Re: Tutorial C18
Publicado por: jorgab_spt en 27 de Junio de 2012, 18:08:34
Muchas gracias Jukinch, y si la verdad estoy recien iniciando la programación en c y me falta mucho por aprender.
Saludos y gracias de nuevo
Título: Re: Tutorial C18
Publicado por: jukinch en 27 de Junio de 2012, 18:30:25
Podés ver estos links:
            http://www.zator.com/Cpp/E3_2_3e.htm (http://www.zator.com/Cpp/E3_2_3e.htm)
            http://es.wikiversity.org/wiki/Fundamentos_de_C_-_Lecci%C3%B3n_2 (http://es.wikiversity.org/wiki/Fundamentos_de_C_-_Lecci%C3%B3n_2)
              Leelos y generá dudas. Es la mejor forma de aprender.
                Saludos desde Argentina
                            Jukinch ;-)
Título: Re: Tutorial C18
Publicado por: jorgab_spt en 28 de Junio de 2012, 13:58:04
Gracias jukinch me ayudaron mucho esas páginas, ya he aprendido un poco mas de c.
Ahora me encuentro en otro problema, me gustaria enviar un vector por comunicación serial y ya no solo un dato como estaba haciendo en mi programa pero la verdad no se como puedo hacer eso. Si me podrian ayudar con eso por favor si alguien sabe que me de una manito. Gracias
Título: Re: Tutorial C18
Publicado por: Suky en 28 de Junio de 2012, 14:06:33
Puedes realizar un for enviando cada uno de los datos del vector:

Código: [Seleccionar]
char Buffer[10];
for(k=0;k<10;k++){
   putc(Buffer[k]);
}
Título: Re: Tutorial C18
Publicado por: jorgab_spt en 28 de Junio de 2012, 14:16:06
A ya listo gracias Suky, me ayudaste mucho porque no tenia idea de como trabajar con eso, ya voy a probarle lo que me dices.
Título: Re: Tutorial C18
Publicado por: jorgab_spt en 04 de Julio de 2012, 13:24:30
Hola amigos, por favor si alguien me podria ayudar con el comando para poder borrar ya sea la segunda o primera línea del lcd, no se si habra eso si alguien me ayuda por favor y si pueden decirme mas comandos del lcd me ayudaría mucho gracias.

Saludos!!!!
Título: Re: Tutorial C18
Publicado por: Palomino86 en 04 de Julio de 2012, 13:41:04
Lo que se me ocurre es que hagas una rutina que rellene con espacios en blanco tal linea. Se que hay comandos de borrado pero por lo menos a lo que yo se, te borran toda la pantalla

Saludos
Título: Re: Tutorial C18
Publicado por: jorgab_spt en 04 de Julio de 2012, 13:56:03
Gracias Palomino86 y si yo tambien estaba haciendop eso, pero queria saber si existia algun comando especial para eso para no ponerle con espacios en blanco.

Saludos!!!
Título: Re: Tutorial C18
Publicado por: Palomino86 en 04 de Julio de 2012, 14:08:36
De nada  8)
Título: Re: Tutorial C18
Publicado por: Suky en 04 de Julio de 2012, 15:05:14
Hola amigos, por favor si alguien me podria ayudar con el comando para poder borrar ya sea la segunda o primera línea del lcd, no se si habra eso si alguien me ayuda por favor y si pueden decirme mas comandos del lcd me ayudaría mucho gracias.

Saludos!!!!

Para los comandos que soporta tu LCD te conviene establecer que controlador posee y buscar su datasheet.


Saludos!
Título: Re: Tutorial C18
Publicado por: jorgab_spt en 04 de Julio de 2012, 16:41:44
Gragias Suky por tu respuesta voy a revisarle bien eso.

Saludos!!
Título: Re: Tutorial C18
Publicado por: jorgab_spt en 27 de Julio de 2012, 10:41:48
Hola amigos por favor si alguien me podria ayudar ando confundido con la comunicación serial, mi problema es que ya configuro mi pic para que tenga un bit de parada, pero lo que no se es como envio ese bit de parada existe algun comando o registro para eso o ya al configurar con un bit de parada este se envia automaticamente al enviar mi dato?
Espero alguien me pueda ayudar, gracias
Título: Re: Tutorial C18
Publicado por: Palomino86 en 27 de Julio de 2012, 10:50:44
Solo necesitas configurarlo.

Al momento de transmitir el pic lo hace automaticamente. Estas usando C18?

Saludos
Título: Re: Tutorial C18
Publicado por: jorgab_spt en 27 de Julio de 2012, 10:59:03
Gracias Palomino86 y si trabajo con c18 estoy con el pic18f25k20 y ya le configuro el USART pero no se en que parte se pone eso de 1 bit de parada o si quisiera 2 bits de parada.
Esta es mi configuración:

TRISCbits.TRISC6=0;             // salida de transmisión
   TRISCbits.TRISC7=1;   

   RCSTAbits.SPEN=1;            // puerto serial (EUSART) habilitado
   TXSTAbits.SYNC=0;            // modo asincronico
   TXSTAbits.TXEN=1;            // habilitar transmision
   TXSTAbits.TX9=0;            // transmision para 8 bits

   RCSTAbits.CREN=1;            //habilita recepcion continua
   RCSTAbits.RX9=0;            //recepcion para 8 bits   
   TXSTAbits.BRGH=0;            // baja velocidad del generador de bauds
   SPBRG=25;                                       //9600 baudios

Título: Re: Tutorial C18
Publicado por: Suky en 27 de Julio de 2012, 11:32:04
Aparte de ver ejemplos has leído el datasheet del microcontrolador? Allí te daras cuenta que no es posible definir cuantos bit de parada  ;-)
Título: Re: Tutorial C18
Publicado por: jorgab_spt en 27 de Julio de 2012, 11:36:45
Gracias Suky y si lo leí por eso mismo estaba confundido porque quisiera 2 bits de parada para utilizar el protocolo MODBUS, entonces lo que me estas diciendo es que ya viene configurado para 1 bit de parada o mejor dicho al configurar el USART ya se pone con 1 bit de parada?
Título: Re: Tutorial C18
Publicado por: Carabobo1 en 30 de Julio de 2012, 00:05:21
Excelente Aporte, ¡¡¡ Muchas Gracias !!! ((:-))