Sei sulla pagina 1di 72

Sin ttulo

uControl
Articulos, circuitos, tutoriales y Revista uControl => Tutoriales, guias y cursos
en uControl => Mensaje iniciado por: Leon Pic en Mayo 03, 2009, 07:37:36
Ttulo: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Leon Pic en Mayo 03, 2009, 07:37:36
Abro este hilo para mantener el tema original Tutorial MPLAB C18 Desde 0
(http://www.ucontrol.com.ar/forosmf/programacion-en-c/tutorial-mplab-c18-desde-0/)
"limpito" as queda mas legible y entendible. ;)
Excelente aporte Suky, muy bien explicado
parejo durante la noche :azn:

:rolleyes: :rolleyes: Le as dado duro y

Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Mayo 03, 2009, 12:00:33
Cita de: Leon Pic en Mayo 03, 2009, 07:37:36
Excelente aporte Suky, muy bien explicado :rolleyes: :rolleyes: Le as dado duro y
parejo durante la noche :azn:
:P :P :P No fue tan as, me mire un par de pelis y despues me puse a trabajar en
esto, y no me di ni cuenta la hora que era!
:shocked:
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Ariel en Mayo 03, 2009, 03:58:08
Cita de: Leon Pic en Mayo 03, 2009, 07:37:36
Excelente aporte Suky, muy bien explicado :rolleyes: :rolleyes: Le as dado duro y
parejo durante la noche :azn:
"Le das duro y parejo.....a la PC" ;)
Fuera de bromas, EXCELENTE trabajo! Cosas como esta son las que hacen que el foro
sea cada vez mas visitado.
Muchisimas gracias por compartirlo.
Ariel.
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Meta en Mayo 11, 2009, 12:23:36
Por si acaso, dejo ms datos.
http://informatica.uv.es/iiguia/SBM/manual.pdf
Saludo.
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: kcire en Junio 27, 2009, 09:27:28
Gracias Suky por el Tutorial esta muy bueno para los que recien comenzamos con los
PIC, va quedando muy completo :bang:, asi podre dar mis primeros pasos en C18.
Un saludo,
Erick
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Meta en Julio 10, 2009, 12:19:07
La verdad que es muy bueno.
Vamos a ver como sigue su ampliacin con ella.
http://electronicapic.iespana.es/manual/mplab_c18_desde_cero.pdf
Pgina 1

Sin ttulo
Saludo.
Ttulo: Re: Tutorial MPLAB C18 Desde 0 -Tengo problemas a la hora de compila
Publicado por: grko32 en Julio 13, 2009, 04:40:26
hola k tal. soy nuevo en este foro.
no puedo compilar el primer programa que muestra este tema y segui todos los pasos
de instalcion y de edicion de proyectos que uds muestra. me salen las sig ventanas.
ojala pudieran ayudarme ya le di vuelta y vuelta e movido de todo, prove con la
version studen y la de evaluacion y nada.
aprovecho pa preguntar si alguien no tiene un ejemplo de como utilizar el nrf24l01,
es un tranceiver. necesito mandar 8 bit y recibirlos del otro lado, ambos con pic.
no importa el leguanje de progrmamacion adjunto las imagenes de lo que me pasa.
Ttulo: Re: Tutorial MPLAB C18 Desde 0 -Tengo problemas a la hora de compila
Publicado por: Suky en Julio 13, 2009, 11:42:03
Cita de: grko32 en Julio 13, 2009, 04:40:26
hola k tal. soy nuevo en este foro.
no puedo compilar el primer programa que muestra este tema y segui todos los pasos
de instalcion y de edicion de proyectos que uds muestra. me salen las sig ventanas.
ojala pudieran ayudarme ya le di vuelta y vuelta e movido de todo, prove con la
version studen y la de evaluacion y nada.
aprovecho pa preguntar si alguien no tiene un ejemplo de como utilizar el nrf24l01,
es un tranceiver. necesito mandar 8 bit y recibirlos del otro lado, ambos con pic.
no importa el leguanje de progrmamacion adjunto las imagenes de lo que me pasa.
No has seleccionado el dispositivo correcto, debe ser PIC18F2550. Borra
18f25j50_g.lkr de Linker Script y selecciona correctamente el dispositivo en
Configure->Select Device
Si quieres utilizar el PIC18F25j50 debes cambiar el include del inicio: #include
<p18f25j50.h> Pero en ese caso debes de tener en cuenta las diferencias entre los
micros, fuses, configuraciones, ect.
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 -Tengo problemas a la hora de compila
Publicado por: grko32 en Julio 14, 2009, 02:14:44
Cita de: Suky en Julio 13, 2009, 11:42:03
Cita de: grko32 en Julio 13, 2009, 04:40:26
hola k tal. soy nuevo en este foro.
no puedo compilar el primer programa que muestra este tema y segui todos los pasos
de instalcion y de edicion de proyectos que uds muestra. me salen las sig ventanas.
ojala pudieran ayudarme ya le di vuelta y vuelta e movido de todo, prove con la
version studen y la de evaluacion y nada.
aprovecho pa preguntar si alguien no tiene un ejemplo de como utilizar el nrf24l01,
es un tranceiver. necesito mandar 8 bit y recibirlos del otro lado, ambos con pic.
no importa el leguanje de progrmamacion adjunto las imagenes de lo que me pasa.
No has seleccionado el dispositivo correcto, debe ser PIC18F2550. Borra
18f25j50_g.lkr de Linker Script y selecciona correctamente el dispositivo en
Configure->Select Device
Si quieres utilizar el PIC18F25j50 debes cambiar el include del inicio: #include
<p18f25j50.h> Pero en ese caso debes de tener en cuenta las diferencias entre los
micros, fuses, configuraciones, ect.
Saludos!
Pgina 2

Sin ttulo
gracias amigo por tu ayuda. me fue de mucah utilidad ya jalo el programa.
Estoy haciendo otro programa este ya es mas complejo estoy ocupando el 18f452,
aperecen sus librerias pero no me aparecen el archivo 18f452.lrk, donde lo puedo
conseguir o cual ocupo
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Julio 14, 2009, 02:45:11
El 18F452.lkr esta en C:\MCC18\lkr.
Ttulo: Re: Tutorial MPLAB C18 Desde 0 -Tengo problemas a la hora de compila
Publicado por: grko32 en Julio 17, 2009, 12:35:33
Cita de: grko32 en Julio 14, 2009, 02:14:44
Cita de: Suky en Julio 13, 2009, 11:42:03
Cita de: grko32 en Julio 13, 2009, 04:40:26
hola k tal. soy nuevo en este foro.
no puedo compilar el primer programa que muestra este tema y segui todos los pasos
de instalcion y de edicion de proyectos que uds muestra. me salen las sig ventanas.
ojala pudieran ayudarme ya le di vuelta y vuelta e movido de todo, prove con la
version studen y la de evaluacion y nada.
aprovecho pa preguntar si alguien no tiene un ejemplo de como utilizar el nrf24l01,
es un tranceiver. necesito mandar 8 bit y recibirlos del otro lado, ambos con pic.
no importa el leguanje de progrmamacion adjunto las imagenes de lo que me pasa.
No has seleccionado el dispositivo correcto, debe ser PIC18F2550. Borra
18f25j50_g.lkr de Linker Script y selecciona correctamente el dispositivo en
Configure->Select Device
Si quieres utilizar el PIC18F25j50 debes cambiar el include del inicio: #include
<p18f25j50.h> Pero en ese caso debes de tener en cuenta las diferencias entre los
micros, fuses, configuraciones, ect.
Saludos!
gracias amigo por tu ayuda. me fue de mucah utilidad ya jalo el programa.
Estoy haciendo otro programa este ya es mas complejo estoy ocupando el 18f452,
aperecen sus librerias pero no me aparecen el archivo 18f452.lrk, donde lo puedo
conseguir o cual ocupo
gracias por al apoyo que me han dado, espero porder ayudar en lo que pueda
Ttulo: Re: Tutorial MPLAB C18 Desde 0 -Tengo problemas a la hora de compila
Publicado por: grko32 en Julio 17, 2009, 12:38:17
hola que tal, habra alguien que alla manejado el tranceiver nrf24l01. me serviria
mucho que algien me pudera ecplicar como generar una programa para controlarlo o
ejemplos de como comunicarme via SPI
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: mariomx en Agosto 18, 2009, 12:54:32
Hola! Muchas gracias por todas sus aportaciones, me han facinado todos los ejemplos
usando C18 son buenicimos gracias a su apoyo aprendemos. He estado queriendo usar
el ejemplo de Control LCD pero sin el pin RW, para optimizar como lo han hecho con
otros pic's pues solo lo ucupamos para escribir y lo colocan a GND.
Tome la libreria XLCD, en ella se usa constantemente el Pin RW para leer si esta
ocupado el LCD con la funcion BusyXLCD() la reacomode para lograr que me indique
que siempre esta libre y escibir en el LCD, sin embargo no me funciona, sera que
tambien debo de dar retardos? con su experiencia quizas ya lo hallan realizado,
agradesco su consejo y apoyo, gracias.
P.D. Estoy usando el pic 18f4550 a 20 MHz y solo conecto al pic RS, E, y los 4 bits
mas significativos, modo 4 bits parte alta.
Pgina 3

Sin ttulo
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Agosto 18, 2009, 01:11:06
Donde se realice el Test de condicin del LCD se debe reemplazar por una demora de
mayor a los 60us. Y revisa el ejemplo para efectivizar los cambios realizados en
las libreras.
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: mariomx en Agosto 18, 2009, 11:40:11
Gracias!!! solucion!!
Si hice lo que me recomendaste remplace la funcin del Test del LCD por la demora.
unsigned char BusyXLCD(void){
Delay10TCYx(30);
//demora de 60useg, Cycles = (TimeDelay * Fosc)/4
return 0;
}
Un fuerte abrazo!!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: cyberian en Agosto 29, 2009, 09:18:49
Hola Suky, tu tutorial est muy bueno, soy nuevo en C18 y en C propiamente dicho,
yo tengo la versin comercial full de C18 la v3.33 que sali ahora el viernes 28 de
agosto, y hay algunas cositas que antes de esta versin me funcionaban bien y ahora
dejaron de funcionar. Pero las pude corregir, aunque no s bien el porqu. Siempre
hablando de la simulacin en la ltima versin existente de proteus.
Por ejemplo en lugar de usar "&" en los parmetros de OpenACD y OpenUSART, por
ejemplo, hay que reemplazarlos por "|".
Otra cosita, porqu no trabajs mejor el micro a 48Mhz, que es la velocidad mxima.
No he tenido problemas a la hora de implementar todos tus ejercicios.
Podras explicar bien el tema del SET de INSTRUCCIONES EXTENDIDAS, y cmo usar las
optimizaciones de C18, he visto en el tamao del programa, que si estn todas las
optimizaciones activas, se reduce mucho el tema de la memoria que ocupa el programa
en el micro. Y se reduce am muchsimo ms, cuando activamos el set de
instrucciones extendidas, pero deja de funcionar la simulacin en proteus. Esto a
qu se debe??? es el proteus el que no se banca las optimizaciones, o es otra
cosa??
Muchsimas gracias por el tuto, est buensimo.
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Agosto 29, 2009, 09:49:23
Hola cyberian! Bienvenido al foro. Con respecto a la seleccin de la frecuencia
reloj utilice 4 MHz a modo de ejemplo nada ms, esta seleccin depender de las
necesidades del proyecto ;)
Despus con respecto al set de instrucciones extendidas y optimizaciones voy a ser
sincero, nunca las he utilizado dado que en este lenguaje no he realizado ningn
proyecto exigente con respecto a esto, sea el tamao de la memoria de programa
utilizado. :P
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: arlen en Septiembre 01, 2009, 03:07:37
hola suky.
soy nuevo en este foro.
estoy iniciando con el PIC18F4550 , estoy usando el tutorial de desarrollaste, el
cual es muy bueno y practico y te felicito por eso, bueno yo me qued en el
ejemplo del xLCD.h, yo tengo la versin estudiantil C18, la v3.33 .
Pgina 4

Sin ttulo
el codigo que estoy usando es el mismo del tutorial pero modificando un poco los
delay, ya que estoy usando un crystal de 20MHz
Cdigo:
#include <p18f4550.h>
#include <delays.h>
#include <xlcd.h>
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma

config
config
config
config
config
config
config
config
config
config
config

FOSC = HS,FCMEN = OFF,IESO = OFF, CPUDIV = OSC1_PLL2


PWRT = ON,BOR = OFF,BORV = 0
WDT = OFF,WDTPS = 32768
MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,CCP2MX = OFF
STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF
CP0 = ON,CP1 = ON,CP2 = ON
CPB = ON,CPD = ON
WRT0 = ON,WRT1 = ON,WRT2 = ON
WRTB = ON,WRTC = ON,WRTD = ON
EBTR0 = ON,EBTR1 = ON,EBTR2 = ON
EBTRB = ON

//esoty usando un cristal de 20MHz


void DelayFor18TCY(void){
Delay10TCYx(2);//18TCY
}
void DelayPORXLCD(void){
Delay1KTCYx(75);//15ms
}
void DelayXLCD(void){
Delay1KTCYx(25);//5ms
}
//envia comando al lcd
void comandXLCD(unsigned char a){
BusyXLCD();
WriteCmdXLCD(a);
}
//ubica curso 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(void){
OpenXLCD(FOUR_BIT & LINES_5X7);//iniciamos lcd
comandXLCD(0x0C);//encendemos el lcd
putsXLCD("Probando LCD");
gotoxyXLCD(1,2);//pasamos al orden de la linea 2
putsXLCD("por SUKY");
while(1){}
}
lo simulo en mplab con debuggers=>selectool=>proteus VSM, pero no sale ningun
mensaje, pero si lo simulo en solo proteus sale :
Pgina 5

Sin ttulo
[PIC18MEMORY]PC=0x0262.Address for TBLRD instruccion(0x0004)is not in code
memory-zero returned
por cierto es la primera vez que etoy en un foro, disculpame por no subir imagenes.
espero que puedas ayudarme.
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Septiembre 01, 2009, 09:43:57
No veo error en el cdigo :P Prueba agregando el archivo xlcd.h y todos los
archivos fuente que se encuentran en src/pmc_common/XLCD al proyecto para que los
compile nuevamente.
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: arlen en Septiembre 02, 2009, 02:08:46
hola de nuevo y gracias por tu apoyo.
segu tus indicaciones , y ya no sale error cuando los simulo en proteus , pero
solo imprime la primera letra que es'p',nada mas, y cuando los simulo en conjunto
con proteus para seguir las instrucciones que se ejecutan; El procedimiento que
sigu para escribir la 'p' es el mismo que siguieron las otras palabras para
imprimirlas pero estas no se imprimieron cuando debieron. crees que sea el proteus,
sabes si este tiene problemas con el PIC18F4550 , por cierto tengo las version 7.5
SP3 (proteus). si no fuera mucho pedir podrias probar el codigo de abajo
simulandolo en proteus o ya con el circuito armado, lo que pasa es que aun no tengo
el 18F4550 y por ahora lo simulo en proteus.
espero los resultados de tu simulacion o ya en el circuito.
Cdigo:
#include <p18f4550.h>
#include <delays.h>
#include <xlcd.h>
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma

config
config
config
config
config
config
config
config
config
config
config

FOSC = HS,FCMEN = OFF,IESO = OFF, CPUDIV = OSC1_PLL2


PWRT = ON,BOR = OFF,BORV = 0
WDT = OFF,WDTPS = 32768
MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,CCP2MX = OFF
STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF
CP0 = ON,CP1 = ON,CP2 = ON
CPB = ON,CPD = ON
WRT0 = ON,WRT1 = ON,WRT2 = ON
WRTB = ON,WRTC = ON,WRTD = ON
EBTR0 = ON,EBTR1 = ON,EBTR2 = ON
EBTRB = ON

void DelayFor18TCY(void){
Delay10TCYx(10);
}
void DelayPORXLCD(void){
Delay1KTCYx(75);
}
void DelayXLCD(void){
Delay1KTCYx(25);
}
//envia comando al lcd
void comandXLCD(unsigned char a){
BusyXLCD();
WriteCmdXLCD(a);
}
Pgina 6

Sin ttulo
//ubica curso 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(void){
OpenXLCD(FOUR_BIT & LINES_5X7);//iniciamos lcd
comandXLCD(0x0C);//encendemos el lcd
putrsXLCD("Probando LCD");
//putrsXLCD("robando LCD");
gotoxyXLCD(1,2);//pasamos al orden de la linea 2
putsXLCD("por SUKY");
while(1){}
}
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: el_greg en Septiembre 05, 2009, 06:35:44
que tal suky bastante agradecido por tus ejemplos todo iba de maravilla, hasta que
llegue al control de lcd me sale el mismo error que tenia arlen, donde le
explicastes que agregara los archivos fuentes de la carpeta src/pmc_common/xlcd la
verdad que no se como agregarlos estoy empezando con este c18... si puedes
explicarme por favor como resolver este problema que me ha frenado por completo en
mi avance...te agradezco cualquier ayuda muchas gracias
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Septiembre 05, 2009, 09:01:09
Para agregar archivos al proyecto van al men View/Project, all sobre la carpeta
hacen click con el botn derecho y Add Files.
Yo hago lo mostrado en el tutorial con las versiones all mencionadas y no he
tenido problemas, luego por falta de tiempo no me puedo poner a probar cada uno de
sus ejemplos en el hard real :P

Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Septiembre 06, 2009, 12:22:42
Prueben lo siguiente, agregar despus de OpenXLCD... la funcin comandXLCD(0x06);,
con esto nos aseguramos que el LCD Incremente la direccin y mantenga el display
fijo. Puede ser por eso que solo les muestre las letras P en cada linea, entonces
en ese caso Proteus toma como default el decremento de la direccin :P

Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: arlen en Septiembre 06, 2009, 04:45:05
hola ,
gracias suky , hice lo que indicaste y sali perfecto,ahora seguir con el adc,
espero que me vaya bien,
de nuevo gracias.
Pgina 7

Sin ttulo
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Septiembre 06, 2009, 05:09:34
Cita de: arlen en Septiembre 06, 2009, 04:45:05
hola ,
gracias suky , hice lo que indicaste y sali perfecto,ahora seguir con el adc,
espero que me vaya bien,
de nuevo gracias.
ok, voy agregando eso al tutorial as nadie se queda clavado en eso de nuevo
:pared
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: el_greg en Septiembre 07, 2009, 09:06:00
que tal suky gracias por tu pronta respuesta ya el problema esta resuelto gracias a
dios y a tu ayuda...pero hay un pequeo detalle para que todo sea perfecto y
continuar con el avance fructifero que llevo hasta ahora...la verdad que no
entiendo esta parte del programa sobre todo la parte de las direcciones 0x40 y esas
cosas... disculpa la molestia pero quiero ir parejo sin que se quede nada por
aprender gracias nuevamente ...excelente trabajo
// Envia comando al LCD
void comandXLCD(unsigned char a){
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);
}
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Septiembre 07, 2009, 09:54:44
Para entender eso debes tener conocimiento del LCD y para ello es importante
pegarle una leda a los datasheet. En un display de 2 lineas, la primera tiene las
direcciones 0x00 a 0x27 y la segunda de 0x40 a 0x67. Lo que hace la funcin es
fijar esa direccin y manda el comando con el formato correspondiente.

Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: el_greg en Septiembre 10, 2009, 11:02:04
QUE TAL SUky vuelvo a molestar ahora con respecto al ejemplo control de tclado
matricial, le agregue como dijistes las resistencias de pull up y cuando hago esto
solo se muestra el numero mas no el texto, adicionalmente cuando simulo el programa
me sale un mensaje, la simulacion no es en tiempo real carga del cpu 100% , la
verdad no se a que se debe....las resistencias de pull_up las estoy conectando en
serie y son de 10k creo que esta bien.....no se si entendiste el problema espero
que si
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Pgina 8

Sin ttulo
Publicado por: Suky en Septiembre 10, 2009, 11:28:44
Osea el texto "tecla pulsada " no se muestra? Pero si al pulsar cualquier tecla se
visualiza cual es? :P
Agregaste la linea comandXLCD(0x06);?
Despus que Proteus te utilice el 100% del CPU es un problema pero no veo porque!!
:'(
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: el_greg en Septiembre 10, 2009, 12:20:29
exacto, el texto tecla pulsada no se muestra y cuando quito las resistencias de
pull_up se muestra el texto pero no leo la tecla...otra cosa que no entiendo es
porq si en el programa se activan las pull_up del portb porq es necesario
agregarlas a los pines rb4-rb7
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: el_greg en Septiembre 10, 2009, 12:22:33
otra pregunta,que raro que c18 no tiene librerias para el manejo d teclados
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: el_greg en Septiembre 10, 2009, 12:52:36
que tal suky reduje el texto a uno mas corto y ahora si me salen ambas cosas la
tecla que pulso y el texto que le mando a mostar...pero queda el problema de la
carga del cpu a 100% que sera
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: arlen en Septiembre 24, 2009, 03:56:16
hola suky.
acabo de terminar en la parte del teclado matricial,y bueno he podido observar que
en la parte en el que se habilita las resistencias "pull up" , en realidad lo estas
deshabilitando,yo le puse INTCON2 = 0x00,
ademas le agregu el gotoxyXLCD(1,1) ya que me pasaba lo mismo que a "el_greg"
Cdigo:
void main(void){
OpenXLCD(FOUR_BIT & LINES_5X7); // Iniciamos LCD.comandXLCD(0x06); // Nos aseguramos incremento de direccion, display fijo
TRISB=0xF0; //eeeessss.PORTB=0x00;
INTCON2 = 0x00; // Habilitamos resistencias pull up.
INTCON = 0x88; //Configuracin de interrupcin por cambio de estado
RB4-RB7
comandXLCD(0x0C);
comandXLCD(0x01);
gotoxyXLCD(1,1);
putrsXLCD("TeclaPulsada \" \"");
gotoxyXLCD(2,2);
putrsXLCD("<<Autor Suky>>");
while(1){}

// Encendemos LCD.-

//Pasamos al oriden del Linea 2.// Bucle infinito.

}
luego tambien modifique un poco la funcion TestTeclado() agregando
PORTB=0x01|(PORTB<<1);
Quedando:
Cdigo:
char TestTeclado(void){
unsigned char i,j;
PORTB=0x0E; //xxxx1110;
i=0;
for(j=0;j<4;j++){
Pgina 9

Sin ttulo
if(PORTBbits.RB4==0){break;}
i++;
if(PORTBbits.RB5==0){break;}
i++;
if(PORTBbits.RB6==0){break;}
i++;
if(PORTBbits.RB7==0){break;}
i++;
PORTB=0x01|(PORTB<<1);//Trasladamos el 0 a siguiente Pin.
}
return(Teclas[i]);
}
haciendo esos cambios el programa y la simulacion salieron perfectos;
El archivo hex que dejo,usa el puerto D para el LCD (como esta en el tutorial pero
con el puerto C)
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: el_greg en Septiembre 27, 2009, 07:08:36
arlen disculpa no entiendo muy bien para que agregastes portb=0x01; ya no se
estaria trasladando un cero si no mas bien un 1 o me equivoco......aprovecho para
preguntar con que comando borro el texto que esta en la lcd..disculpen la molestia
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Septiembre 27, 2009, 07:12:03
Cita de: el_greg en Septiembre 27, 2009, 07:08:36
arlen disculpa no entiendo muy bien para que agregastes portb=0x01; ya no se
estaria trasladando un cero si no mas bien un 1 o me equivoco......aprovecho para
preguntar con que comando borro el texto que esta en la lcd..disculpen la molestia
Para borrar y retornar al origen: comandXLCD(0x01);
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: cyberian en Septiembre 30, 2009, 01:46:45
Excelente trabajo. Gracias por fomentar C18, creo que los que lo usen, van a ser
los ms creativos. No hay que limitarse a CCS. Es la era de C18. ;D
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: arlen en Octubre 08, 2009, 11:34:58
hola el_greg , disculpa por la demora ,le agregue
PORTB=0x01|(PORTB<<1);//Trasladamos el 0 a siguiente Pin
si no le agrego, seria asi:
PORTB:
0bxxxx1110
0bxxxx1100
0bxxxx1000
0bxxxx0000
si le agrego, seria asi:
PORTB:
0bxxxx1110
0bxxxx1101
0bxxxx1011
0bxxxx0111
el objetivo es enviar un '0' y a los demas un '1'

Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Octubre 08, 2009, 11:57:39
Pgina 10

Sin ttulo
Igual de las 2 maneras funcionaran por que se van descartando las filas
anteriores, adems este testeo se hace en unos pocos us ;)
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: xesc0 en Octubre 21, 2009, 10:26:04
Hola Gente!
Alguna idea de cmo puedo generar el archivo Hex con el Mplab ide?
Gracias a todos! ;D
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Octubre 21, 2009, 10:33:53
Haciendo Buil All ;D Exactamente cual es el problema, no lo genera? :shocked: En
la primer parte del tutorial se muestra como crear un proyecto para luego poder
compilar sin problemas ;)
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: xesc0 en Octubre 21, 2009, 11:01:33
Hola Suky :)
Si he seguido el tutorial y estaba mirando de compilar uno de tus ejemplos, no veo
la opcin de build all... puede que haya hecho algo mal. Veo que tengo la opcion
quickbuild (no.asm file)... y este si me da error :pared Que debera de revisar?
Empiezo otra vez de 0? :grr:
Ya esta... no haba aadido los header files y no aparecia la opcin :D ahora ya lo
genera sin problemas. Perdon :'( :'(
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: xesc0 en Octubre 21, 2009, 11:15:39
Hola de nuevo!
He hecho algunos ejemplos y todo a ido bien, pero el ejemplo del LCD me da un error
en el isis que no acabo de entender. La compilacin perfecta y el montaje dira que
tambin. El error dice as:
[PIC18 MEMORY] PC=0x026A. Address for TBLRD instruction (0x00041d00) is not in code
memory - zero returned.
Alguna idea de porque puede darme ese error? adjunto los archivos para que le
echeis un ojo ^^
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Octubre 22, 2009, 03:31:07
:grr: :grr: Realmente ni idea de que puede ser!
:titanic Ahora estoy saliendo,
devuelta le doy una revisin mas profunda :P
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: xesc0 en Octubre 27, 2009, 08:39:58
Suky te envio el proyecto entero y te cuento, he aadido las librerias de
MCC18\src\pmc_common\XLCD menos la putr... lo he probado con pic 18F2550 y con
18F4550.
Las versiones que tengo son MPASMWIN.exe v5.33, mplink.exe v4.33 y mcc18.exe v3.33.
Tambin intent cambiar de puertos utilizar el PortC en 2550 y PortD en 4550
(modificando la libreria xlcd.h) pero siempre me sale el mismo error en la
Pgina 11

Sin ttulo
simulacin "error en la memoria del pic" :pared :pared. Estoy seguro de que es un
problema en la compilacin, pero no entiendo el motivo, no toqu ni una coma de tu
cdigo original y segu al pie de la letra tus instrucciones :grr: :grr: :grr:
:grr: :grr:
No hay prisa alguna, yo dejo el proyecto para que todos los que quieran lo toqueten
xD y si alguien sabe la razn por la que no me funciona se agradece una respuesta
xD
Saludos!!!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Octubre 27, 2009, 09:39:24
Perdn xesc0 se me haba olvidado :P Haber, me baje la ltima versin de C18 la
instale y arme el proyecto como se indica en el tutorial compile y me indicaba lo
mismo :grr: Agregue todos los archivos fuente de XLCD.h que estn en
MCC18/src/pmc_common/XLCD y el mismo Xlcd.h al proyecto, una nueva prueba y
guala!!! Funciono!
Cada vez que me bajo una version nueva de C18 hay que trabajarlo distinto
:grr: :grr: :pared
Prueba de esa manera y sino me cuentas!

:grr:

:P

Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: xesc0 en Octubre 27, 2009, 09:46:37
Perfecto Suky! ahora corre como la seda. :bang: No me gusta nada que a cada versin
se tengan que hacer malabarismos, pero vaya, ya esta solucionado. Mil gracias!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: xesc0 en Octubre 27, 2009, 11:44:24
Si no quieres leer datos del LCD y envias el rw a tierra, cmo hay que modificar
la librera xlcd.h para ese pin?
Cdigo:
//#define RW_PIN
PORTDbits.RD2
/* PORT for RW */
#define RW_PIN LATDbits.LATD2
//#define TRIS_RW DDRDbits.RD2
/* TRIS for RW */
#define TRIS_RW
TRISDbits.TRISD2
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Octubre 27, 2009, 11:59:00
Hay que buscar donde de haga el test de estado del LCD y reemplazar por una demora
de 60us.
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: xesc0 en Octubre 27, 2009, 12:12:58
No te entiendo :) En la libreria xlcd.h tienes que asignarle un puerto al rw, el
retardo que dices supongo que es en el cdigo main, no en la librera o s?
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Octubre 27, 2009, 12:49:41
No, en el archivo busyxlcd.c se debe cambiar a:
Pgina 12

Sin ttulo
Cdigo:
unsigned char BusyXLCD(void)
{
Delay...
;// Demora de 60us.return(1);
}
Haciendo su copia de seguridad por las dudas

:P

Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: xesc0 en Octubre 27, 2009, 01:23:07
Me da error de compilacin en la linea en la que le agrego el delay y sigo sin
saber que puerto debo asignarle al rw en la libreria xlcd.h, he intentado eliminar
esas lineas pero entonces al compilar me dice que se requiere de algun valor para
este :D alguna idea?
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Octubre 27, 2009, 01:51:32
Me equivoque ha que retornar 0, busy debe quedar as por ejemplo para un cristal de
4MHz:
Cdigo:
unsigned char BusyXLCD(void)
{
Delay10TCYx(6);
return(0);
}
Y para eliminar el pin RW hay que asignarle una variable cualquiera o comentar RW
cuando se use :P
Para usar una variable hace as:
Cdigo:
extern char rw;
#define RW_PIN
#define TRIS_RW

rw//LATBbits.LATB6
rw//TRISBbits.TRISB6

/* PORT for RW */
/* TRIS for RW */

Y en archivo principal defins rw:


Cdigo:
unsigned char rw;
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: xesc0 en Octubre 27, 2009, 02:22:01
Error en la compilacin:
C:\MCC18\src\pmc_common\XLCD\busyxlcd.c:34:Error: syntax error
Me rindo :P
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Octubre 27, 2009, 02:25:35
Cita de: xesc0 en Octubre 27, 2009, 02:22:01
Pgina 13

Sin ttulo
Error en la compilacin:
C:\MCC18\src\pmc_common\XLCD\busyxlcd.c:34:Error: syntax error
Me rindo :P
:grr: :grr: :grr: Pero no entiendo, yo lo hice as y compilo sin problemas!

:P

Los includes estn en este orden:


Cdigo:
#include <delays.h>
#include <xlcd.h>
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: xesc0 en Octubre 28, 2009, 12:04:52
Lo siento suky la verdad es que pens que no iba a tener solucin y borr el
proyecto del Rw al ground. Pero no te preocupes! lo repetir y de paso ahora te
pongo nuevas dudas. Sigo con problemas con los lcds. Esta vez he utilizado un
pic18f4550 y he conectado el lcd en el puerto D del siguiente modo:
(http://i68.photobucket.com/albums/i29/Lin_Xesco/snap0023.png)
Para visualizarlo a mxima calidad: http://ves.cat/aa1z
He modificado el xlcd.h (tengo copia de seguridad de todos los archivos :angel:)
Cdigo:
#define DATA_PORT
#define TRIS_DATA_PORT

PORTD
TRISD

#define RW_PIN
#define TRIS_RW

LATBbits.LATD1
TRISBbits.TRISD1

/* PORT for RW */
/* TRIS for RW */

#define RS_PIN
#define TRIS_RS

LATBbits.LATD0
TRISBbits.TRISD0

/* PORT for RS */
/* TRIS for RS */

#define E_PIN
#define TRIS_E

LATBbits.LATD2
TRISBbits.TRISD2

/* PORT for D
/* TRIS for E */

*/

Y luego he utilizado el mismo cdigo que tienes tu en el tutorial.


He aadido todos los Header Files: delays.h, p18f4550.h y xlcd.h
Los Source foles tambin, los que corresponden a src\pmc_common\xlcd y el .c main
Me sale el siguinete error en la compilacin:
C:\MCC18\src\pmc_common\XLCD\busyxlcd.c:13:Error
'__tag_49'
C:\MCC18\src\pmc_common\XLCD\busyxlcd.c:13:Error
C:\MCC18\src\pmc_common\XLCD\busyxlcd.c:14:Error
'__tag_49'
C:\MCC18\src\pmc_common\XLCD\busyxlcd.c:14:Error
C:\MCC18\src\pmc_common\XLCD\busyxlcd.c:16:Error
'__tag_49'
C:\MCC18\src\pmc_common\XLCD\busyxlcd.c:16:Error
C:\MCC18\src\pmc_common\XLCD\busyxlcd.c:38:Error
'__tag_49'
C:\MCC18\src\pmc_common\XLCD\busyxlcd.c:38:Error
C:\MCC18\src\pmc_common\XLCD\busyxlcd.c:40:Error
Pgina 14

[1205] unknown member 'LATD1' in


[1131] type mismatch in assignment
[1205] unknown member 'LATD0' in
[1131] type mismatch in assignment
[1205] unknown member 'LATD2' in
[1131] type mismatch in assignment
[1205] unknown member 'LATD2' in
[1131] type mismatch in assignment
[1205] unknown member 'LATD2' in

Sin ttulo
'__tag_49'
C:\MCC18\src\pmc_common\XLCD\busyxlcd.c:40:Error [1131] type mismatch in assignment
C:\MCC18\src\pmc_common\XLCD\busyxlcd.c:42:Error [1205] unknown member 'LATD2' in
'__tag_49'
C:\MCC18\src\pmc_common\XLCD\busyxlcd.c:42:Error [1131] type mismatch in assignment
C:\MCC18\src\pmc_common\XLCD\busyxlcd.c:43:Error [1205] unknown member 'LATD1' in
'__tag_49'
C:\MCC18\src\pmc_common\XLCD\busyxlcd.c:43:Error [1131] type mismatch in assignment
C:\MCC18\src\pmc_common\XLCD\busyxlcd.c:48:Error [1205] unknown member 'LATD2' in
'__tag_49'
C:\MCC18\src\pmc_common\XLCD\busyxlcd.c:48:Error [1131] type mismatch in assignment
C:\MCC18\src\pmc_common\XLCD\busyxlcd.c:50:Error [1205] unknown member 'LATD2' in
'__tag_49'
C:\MCC18\src\pmc_common\XLCD\busyxlcd.c:50:Error [1131] type mismatch in assignment
C:\MCC18\src\pmc_common\XLCD\busyxlcd.c:52:Error [1205] unknown member 'LATD2' in
'__tag_49'
C:\MCC18\src\pmc_common\XLCD\busyxlcd.c:52:Error [1131] type mismatch in assignment
C:\MCC18\src\pmc_common\XLCD\busyxlcd.c:53:Error [1205] unknown member 'LATD1' in
'__tag_49'
C:\MCC18\src\pmc_common\XLCD\busyxlcd.c:53:Error [1131] type mismatch in assignment
Halting build on first failure as requested.
---------------------------------------------------------------------Debug build of project `C:\Proyectos Electronica\Programacin MPLAB\LCD 18f4550
PortD\LCD 18f4550 PortD.mcp' failed.
Language tool versions: MPASMWIN.exe v5.33, mplink.exe v4.33, mcc18.exe v3.33
Preprocessor symbol `__DEBUG' is defined.
Wed Oct 28 16:03:20 2009
---------------------------------------------------------------------BUILD FAILED
He mirado el documento Busyxlcd y no entiendo que tengo que cambiar, no aparece
ningn puerto asignado as que :pared :pared :pared :pared :pared :pared :pared
Si elimino el documento del proyecto me salta al siguiente con el mismo error.
Alguna idea?

:grr: :grr: :grr:

Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Octubre 28, 2009, 12:48:16
Lo que pasa es que estas definiendo por ejemplo: #define RW_PIN
LATBbits.LATD1 ,
y debera ser as: #define RW_PIN
LATDbits.LATD1 Falta cambiar el puerto en la
definicin ;)

Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: xesc0 en Octubre 28, 2009, 04:41:17
:idiot:
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: xesc0 en Octubre 29, 2009, 02:52:14
Me he encontrado con diferentes problemas a la hora de la simulacin, pero he
podido resolverlos, igualmente quiero compartirlos. Despus de conseguir compilar
el archivo, gracias a la correcin se Suky, en la simulacin me daba un error como
este: "logic contente(s) DR4 on the net". Si os fijais en el esquema
(http://ves.cat/aa1z) los pines del LCD D4, D5, D6 y D7 estan conectados justo
despues de los pines al RS, RW y E. Ese es el problema! los cuatro pines de datos
deben ir al final del puerto con el que se trabaje. Una vez conseguida la
simulacin no conseguia mostrar el "Por Suky" en la segunda linea, entonces saque
un trozo de texto de otro proyecto y ya funcion perfecto.
Pgina 15

Sin ttulo
Cdigo:
while( BusyXLCD() );
WriteCmdXLCD(0xC0);

//Con este pude pasar a la segunda linea

Despus de todo esto encontr otro ejemplo y hice unas pruebas... y ahora funciona
todo perfecto. Adjunto el documento por si alguien quiere invesitar :P
El ejemplo es de un LCD y un pic18f4550 por el puerto D.
Un saludo :)
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Octubre 29, 2009, 09:26:23
Cita de: xesc0 en Octubre 29, 2009, 02:52:14
Si os fijais en el esquema (http://ves.cat/aa1z) los pines del LCD D4, D5, D6 y D7
estan conectados justo despues de los pines al RS, RW y E. Ese es el problema! los
cuatro pines de datos deben ir al final del puerto con el que se trabaje.
Si es cierto! ( no me di cuenta :idiot: ) Tienen que estar en algn nible del
puerto, en 0-3 o 4-7.
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: xesc0 en Noviembre 04, 2009, 04:43:26
Hola de nuevo!
Ah mi problema, conversin analgico/digital, error:
C:\Proyectos Electronica\Programacin MPLAB\Conversion AnalogoDigital\LCD 18f4550
PortD.c:18:Error: syntax error
Correspondiente a:
Lnea18>
unsigned int Canal0, Canal1;
PD: Adjuntado todos los archivos en un rar :)
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Noviembre 04, 2009, 05:49:47
No hay problemas con las consultas ;)
Ahora mirando el cdigo detecto esto:
Cdigo:
void main(void){
InitPIC();
unsigned int Canal0, Canal1;
char String[4];
OpenXLCD(FOUR_BIT & LINES_5X7); // Iniciamos LCD.Donde estas declarando variables despus de llamar a una funcin, por ello el error
de sintaxis.
Otra cosita, veo que cambiaste una librera del lcd, pero la has dejado con el
mismo nombre. El compilador buscar primero la que tiene por defecto y si no la
encuentra usar la tuya. Lo mejor es cambiar la que viene por defecto o tendrs que
cambiarle el nombre y copiar los source de la librera modificando el include de
cada uno de ellos :P
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Pgina 16

Sin ttulo
Publicado por: xesc0 en Noviembre 05, 2009, 07:09:21
Ya pude solucionar el problema anterior, ahora me da otro error, seguro que debido
a que yo estoy utilizando el pic4550 en vez del 2550 del ejemplo. Lo miro y remiro
pero no se a que error se refiere el Isis.
(http://i68.photobucket.com/albums/i29/Lin_Xesco/snap0024.png)
Las librerias que modifico son a las que va el programa directamente c:\MCC18\h
(tengo copia de seguridad) y adjunto las librerias modificadas a los archivos
comprimidos por si se quieren ver las modificaciones ^^.
Gracias a lo que has dicho en el anterior post he descubierto como escribir todos
los bloques de cdigo bien ordenaditos para luego hacer la llamada antes de que se
declaren las funciones :P :bang: :bang:
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Noviembre 05, 2009, 10:26:01
Fjate de configurar "manualmente" los registros como muestro en este hilo
(http://www.ucontrol.com.ar/forosmf/explicaciones-y-consultas-tecnicas/modulo-de-co
nversion-analogica-(-pic16f87xa-y-pic18f2455255044554550-)/) ;)
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: freshdesing en Noviembre 05, 2009, 02:37:42
Primero felicitarte por el tutorial. ahora mismo estoy atascado en el lcd...como
otros tantos....
He copiado directamente los ficheros tal y como vienen en el tutorial y he aadido
la lnea
Cdigo: (c)
OpenXLCD(FOUR_BIT & LINES_5X7); // Iniciamos LCD.comandXLCD(0x06); // Nos aseguramos incremento de direccion, display fijo
comandXLCD(0x0C);
// Encendemos LCD.Pero me aparece la primera lnea con los cuadrados en negro y no escribe nada.
Tambin he probado copiando todos los .c y el .h de la libreria en el directorio de
trabajo y tampoco fuciona. No he modificado la libreria, ya que tengo E,RS,RW en
los pines qeu vienen por defecto y los datos en el "nibble" bajo del puerto B.
Tengo u nXtal de 4MHz. Si coloco otro pic 18F2550 para controlar el LCD y
programado el Mikro C, funciona perfectamente.
Llevo varios das probando diferentes librerias, pero hay algo que se me est
pasando por alto.
Uso el MPlab 8.0.
Si alguien puede ayudarme se lo agradecera.
Un saludo y gracias de antemano.
Agrego el proyecto, que es bajado del foro.
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: xesc0 en Noviembre 05, 2009, 05:38:30
Hola freshdesing!
El cdigo escrito esta bien pero deberas crear el proyecto con el Mplab desde el
inicio tal como explica Suky en el tutorial (no es buena idea partir de uno ya
creado). En cuanto a las librerias no has llamado correctamente a la p18f2550.h ni
a la delays.h van en las header files ubicadas en c:\MCC18\h.
Pgina 17

Sin ttulo
La simulacin con el Isis no me ha dado ningn error. Mi version proteus es la 7.4.
La prxima vez mira de dar ms datos acerca del problema que tienes, porque yo
supongo que el problema a has tenido a sido el error en la copilacin no?
Un saludo!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: xesc0 en Noviembre 05, 2009, 07:47:02
He mirado el hilo que recomendaste (muy bien hecho :P) y no veo ninguna
configuracin del ACDCON en el cdigo ejemplo de la conversin analgica/digital,
porque?

Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Noviembre 05, 2009, 09:31:03
Como que no! y esta parte:
Cdigo:
ADCON0=0x01;
//Canal 0, Modulo habilitado.ADCON1=0x0E;
// AN0, Vdd, Vss.ADCON2=0x94;
// Justificado a la derecha, 4Tad, Fosc/4
;D
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: xesc0 en Noviembre 06, 2009, 06:57:41
Ese trozo de cdigo es del ejemplo en c18 de la conversin analgica digital pero
no es eso a lo que me refiero, digo que en el ejemplo del tutorial, donde estan los
dems ejemplos en Mplab esa orden no esta (en el ejemplo analgico digital)!
Cdigo:
#include
#include
#include
#include
#include
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma

<p18f2550.h>
<delays.h>
<xlcd.h>
<stdlib.h> //Libreria para conversiones.
<adc.h>
config
config
config
config
config
config
config
config
config
config
config

FOSC = XT_XT,FCMEN = OFF,IESO = OFF, CPUDIV = OSC1_PLL2


PWRT = ON,BOR = OFF,BORV = 0
WDT = OFF,WDTPS = 32768
MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,CCP2MX = OFF
STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF
CP0 = ON,CP1 = ON,CP2 = ON
CPB = ON,CPD = ON
WRT0 = ON,WRT1 = ON,WRT2 = ON
WRTB = ON,WRTC = ON,WRTD = ON
EBTR0 = ON,EBTR1 = ON,EBTR2 = ON
EBTRB = ON

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

Sin ttulo
// Envia comando al LCD
void comandXLCD(unsigned char a){
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(void){
unsigned int Canal0, Canal1;
char String[4];
OpenXLCD(FOUR_BIT & LINES_5X7); // Iniciamos LCD.comandXLCD(0x06); // Nos aseguramos incremento de direccion, display fijo
OpenADC(ADC_FOSC_RC & ADC_2_TAD & ADC_RIGHT_JUST, ADC_REF_VDD_VSS &
ADC_INT_OFF, ADC_2ANA);
comandXLCD(0x0C);
// Encendemos LCD.while(1){
comandXLCD(0x01);
// Borra pantalla y vuelve
al origen.putrsXLCD("Presionar boton");
while(PORTAbits.RA2==1){}
// Espero a que se accione el
pulsador.SetChanADC(0); // Selecciono canal a convertir.//Delay10TCYx(1);
// 10us para que se cargue el capacitor
sample&hold (Solo cuando se selecciona ADC_0_TAD).ConvertADC();
// Comienza conversin.While(BusyADC()==1){}
// Hasta que se finalice conversin.Canal0= ReadADC();
// Realizo lectura.-

sample&hold

SetChanADC(1); // Selecciono canal a convertir.//Delay10TCYx(1);


// 10us para que se cargue el capacitor
(Solo cuando se selecciona ADC_0_TAD).ConvertADC();
// Comienza conversin.While(BusyADC()==1){}
// Hasta que se finalice conversin.Canal1= ReadADC();
// Realizo lectura.comandXLCD(0x01);

// Borra pantalla y vuelve

al origen.putrsXLCD("Canal 0 = ");
itoa(Canal0, String);

// Convertimos entero a string.-

putsXLCD(String);
gotoxyXLCD(1,2);
putrsXLCD("Canal 1 = ");
itoa(Canal1, String);

// Convertimos entero a string.-

putsXLCD(String);
Delay10KTCYx(100);
}
}
Pgina 19

Sin ttulo
Lo que s veo es esto:
OpenADC(ADC_FOSC_RC & ADC_2_TAD & ADC_RIGHT_JUST, ADC_REF_VDD_VSS & ADC_INT_OFF,
ADC_2ANA);
En el AD Converter de C:\MCC18\doc\periph-lib las ordenes que se dan para el 2550
son las mismas para el 4550, porque estan en el mismo grupo (ADC_V5). Esto es una
sustitucin del ACDCON?
http://www.ucontrol.com.ar/forosmf/programacion-en-c/tutorial-mplab-c18-desde-0/msg
7086/#msg7086
:grr: :grr: :grr: entiendemeeeee

;D

Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: freshdesing en Noviembre 06, 2009, 08:41:14
Xesc, gracias por su respuesta. Al compilar solo me salen dos warning, no me da
ningn error.
d:\Mis documentos\PROYECTOS\MPLAB C18\Curso
PortB\LCD 18f2550 PortB.c:50:Warning [2066]
d:\Mis documentos\PROYECTOS\MPLAB C18\Curso
PortB\LCD 18f2550 PortB.c:52:Warning [2066]
Al ponerlo con
cuadrados, sin
las dos .h que
incluido en el

Todopic C18\18F2550_mikroe\LCD 18f2550


type qualifier mismatch in assignment
Todopic C18\18F2550_mikroe\LCD 18f2550
type qualifier mismatch in assignment

el hardware solo se enciende la primera fila del LCD y con los


ningn texto y se queda as. He creado el proyecto desde cero. Y
mencionas, las tengo al principio del programa, pero tambien las he
proyecto.... pero todo sigue igual....

Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: xesc0 en Noviembre 06, 2009, 08:49:17
Cuando veas que te sale un error, puedes seguirlo:
d:\Mis documentos\PROYECTOS\MPLAB C18\Curso
PortB\LCD 18f2550 PortB.c:50:Warning [2066]
d:\Mis documentos\PROYECTOS\MPLAB C18\Curso
PortB\LCD 18f2550 PortB.c:52:Warning [2066]

Todopic C18\18F2550_mikroe\LCD 18f2550


type qualifier mismatch in assignment
Todopic C18\18F2550_mikroe\LCD 18f2550
type qualifier mismatch in assignment

Lo que ves en azul es la linea afectada por una "anomalia" xD una vez sepas la
linea, boton derecho sobre el cuadro donde tienes el cdigo, luego click en goto,
pones la linea y te lleva directo. No se que error tienes mira de seguir las lineas
que te dan problemas para descubrirlo :P
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Noviembre 06, 2009, 10:27:00
:pared Uno lo hace con la funcin OpenADC(... y en el otro se fijan los registros
a "mano". No puedo creer que no se entienda eso :P
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Noviembre 06, 2009, 10:45:43
Cita de: freshdesing en Noviembre 06, 2009, 08:41:14
Xesc, gracias por su respuesta. Al compilar solo me salen dos warning, no me da
ningn error.
d:\Mis documentos\PROYECTOS\MPLAB C18\Curso Todopic C18\18F2550_mikroe\LCD 18f2550
PortB\LCD 18f2550 PortB.c:50:Warning [2066] type qualifier mismatch in assignment
Pgina 20

Sin ttulo
d:\Mis documentos\PROYECTOS\MPLAB C18\Curso Todopic C18\18F2550_mikroe\LCD 18f2550
PortB\LCD 18f2550 PortB.c:52:Warning [2066] type qualifier mismatch in assignment
Al ponerlo con
cuadrados, sin
las dos .h que
incluido en el

el hardware solo se enciende la primera fila del LCD y con los


ningn texto y se queda as. He creado el proyecto desde cero. Y
mencionas, las tengo al principio del programa, pero tambien las he
proyecto.... pero todo sigue igual....

Por lo que indicas el LCD nunca se inicia correctamente, verifica la correcta


configuracin de los pines que coincidan con el que estas implementando. Tambin
revisa el siguiente mensaje
(http://www.ucontrol.com.ar/forosmf/programacion-en-c/tutorial-mplab-c18-desde-0-co
mentarios-dudas-yu-opiniones/msg12934/#msg12934) en donde un compaero tiene
problemas con las funciones al implementar &
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: freshdesing en Noviembre 10, 2009, 01:46:07
Siento no saber el porqu pero ya est solucionado. Aqu el programa que me ha
funcionado por si alguien lo necesita.
Est sacado de "MPLAB C18 desde 0", por Suky www.ucontrol.com.ar y de
"encaminando C", por navaismo http://encaminandoc.blogspot.com/. Gracias a ambos.
LCD18F2550PORTB.c
Cdigo: (c)
#include <p18f2550.h>
#include <delays.h>
#include <lcd.h>
#include <stdlib.h>
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma

config
config
config
config
config
config
config
config
config
config
config

FOSC = XT_XT,FCMEN = OFF,IESO = OFF, CPUDIV = OSC1_PLL2


PWRT = ON,BOR = OFF,BORV = 0
WDT = OFF,WDTPS = 32768
MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,CCP2MX = OFF
STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF
CP0 = ON,CP1 = ON,CP2 = ON
CPB = ON,CPD = ON
WRT0 = ON,WRT1 = ON,WRT2 = ON
WRTB = ON,WRTC = ON,WRTD = ON
EBTR0 = ON,EBTR1 = ON,EBTR2 = ON
EBTRB = ON

char aaa[]="Hello";
char bbb[]="Microchip";
void DelayFor18TCY(void){
Delay10TCYx(2);
}
void DelayPORXLCD(void){
Delay1KTCYx(15);
}
void DelayXLCD(void){
Delay1KTCYx(2);
}
// Envia comando al LCD
void comandXLCD(unsigned char a){
BusyXLCD();
Pgina 21

Sin ttulo
WriteCmdXLCD(a);
}
// Escribir Strings en el LCD
void WriteLCD( char txt[16], char num[5])
{
putrsXLCD(txt);
//Mostramos mensaje en LCD
putsXLCD(num);
//Enviamos cadena de enteros
}
// 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(void){
int num=101;
char nums;
itoa(num,nums);

//numeo en cadena

OpenXLCD(FOUR_BIT & LINES_5X7); // Iniciamos LCD.comandXLCD(0x0C);


comandXLCD(0x06); // Nos aseguramos incremento de direccion, display fijo
// Encendemos LCD.putsXLCD(aaa);
putsXLCD(bbb);
gotoxyXLCD(1,2);
putrsXLCD("hello");
comandXLCD(DON);
Delay1KTCYx(200);
comandXLCD(CLEAR);
WriteLCD("el nmero es:",nums);
while(1){
}

//Pasamos al oriden del Linea 2.-

// Bucle infinito.

}
lcd.h
Cdigo: (c)
#ifndef __XLCD_H
#define __XLCD_H
/* PIC18 XLCD peripheral routines.
*
*
Notes:
*
- These libraries routines are written to support the
*
Hitachi HD44780 LCD controller.
*
- The user must define the following items:
*
- The LCD interface type (4- or 8-bits)
*
- If 4-bit mode
*
- whether using the upper or lower nibble
*
- The data port
Pgina 22

*
*
*
*
*
*
*
*/

- The
-

Sin ttulo
The tris register for data port
The control signal ports and pins
The control signal port tris and pins
user must provide three delay routines:
DelayFor18TCY() provides a 18 Tcy delay
DelayPORXLCD() provides at least 15ms delay
DelayXLCD() provides at least 5ms delay

/* Interface type 8-bit or 4-bit


* For 8-bit operation uncomment the #define BIT8
*/
/* #define BIT8 */
/* When in 4-bit interface define if the data is in the upper
* or lower nibble. For lower nibble, comment the #define UPPER
*/
//#define UPPER
/* DATA_PORT defines the port to which the LCD data lines are connected */
#define DATA_PORT
PORTB
#define TRIS_DATA_PORT TRISB
/* CTRL_PORT defines the port where the control
* These are just samples, change to match your
*/
#define RW_PIN
PORTBbits.RB6
/* PORT for RW
#define TRIS_RW DDRBbits.RB6
/* TRIS for RW
#define RS_PIN
PORTBbits.RB5
/* PORT for RS
#define TRIS_RS DDRBbits.RB5
/* TRIS for RS
#define E_PIN
PORTBbits.RB4
/* PORT for E
#define TRIS_E
DDRBbits.RB4
/* TRIS for E

lines are connected.


application.
*/
*/
*/
*/
*/
*/

/* Display ON/OFF Control defines */


#define DON
0b00001111 /* Display on
#define DOFF
0b00001011 /* Display off
#define CURSOR_ON
0b00001111 /* Cursor on
#define CURSOR_OFF 0b00001101 /* Cursor off
#define BLINK_ON
0b00001111 /* Cursor Blink
#define BLINK_OFF
0b00001110 /* Cursor No Blink
/* Cursor or Display Shift defines */
#define SHIFT_CUR_LEFT
0b00010011
#define SHIFT_CUR_RIGHT
0b00010111
#define SHIFT_DISP_LEFT
0b00011011
#define SHIFT_DISP_RIGHT 0b00011111
/*Funciones*/
#define CLEAR

0x01

/*
/*
/*
/*

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

Cursor shifts to the left


Cursor shifts to the right
Display shifts to the left
Display shifts to the right

*/
*/
*/
*/

/*Borra el display*/

/* Function Set defines */


#define FOUR_BIT
0b00101111
#define EIGHT_BIT 0b00111111
#define LINE_5X7
0b00110011
#define LINE_5X10 0b00110111
#define LINES_5X7 0b00111011

/*
/*
/*
/*
/*

4-bit Interface
8-bit Interface
5x7 characters, single line
5x10 characters
5x7 characters, multiple line

*/
*/
*/
*/
*/

#define PARAM_SCLASS auto


#define MEM_MODEL far /* Change this to near for small memory model */
/* OpenXLCD
* Configures I/O pins for external LCD
Pgina 23

Sin ttulo
*/
void OpenXLCD(unsigned char lcdtype);
/* SetCGRamAddr
* Sets the character generator address
*/
void SetCGRamAddr(unsigned char CGaddr);
/* SetDDRamAddr
* Sets the display data address
*/
void SetDDRamAddr(unsigned char DDaddr);
/* BusyXLCD
* Returns the busy status of the LCD
*/
unsigned char BusyXLCD(void);
/* ReadAddrXLCD
* Reads the current address
*/
unsigned char ReadAddrXLCD(void);
/* ReadDataXLCD
* Reads a byte of data
*/
char ReadDataXLCD(void);
/* WriteCmdXLCD
* Writes a command to the LCD
*/
void WriteCmdXLCD(unsigned char cmd);
/* WriteDataXLCD
* Writes a data byte to the LCD
*/
void WriteDataXLCD(char data);
/* putcXLCD
* A putc is a write
*/
#define putcXLCD WriteDataXLCD
/* putsXLCD
* Writes a string of characters to the LCD
*/
void putsXLCD(char *buffer);
/* putrsXLCD
* Writes a string of characters in ROM to the LCD
*/
void putrsXLCD(const rom char *buffer);
/* User defines these routines according to the oscillator frequency */
extern void DelayFor18TCY(void);
extern void DelayPORXLCD(void);
extern void DelayXLCD(void);
/********************************************************************
*
Function Name: OpenXLCD
*
*
Return Value:
void
*
*
Parameters:
lcdtype: sets the type of LCD (lines)
*
*
Description:
This routine configures the LCD. Based on
*
Pgina 24

Sin ttulo
*
the Hitachi HD44780 LCD controller. The
*
*
routine will configure the I/O pins of the *
*
microcontroller, setup the LCD for 4- or
*
*
8-bit mode and clear the display. The user *
*
must provide three delay routines:
*
*
DelayFor18TCY() provides a 18 Tcy delay
*
*
DelayPORXLCD() provides at least 15ms delay *
*
DelayXLCD() provides at least 5ms delay
*
********************************************************************/
void OpenXLCD(unsigned char lcdtype)
{
// The data bits must be either a 8-bit port or the upper or
// lower 4-bits of a port. These pins are made into inputs
#ifdef BIT8
// 8-bit mode, use whole port
DATA_PORT = 0;
TRIS_DATA_PORT = 0xff;
#else
// 4-bit mode
#ifdef UPPER
// Upper 4-bits of the port
DATA_PORT &= 0x0f;
TRIS_DATA_PORT |= 0xf0;
#else
// Lower 4-bits of the port
DATA_PORT &= 0xf0;
TRIS_DATA_PORT |= 0x0f;
#endif
#endif
TRIS_RW = 0;
// All control signals made outputs
TRIS_RS = 0;
TRIS_E = 0;
RW_PIN = 0;
// R/W pin made low
RS_PIN = 0;
// Register select pin made low
E_PIN = 0;
// Clock pin made low
// Delay for 15ms to allow for LCD Power on reset
DelayPORXLCD();
// Setup interface to LCD
#ifdef BIT8
TRIS_DATA_PORT = 0;
DATA_PORT = 0b00110000;
#else
#ifdef UPPER
TRIS_DATA_PORT &= 0x0f;
DATA_PORT &= 0x0f;
DATA_PORT |= 0b00100000;
#else
TRIS_DATA_PORT &= 0xf0;
DATA_PORT &= 0xf0;
DATA_PORT |= 0b00000010;
#endif
#endif
E_PIN = 1;
DelayFor18TCY();
E_PIN = 0;

//
//
//
//
//

8-bit mode interface


Data port output
Function set cmd(8-bit interface)
4-bit mode interface
Upper nibble interface

// Function set cmd(4-bit interface)


// Lower nibble interface
// Function set cmd(4-bit interface)
// Clock the cmd in

// Delay for at least 4.1ms


DelayXLCD();
// Setup interface to LCD
#ifdef BIT8
DATA_PORT = 0b00110000;
#else
#ifdef UPPER

// 8-bit interface
// Function set cmd(8-bit interface)
// 4-bit interface
// Upper nibble interface
Pgina 25

DATA_PORT &= 0x0f;


DATA_PORT |= 0b00100000;
#else
DATA_PORT &= 0xf0;
DATA_PORT |= 0b00000010;

Sin ttulo
// Function set cmd(4-bit interface)
// Lower nibble interface
// Function set cmd(4-bit interface)

#endif
#endif
E_PIN = 1;
DelayFor18TCY();
E_PIN = 0;

// Clock the cmd in

// Delay for at least 100us


DelayXLCD();
// Setup interface to LCD
#ifdef BIT8
DATA_PORT = 0b00110000;
#else
#ifdef UPPER
DATA_PORT &= 0x0f;
DATA_PORT |= 0b00100000;
#else
DATA_PORT &= 0xf0;
DATA_PORT |= 0b00000010;
#endif
#endif
E_PIN = 1;
DelayFor18TCY();
E_PIN = 0;
#ifdef BIT8
TRIS_DATA_PORT = 0xff;
#else
#ifdef UPPER
TRIS_DATA_PORT |= 0xf0;
#else
TRIS_DATA_PORT |= 0x0f;
#endif
#endif

//
//
//
//
//

8-bit interface
Function set cmd(8-bit interface)
4-bit interface
Upper nibble interface
Function set cmd(4-bit interface)

// Lower nibble interface


// Function set cmd(4-bit interface)

// Clock cmd in

//
//
//
//
//
//
//

8-bit interface
Make data port input
4-bit interface
Upper nibble interface
Make data nibble input
Lower nibble interface
Make data nibble input

// Set data interface width, # lines, font


while(BusyXLCD());
// Wait if LCD busy
WriteCmdXLCD(lcdtype);
// Function set cmd
// Turn the display on then off
while(BusyXLCD());
// Wait if LCD busy
WriteCmdXLCD(DOFF&CURSOR_OFF&BLINK_OFF);
// Display OFF/Blink OFF
while(BusyXLCD());
// Wait if LCD busy
WriteCmdXLCD(DON&CURSOR_ON&BLINK_ON);
// Display ON/Blink ON
// Clear display
while(BusyXLCD());
WriteCmdXLCD(0x01);

// Wait if LCD busy


// Clear display

// Set entry mode inc, no shift


while(BusyXLCD());
// Wait if LCD busy
WriteCmdXLCD(SHIFT_CUR_LEFT);
// Entry Mode
// Set DD Ram address to 0
while(BusyXLCD());
SetDDRamAddr(0);

// Wait if LCD busy


// Set Display data ram address to 0

return;
Pgina 26

Sin ttulo
}
/********************************************************************
*
Function Name: BusyXLCD
*
*
Return Value:
char: busy status of LCD controller
*
*
Parameters:
void
*
*
Description:
This routine reads the busy status of the
*
*
Hitachi HD44780 LCD controller.
*
********************************************************************/
unsigned char BusyXLCD(void)
{
RW_PIN = 1;
// Set the control bits for read
RS_PIN = 0;
DelayFor18TCY();
E_PIN = 1;
// Clock in the command
DelayFor18TCY();
#ifdef BIT8
// 8-bit interface
if(DATA_PORT&0x80)
// Read bit 7 (busy bit)
{
// If high
E_PIN = 0;
// Reset clock line
RW_PIN = 0;
// Reset control line
return 1;
// Return TRUE
}
else
// Bit 7 low
{
E_PIN = 0;
// Reset clock line
RW_PIN = 0;
// Reset control line
return 0;
// Return FALSE
}
#else
// 4-bit interface
#ifdef UPPER
// Upper nibble interface
if(DATA_PORT&0x80)
#else
// Lower nibble interface
if(DATA_PORT&0x08)
#endif
{
E_PIN = 0;
// Reset clock line
DelayFor18TCY();
E_PIN = 1;
// Clock out other nibble
DelayFor18TCY();
E_PIN = 0;
RW_PIN = 0;
// Reset control line
return 1;
// Return TRUE
}
else
// Busy bit is low
{
E_PIN = 0;
// Reset clock line
DelayFor18TCY();
E_PIN = 1;
// Clock out other nibble
DelayFor18TCY();
E_PIN = 0;
RW_PIN = 0;
// Reset control line
return 0;
// Return FALSE
}
#endif
}
/********************************************************************
*
Function Name: putrsXLCD
*
Return Value:
void
*
Parameters:
buffer: pointer to string
*
Description:
This routine writes a string of bytes to the
*
Hitachi HD44780 LCD controller. The user
Pgina 27

Sin ttulo
*
must check to see if the LCD controller is
*
busy before calling this routine. The data
*
is written to the character generator RAM or
*
the display data RAM depending on what the
*
previous SetxxRamAddr routine was called.
********************************************************************/
void putrsXLCD(const rom char *buffer)
{
while(*buffer)
// Write data to LCD up to null
{
while(BusyXLCD());
// Wait while LCD is busy
WriteDataXLCD(*buffer); // Write character to LCD
buffer++;
// Increment buffer
}
return;
}
/********************************************************************
*
Function Name: putsXLCD
*
Return Value:
void
*
Parameters:
buffer: pointer to string
*
Description:
This routine writes a string of bytes to the
*
Hitachi HD44780 LCD controller. The user
*
must check to see if the LCD controller is
*
busy before calling this routine. The data
*
is written to the character generator RAM or
*
the display data RAM depending on what the
*
previous SetxxRamAddr routine was called.
********************************************************************/
void putsXLCD(char *buffer)
{
while(*buffer)
// Write data to LCD up to null
{
while(BusyXLCD());
// Wait while LCD is busy
WriteDataXLCD(*buffer); // Write character to LCD
buffer++;
// Increment buffer
}
return;
}
/*********************************************************************
*
Function Name: ReadAddrXLCD
*
*
Return Value:
char: address from LCD controller
*
*
Parameters:
void
*
*
Description:
This routine reads an address byte from the *
*
Hitachi HD44780 LCD controller. The user
*
*
must check to see if the LCD controller is
*
*
busy before calling this routine. The address*
*
is read from the character generator RAM or *
*
the display data RAM depending on what the
*
*
previous SetxxRamAddr routine was called.
*
*********************************************************************/
unsigned char ReadAddrXLCD(void)
{
char data;
// Holds the data retrieved from the LCD
#ifdef BIT8
RW_PIN = 1;
RS_PIN = 0;
DelayFor18TCY();
E_PIN = 1;
DelayFor18TCY();
data = DATA_PORT;

// 8-bit interface
// Set control bits for the read
// Clock data out of the LCD controller
// Save the data in the register
Pgina 28

Sin ttulo
E_PIN = 0;
RW_PIN = 0;
#else
RW_PIN = 1;
RS_PIN = 0;
DelayFor18TCY();
E_PIN = 1;
DelayFor18TCY();
#ifdef UPPER
data = DATA_PORT&0xf0;
data
#else
data = (DATA_PORT<<4)&0xf0;
data
#endif
E_PIN = 0;
DelayFor18TCY();
E_PIN = 1;
DelayFor18TCY();
#ifdef UPPER
data |= (DATA_PORT>>4)&0x0f;
data
#else
data |= DATA_PORT&0x0f;
data
#endif
E_PIN = 0;
RW_PIN = 0;
#endif
return (data&0x7f);
bit
}

// Reset the control bits


// 4-bit interface
// Set control bits for the read
// Clock data out of the LCD controller
// Upper nibble interface
// Read the nibble into the upper nibble of
// Lower nibble interface
// Read the nibble into the upper nibble of
// Reset the clock
// Clock out the lower nibble
// Upper nibble interface
// Read the nibble into the lower nibble of
// Lower nibble interface
// Read the nibble into the lower nibble of

// Reset the control lines


// Return the address, Mask off the busy

/********************************************************************
*
Function Name: ReadDataXLCD
*
*
Return Value:
char: data byte from LCD controller
*
*
Parameters:
void
*
*
Description:
This routine reads a data byte from the
*
*
Hitachi HD44780 LCD controller. The user
*
*
must check to see if the LCD controller is *
*
busy before calling this routine. The data *
*
is read from the character generator RAM or *
*
the display data RAM depending on what the *
*
previous SetxxRamAddr routine was called.
*
********************************************************************/
char ReadDataXLCD(void)
{
char data;
#ifdef BIT8
RS_PIN = 1;
RW_PIN = 1;
DelayFor18TCY();
E_PIN = 1;
DelayFor18TCY();
data = DATA_PORT;
E_PIN = 0;
RS_PIN = 0;
RW_PIN = 0;
#else
RW_PIN = 1;
RS_PIN = 1;
DelayFor18TCY();

// 8-bit interface
// Set the control bits
// Clock the data out of the LCD
// Read the data
// Reset the control bits
// 4-bit interface

Pgina 29

E_PIN = 1;
DelayFor18TCY();
#ifdef UPPER
data = DATA_PORT&0xf0;
#else
data = (DATA_PORT<<4)&0xf0;
#endif
E_PIN = 0;
DelayFor18TCY();
E_PIN = 1;
DelayFor18TCY();
#ifdef UPPER
data |= (DATA_PORT>>4)&0x0f;
#else
data |= DATA_PORT&0x0f;
#endif
E_PIN = 0;
RS_PIN = 0;
RW_PIN = 0;
#endif
return(data);
}

Sin ttulo
// Clock the data out of the LCD
//
//
//
//

Upper nibble interface


Read the upper nibble of data
Lower nibble interface
read the upper nibble of data

// Reset the clock line


// Clock the next nibble out of the LCD
//
//
//
//

Upper nibble interface


Read the lower nibble of data
Lower nibble interface
Read the lower nibble of data

// Reset the control bits


// Return the data byte

/********************************************************************
*
Function Name: SetCGRamAddr
*
*
Return Value:
void
*
*
Parameters:
CGaddr: character generator ram address
*
*
Description:
This routine sets the character generator
*
*
address of the Hitachi HD44780 LCD
*
*
controller. The user must check to see if
*
*
the LCD controller is busy before calling
*
*
this routine.
*
********************************************************************/
void SetCGRamAddr(unsigned char CGaddr)
{
#ifdef BIT8
// 8-bit interface
TRIS_DATA_PORT = 0;
// Make data port ouput
DATA_PORT = CGaddr | 0b01000000;
// Write cmd and address to port
RW_PIN = 0;
// Set control signals
RS_PIN = 0;
DelayFor18TCY();
E_PIN = 1;
// Clock cmd and address in
DelayFor18TCY();
E_PIN = 0;
DelayFor18TCY();
TRIS_DATA_PORT = 0xff;
// Make data port inputs
#else
// 4-bit interface
#ifdef UPPER
// Upper nibble interface
TRIS_DATA_PORT &= 0x0f;
// Make nibble input
DATA_PORT &= 0x0f;
// and write upper nibble
DATA_PORT |= ((CGaddr | 0b01000000) & 0xf0);
#else
// Lower nibble interface
TRIS_DATA_PORT &= 0xf0;
// Make nibble input
DATA_PORT &= 0xf0;
// and write upper nibble
DATA_PORT |= (((CGaddr |0b01000000)>>4) & 0x0f);
#endif
RW_PIN = 0;
// Set control signals
RS_PIN = 0;
DelayFor18TCY();
E_PIN = 1;
// Clock cmd and address in
DelayFor18TCY();
E_PIN = 0;
#ifdef UPPER
// Upper nibble interface
Pgina 30

#else

Sin ttulo
DATA_PORT &= 0x0f;
// Write lower nibble
DATA_PORT |= ((CGaddr<<4)&0xf0);
// Lower nibble interface
DATA_PORT &= 0xf0;
// Write lower nibble
DATA_PORT |= (CGaddr&0x0f);

#endif
DelayFor18TCY();
E_PIN = 1;
DelayFor18TCY();
E_PIN = 0;
#ifdef UPPER
TRIS_DATA_PORT |= 0xf0;
#else
TRIS_DATA_PORT |= 0x0f;
#endif
#endif
return;
}

// Clock cmd and address in


//
//
//
//

Upper nibble interface


Make inputs
Lower nibble interface
Make inputs

/********************************************************************
*
Function Name: SetDDRamAddr
*
*
Return Value:
void
*
*
Parameters:
CGaddr: display data address
*
*
Description:
This routine sets the display data address *
*
of the Hitachi HD44780 LCD controller. The *
*
user must check to see if the LCD controller*
*
is busy before calling this routine.
*
********************************************************************/
void SetDDRamAddr(unsigned char DDaddr)
{
#ifdef BIT8
// 8-bit interface
TRIS_DATA_PORT = 0;
// Make port output
DATA_PORT = DDaddr | 0b10000000;
// Write cmd and address to port
RW_PIN = 0;
// Set the control bits
RS_PIN = 0;
DelayFor18TCY();
E_PIN = 1;
// Clock the cmd and address in
DelayFor18TCY();
E_PIN = 0;
DelayFor18TCY();
TRIS_DATA_PORT = 0xff;
// Make port input
#else
// 4-bit interface
#ifdef UPPER
// Upper nibble interface
TRIS_DATA_PORT &= 0x0f;
// Make port output
DATA_PORT &= 0x0f;
// and write upper nibble
DATA_PORT |= ((DDaddr | 0b10000000) & 0xf0);
#else
// Lower nibble interface
TRIS_DATA_PORT &= 0xf0;
// Make port output
DATA_PORT &= 0xf0;
// and write upper nibble
DATA_PORT |= (((DDaddr | 0b10000000)>>4) & 0x0f);
#endif
RW_PIN = 0;
// Set control bits
RS_PIN = 0;
DelayFor18TCY();
E_PIN = 1;
// Clock the cmd and address in
DelayFor18TCY();
E_PIN = 0;
#ifdef UPPER
// Upper nibble interface
DATA_PORT &= 0x0f;
// Write lower nibble
DATA_PORT |= ((DDaddr<<4)&0xf0);
#else
// Lower nibble interface
DATA_PORT &= 0xf0;
// Write lower nibble
DATA_PORT |= (DDaddr&0x0f);
Pgina 31

Sin ttulo
#endif
DelayFor18TCY();
E_PIN = 1;
DelayFor18TCY();
E_PIN = 0;
#ifdef UPPER
TRIS_DATA_PORT |= 0xf0;
#else
TRIS_DATA_PORT |= 0x0f;
#endif
#endif
return;
}

// Clock the cmd and address in


//
//
//
//

Upper nibble interface


Make port input
Lower nibble interface
Make port input

/********************************************************************
*
Function Name: WriteCmdXLCD
*
*
Return Value:
void
*
*
Parameters:
cmd: command to send to LCD
*
*
Description:
This routine writes a command to the Hitachi*
*
HD44780 LCD controller. The user must check *
*
to see if the LCD controller is busy before *
*
calling this routine.
*
********************************************************************/
void WriteCmdXLCD(unsigned char cmd)
{
#ifdef BIT8
// 8-bit interface
TRIS_DATA_PORT = 0;
// Data port output
DATA_PORT = cmd;
// Write command to data port
RW_PIN = 0;
// Set the control signals
RS_PIN = 0;
// for sending a command
DelayFor18TCY();
E_PIN = 1;
// Clock the command in
DelayFor18TCY();
E_PIN = 0;
DelayFor18TCY();
TRIS_DATA_PORT = 0xff;
// Data port input
#else
// 4-bit interface
#ifdef UPPER
// Upper nibble interface
TRIS_DATA_PORT &= 0x0f;
DATA_PORT &= 0x0f;
DATA_PORT |= cmd&0xf0;
#else
// Lower nibble interface
TRIS_DATA_PORT &= 0xf0;
DATA_PORT &= 0xf0;
DATA_PORT |= (cmd>>4)&0x0f;
#endif
RW_PIN = 0;
// Set control signals for command
RS_PIN = 0;
DelayFor18TCY();
E_PIN = 1;
// Clock command in
DelayFor18TCY();
E_PIN = 0;
#ifdef UPPER
// Upper nibble interface
DATA_PORT &= 0x0f;
DATA_PORT |= (cmd<<4)&0xf0;
#else
// Lower nibble interface
DATA_PORT &= 0xf0;
DATA_PORT |= cmd&0x0f;
#endif
DelayFor18TCY();
E_PIN = 1;
// Clock command in
DelayFor18TCY();
E_PIN = 0;
Pgina 32

#ifdef UPPER
TRIS_DATA_PORT |= 0xf0;
#else
TRIS_DATA_PORT |= 0x0f;
#endif
#endif
return;
}

Sin ttulo
// Make data nibble input

/********************************************************************
*
Function Name: WriteDataXLCD
*
*
Return Value:
void
*
*
Parameters:
data: data byte to be written to LCD
*
*
Description:
This routine writes a data byte to the
*
*
Hitachi HD44780 LCD controller. The user
*
*
must check to see if the LCD controller is *
*
busy before calling this routine. The data *
*
is written to the character generator RAM or*
*
the display data RAM depending on what the *
*
previous SetxxRamAddr routine was called.
*
********************************************************************/
void WriteDataXLCD(char data)
{
#ifdef BIT8
// 8-bit interface
TRIS_DATA_PORT = 0;
// Make port output
DATA_PORT = data;
// Write data to port
RS_PIN = 1;
// Set control bits
RW_PIN = 0;
DelayFor18TCY();
E_PIN = 1;
// Clock data into LCD
DelayFor18TCY();
E_PIN = 0;
RS_PIN = 0;
// Reset control bits
TRIS_DATA_PORT = 0xff;
// Make port input
#else
// 4-bit interface
#ifdef UPPER
// Upper nibble interface
TRIS_DATA_PORT &= 0x0f;
DATA_PORT &= 0x0f;
DATA_PORT |= data&0xf0;
#else
// Lower nibble interface
TRIS_DATA_PORT &= 0xf0;
DATA_PORT &= 0xf0;
DATA_PORT |= ((data>>4)&0x0f);
#endif
RS_PIN = 1;
// Set control bits
RW_PIN = 0;
DelayFor18TCY();
E_PIN = 1;
// Clock nibble into LCD
DelayFor18TCY();
E_PIN = 0;
#ifdef UPPER
// Upper nibble interface
DATA_PORT &= 0x0f;
DATA_PORT |= ((data<<4)&0xf0);
#else
// Lower nibble interface
DATA_PORT &= 0xf0;
DATA_PORT |= (data&0x0f);
#endif
DelayFor18TCY();
E_PIN = 1;
// Clock nibble into LCD
DelayFor18TCY();
E_PIN = 0;
#ifdef UPPER
// Upper nibble interface
TRIS_DATA_PORT |= 0xf0;
Pgina 33

Sin ttulo
// Lower nibble interface

#else
TRIS_DATA_PORT |= 0x0f;
#endif
#endif
return;
}
Un saludo.

Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: freshdesing en Noviembre 10, 2009, 03:05:40
Estoy intentando usar el LCD sin RW. He modificado las tres cosas que se han
comentado en el foro:
Cdigo: (c)
unsigned char BusyXLCD(void)
{
Delay10TCYx(6);
return(0);
}
Cdigo: (c)
extern char rw;
#define RW_PIN
#define TRIS_RW

rw//LATBbits.LATB6
rw//TRISBbits.TRISB6

/* PORT for RW */
/* TRIS for RW */

y
Cdigo: (c)
unsigned char rw;
Pero me da el siguiente error:
Error [1109] type mismatch in redeclaration of 'rw'
Alguien sabe a que puede ser debido?
Gracias.
El problema era que creo que hay que poner las dos como extern unsigned char rw;
Y ahora el problema es que intento poner hola el la primera lnea del LCD "Hola" y
en la segunda "Microchip", y me aparece en la primera lnea "a" y en la
segunda"Microcip". El programa principal es:
Cdigo: (c)
void main(void){
OpenXLCD(FOUR_BIT & LINES_5X7); // Iniciamos LCD.comandXLCD(0x0C);
comandXLCD(0x06); // Nos aseguramos incremento de direccion, display fijo
// Encendemos LCD.putsXLCD(aaa);
gotoxyXLCD(1,2);
putsXLCD(bbb);
while(1){
}
}
[code]
Y si lo hago usando RW funciona correctamente.
Alguien sabe a que es debido?
Pgina 34

//Pasamos al oriden del Linea 2.// Bucle infinito.

Sin ttulo
Gracias.
[/code]
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Noviembre 10, 2009, 03:20:11
Esta diciendo que hay una re-declaracin de rw, unsigned char rw; debe ir en el *.c
principal.
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: freshdesing en Noviembre 10, 2009, 03:28:52
Cita de: Suky en Noviembre 10, 2009, 03:20:11
Esta diciendo que hay una re-declaracin de rw, unsigned char rw; debe ir en el *.c
principal.
Saludos!
Gracias, ya est resuleto eso. Has visto la parte que al cambiar el pin RW a tierra
ahora no me aparecen los cuatro primeros dgitos de la lnea 1.... est en el post
anterior, que lo he modificado....
Gracias de nuevo.
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Noviembre 10, 2009, 03:32:02
??? Ah no se, dale mas tiempo, aumenta en Delay10TCYx(6);. :P
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: freshdesing en Noviembre 18, 2009, 01:21:05
Hola, a ver si alguien podra echarme una mano:
Cuando intento sacar por el LCD los sigueintes mensajes... no me aparecen bien los
datos, se mueven a la izquierda y no salen completos. Si solo pongo un solo canal
sale perfecto, pero al poner le segundo canal se estropea todo....
Cdigo: (c)
void main(void)
{
unsigned int canal_0, canal_1;
char string0[4],string1[4];
TRISA=0xFF;
XLCDInit();
OpenADC(ADC_FOSC_RC & ADC_RIGHT_JUST & ADC_4_TAD,
ADC_CH0 & ADC_INT_OFF & ADC_VREFPLUS_VDD &
ADC_VREFMINUS_VSS,
13); //Con este numero configuramos los pueros A/D
while(1){

ADCON1

SetChanADC(ADC_CH0);
// Selecciono canal a convertir.Delay10TCYx(4); // 20us para que se cargue el capacitor sample&hold.ConvertADC();
// Comienza conversin.while(BusyADC()==1){}
// Hasta que se finalice conversin.canal_0= ReadADC();
// Realizo lectura.SetChanADC(ADC_CH1);
// Selecciono canal a convertir.Delay10TCYx(4); // 20us para que se cargue el capacitor sample&hold.ConvertADC();
// Comienza conversin.while(BusyADC()==1){}
// Hasta que se finalice conversin.Pgina 35

canal_1= ReadADC();

Sin ttulo
// Realizo lectura.-

itoa(canal_0,string0);
XLCDClear();
XLCDPutRomString("Canal 0=");
XLCDPutRamString(string0);
XLCDL2home();
XLCDPutRomString("Canal 1=");
XLCDPutRamString(string0);
Delay10KTCYx(1000);
}
}
Uso la libreria maestra de Microchip para el LCD.
Gracias.
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Destajador en Diciembre 10, 2009, 02:57:51
Estoy comenzando con a trabajar con I2C con el C18, la verdad loco que el manual
que te mandaste esta barbaro, le pasaron el trapito a los de uChip!!
Un abrazo.
Frank
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: fgg en Diciembre 31, 2009, 03:46:39
Hola gente .
Tengo un problema con la generacion de los archivos. hex en c18.Como puedo
solucionarlo.
He seguido paso a paso el tutorial de suky.
Desde ya gracias
fgg
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: alets en Enero 19, 2010, 03:32:46
Hola , he analizado el programa del reloj con el pic 18f2550, hice el circuito y
trate de compilar el programa que aprece en el tutorial, pero al hacerlo me arroja
un error, dice : Error - could not find definition of symbol 'set_datetime' in file
'C:\MCC18\bin\Reloj\reloj.o'.
Errors
: 1
segun puedo ver en mi novatez, set_datetime esta definido en el .h del ds1302 ,
realmente no entiendo el problema, podrian ayudarme porfavor, al complar aparece
lo siguiente :
Executing: "C:\MCC18\bin\mcc18.exe" -p=18F2550 /i"C:\MCC18\h" -I"C:\MCC18\lib"
-I"C:\MCC18\lkr" "reloj.c" -fo="reloj.o" -Ou- -Ot- -Ob- -Op- -Or- -Od- -OpaMPLAB C18 v3.15 (demo)
Copyright 1999-2005 Microchip Technology Inc.
Days remaining until demo becomes feature limited: 58
C:\MCC18\bin\Reloj\reloj.c:69:Warning [2066] type qualifier mismatch in assignment
C:\MCC18\bin\Reloj\reloj.c:71:Warning [2066] type qualifier mismatch in assignment
C:\MCC18\bin\Reloj\reloj.c:125:Warning [2066] type qualifier mismatch in assignment
C:\MCC18\bin\Reloj\reloj.c:127:Warning [2066] type qualifier mismatch in assignment
C:\MCC18\bin\Reloj\reloj.c:128:Warning [2066] type qualifier mismatch in assignment
C:\MCC18\bin\Reloj\reloj.c:130:Warning [2066] type qualifier mismatch in assignment
Pgina 36

Sin ttulo
C:\MCC18\bin\Reloj\reloj.c:131:Warning [2066] type qualifier mismatch in assignment
C:\MCC18\bin\Reloj\reloj.c:133:Warning [2066] type qualifier mismatch in assignment
C:\MCC18\bin\Reloj\reloj.c:141:Warning [2066] type qualifier mismatch in assignment
C:\MCC18\bin\Reloj\reloj.c:143:Warning [2066] type qualifier mismatch in assignment
C:\MCC18\bin\Reloj\reloj.c:144:Warning [2066] type qualifier mismatch in assignment
C:\MCC18\bin\Reloj\reloj.c:146:Warning [2066] type qualifier mismatch in assignment
C:\MCC18\bin\Reloj\reloj.c:147:Warning [2066] type qualifier mismatch in assignment
C:\MCC18\bin\Reloj\reloj.c:149:Warning [2066] type qualifier mismatch in assignment
C:\MCC18\bin\Reloj\reloj.c:154:Warning [2058] call of function without prototype
C:\MCC18\bin\Reloj\reloj.c:155:Warning [2058] call of function without prototype
C:\MCC18\bin\Reloj\reloj.c:156:Warning [2058] call of function without prototype
C:\MCC18\bin\Reloj\reloj.c:157:Warning [2058] call of function without prototype
C:\MCC18\bin\Reloj\reloj.c:161:Warning [2058] call of function without prototype
C:\MCC18\bin\Reloj\reloj.c:162:Warning [2058] call of function without prototype
C:\MCC18\bin\Reloj\reloj.c:163:Warning [2058] call of function without prototype
Executing: "C:\Program Files\Microchip\MPASM Suite\MPLink.exe" /l"C:\MCC18\lib"
/k"C:\MCC18\lkr" "C:\MCC18\lkr\18f2550.lkr" "C:\MCC18\bin\Reloj\reloj.o"
"C:\MCC18\lib\p18f2550.lib" /o"reloj.cof" /M"reloj.map" /W
MPLINK 4.11, Linker
Copyright (c) 2007 Microchip Technology Inc.
Error - could not find definition of symbol 'set_datetime' in file
'C:\MCC18\bin\Reloj\reloj.o'.
Errors
: 1
Link step failed.
BUILD FAILED: Tue Jan 19 00:33:38 2010
porfavor APOYENME!!!!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Enero 19, 2010, 08:49:18
Asegrate de agregar al proyecto los archivos ds1302.c y ds1302.h, en los primeros
mensajes se indica como.

Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: netjocker en Febrero 03, 2010, 08:30:15
hola soy nuevo en esto de los pics y con la ayuda del manual de suky estoy
intentando hacer un programilla sencillo.
pero al intentar simularlo me sale este error y no se porque.
el error es el siguiente:
Clean: Deleting intermediary and output files.
Clean: Deleted file "C:\matriz\matriz.o".
Clean: Done.
Executing: "C:\MCC18\bin\mcc18.exe" -p=18F2550 /i"C:\MCC18\h" "matriz.c"
-fo="matriz.o" -D__DEBUG -Ou- -Ot- -Ob- -Op- -Or- -Od- -OpaCouldn't locate build tool. Check tool locations.
Debug build of project `C:\matriz\matriz.mcp' failed.
Language tool versions: mcc18.exe v3.34
Preprocessor symbol `__DEBUG' is defined.
Wed Feb 03 12:34:03 2010
si alguien me ayuda se lo agradeceria.
muchas gracias
Ya he conseguido que me lo haga, era porque no habia dicho donde estaba el
Pgina 37

Sin ttulo
mpasmwin, mplink y el mplib.
muchas gracias de todas formas.
un saludo
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Febrero 03, 2010, 08:51:43
Jejeje! Estaba por decirte eso! Bueno, me alegro que lo hayas solucionado. A
trabajar :prog
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: illusionista_86 en Febrero 17, 2010, 03:28:19
hola a todos, estoy intentando realizar el ejercicio de comunicacin por RS23,
modulo_rs232, pero al simular no puedo ver nada de nada, adjunto los archivos del
MPLAB y del PROTEUS para ver si alguien me puede ayudar, dentro hay una imagen
donde se pueden ver unos errores al simular, pero no se como solucionarlo.
no consigo enviar por el terminar virtual nada, y recivir nada tampoco.
lo he realizado creando un nuevo proyecto y copiando el cdigo del manual pero nada
de nada.
alguna solucin? gracias.

EDITO: ya tengo la solucin, he conectado mal en la simulacin de proteus los


cables RX del pic se conecta a TX del terminal virtual, el TX de pic se conecta con
el RX del terminal virtual.
gracias de todas formas.
EDITO 2: adjunto la nueva solucin, la que es correcta, pero ahora continua
saliendo los errores de la imagen, y el canal analogico dos, el conectado a RA1, no
funciona y lo que hace es mostrar el mismo resultado que tiene el convertidor
analogico en la posicin RA0, es decir, el valor analogico de RA1, no hace caso y
siempre muestra en los dos casos el valor analogico de RA0. alguna solucin??
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: illusionista_86 en Marzo 09, 2010, 09:17:00
hola otra vez, tengo un problema con la configuracin del lcd.
el problema es que quiero tener un vector parecido a:
char menu[2]={"minutos","segundos"} y utilizando la libreria XLCD de microchip y
utilizando mplabc18, visualizar por el LCD segn el valor de la variable.
lo que hago es:
putrsXLCD(menu[1]) o

putrsXLCD(menu[2])

con lo cual visualizar "minutos" o "segundos", pero el problema que tengo es que
los simbolos que aparecen son muy extraos y no se corresponde para nada en esos
nombre.
que puedo estar haciendo mal? puede ser que sea algo del tipo de datos, pero no
encuentro la solucin.
Pgina 38

Sin ttulo
en CCS, he visto a gente que hace algo como:
printf(funcin a escribir lcd, "%i",variable)
pero yo lo he probado en cc18 y eso tampoco funciona, alguna solucin?? gracias.
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Marzo 10, 2010, 08:47:59
Lo correcto sera:
rom const char menu[2][10]={"minutos",
"segundos"};
putrXLCD(menu[0]) o putrXLCD(menu[1])
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: illusionista_86 en Marzo 10, 2010, 02:08:08
gracias voy a probarlo
EDITO: va perfecto !!!!!! gracias.
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: soiasin en Marzo 17, 2010, 04:30:39
Buenas, estoy programando un lcd con el pic18f4520 y me compila correctamente el
siguiente codigo. Al simularlo en Proteus, no se muestra el mensaje en el lcd como
aparece en la imagen. Me pueden ayudar a solucionar el problema? ??? ???
gracias de antemano :bang:
http://img262.imageshack.us/img262/864/dibujoxwx.jpg
(http://img262.imageshack.us/img262/864/dibujoxwx.jpg)
Cdigo:
#include
#include
#include
#include
#include
#pragma
#pragma
#pragma
#pragma
#pragma

<p18f4520.h>
<delays.h>
<stdio.h>
<xlcd.h>
<stdlib.h>
config
config
config
config
config

OSC = XT,FCMEN = OFF,IESO = OFF


PWRT = ON,BORV = 3
WDT = OFF
MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF
STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF

void DelayFor18TCY (void)


{
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Pgina 39

Sin ttulo
Nop();
}
void DelayPORXLCD (void)
{
Delay1KTCYx(15);
return;
}
void DelayXLCD (void)
{
Delay1KTCYx(5);
return;
}
void cmdLCD (unsigned char dato)
{
while(BusyXLCD());
WriteCmdXLCD(dato);
}
void writeLCD (char txt[16], char is[5])
{
putrsXLCD( (const far rom char * )txt);
putsXLCD(is);
}
void main (void)
{
OpenXLCD( FOUR_BIT & LINES_5X7 );
while( BusyXLCD() );
WriteCmdXLCD( DON);
WriteCmdXLCD( BLINK_ON);
putrsXLCD(( const far rom char * )"This is a test");
while(1){}
}
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Marzo 17, 2010, 11:28:55
Coincide como estas conectando el LCD en proteus a como est configurada la
librera? Estoy seguro que es ese el problema ;)
Tambin asegrate de iniciar correctamente el LCD, indicando si incrementar o
decrementar direccin, ect.
Saludos1
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: soiasin en Marzo 19, 2010, 09:06:47
Buenas,
No consegu resolver el problema del lcd, todo esta bien conectado y configurado,
cunado ejecuto la siguiente instruccin: "WriteDataXLCD('P');", aparece la "P" en
pantalla pero cuando intenta ejecutar la instruccin "putrsXLCD("HOLA");", salta en
el "while(*buffer)" y temina el programa. :'( Imagino que sera tema de punteros...
alguna solucin?
Gracias de antemano. :bang:
Cdigo:
void putrsXLCD(const rom char *buffer)
{
while(*buffer)
// Write data to LCD up to null
{
while(BusyXLCD());
// Wait while LCD is busy
Pgina 40

Sin ttulo
WriteDataXLCD(*buffer); // Write character to LCD
buffer++;
// Increment buffer
}
return;
}
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas
Publicado por: soiasin en Marzo 19, 2010, 09:12:46
Y una segunda pregunta; en el siguiente cdigo, al compilar
sintaxis en la instruccin, "#bit lcd_enable = 5.2", cul
correcta?. El cdigo esta copiado literalmente de internet,
el LCD de una PIC'SCHOOL.
Gracias de antemano. ;)

y/u opiniones.
con C18, da error de
sera la sintaxis
es para hacer funcionar

Cdigo:
#bit lcd_enable = 5.2
#bit lcd_rw
= 5.1
#bit lcd_rs
= 5.0
#byte lcd_a = 5
#byte lcd_b = 6
#define LCD_LINEA2 0x40
#define LCD_DATO
1
#define LCD_COMANDO 0

// Direccion de memoria para la segunda linea

#define LCD_CLEAR
#define LCD_HOME

0x01
0x02

#define
#define
#define
#define

LCD_DISPLAY_OFF
LCD_DISPLAY_ON
LCD_CURSOR_ON
LCD_CURSOR_BLINK

0x08
0x0C
0x0E
0x0F

#define
#define
#define
#define

LCD_CURSOR_SHIFT_RIGHT
LCD_CURSOR_SHIFT_LEFT
LCD_DISPLAY_SHIFT_RIGHT
LCD_DISPLAY_SHIFT_LEFT

0x10
0x14
0x18
0x1C

int lcd_leer()
{
int valor;
set_tris_a(0x18);
set_tris_b(0xFF);
lcd_rw = 1;
delay_cycles(1);
lcd_enable = 1;
delay_cycles(1);
valor = lcd_b;
lcd_enable = 0;
delay_us(40);
set_tris_b(0x00);
return valor;
}
void lcd_enviar(int dir, int valor)
{
set_tris_a(0x00);
set_tris_b(0x00);
Pgina 41

Sin ttulo
lcd_rs = 0;
while( bit_test(lcd_leer(),7) );
lcd_rs = dir;
delay_cycles(1);
lcd_rw = 0;
delay_cycles(1);
lcd_enable = 0;
lcd_b = valor;
delay_cycles(1);
lcd_enable = 1;
delay_us(2);
lcd_enable = 0;
delay_us(40);
}
void lcd_init()
{
int i;
set_tris_a(0x18);
set_tris_b(0x00);
lcd_enable = 0;
lcd_rw = 0;
lcd_rs = 0;
delay_ms(15);
for(i=0; i<3; i++)
{
lcd_enviar(LCD_COMANDO,0x38);
delay_ms(5);
}
lcd_enviar(LCD_COMANDO,LCD_DISPLAY_ON);
lcd_enviar(LCD_COMANDO,0x06);
lcd_enviar(LCD_COMANDO,LCD_CLEAR);
lcd_enviar(LCD_COMANDO,LCD_HOME);
}
void lcd_gotoxy( byte x, byte y) {
byte dir;
if(y!=1)
dir=LCD_LINEA2;
else
dir=0;
dir+=x-1;
lcd_enviar(LCD_COMANDO,0x80|dir);
}
void lcd_putc( char c) {
switch (c) {
case '\f'
: lcd_enviar(LCD_COMANDO,0x01);
delay_ms(2);
break;
case '\n'
: lcd_gotoxy(1,2);
case '\b'
: lcd_enviar(LCD_COMANDO,0x10);
default
: lcd_enviar(LCD_DATO,c);
}
Pgina 42

break;
break;
break;

Sin ttulo
}
char lcd_getc( int x, int y) {
char valor;
lcd_gotoxy(x,y);
lcd_rs = 1;
valor = lcd_leer();
lcd_rs = 0;
return valor;
}
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: el_greg en Marzo 19, 2010, 05:10:04
hola, es posible mostrar numeros decimales en una pantalla lcd 16x2 utilizando el
compilador de c18.....en conclusion estoy buscando el equivalente a la siguiente
instruccion
printf(lcd_putc,"%1.3g ",variable);....espero haberme
explicado...agradezco su ayuda
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: illusionista_86 en Marzo 20, 2010, 09:28:44
bueno, no se si te sirve ya que solo lo he probado en enteros, pero en enteros lo
realizo asi:
tengo una funcin para visualizar:
void writeLCD(char txt[16], char is[5])
{
putrsXLCD(txt);
putsXLCD(is);
}
luego la funcin la llamo de esta manera:
int minutos;
char it[5];

//se inizializa la variable a mostrar


// variable de conversin a "char" de la variable a visualizar.

itoa(minutos,it);
//funcin para convertir la variable "minutos" en "int" a la
variable "it" en "char.
// esta funcin no se si sirve igual para convertir de
"float" a "char" pero prueba a ver
// y comentas el resultado ya que tambin me puede
interesar en un futuro
writeLCD("
",it); // llamo a la funcin que he creado con dos parmetros, el
primero puede ser un valor "char"
// y el segundo el valor convertido. Hay que tener en
cuenta que el segundo se escribe
// seguido del primero
ya digo que no se si funciona igual para "floats" pero se puede probar.

Pgina 43

Sin ttulo
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: el_greg en Marzo 20, 2010, 11:17:06
gracias ya lo resolvi, aplique algo parecido......no es super exacto pero me
sirvio.........
canal= ReadADC();
// Realizo lectura.canal*=24;//resultado de la multiplicacion (25/1024)*1000=24 para variar de
0a 25 voltios
canal/=10; //
i1=canal/100;
i2=canal%100;
comandXLCD(0x01);
// Borra pantalla y vuelve al origen.putrsXLCD("voltaje = ");
itoa(i1,i1s);
itoa(i2,i2s);
putsXLCD(i1s); //aqui se imprime la parte entera
putrsXLCD(".");
putsXLCD(i2s);//aqui la parte decimal
para el que le interesa..esta basado en el ejemplo adc que posteo nuestro buen
amigo suky....solo agregue la parte para mostrar el voltaje
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: el_greg en Marzo 20, 2010, 11:39:15
suky estoy tratando de entender la libreria que posteastes del ds1302.....
* \param Byte Valor a enviar al DS1302.//esto es un comando? este simbolo *\ que
significa?
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: el_greg en Marzo 20, 2010, 11:48:20
disculpen mi ignorancia me di cuenta que son solos comentarios lo que no entiendo
es porq no usan solo doble barra a veces colocan barra y asteriscos en otras
ocasiones lo inviertes asterisco y luego barra......de verdad que no entiendo eso
se que */ es para colocar comentarios de varias lineas pero \* no lo entiendo
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Marzo 20, 2010, 03:42:46
Cita de: el_greg en Marzo 20, 2010, 11:39:15
suky estoy tratando de entender la libreria que posteastes del ds1302.....
* \param Byte Valor a enviar al DS1302.//esto es un comando? este simbolo *\ que
significa?

En realidad la coloco de esa forma para utilizar programas de documentacin como


Doxygen, es costumbre nada ms ;D
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: el_greg en Marzo 21, 2010, 05:31:47
ah ok eso me confundia..............suky una pregunta, estoy trabajando con el pic
18f25j10 con un cristal de 10 MHz como hago para multiplicar esta fecuencia por 4
de modo que pueda trabajar a 40 MHz......creo que me explique ;D ..........gracias
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Marzo 21, 2010, 06:56:14
mmm... No tengo el datasheet de ese micro, pero si es como el 18F4620 hay que
colocar el fuse correspondiente y se habilita el PLL que multiplica por 4. A leer
el datasheet ;D
Pgina 44

Sin ttulo
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: el_greg en Marzo 21, 2010, 07:45:47
ok puedes postear como se lo configuras a cualquier pic..........para tener una
idea lo que pasa es que la datasheets esta en ingles y no me ha dado tiempo de
aprenderlo ;D.............gracias
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Marzo 22, 2010, 12:04:23
Pero el datasheet esta dividido en partes, hay que revisar bit's de configuracin y
configuraciones del oscilador. No es necesario leerlo todo, pods ir por partes
mientras vas avanzando, te est esperando! :laugh: :laugh: Cuando vea el esfuerzo
de la contra parte ayudo :rolleyes:
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: el_greg en Marzo 22, 2010, 02:19:56
ok bueno estuve leyendo y para multiplicar el oscilador externo por 4 debo
configurar el bit PLLEN del registro OSCTUNE.....AHORA BIEN PARA LA PROGRAMACION
seria asi
#pragma config FOSC = HSPLL
y mas abajo cargar el registro osctune con 64..de modo que el bit 6 que es el PLLEN
quede habilitado
VOID MAIN()
{
OSCTUNE=64;//bit PLLEN activado
}
estara bien asi?
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: el_greg en Marzo 24, 2010, 07:58:47
supongo que nadie me respondia por lo tonto de la pregunta .....dure 2 dias con esa
tonteria pero ya me di cuenta que para multiplicar la frecuencia del cristal exteno
por 4 basta con cambiar hs por hspll ..............igual les agradezco su ayuda y
disculpen mi ignorancia pero comprendan que soy un novato en desarrollo ;D
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Ariel en Marzo 27, 2010, 01:24:33
Hola!
Me he embarcado en la aventura de comprender este compilador que a primera vista
parece super interesante.
Imprimi un par de libros, y estoy siguiendo el tutorial (excelente) de Suky.
Pero (siempre hay un pero) no logro compilar mi programa.
El error que obtengo es el siguiente, y seguro se debe a algun path o algo mas
definido:
---------------------------------------------------------------------Debug build of project `C:\Ariel\Proyectos C18\leds1.mcp' started.
Language tool versions: mcc18.exe v3.35
Preprocessor symbol `__DEBUG' is defined.
Sat Mar 27 13:26:05 2010
---------------------------------------------------------------------Make: The target "C:\Ariel\Proyectos C18\primer.o" is out of date.
Executing: "C:\MCC18\bin\mcc18-traditional.exe" -p=18F4550 /i"C:\MCC18\h"
"primer.c" -fo="primer.o" -D__DEBUG -Ou- -Ot- -Ob- -Op- -Or- -Od- -OpaC:\Ariel\Proyectos C18\primer.c:1:Error [1027] unable to locate 'pic18f4550.h'
MPLAB C18 v3.35 (evaluation)
Copyright 2000-2010 Microchip Technology Inc.
Days remaining until evaluation becomes feature limited: 59
Halting build on first failure as requested.
---------------------------------------------------------------------Pgina 45

Sin ttulo
Debug build of project `C:\Ariel\Proyectos C18\leds1.mcp' failed.
Language tool versions: mcc18.exe v3.35
Preprocessor symbol `__DEBUG' is defined.
Sat Mar 27 13:26:05 2010
---------------------------------------------------------------------BUILD FAILED
Que puedo revisar?

???

Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Ariel en Marzo 27, 2010, 01:31:30
Solucionado....
Es "p18f4550.h" y no "pic18f4550.h" ... ;D
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Marzo 27, 2010, 01:41:37
Cita de: Ariel en Marzo 27, 2010, 01:31:30
Solucionado....
Es "p18f4550.h" y no "pic18f4550.h" ... ;D
:laugh: No alcance ni a ver el anterior mensaje y ya estaba solucionado

:bang:

Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Ariel en Marzo 27, 2010, 01:48:52
Cita de: Suky en Marzo 27, 2010, 01:41:37
Cita de: Ariel en Marzo 27, 2010, 01:31:30
Solucionado....
Es "p18f4550.h" y no "pic18f4550.h" ... ;D
:laugh: No alcance ni a ver el anterior mensaje y ya estaba solucionado

:bang:

Me di cuenta al buscar el archivo dentro del directorio de los include. Quizas


deberias cambiarlo en los primeros post del tutorial, por que en algunos lados los
tenes como "pic"...supongo que como herencia del CCS ;)
GRACIAS!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Marzo 27, 2010, 02:49:56
Se me haba escapado ese detalle :P Modificado ;)
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Ariel en Marzo 27, 2010, 02:50:01
Error - could not find file 'c018i.o'.
Comparto algo que seguro es una obviedad para todo el mundo. Al compilar obtenia el
error Error - could not find file 'c018i.o'. Este error se genera por que no se
especific la direccin en donde se encuentran las librerias. La solucin es
indicarlo, haciendo:
project -> build options -> project -> directories ->library search path -> new
Y agregar el directorio:
c:/MCC18/lib
Algunas cosas quedan "seteadas" cda vez que se abre un proyecto nuevo (el modelo
del pic, la ruta del compilador, etc) pero esta maldita cosa parece que no.... :P
Saludos!
Pgina 46

Sin ttulo
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Marzo 27, 2010, 02:55:40
Exactamente, cada vez que se inicia un proyecto hay que revisar esos detalles como
se indica en el mensaje creacin de un proyecto. :P Ser porque es un IDE que
trabaja con asm, C18, C30 y C32 ???
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Ariel en Marzo 27, 2010, 03:00:25
Cita de: Suky en Marzo 27, 2010, 02:55:40
Exactamente, cada vez que se inicia un proyecto hay que revisar esos detalles como
se indica en el mensaje creacin de un proyecto. :P Ser porque es un IDE que
trabaja con asm, C18, C30 y C32 ???
Muy posiblemente.
Est muy bueno.....Jamas (ops!) habia usado MPLAB :P
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: el_greg en Abril 13, 2010, 09:28:28
hola suky, estuve probando la libreria flex_lcd para c18 que posteastes......y
tengo una pregunta, con la funcion printf sera posible imprimir variables flotantes
como se hace con ccs...osea usar una instruccion mas o menos asi
printf(lcd_putc,"%1.3g voltios",voltio1);...donde puedo leer mas acerca de la
funcion printf en c18?
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: el_greg en Abril 13, 2010, 11:32:12
ya lo intente y por lo visto no es posible......tengo entendido que c18 no permite
enviar variables flotantes
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Abril 13, 2010, 12:54:07
No el printf de C18 no permite variables flotantes.
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: el_greg en Abril 14, 2010, 06:44:04
se me habia perdido este post jeje no lo encontraba......que mala suerte que no
maneje flotante......una pregunta suky sera que con esta libreria puedo manejar lcd
de 4 filas ya que con la flex_lcd original lo hago..o si no sera posible
modificarla para que baje a la fila 3 y 4
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Abril 14, 2010, 07:56:58
Si modificarla es sencillo, hay que agregar una variable que guarde en la linea que
est y modificar la funcin gotoxy para las 4 lineas, y algn otro detalle que no
me acuerdo :P
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: younlink en Abril 27, 2010, 09:00:04
Saludos!! me encanta el tutorial de C, de hecho lo he estado aplicando para un
PIC18F4585 pero tengo un problema.
Aplico las modificaciones de la libreria xlcd.h para usar
necesito las salidas RX y TX para comunicacion RS232 y El
servo y el Puerto A para sensores Analogos. Al momento de
aparece el cambio de puerto pero al momento de pasarlo al
ya he rolado el pic por todos los demas puertos pero solo
D. HELP!!! :pared
Pgina 47

el puerto D porque
puerto B para controlar 8
simular con proteus me
pic no me aparece nada;
no me jala en el puerto

Sin ttulo
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Abril 28, 2010, 11:23:33
Adjuntaste los archivos fuente para que genere los archivos objetos actualizados?
Si ya lo has hecho no se me ocurre porque no funciona :pared Podes probar con la
libreria flex_lcd_c18 que coloque en el ltimo post ;)
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: younlink en Abril 28, 2010, 02:59:32
si: los cargue a la izquierda en source, solo que no se de cual carpeta xlcd cargar
la fuente, hay dos carpetas antes de pmc: traditional y extended.
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Abril 29, 2010, 11:51:50
En tradicional....
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: younlink en Mayo 02, 2010, 01:49:34
hola; creo que el c18 no esta leyendo las librerias.
decidi rendirme con lo de modificar el puerto para el LCD y pase a leer las
entradas analogas AN0 y AN1 con el LCD, en la simulacion con el proteus el valor no
cambiaba en el LCD por el puerto C asi que empece a configurar el pic18f4585 de
manera manual y empece a medir el valor de AN0 pero en ambos canales; cambie la
parte del codigo setChanADC(x) por ADCON0=0x05 y en el simulador ya lee el canal 2.
Antes probe fisicamente el LCD en el puerto C y salia el mensaje; ahora no se ve
nada y no se si esta midiendo los canales analogos. abre configurado mal el
programa?
:'(
intente el siguiente programa cuyo unico objetivo es encender y apagar un led pero
no resulto.
Cdigo:
#include <p18F4585.h>
//**************************************************************
#pragma config OSC = XT,FCMEN = OFF,IESO = OFF
#pragma config PWRT = ON,BOREN = OFF,BORV = 0
#pragma config WDT = OFF,WDTPS = 32768
#pragma config MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,DEBUG = OFF
#pragma config STVREN = OFF,LVP = OFF,XINST = OFF
#pragma config CP0 = ON,CP1 = ON,CP2 = ON
#pragma config CPB = ON,CPD = ON
#pragma config WRT0 = ON,WRT1 = ON,WRT2 = ON
#pragma config WRTB = ON,WRTC = ON,WRTD = ON
#pragma config EBTR0 = ON,EBTR1 = ON,EBTR2 = ON
#pragma config EBTRB = ON
//**************************************************************

void main(void){
TRISA=0xFF;
Pgina 48

Sin ttulo
TRISB=0x00;
PORTB=0x00;
while(1){
while(PORTAbits.RA2==1){PORTBbits.RB0=0;}
PORTBbits.RB0=1;
}
}
que puede estas fallando?
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: younlink en Mayo 16, 2010, 07:54:02
;) muchasgracias sucky encontre mi herror; al parecer al usar setChanADC(x) en X no
va un numero (no se si esto sea solo para el 4585) pero lo que va es ADC_CHX donde
X si es el numero del canal a usar y este debe estar habilitado obvio; ademas de
que al empezar mi programacion por default todos los puertos analogos entan
habilitador poes eso empezando el main debo hacer a fuerza un openADC habilitando
solo los que usare o en caso contrrario poner todos los ADCONX en ceros para
desabilitar en ADC. creo que por eso no jalaba lo del LCD pero eso lo probare en
las vacaciones porque ahorita ya la libre gracias a ti y a tu magnifico tutorial.
como nota use tu tuto para crear dos modulos electronicos:
1.- un controlador de servos con sensado de fuerza.
2.- un sensor de colores.
Todos con comunicacion RS485 gracias al max485.
En otras palabras use el usart, el ADC, y las rutinas de retardos.
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: sander en Junio 24, 2010, 04:30:22
Yo paso para agradecer y felicitar a suky por el excelente trabajo realizado en el
tutorial, realmente me ayudo mucho. gracias.
Saludos
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: sworder en Julio 24, 2010, 02:23:28
hola:
para todos los que quieran trabajar con variables flotantes directamente y luego
convertirlo a string, encontre una rutina en la web,
que les puede servir yo la utilize y no me dio problema.
saludos

// str is a buffer like char buffer[10];


// f is the float number to convert, size is the number of decimal places
#include
<stdlib.h>
#include
<string.h>
void FloatToString2(static char *str,static float f,static unsigned char size)
{
static unsigned char pos;
// position in string
static unsigned char len;
// length of decimal part of result
static int value;
// decimal digit(s) to convert
static unsigned char i;
pos = 0;
// initialize pos, just to be sure
value = (int)f;
// truncate the floating point number
itoa(value,str);
// this is kinda dangerous depending on the length of
str
Pgina 49

Sin ttulo
// now str array has the digits before the decimal
if (f < 0 ) // handle negative numbers
{
f *= -1;
value *= -1;
}
len = strlen(str);
// find out how big the integer part was
pos = len;
// position the pointer to the end of the integer part
str[pos++] = '.';
// add decimal point to string
// process remaining digits by method of LudwigKeck on forum.microchip.com
f = f - (float)value;
// remove int part from float
value = 1;
for( i = 1; i <= size; ++i)
// generate power of ten needed to
{
value *= 10;
// to get rest of digits
}
f *= value;
// move remaing digits to LHS of decimal
//f += 0.5;
// for proper rounding
value = (int)f;
// get rest of the digits
itoa(value, &(str[pos]));

// put digits into string

}
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: jukinch en Agosto 21, 2010, 02:18:30
Hola amigos del foro:
Estoy aprendiendo a usar la librera xlcd.
Si bien ya puedo escribir texto en el lcd, el problema que se me ha
planteado es al resetear el pic.
Si reseteo una vez aparecen caracteres raros, reseteo otra vez y vuelve el
texto normalmente, vuelvo a resetear y aparecen caracteres raros y as
sucesivamente. Siempre la misma basura. Es decir los mismos caracteres raros.
el botn de reset que pulso resetea slo al pic pero no al lcd. El Lcd
sigue siempre alimentado.
Supongo que el problema se da poque el lcd tiene su propio controlador y no
lo reseteo.
Si quito la alimentacin del circuito incluido el lcd y lo enciendo
nuevamente el texto se lee normalmente.
Aqui van las preguntas:
Hay alguna forma de resetear al lcd por software?
Puedo reinicializar el lcd varias veces con el siguiente comando :
OpenXLCD(FOUR_BIT&LINES_5X7);
5x7

//inicializamos LCD con varias lineas y caracteres

OpenXLCD(FOUR_BIT&LINES_5X7);
5x7
saludos.
Jukinch

//inicializamos LCD con varias lineas y caracteres

Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: younlink en Noviembre 20, 2010, 11:11:48
Cita de: younlink en Mayo 16, 2010, 07:54:02
;) muchasgracias sucky encontre mi herror; al parecer al usar setChanADC(x) en X no
va un numero (no se si esto sea solo para el 4585) pero lo que va es ADC_CHX donde
X si es el numero del canal a usar y este debe estar habilitado obvio; ademas de
que al empezar mi programacion por default todos los puertos analogos entan
Pgina 50

Sin ttulo
habilitador poes eso empezando el main debo hacer a fuerza un openADC habilitando
solo los que usare o en caso contrrario poner todos los ADCONX en ceros para
desabilitar en ADC. creo que por eso no jalaba lo del LCD pero eso lo probare en
las vacaciones porque ahorita ya la libre gracias a ti y a tu magnifico tutorial.
como nota use tu tuto para crear dos modulos electronicos:
1.- un controlador de servos con sensado de fuerza.
2.- un sensor de colores.
Todos con comunicacion RS485 gracias al max485.
En otras palabras use el usart, el ADC, y las rutinas de retardos.
ya casi tiene un ao que busque guia en este foro :P gracias sucky, me fue muy bien
en mi proyecto lastima que por las carreras no lo termine en PCB. parece ser que la
razon por la que no sirve el LCD (si aun sigo con el mismo problema) es algo que
tiene que ver con los ADCON ya que si no los ocupo puedo usar libremente el teclado
matricial y el LCD en el puerto que yo quiera pero si intento usar los analogos me
niega el LCD.
agrego el siguiente condigo donde si quito el coment del open ADC mi mensaje llega
hasta
BIENVENIDO
>>INICIO<<
pero si comento el openADC me aparece el mensaje completo. esto ocurre aunque use
directo ADCONx=0x00 (o su correspondiente) ???
Cdigo:
#include
#include
#include
#include
#include
#include
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma

<p18f4585.h>
<delays.h>
<xlcd.h>
<stdlib.h> //Libreria para conversiones.
<adc.h>
<stdio.h>
config
config
config
config
config
config
config
config
config
config
config

OSC = XT, FCMEN = OFF, IESO = OFF


PWRT = ON, BOREN = OFF, BORV = 0
WDT = OFF, WDTPS = 32768
MCLRE = ON, LPT1OSC = OFF, PBADEN = OFF, DEBUG = OFF
XINST = OFF, LVP = OFF, STVREN = OFF
CP0 = OFF, CP1 = OFF, CP2 = OFF
CPB = OFF, CPD = OFF
WRT0 = OFF, WRT1 = OFF, WRT2 = OFF
WRTB = OFF,WRTC = OFF,WRTD = OFF
EBTR0 = ON,EBTR1 = ON,EBTR2 = ON
EBTRB = ON

//*************************************************************************
unsigned
unsigned
unsigned
unsigned

int Canal0, Canal1;


char String[5];
char Tecla,Menu,UnidadesFlag;
char Teclas[17]={0x07,'8','9','/',
'4','5','6','x',
'1','2','3','-',
'.','0','=','+',''};

void
void
void
void

ISRRB4_RB7(void);
DelayFor18TCY(void);
DelayPORXLCD(void);
DelayXLCD(void);
Pgina 51

Sin ttulo
void comandXLCD(unsigned char a);
void gotoxyXLCD(unsigned char x, unsigned char y);
char TestTeclado(void);
// Creamos una nueva seccion de codigo a partir de la direccion 0x08.#pragma code Interrupcion = 0X0008
void VectorInterrupcion(void){
_asm goto ISRRB4_RB7 _endasm
}
#pragma code // Cerramos seccion.//*************************************************************************
void main(void){
OpenXLCD(FOUR_BIT & LINES_5X7); // Iniciamos LCD.comandXLCD(0x06); // Nos aseguramos incremento de direccion, display fijo
comandXLCD(0x0C);
// Encendemos LCD.//ADCON1=0x0F;//Todos entrada/salida digitales.comandXLCD(0x0C);
gotoxyXLCD(4,1);
putrsXLCD("BIENVENIDO");
gotoxyXLCD(4,2);
putrsXLCD(">>INICIO<<");

// Encendemos LCD.//Pasamos al oriden del Linea 2.-

Menu=0x00;
TRISB=0xF0; //eeeessss.PORTB=0xF0;
LATB=0xF0;
INTCON3 = 0x00;
INTCON2 = 0X00; // Habilitamos resistencias pull up.
INTCON = 0X88; //Configuracin de interrupcin por cambio de estado
RB4-RB7
while(Menu == 0x00){
if(Tecla == 0x2b){Menu++;}
}

// Bucle infinito.

comandXLCD(0x01);
putrsXLCD("PID Iniciado");
gotoxyXLCD(1,2);
putrsXLCD("Frec.= ");
/*OpenADC(ADC_FOSC_RC & ADC_RIGHT_JUST & ADC_2_TAD,
ADC_CH0 & ADC_INT_OFF & ADC_REF_VDD_VSS,
ADC_1ANA);*/
while(1){
gotoxyXLCD(7,2);
putrsXLCD("Hz");
}
}
//*************************************************************************
void DelayFor18TCY(void){
Delay10TCYx(2);
}
void DelayPORXLCD(void){
Delay1KTCYx(15);
}
Pgina 52

Sin ttulo
void DelayXLCD(void){
Delay1KTCYx(2);
}
// Envia comando al LCD
void comandXLCD(unsigned char a){
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);
}
/* Rastrea Tecla presionada, para ello, se va colocando a 0 lgico las filas de a
una por vez,
* y se testea si alguna columna tambien lo esta. Se utiliza la variable i para
indicar que tecla
* esta siendo testeada, y de esta manera al detectar la pulsacion usar esta
variable para
* seleccionar el caracter en el Buffer Teclas.*/
char TestTeclado(void){
unsigned char i,j;
PORTB=0x0E; //xxxx1110.
i=0;
for(j=0;j<4;j++){
if(PORTBbits.RB4==0){break;}
i++;
if(PORTBbits.RB5==0){break;}
i++;
if(PORTBbits.RB6==0){break;}
i++;
if(PORTBbits.RB7==0){break;}
i++;
PORTB=0x01|(PORTB<<1); //Trasladamos el 0 a siguiente Pin. dejando
el resto en 1
}
return(Teclas[i]);
}
//****************************************************************
// Rutina de Interrupcion.#pragma interrupt ISRRB4_RB7
void ISRRB4_RB7(void){
if(INTCONbits.RBIF==1){
Tecla=TestTeclado();
//Realizamos test del Teclado, y nos
devuelve tecla pulsada
while(PORTBbits.RB4==0 |PORTBbits.RB5==0 |PORTBbits.RB6==0
|PORTBbits.RB7==0){} //Esperamos a que se suelte.PORTB=0x00;
INTCONbits.RBIF = 0; //Borramos bandera
}
}
Pgina 53

Sin ttulo
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: younlink en Noviembre 22, 2010, 02:59:43
:titanic he estado jugando con el codigo y mi pic en mi circuito armado; como
resultado les dejo lo siguinte:
casos que he encontrado con mi programa que no funcionan en real apesar de que
mplab y proteus dicen lo contrario:
usar openADC() hace que deje de funciona el LCD, recibes mensajes hasta el momento
en que ejecutas opend ADC() o cualquier otro relacionado.
usar un retardo mayor a 200ms (delay1ktcyx(200)) proboca que deje de funcionar el
teclado matricial o que te debuelva "||"
los comparadores no funcionan su usas mas de dos al mismo tiempo en un if; por
ejemplo:
if(a>b&&c<d&&s=d)... <- el teclado manda basura "||"
el switch solo hacepta defaul; cualquier otro proboca basura en el teclado
hay mas casos que he hido encontrando pero como voy borro y pruebo me he ido
olvidando de ellos.
si alguien tiene una idea de como corregir estos detalles le estare muy
agradecido...
y si alguien tiene un programa en C para un contro PID de motor con teclado
matricial y display LCD le estare MUCHO MAS AGRADECIDO ;D
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Noviembre 22, 2010, 09:52:12
Detalles no puedo dar, por falta de tiempo, pero por un lado el tema de los && ||
anidados es ms que nada por mala implementacin, Coloca un par de parntesis as
que organizado.
Revisa el tema de los fusibles, hay uno que indica si el puerto B lo usaremos como
digital o analgico.
El tema de la demora, ni idea cual es la que modificas y genera ese problema, as
que no se que contestarte.
El tema del switch tambin debe ser una mala implementacin. Trabajo casi todos los
das con C18 y no genera este tipo de problema, solo hay que revisar el cdigo con
calma y ver donde puede estar fallando. Hacer debugger, ect.
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: younlink en Noviembre 23, 2010, 12:06:45
hola; creo que encontre mi problema, decidi abrir mi quemador de pic's y leer lo
que tengo grabado en el pic luego de grabarlo, al momento de grabar el pic el la
direccion flash 0x00000 estoy grabando 0x03F6 pero al leerlo hay un 0x03F0; de
hecho le doy "verificar grabacion" y me marca error.
no es el pic ya que cambie por uno nuevo y se presento el mismo problema.
hay modo de cambiar el programa en c18 para que empiece a grabar apartir de la
direccion 0x00001? o otra direccion? puede que ese sea todo el problema :idiot:
EDIT:
lei el datasheet el f4585 y el la direccion 0x0000 esta el vector de reset; lo que
sea que estoy haciendo "choca" con este vector, yo deberia empezar mi programa en
la direccion 0019
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Pgina 54

Sin ttulo
Publicado por: mauro1612 en Septiembre 18, 2011, 10:59:13
Hola, acabo de registrarme en el foro.
Podrido de programar en ASM decid empezar con C y eleg el compilador C18, por
varias razones. Esta gua me ha resultado muy til para empezar. Estoy sorprendido
con la facilidad que se pueden hacer cosas que en assembler llevan un monton de
tiempo. Que bueno tener FOR! Jaja, parece algo simple pero cambia un monton la
programacin.
Como sugerencia, en el ejemplo para controlar LCD creaste la funcin:
Cdigo:
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 );
}
Pero solo funciona para dos lneas, por eso hice un caso general para 4 lneas:
Cdigo:
void gotoxyXLCD ( unsigned char x, unsigned char y){
unsigned char direccion ;
switch (y){
case 1:
direccion=0x00+x-1;
break;
case 2:
direccion=0x40+x-1;
break;
case 3:
direccion=0x14+x-1;
break;
case 4:
direccion=0x54+x-1;
break;
}
comandXLCD (0x80 | direccion );
}
Lo prob simulando con Proteus, usando un PIC18F4550 y un LCD de 4 lneas y 20
caracteres, funciona OK.
Saludos y gracias por el tutorial!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Miquel_S en Octubre 22, 2011, 12:40:05
Estoy empezando mal, :'( estoy intentando entender este error pero no lo consigo,
he abierto el 18f4455_g.lkr y peor.
Podeis echarme una mano?
Error - Unrecognized input in '..\..\LKR\18f4455_g.lkr:4': #DEFINE
Cdigo:
/* ** Archivo con definicion de registros y bits del microcontrolador elegido ** */
#include <p18f4455.h>
#include <timers.h>
Pgina 55

Sin ttulo
/* ** Configuracion de los fuses del Microcontrolador ** */
#pragma config PLLDIV = 5
// Divide by 5 (20MHz oscillator input)
#pragma config CPUDIV = OSC1_PLL2
// [Primary Oscillator Src:/1][96MHz PLL
Src:/2]
#pragma config USBDIV = 2
// USB clock source comes from the 96MHz PLL
divided by 2
#pragma config FOSC = HSPLL_HS // HS oscillator, PLL enabled (HSPLL)
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config PWRT = OFF
#pragma config BOR = ON
#pragma config BORV = 3
#pragma config VREGEN = ON
#pragma config WDT = OFF
#pragma config WDTPS = 32768
#pragma config CCP2MX = OFF
#pragma config PBADEN = OFF
#pragma config LPT1OSC = OFF
#pragma config MCLRE = ON
#pragma config STVREN = ON
#pragma config LVP = OFF
#pragma config ICPRT = OFF
#pragma config XINST = OFF
#pragma config DEBUG = OFF
#pragma config CP0 = OFF
#pragma config CP1 = OFF
#pragma config CP2 = OFF
#pragma config CPB = OFF
#pragma config CPD = OFF
#pragma config WRT0 = OFF
#pragma config WRT1 = OFF
#pragma config WRT2 = OFF
#pragma config WRTC = OFF
#pragma config WRTB = OFF
#pragma config WRTD = OFF
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF
#pragma config EBTR2 = OFF
#pragma config EBTRB = OFF
/* ** Definion de Constantes ** */
#define NUMBER_OF_LEDS 8
/* ** Definicion de Funciones ** */
void timer_isr (void);
/* ** Definicion de Variables ** */
static unsigned char s_count = 0;
#pragma code low_vector=0x18
void low_interrupt (void)
{
_asm GOTO timer_isr _endasm
}
#pragma code
#pragma interruptlow timer_isr
void timer_isr (void)
{
static unsigned char led_display = 0;
INTCONbits.TMR0IF = 0;
s_count = s_count % (NUMBER_OF_LEDS + 1);
Pgina 56

Sin ttulo
led_display = (1 << s_count++) -1;
PORTB = led_display;
}
void main (void)
{
TRISB = 0;
PORTB = 0;
OpenTimer0 (TIMER_INT_ON & T0_SOURCE_INT & T0_16BIT);
INTCONbits.GIE = 1;
while (1)
{
}
}
Gracias.
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Octubre 22, 2011, 12:58:50
Hay que actualizar el compilador C18...
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Miquel_S en Octubre 22, 2011, 06:11:41
Gracias Suky solventado el problema, otra cosita que hace esta instruccion porque
no comprendo el significado de % (modulo)
Cdigo:
s_count = s_count % (NUMBER_OF_LEDS + 1);
La variable s_count es igual a s_count modulo (NUMBER_OF_LEDS + 1);
Saludos.
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Octubre 22, 2011, 09:00:28
Devuelve el resto de la divisin por tal numero.
Saludos
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Miquel_S en Octubre 23, 2011, 04:34:05
Gracias de nuevo Suky.
Saludos.
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: javierdavid2006 en Febrero 21, 2012, 01:08:52
Hola a todos, tengo una problema, he instalado mplab c18, pero no se ni como se
abre el programa, lo tengo instalado en esta ruta de la computadora, C:\Program
Files\MCC18, pero no se creo ningun acceso directo, aunque hay un monton de
archivos dentro a los que les di enter y nada.
Ayuda. o es que que tengo que tener instalado MpLab 8.50 y el c18 es una expansion
de este.
Muchas gracias a todos quienes respondan.
Javier - Ecuador
Pgina 57

Sin ttulo
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: jukinch en Febrero 21, 2012, 01:15:17
Hola Javierdavid2006
Primero instala el mplab y luego el c18.
Mira el tutorial de suky
Saludos jukinch
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: javierdavid2006 en Febrero 21, 2012, 01:26:00
Hola, como estas, ya lo estuve revisando, incluso lo tengo abierto, sino que ahi
instala directamente el c18 v3.30 y despues ya crea un proyecto "Ejemplo 001", y yo
lo instalo igualito y la misma version pero no se me crea un ejecutable para abrir
el programa.
Ahora estoy instalando mplab 8.50 para ver si se abre el c18. Tu que dices, se
instala soloel c18 y ya funciona de una o tiene algun prerequisito del sistema.
Gracias por tu ayuda.
Javier - Ecuador
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: javierdavid2006 en Febrero 21, 2012, 01:41:58
Instale el mplab 8.50 y al abrir la aplicacion, se abre este, y yo quisiera manejar
el c18 para aprender a usar este, y en este c18 esta basado el tutorial de suky.
Ayuda.
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: HJ en Febrero 21, 2012, 01:50:55
Hola, desde dentro del MPLAB, cuando crees un nuevo proyecto, asgnale el
compilador C18 y listo, tal cual se ve en el tutorial de Suky.
El C18 es el compilador, pero el entorno de trabajo es el MPLAB.
Saludos
HJ
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: javierdavid2006 en Febrero 21, 2012, 01:54:36
Hummm, listo muchas gracias.
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Febrero 21, 2012, 02:10:45
Cita de: Suky en Mayo 03, 2009, 03:13:15
Entorno de programacin MPLAB IDE.
Ensamblador, enlazador, gestin de proyectos, depurador y simulador. La interfaz
grfica del usuario MPLAB IDE sirve como un nico entorno para escribir, compilar y
depurar cdigo para aplicaciones embebidas. Permite manejar la mayora de los
detalles del compilador, ensamblador y enlazador, quedando la tarea de escribir y
depurar la aplicacin como foco principal del programador (usuario)
Gratuito, se puede descargar de www.microchip.com
Compilador MPLAB C18
MPLAB C18 es un compilador cruzado que se corre en un PC y produce cdigo que puede
ser ejecutado por la familia de microcontroladores de Microchip PIC18XXXX. Al igual
que un ensamblador, el compilador traduce las declaraciones humanas en unos y ceros
para ser ejecutados por el microcontrolador.
Sigue la norma ANSI C, salvo en particularidades de los microcontroladores
Libreras para comunicaciones SPI, I2C, UART, USART, generacin PWM, cadena de
caracteres y funciones matemticas de coma flotante
Maneja nmeros reales de 32 bits (float y double)
Versin demo de 60 das, descargable de www.microchip.com
Pgina 58

Sin ttulo
:rolleyes:
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: caeshark en Junio 03, 2012, 07:28:25
Alguien sabe la manera correcta de gestionar dos interrupciones en C18, estoi
intentando hacer un programito con dos interrupciones una del puerto serie y otra
del timer 0, pero cuando se produce cualquiera de las dos el programa se vuelve
loco, donde podria encontrar algun ejemplo?
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Junio 03, 2012, 08:07:04
Mustranos que has hecho, por ahi encontramos el error ;)
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: caeshark en Junio 03, 2012, 08:14:34
Es todo sacado de tus ejemplos pero no consigo configurarlo como me gustaria
La idea que no se si es correcta o no es que al pulsar una tecla del teclado del pc
salte la interrupcion del usart, y una vez dentro de un switch activar la
interrupcion del timer para que haga una cuenta.
Cdigo:
#include <p18f4550.h>
#include <usart.h>
#include<stdio.h>
#include<pwm.h>
#include<timers.h>
#include<GenericTypeDefs.h>
#include <delays.h>
#include <stdlib.h> //Libreria para conversiones.
#include <adc.h>

#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma

config
config
config
config
config
config
config
config
config
config
config

FOSC = XT_XT,FCMEN = OFF,IESO = OFF, CPUDIV = OSC1_PLL2


PWRT = ON,BOR = OFF,BORV = 0
WDT = OFF,WDTPS = 32768
MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,CCP2MX = OFF
STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF
CP0 = ON,CP1 = ON,CP2 = ON
CPB = ON,CPD = ON
WRT0 = ON,WRT1 = ON,WRT2 = ON
WRTB = ON,WRTC = ON,WRTD = ON
EBTR0 = ON,EBTR1 = ON,EBTR2 = ON
EBTRB = ON

int lectura;
char string[1];
unsigned int value, TIEMPO, TIEMPOTEMP, SEGUNDOS;
unsigned int Canal0, Canal1;
char String[4];
void ISRBajaPrioridad(void);
void ISRRecepcion(void);
volatile char Data, Kbhit;
void low_isr(void);
void high_isr(void);
/*
* For PIC18 devices the high interrupt vector is found at
* 00000008h. The following code will branch to the
Pgina 59

Sin ttulo
* high_interrupt_service_routine function to handle
* interrupts that occur at the high vector.
*/
#pragma code high_vector=0x08
void interrupt_at_high_vector(void)
{
_asm GOTO high_isr _endasm
}
#pragma code /* return to the default code section */
#pragma interrupt high_isr
void high_isr (void)
{
switch (PIR1bits.RCIF){
case 0X01:
Data=getcUSART();
// Leemos Dato recibido
Kbhit=1;
// Indicamos que se ha
recibido un dato.PIR1bits.RCIF=0;
// Borramos bandera.INTCONbits.TMR0IF=0;
break;
case 0x00:
if(INTCONbits.TMR0IF=1){
INTCONbits.TMR0IF=0;
}
break;
}
}
/*
* For PIC18 devices the low interrupt vector is found at
* 00000018h. The following code will branch to the
* low_interrupt_service_routine function to handle
* interrupts that occur at the low vector.
*/
#pragma code low_vector=0x18
void interrupt_at_low_vector(void)
{
_asm GOTO low_isr _endasm
}
#pragma code /* return to the default code section */
#pragma interruptlow low_isr
void low_isr (void)
{
if(INTCONbits.TMR0IF==1){
TIEMPO=0;
}
}
//#define lectura
typedef union
{
struct
{
unsigned
unsigned
unsigned
unsigned
unsigned
unsigned

int
int
int
int
int
int

b0:
b1:
b2:
b3:
b4:
b5:

1;
1;
1;
1;
1;
1;
Pgina 60

Sin ttulo
unsigned int b6: 1;
unsigned int b7: 1;
};
unsigned char byte;
} BANDERAS;
BANDERAS

BANDERASBIT;

void main (void){


int lectura;
char string[1];
unsigned int value, TIEMPO, TIEMPOTEMP, SEGUNDOS;
unsigned int Canal0, Canal1;
char String[4];
TRISC=0x80;
TRISB=0x00;
OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE &
USART_EIGHT_BIT &
USART_CONT_RX & USART_BRGH_HIGH,25); // 9600,8,n,1
OpenADC(ADC_FOSC_RC & ADC_2_TAD & ADC_RIGHT_JUST, ADC_REF_VDD_VSS &
ADC_INT_OFF, ADC_2ANA);
Kbhit=0;
RCONbits.IPEN=0;
INTCONbits.PEIE=1;
INTCONbits.GIEH=1;
INTCONbits.GIEL=1;
INTCONbits.TMR0IF=0;

//

// Deshabilitamos Prioridades
// Habilitamos interrupcion de perifericos.// Habilitamos interrupcion Global.
// Habilitamos interrupcion Global.

OpenPWM1(255);
SetDCPWM1(1023);
OpenPWM2(255);
SetDCPWM2(0);
Delay10KTCYx(200);
SEGUNDOS=0;
TIEMPO=0;
WriteTimer0(0XFF);
putrsUSART("CONTROL
putrsUSART("PULSA l
putrsUSART("PULSA k
putrsUSART("PULSA
putrsUSART("PULSA b

AW4!!!!!!!!!!!!!!!!
PARA LLENADO AL 70%
PARA VACIADO AL 70%
PARA LLENADO AL 38%
PARA VACIADO AL 38%

\n");
\n");
\n");
\n");
\n");

while(1){
while(Kbhit==0){}; // esperamos a recibir dato.Kbhit=0;
switch(Data){

T0_PS_1_16);

case 0x6C:
// LETRA l
OpenTimer0(TIMER_INT_ON & T0_8BIT & T0_SOURCE_INT &
//Configuracion del Timer0
INTCONbits.TMR0IF=0;
// Borramos bandera.WriteTimer0(0);
// Cargamos nuevamente
Pgina 61

Sin ttulo
Timer0 para que cuente 1seg.

el

capacitor sample&hold

SetDCPWM1(716);
SetDCPWM2(0);
putcUSART(0x0C);
SetChanADC(0); // Selecciono canal a convertir.//Delay10TCYx(1);
// 10us para que se cargue
(Solo cuando se selecciona ADC_0_TAD).do{
ConvertADC();
// Comienza conversin.while(BusyADC()==1){}
// Hasta que se finalice

conversin.Canal0= ReadADC();
if(INTCONbits.TMR0IF==1){
TIEMPO=TIEMPO+1;
INTCONbits.TMR0IF=0;
}
}while(Canal0>=500);

// Realizo lectura.// Borramos bandera.-

putrsUSART("\n");
putrsUSART("Canal 0 = ");
itoa(Canal0, String);

// Convertimos

entero a string.putsUSART(String);
putrsUSART("\r\n");
SEGUNDOS=ReadTimer0(); // Realizo lectura.itoa(SEGUNDOS, String);
putsUSART(String);
putrsUSART("\r\n");
putrsUSART("LLENADO AL 70% \n");
putrsUSART("\r\n");
break;

case 0x6B:

el

capacitor sample&hold

// LETRA k
SetDCPWM2(716);
SetDCPWM1(0);
putcUSART(0x0C);
SetChanADC(0); // Selecciono canal a convertir.//Delay10TCYx(1);
// 10us para que se cargue
(Solo cuando se selecciona ADC_0_TAD).ConvertADC();
// Comienza conversin.while(BusyADC()==1){}
// Hasta que se finalice

conversin.Canal0= ReadADC();
// Realizo lectura.putrsUSART("\n");
putrsUSART("Canal 0 = ");
itoa(Canal0, String);
// Convertimos
entero a string.putsUSART(String);
putrsUSART("\r\n");
putrsUSART("VACIADO AL 70% \n");
putrsUSART("\r\n");
break;
case 0x76:

// LETRA v
SetDCPWM1(388);
Pgina 62

el

capacitor sample&hold

Sin ttulo
SetDCPWM2(0);
putcUSART(0x0C);
SetChanADC(0); // Selecciono canal a convertir.//Delay10TCYx(1);
// 10us para que se cargue
(Solo cuando se selecciona ADC_0_TAD).ConvertADC();
// Comienza conversin.while(BusyADC()==1){}
// Hasta que se finalice

conversin.Canal0= ReadADC();
// Realizo lectura.putrsUSART("\n");
putrsUSART("Canal 0 = ");
itoa(Canal0, String);
// Convertimos
entero a string.putsUSART(String);
putrsUSART("\r\n");
putrsUSART("LLENADO AL 38% \n");
putrsUSART("\r\n");
break;
case 0x62:

el

capacitor sample&hold

// LETRA b
SetDCPWM2(388);
SetDCPWM1(0);
putcUSART(0x0C);
SetChanADC(0); // Selecciono canal a convertir.//Delay10TCYx(1);
// 10us para que se cargue
(Solo cuando se selecciona ADC_0_TAD).ConvertADC();
// Comienza conversin.while(BusyADC()==1){}
// Hasta que se finalice

conversin.Canal0= ReadADC();
// Realizo lectura.putrsUSART("\n");
putrsUSART("Canal 0 = ");
itoa(Canal0, String);
// Convertimos
entero a string.putsUSART(String);
putrsUSART("\r\n");
putrsUSART("VACIADO AL 38% \n");
putrsUSART("\r\n");
break;
}
}
}
Como ves al principio he intentado configurar los vectores de interrupcion alto y
bajo pero no daba resultado, con las dos opciones siempre se va a la parte de
codigo de la interrupcion de prioridad alta. Luego he pensado en poner el switch en
la de prioridad alta, pero no se cual es el problema que no me borra el TMR0IF, lo
voy simulando y cuando llega ahi no lo pone a 0, se supone que es el bit 2 del
INTCON, quizas si lo pudiera borrar me serviria, pero no se que pasa que no lo pone
a 0.
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Junio 03, 2012, 08:44:41
En ningun lado veo que habilites las prioridades, solo veo:
Cdigo:
RCONbits.IPEN=0;

// Deshabilitamos Prioridades

Luego de habilitar las prioridades debes indicar que prioridad tendr cada una
seteando el bit ...IP
Pgina 63

Sin ttulo
Luego el switch en la interrupcin de alta prioridad no corresponde.
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: caeshark en Junio 03, 2012, 09:03:43
Juas con tres frases me has arreglao, la pelea que llevo de casi medio dia
:rolleyes2: :rolleyes2: :rolleyes2: :rolleyes2: :rolleyes2: :rolleyes2:
pero aun sigo sin poder borrar el bit de interrupcion del tmr0
INTCONbits.TMR0IF=0; no se supone que haciendo esto podria borrarlo?
Gracias a tus comentarios ya he podido situar cada interrupcion donde corresponde
muchas gracias Suky. Este ha sido el resultado
Cdigo:
#include <p18f4550.h>
#include <usart.h>
#include<stdio.h>
#include<pwm.h>
#include<timers.h>
#include<GenericTypeDefs.h>
#include <delays.h>
#include <stdlib.h> //Libreria para conversiones.
#include <adc.h>

#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma

config
config
config
config
config
config
config
config
config
config
config

FOSC = XT_XT,FCMEN = OFF,IESO = OFF, CPUDIV = OSC1_PLL2


PWRT = ON,BOR = OFF,BORV = 0
WDT = OFF,WDTPS = 32768
MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,CCP2MX = OFF
STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF
CP0 = ON,CP1 = ON,CP2 = ON
CPB = ON,CPD = ON
WRT0 = ON,WRT1 = ON,WRT2 = ON
WRTB = ON,WRTC = ON,WRTD = ON
EBTR0 = ON,EBTR1 = ON,EBTR2 = ON
EBTRB = ON

int lectura;
char string[1];
unsigned int value, TIEMPO, TIEMPOTEMP, SEGUNDOS;
unsigned int Canal0, Canal1;
char String[4];
void ISRBajaPrioridad(void);
void ISRRecepcion(void);
volatile char Data, Kbhit;
void low_isr(void);
void high_isr(void);
/*
* For PIC18 devices the high interrupt vector is found at
* 00000008h. The following code will branch to the
* high_interrupt_service_routine function to handle
* interrupts that occur at the high vector.
*/
#pragma code high_vector=0x08
Pgina 64

Sin ttulo
void interrupt_at_high_vector(void)
{
_asm GOTO high_isr _endasm
}
#pragma code /* return to the default code section */
#pragma interrupt high_isr
void high_isr (void)
{
if(PIR1bits.RCIF==1){
Data=getcUSART();
// Leemos Dato recibido
Kbhit=1;
// Indicamos que se ha recibido un
dato.PIR1bits.RCIF=0;
// Borramos bandera.}
}
/*
* For PIC18 devices the low interrupt vector is found at
* 00000018h. The following code will branch to the
* low_interrupt_service_routine function to handle
* interrupts that occur at the low vector.
*/
#pragma code low_vector=0x18
void interrupt_at_low_vector(void)
{
_asm GOTO low_isr _endasm
}
#pragma code /* return to the default code section */
#pragma interruptlow low_isr
void low_isr (void)
{
if(INTCONbits.TMR0IF==1){
INTCONbits.TMR0IF=0;
TIEMPO=0;
}
}
//#define lectura
typedef union
{
struct
{
unsigned int b0:
unsigned int b1:
unsigned int b2:
unsigned int b3:
unsigned int b4:
unsigned int b5:
unsigned int b6:
unsigned int b7:
};
unsigned char byte;
} BANDERAS;
BANDERAS

1;
1;
1;
1;
1;
1;
1;
1;

BANDERASBIT;

Pgina 65

Sin ttulo
void main (void){
int lectura;
char string[1];
unsigned int value, TIEMPO, TIEMPOTEMP, SEGUNDOS;
unsigned int Canal0, Canal1;
char String[4];
TRISC=0x80;
TRISB=0x00;
OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE &
USART_EIGHT_BIT &
USART_CONT_RX & USART_BRGH_HIGH,25); // 9600,8,n,1
OpenADC(ADC_FOSC_RC & ADC_2_TAD & ADC_RIGHT_JUST, ADC_REF_VDD_VSS &
ADC_INT_OFF, ADC_2ANA);
Kbhit=0;
RCONbits.IPEN=1;
INTCONbits.PEIE=1;
INTCONbits.GIEH=1;
INTCONbits.GIEL=1;
INTCONbits.TMR0IF=0;
IPR1bits.RCIP=1;
INTCON2bits.TMR0IP=0;

//

// Deshabilitamos Prioridades
// Habilitamos interrupcion de perifericos.// Habilitamos interrupcion Global.
// Habilitamos interrupcion Global.

OpenPWM1(255);
SetDCPWM1(1023);
OpenPWM2(255);
SetDCPWM2(0);
Delay10KTCYx(200);
SEGUNDOS=0;
TIEMPO=0;
WriteTimer0(0XFF);
putrsUSART("CONTROL
putrsUSART("PULSA l
putrsUSART("PULSA k
putrsUSART("PULSA
putrsUSART("PULSA b

AW4!!!!!!!!!!!!!!!!
PARA LLENADO AL 70%
PARA VACIADO AL 70%
PARA LLENADO AL 38%
PARA VACIADO AL 38%

\n");
\n");
\n");
\n");
\n");

while(1){
while(Kbhit==0){}; // esperamos a recibir dato.Kbhit=0;
switch(Data){
case 0x6C:
// LETRA l
OpenTimer0(TIMER_INT_ON & T0_8BIT & T0_SOURCE_INT &
T0_PS_1_16); //Configuracion del Timer0
INTCONbits.TMR0IF=0;
// Borramos bandera.WriteTimer0(0);
// Cargamos nuevamente
Timer0 para que cuente 1seg.
SetDCPWM1(716);
SetDCPWM2(0);
putcUSART(0x0C);
SetChanADC(0); // Selecciono canal a convertir.//Delay10TCYx(1);
// 10us para que se cargue
el capacitor sample&hold (Solo cuando se selecciona ADC_0_TAD).do{
ConvertADC();
// Comienza conversin.Pgina 66

Sin ttulo
while(BusyADC()==1){}

// Hasta que se finalice

conversin.Canal0= ReadADC();
if(INTCONbits.TMR0IF==1){
TIEMPO=TIEMPO+1;
INTCONbits.TMR0IF=0;
}
}while(Canal0>=500);

// Realizo lectura.// Borramos bandera.-

putrsUSART("\n");
putrsUSART("Canal 0 = ");
itoa(Canal0, String);

// Convertimos

entero a string.putsUSART(String);
putrsUSART("\r\n");
SEGUNDOS=ReadTimer0(); // Realizo lectura.itoa(SEGUNDOS, String);
putsUSART(String);
putrsUSART("\r\n");
putrsUSART("LLENADO AL 70% \n");
putrsUSART("\r\n");
break;

case 0x6B:

el

capacitor sample&hold

// LETRA k
SetDCPWM2(716);
SetDCPWM1(0);
putcUSART(0x0C);
SetChanADC(0); // Selecciono canal a convertir.//Delay10TCYx(1);
// 10us para que se cargue
(Solo cuando se selecciona ADC_0_TAD).ConvertADC();
// Comienza conversin.while(BusyADC()==1){}
// Hasta que se finalice

conversin.Canal0= ReadADC();
// Realizo lectura.putrsUSART("\n");
putrsUSART("Canal 0 = ");
itoa(Canal0, String);
// Convertimos
entero a string.putsUSART(String);
putrsUSART("\r\n");
putrsUSART("VACIADO AL 70% \n");
putrsUSART("\r\n");
break;
case 0x76:

el

capacitor sample&hold

// LETRA v
SetDCPWM1(388);
SetDCPWM2(0);
putcUSART(0x0C);
SetChanADC(0); // Selecciono canal a convertir.//Delay10TCYx(1);
// 10us para que se cargue
(Solo cuando se selecciona ADC_0_TAD).ConvertADC();
// Comienza conversin.while(BusyADC()==1){}
// Hasta que se finalice

conversin.Canal0= ReadADC();
Pgina 67

// Realizo lectura.-

Sin ttulo
putrsUSART("\n");
putrsUSART("Canal 0 = ");
itoa(Canal0, String);

// Convertimos

entero a string.putsUSART(String);
putrsUSART("\r\n");
putrsUSART("LLENADO AL 38% \n");
putrsUSART("\r\n");
break;
case 0x62:

el

capacitor sample&hold

// LETRA b
SetDCPWM2(388);
SetDCPWM1(0);
putcUSART(0x0C);
SetChanADC(0); // Selecciono canal a convertir.//Delay10TCYx(1);
// 10us para que se cargue
(Solo cuando se selecciona ADC_0_TAD).ConvertADC();
// Comienza conversin.while(BusyADC()==1){}
// Hasta que se finalice

conversin.Canal0= ReadADC();
// Realizo lectura.putrsUSART("\n");
putrsUSART("Canal 0 = ");
itoa(Canal0, String);
// Convertimos
entero a string.putsUSART(String);
putrsUSART("\r\n");
putrsUSART("VACIADO AL 38% \n");
putrsUSART("\r\n");
break;
}
}
}
Pero una vez que entro en el case 0x6C: y abro el timer ya no deja de producirse la
interrupcion, y no consigo borrar el bit, para que no se produzca. En la parte de
la interrupcion de baja prioridad es lo unico que hago si esta a 1 lo pongo a 0.
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Junio 03, 2012, 09:27:41
Ah no entiendo cual es la utilidad? Habilitas el timer y luego testeas el bit IF,
pero al activarse la interrupcin la borras dentro de la misma :P Es raro que no
se pueda borrar, habria que hacer un debug ms fino para ver porque. :rolleyes:
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: caeshark en Junio 04, 2012, 07:10:04
Si la utilidad de momento ninguna, lo he puesto asi para asegurarme que ninguna
otra cosa me lo activaba otra vez, pero el tema es que, entra bien en su vector de
interrupcion, ahi miro si la bandera esta arriba, y si esta arriba la borro, pues
cuando el programa pasa por el borrado de bandera no me modifica el registro, tengo
abierto el registro en el mplab y no cambia ninguno de sus bits.
No se que pueda ser, una vez que se activa tmr0if ya no sale de ahi, xq no puedo
borrar la bandera.
Otra cosa que no me cuadra mucho,
si os fijais cargo el timer con 0, se supone que tendria que llegar hasta 1023,
luego desboordar y volver a empezar no? vengo del assembler y estoy intentando
Pgina 68

Sin ttulo
aprender c18, en assembler cuando cargaba el timer simulando iba viendo como
aumentaba la cuenta del timer linea a linea de programa, pero aqui me san saliendo
valores aleatoriamente, cuando simulo paso por paso, es porque una instruccion de
c18 son varias de asm o me equivoco?
Version de MPLAB 8.30
Version MPLAB c18 3.30
Los h, lib, lkr estan en el directorio C:\MCC18\
el output en otra carpeta.

como explicas en el tutorial, y

Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Junio 04, 2012, 11:03:51
Cita de: caeshark en Junio 04, 2012, 07:10:04
Si la utilidad de momento ninguna, lo he puesto asi para asegurarme que ninguna
otra cosa me lo activaba otra vez, pero el tema es que, entra bien en su vector de
interrupcion, ahi miro si la bandera esta arriba, y si esta arriba la borro, pues
cuando el programa pasa por el borrado de bandera no me modifica el registro, tengo
abierto el registro en el mplab y no cambia ninguno de sus bits.
No se que pueda ser, una vez que se activa tmr0if ya no sale de ahi, xq no puedo
borrar la bandera.
Otra cosa que no me cuadra mucho,
si os fijais cargo el timer con 0, se supone que tendria que llegar hasta 1023,
luego desboordar y volver a empezar no? vengo del assembler y estoy intentando
aprender c18, en assembler cuando cargaba el timer simulando iba viendo como
aumentaba la cuenta del timer linea a linea de programa, pero aqui me san saliendo
valores aleatoriamente, cuando simulo paso por paso, es porque una instruccion de
c18 son varias de asm o me equivoco?
Version de MPLAB 8.30
Version MPLAB c18 3.30
Los h, lib, lkr estan en el directorio C:\MCC18\
el output en otra carpeta.

como explicas en el tutorial, y

Porque 1023?
Luego, es cierto que cualquier instruccin de C18 son varias de asm, por eso se
incrementa en varios pasos. Podras simularlo en Proteus, puede ser algn problema
del simulador.
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: caeshark en Junio 04, 2012, 05:31:20
Pues no se lo de 1023 me lo he sacado de la manga XD, puesto que si lo configuramos
a 8 bits seria 255 y a 16 65.535, sta claro que me he vuelto a liar XD. Lo unico
que no puse es que la simulacion la hago con el icd3, por si da alguna pista para
la dichosa bandera. Cuando llegue a casa lo miro en proteus y os cuento.
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: caeshark en Junio 04, 2012, 09:19:12
ZASCA!!!!!!! Tenias toda la razon Suky lo he simulado en proteus y si que me ha
borrado la dichosa bandera...
Entonces? Ahora si que me quedo en un mar de dudas, no se supone que con el icd3
estoy simulando la realidad?
Hay algo mal en la configuracion del icd3 algun fuse mal colocado?
Buff que de problemas...
Necesito un cable.
Pgina 69

Sin ttulo
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Junio 04, 2012, 10:12:50
En teora al debugger con el ICD3 estas verificando el programa real, pero puede
que algo falle en MPLAB IDE que que no se actualice el estado. Puedes actualizar su
versin. En el cdigo no veo porque no se borre la bandera :P
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: caeshark en Junio 05, 2012, 12:59:39
Actualizo la version a la que trae el mplab 8.30, me hace lo mismo, no se si habra
otra mas reciente, de ser asi donde podria encontrarla?
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: HJ en Junio 05, 2012, 01:11:51
Cita de: caeshark en Junio 05, 2012, 12:59:39
Actualizo la version a la que trae el mplab 8.30, me hace lo mismo, no se si habra
otra mas reciente, de ser asi donde podria encontrarla?
Actualmente estoy utilizando las versin 8.84 que puedes bajar de la pagina de
microchip (http://www.microchip.com/).
Saludos
HJ
Edito: Ya est disponible la versin 8.85 (Ac
(http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocNa
me=en019469&part=SW007002))
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: caeshark en Junio 05, 2012, 01:13:34
Eso es version de mplab o del firm del icd3
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: HJ en Junio 05, 2012, 01:22:19
Cita de: caeshark en Junio 05, 2012, 01:13:34
Eso es version de mplab o del firm del icd3
del MPLAB
Edito: al conectar el ICD3 al nuevo MPLAB, automticamente te carga el nuevo
firmware, obviamente que te pregunta y/o avisa de esa situacin.
Es decir, bajas la nueva versin del MPLAB, lo instalas, lo abres, conectas tu ICD3
y al reconocerlo te dice que va ha actualizarte el firmware.
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: caeshark en Junio 05, 2012, 03:49:39
Cuando llegue a casa lo pruebo y os cuento.
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: caeshark en Junio 05, 2012, 06:45:31
MPLAB ICD 3 detected
Connecting to MPLAB ICD 3...
Running self test...
Self test completed
Firmware Suite Version...... 01.23.06
Firmware type......................PIC18F
Downloading FPGA...(This may take up to 1 minute)
AP download complete
Running self test...
Self test completed
Downloading bootloader...
Bootloader download complete
Pgina 70

Sin ttulo
Running self test...
Self test completed
Downloading RS...
RS download complete
Downloading AP...
AP download complete
Running self test...
Self test completed
Firmware Suite Version...... 01.27.15
Firmware type......................PIC18F
MPLAB ICD 3 Connected.
HJ descargado he instalado el 8.85 he instalado y ese es el mensaje que me ha
tirado el MPLAB todo ok.
Pero sigo con el mismo problema al pasar por la linea que deberia borrar el tmr0if
el registro no se modifica.
no se que hacer...
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: caeshark en Junio 05, 2012, 07:39:41
Cdigo:
#pragma code low_vector=0x18
void interrupt_at_low_vector(void)
{
_asm GOTO low_isr _endasm
}
#pragma code /* return to the default code section */
#pragma interruptlow low_isr
void low_isr (void)
{
if(INTCONbits.TMR0IF==1){
INTCON=0;
TIEMPO=0;
}
}
(http://img849.imageshack.us/img849/360/intcon.jpg)

He modificado ya para probar a ver que pasa y no hay manera....


El trozo de codigo de arriba pertenece a la interrupcion del tmr0if, como veis
cuando entra ahi borro todo el registro del INTCON y es curioso que el unico bit
que se queda a 1 es el de tmr0if que podra ser?
Voy a probar a cambiar el chip xq ya esto es de locos.
Por cierto que programa usais para monitorizar el puerto serie?
EDITO: Cambio de chip con identico resultado, HJ podrias pasarme la configuracion
de fuses que usas cuando simulas con el icd3?
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: ricardossalazar en Julio 22, 2012, 08:12:54
cuando dice que se agregue el ds1302.c al proyecto el c18 no traer ese archivo solo
el ds1302.h
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Julio 22, 2012, 09:18:27
Cita de: ricardossalazar en Julio 22, 2012, 08:12:54
cuando dice que se agregue el ds1302.c al proyecto el c18 no traer ese archivo solo
el ds1302.h
Ese archivo lo vamos creando en el tutorial, no viene incluido entra las libreras
Pgina 71

Sin ttulo
de C18. O sea, en la carpeta de tu proyecto deberas de tener main.c, ds1302.h y
ds1302.c
Saludos!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: oe en Noviembre 03, 2014, 02:18:40
Hola a todos, he seguido este ejemplo
(http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/tutorialmplab-c18-desde-0/msg8916/#msg8916) para escribir un dato en una memoria eeprom
si guardo el siguiente valor por ejemplo
{0xA1,0xA2,0xA3,0xA4,0xA5}
Lo guarda correctamente, pero si intento guardar el siguiente:
{0xA1,0xA2,0x00,0xA4,0xA5}
guarda unicamante los dos primeros bytes, es decir cuando encuentra un 0 en la
trama, deja de guardar los datos No es posible guardar 0 en la memoria ? :idiot:
:grr: :pared
Gracias!
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: Suky en Noviembre 03, 2014, 08:28:18
Hola! El problema esta en que utiliza la funcin putsI2C, o sea es para strings.
Tendras que mirar si hay alguna funcin para enviar datos en general o armarte
alguna ;)
Saludos
Ttulo: Re: Tutorial MPLAB C18 Desde 0 - Comentarios, dudas y/u opiniones.
Publicado por: oe en Noviembre 03, 2014, 08:32:17
Cita de: Suky en Noviembre 03, 2014, 08:28:18
Hola! El problema esta en que utiliza la funcin putsI2C, o sea es para strings.
Tendras que mirar si hay alguna funcin para enviar datos en general o armarte
alguna ;)
Dale, ya entiendo, al darle una checada a las funciones tenia la leve sospecha que
hiba por ah el problema.
Ver que puedo hacer. Muchas gracias.

Pgina 72

Potrebbero piacerti anche