Autor Tema: Tutorial C18  (Leído 57524 veces)

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

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tutorial C18
« Respuesta #90 en: 01 de Octubre de 2010, 15:58:49 »
Y están ubicados correctamente? Porque si se usa el R/W, se queda a la espera de una respuesta de desocupado por parte del LCD, puede que esté mal y pase algo de eso. La manera de trabajar cuando no funciona es hacer debug, y ver donde falla, si las variables cargadas son correctas, hay algo mal en el algoritmo, porque falla!, ect. Sino se depende mucho de otras personas  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado PICYO

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

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

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

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





Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tutorial C18
« Respuesta #92 en: 02 de Octubre de 2010, 21:19:33 »
Adjuntame el proyecto completo, o sea comprime la carpeta, así le doy un vistazo.  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: Tutorial C18
« Respuesta #93 en: 03 de Octubre de 2010, 08:23:29 »
ok! Aquí te lo adjunto. Me da que en 5 minutos sabrás el porqué ( miénteme y dime que has tardado horas!! jeje!)
Hasta luego!

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tutorial C18
« Respuesta #94 en: 03 de Octubre de 2010, 12:17:30 »
Bueno, al realizar el debug en MPLAB SIM se queda a la espera de la condición de busy, si realizamos un estimulo fijando a 0 el valor de RB3 (D7 de  LCD) sigue la ejecución como debe ser.

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

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado PICYO

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

Bueno, las suposiciones de mi cita anterior, veo que no estaban desencaminadas pues... estaban absolutamente perdidas!
Otra pregunta, ya que estamos... Miraste los sectores incompletos  del assembler generado. Bueno, sigo tus pasos y miro el "Dissasembly Listing"... y mis pasos se quedan ahí :P Quiero decir, qué trozo de código no está completo, cómo puedo saberlo para otras ocasiones? Perdona que me ponga preguntón con esto, pero es para sacarle partido al error.
Hasta luego!

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tutorial C18
« Respuesta #96 en: 03 de Octubre de 2010, 23:55:25 »
En proteus es más sencillo de verlo, cargas el .coff y haces CTRL + D. Verás que están las instrucciones de C, pero no hay lineas de assembler  :shock:


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Tutorial C18
« Respuesta #97 en: 05 de Octubre de 2010, 13:11:56 »
Alguien sabe donde podría ver información acerca de grabar datos en la memoria interna del microcontrolador en C18? o con que instrucciones lo realizo? :-/

Saludos
Lo que no me destruye, me fortalece

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tutorial C18
« Respuesta #98 en: 05 de Octubre de 2010, 14:47:00 »
En C:\MCC18\doc\periph-lib\EEPROM.htm


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Dudas con el USART de C18
« Respuesta #99 en: 09 de Noviembre de 2010, 16:12:16 »
Hola que tal;


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

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

Lo anterior esta correcto

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

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

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


Saludos
Lo que no me destruye, me fortalece

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tutorial C18
« Respuesta #100 en: 09 de Noviembre de 2010, 16:16:47 »
Revisa la ayuda, y dale una revisada a BusyUSART


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Tutorial C18
« Respuesta #101 en: 09 de Noviembre de 2010, 16:17:53 »
Ok  dejame checar esa parte.

Saludos
Lo que no me destruye, me fortalece

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Tutorial C18
« Respuesta #102 en: 09 de Noviembre de 2010, 16:33:00 »
Ok he leído la ayuda.

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

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

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

Saludos
Lo que no me destruye, me fortalece

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tutorial C18
« Respuesta #103 en: 09 de Noviembre de 2010, 16:46:56 »
A probarlo sin dar vueltas!!!  :)
No contesto mensajes privados, las consultas en el foro

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Tutorial C18
« Respuesta #104 en: 09 de Noviembre de 2010, 17:06:00 »
De lo siguiente me surge otra duda jejeje  :oops:

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

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

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

Saludos
Lo que no me destruye, me fortalece