Autor Tema: pic18f8722 in serial communication with host  (Leído 9025 veces)

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

Desconectado shagui

  • PIC10
  • *
  • Mensajes: 12
pic18f8722 in serial communication with host
« en: 21 de Enero de 2007, 13:07:20 »
Hola muy buenas. Siento escribir gran parte de éste mensaje en inglés. Estoy trabajando en la forma de medir la potencia del sonido de una onda de audio a través de un microfono. Utilizando éste como sensor para transmitir el valor de la tensión entre sus terminales, y adecuando su señal con un preamplificador de ganancia unitaria, a un microcontrolador por medio del convertidor analógico-digital  y más tarde mostrar éste valor por pantalla en mi ordenador personal gracias a un interfaz de comunicación serie RS-232.

 El código que puedo utilizar para éste microcontrolador según los tiempos que he calculado para cada sample son 250 líneas de programa, es decir 250 instrucciones, ya que su pipeline me dice que necesito 8 ciclos de relog para ejecutar una instrucción y tengo un oscilador que opera a 40 MHz. Acabo de enviar todas mis dudas al foro de microchip. He intentado compilar mi software con varios programas, sobre todo con Hi Tech PICC18. Pero al final he desistido porque no sé como configurarlo con MPLAB. La conexión a internet que poseo restringe algunos puertos de comunicación y no puedo trabajar con los programas en modo on-line. Así  que llevo días leyendo acerca del compilador MPLAB C18 y creo que he avanzado bastante en todas las posibilidades que tengo con él. He desarrollado satisfactoriamente todos los ejemplos, claro que no consigo compilar el mí o propio.

 Mi error ha sido haber escojido un PIC(18f8722) en vez de otro con menos problemas y más documentación disponible. Me han aconsejado programarlo en  ensamblador pero pienso que es una locura ya que también necesito programar un filtro digital FIR/IIR en modo paso baja y es imposible, tan solo para implementar una función logarítmica necesito más de veinte líneas de código en ensamblador, para un implementar un sumatorio como el de un filtro necesitaría más de 300 líneas de programa.

Aunque consiga compilarlo en C, aún no sé ni si podré programarlo ya que necesitaré un programador (MPLAB ICD2 In-Circuit Debugger) para descargar el programa en el PIC DEM y éste tiene un alto precio. He intentado buscar otras alternativas como utilizar el Hiperterminal de windows pero tampoco es compatible con el PICDEM en el que está desarrollado éste microcontrolador (DM183022 PICDEM HPC EXPLORER BOARD) y del cuál dispongo.  De momento he tenido suerte pasando la evaluación del proyecto, pero ahora empieza una cuenta atrás de tres meses para conseguir que funcione. Le agradecería si pudiese ayudarme a encausar el rumbo de algunas de mis más importantes dudas en éste momento. Le dejo la descripción de todas ellas a continuación, están en inglés ya que son las preguntas que he dejado en el foro de microchip, no creo que tenga ningún problema para entenderlas ya que mi nivel de inglés deja mucho que desear todavía.

No quisiera causarte muchas molestias ya que deberí a ser yo quien resolviera todas estas dudas pero nunca está de más tener un experto mentor que te dé una ví a a seguir.

Un coordial saludo

Antonio

*************************************************************************************************************************************************************************************************************************
Hello

I am a beginner. I have a PICDEM HPC explorer board to develop my own project. I want to transmit the value of voltage in ADC input of PICDEM to display it in my laptop. I am programming the code for the PIC in MPLAB c18 student version. I have a lot of questions:

-I believe that I need a MPLAB ICD2 to set up my software in the microcontroller and it is more expensive than the PICDEM. I wanna know if I can use another way to do that. 

-About the student version of MPLAB c18 v3_02: I have problems to compile my program. When I built all, the output give me the following message:

Clean: Deleting intermediary and output files.
Clean: Deleted file "C:\MyProject\Voltage\Voltage.mcs".
Clean: Done.
Executing: "C:\MCC18\bin\mcc18.exe" -p=18F8722  /i"C:\MCC18\h" "voltage.c" -fo="voltage.o" -mL -Oa
MPLAB C18 v3.02 (demo)
Copyright 1999-2005 Microchip Technology Inc.
Days remaining until demo becomes feature limited:  40
WARNING:  The procedural abstraction optimization will not be supported when the demo becomes feature limited.
C:\MyProject\Voltage\voltage.c:35:Error: syntax error
Halting build on first failure as requested.
BUILD FAILED: Sun Jan 21 08:32:22 2007


-I have tried to compile my code in Hi Tech PICC18 v9.50PL3 previously but that is not possible because I can not configure it inside MPLAB IDE v7.51. The result of the compilation was the following message:

Error[1187]   : invalid activation request

I think that I have got this error because MPLAB IDE v7.51 can not search the Paths&Directories of Hi Tech PICC18 Toolsuite in Project--> Set Language Tools Localization


-Too, I would like know which is the best way for interfacing the PICDEM (RS-232) with my laptop(USB) by serial communication.To do that I will use a USB to RS-232 cable. I will develop a C/C++ software to read the COM port in the host. I am studying the BIOS library to make that and to read the value transmitted from MAX232 of PICDEM explorer board to the host.  I am doing it because unfortunately I can not use the hyperterminal to download my application code on the HPC explorer board, then I believe either can not use hyperterminal to receive any information form my PIC.


I attach the code that I am trying to compile in MPLAB c18. It has a little variation respect to the code that I used for Hi Tech PICC18:

#include<stdio.h>
#include<math.h>
#include<p18cxxx.h>
#include<p18f8722.h>
#include<adc.h>
#include <stdlib.h>
#include<timers.h>
#include <usart.h>
_18F8722

/* #include<pic.h>               // Only used for Hi Tech PICC18 compiler */
/* _CONFIG(HS & WDTDIS);   // Only uesd for Hi Tech PICC18 compiler */


/* Xtal frequency */
#define XTAL 40000000L
#define ON 1
#define OFF 0
#define TX1IF    PIR1bits.TX1IF
#define RC1IF    PIR1bits.RC1IF
#define TMR1IF    PIR1bits.TMR1IF
#define RC0        PORTCbits.RC0
#define ADGO    ADCON0bits.GO
#define UPDATES_PER_SECOND 1L
#define TMR1H_RESET ((65542L-((XTAL/32L)/UPDATES_PER_SECOND)) >> 
#define TMR1L_RESET ((65542L-((XTAL/32L)/UPDATES_PER_SECOND)) & 0xff)
/* NOTE: 65542 instead of 65536 for 6 cycles it takes to recognize TMR0
* 32=4 Instruction cycles per CLK * 8 (Preescaler value)
* overflow and reload TMR1H/TMR1L:
*  while (!TMR1IF)
*  ;
*  TMR1H= TMR1H_RESET;
*  TMR1L= TMR1L_RESET;
* becomes
*  Lxx:
*   BTFSS 0x0C, 0
*   GOTO Lxx
*   MOVLW xxxx
*   MOVWF TMR1H
*   MOVLW yyyy
*   MOVWF TMR1L
*/

void serial_setup(void)                      <---------------- Here is the first error of the compilation in MPLAB C18: "syntax error"
{
/*
* Comms setup:9600/f=40 MHZ -> BRHG=1;SPBRGX=25
*/
SPBRG1=25;
BRG16= 0;
BRGH=1;         //data rate for sending--EUSART
SYNC=0;         //asynchronous
SPEN=1;         //enable serial port pins
CREN=1;         //enable recepton
SREN=0;         //no effect
TX1IE=0;        //disable tx interrups
RC1IE=0;        //disable rx interrups
TX9=0;         //8-bit transmission
RX9=0;         //8-bit reception
TXEN=0;         //reset transmitter
TXEN=1;         //enable the transmitter
}
//writes a character to the serial port
void putch(char letter)
{
while(!TX1IF);
TXREG1=letter;
}
//gets a character from the serial port without timeout
unsigned char getch(void)
{
while(!RC1IF);
return RCREG1;
}
void main(void)
{
unsigned char i, j;
unsigned int adcv[30], sum=0;
TRISC=0x80; // PORT C output Except RX (RC7) serial_setup();
ADCON2= 0b10001001;
/*1....... = right justified in ADRESH:ADRESL */
/*.0...... = unused */
/*..001... = 2 adquisition time A/D
/*.....001 = A/D conversion clock = Fosc/8 */
ADCON1= 0b00001110;
/*00...... = unused */
/*..00.... = voltage reference: +AVdd, -AVss */
/*....1110 = only NA0 is analog, Vref+=AVdd, Vref-=ground(AVss)*/
ADCON0= 0b00000011;
/*00...... = unused*/
/*..0000.. = channel 0 (AN0 on RA0) */
/*......0. = A/D conversion not in progress */
/*.......1 = ADC on */
T1CON = 0b11001001;
/*1....... = mode enable bit in one 16-bit operations */
/*.1...... = device clock derived from Timer1 oscilator */
/*..00.... = 1:1 prescalar */
/*....1... = Oscillator is enabled */
/*.....0.. = !T1SYNC (ignored if TMR1CS is 0) */
/*......0. = TMR1CS = internal clock (Fosc/4) */
/*.......1 = TMR1ON (timer1 enabled) */
while(1)

{
TMR1H = TMR1H_RESET;
TMR1L = TMR1L_RESET;
TMR1IF = OFF;
RC0=0; //LED off
for(i=0;i<30;i++) adcv=0;
i=0;
while (!TMR1IF)
{
TMR1H = TMR1H_RESET;
TMR1L = TMR1L_RESET;
TMR1IF = OFF;
ADG0 = ON;
  while (ADG0); /*wait for ADC conversion */
  adcv = (ADRESH<<+ADRESL;
  sum=0;
  for(j=0;j<30;j++) sum+=adcv[j];
  sum=(sum)/30;
  sum=sum>>3; //valour betwen (0,511) (aprox. in hundredth of volt with 2% error)
  printf("Analogue value = %d, %d\n",sum/100,sum%100);
  i=i+1; if(i>30) i=0; //actualize indice
} //while(!t...
} /* while(1) */
} /*main() */


I know that have a lot of questions. I am reading more than twenty manuals at moment. Please I need your help before I will come crazy.

Regards

Thank you

Antonio

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: pic18f8722 in serial communication with host
« Respuesta #1 en: 21 de Enero de 2007, 15:45:00 »
shagui, vayamos por partes.  Comprendiendo de lo más básico para luego pasar a lo más complejo.

De lo que leo de tu posts creo que estas confundiendo lo que es "programar a tu micro" con un programador, a lo que es el uso del puerto serie.

Un programador es un circuito que se conecta directamente al PIC y mediante un protocolo propio de Microchip le 'graba' en la flash el contenido que tú desees.  Ese contenido viene dado por un archivo .HEX que es lo que suele generar cualquier compilador (C, Pascal, Basic, Niple, etc) o ensamblador.

En cuanto a programadores hay muuuuuuuchos circuitos que puedes usar, todos de diferentes precios y capacidades.  Te sugiero te pegues una vuelta por el sector de "Programadores" para que elijas una opción que te venga bien a tus gustos, a tus ganas de seguir con el tema, a tu capacidad económica, etc.

El ICD-2 es un debugger que tiene la posibilidad además de programar el microcontrolador, de ahí que hayas leído que con él puedes programar a tu PIC. 




Por otro lado existes los programas Bootloader o "Firmware Updater" que son software que te permiten mediante una conexión de puerto serie , paralelo, can bus, spi, etc. actualizar a tu pic.    El software en cuestión debe estar previamente ya grabado en el PIC, con lo cual necesitaste sí o si previamente de un programador ( o bien adquiriste el pic con el software ya grabado anteriormente).


Sumado a esto, te digo que está bien que te hayas inclinado por usar un software en C.  El assembler es muy útil y muy directo, hasta necesario si quieres saber los detalles de cómo funciona tu microcontrolador pero para comenzar, tal vez sea muy tedioso y para hacer un filtro FIR no te lo aconsejo para nada.


No quiero seguir ahondando en el tema hasta no saber si realmente vamos llevando la cosa por buen camino.
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado shagui

  • PIC10
  • *
  • Mensajes: 12
Re: pic18f8722 in serial communication with host
« Respuesta #2 en: 22 de Enero de 2007, 04:52:16 »
Muy buenas de nuevo

Te agradezco el interés mostrado acerca de éste proyecto. Tengo dudas acerca del comentario que me haces de poder utilizar un programador.
Me consta que mi PICDEM viene desde la casa microchip con un bootloader ya programado. Mi cuestión es como puedo descargar mi propio programa en el Pic de éste PICDEM y actualizar de ese modo éste bootloader. Tampoco sé si puedo utilizar el PIC que viene en ésta placa para desarrollar mi aplicación o si por el contrario deberé implementar un segundo PIC18f8722. En cualquier caso te agradecería si pudieses explicarme como puedo programar en éste PICDEM HPC mi software en MPLAB C18 sin tener que recurrir al MPLAB ICD2. No me importaría construir mi propio programador pero al considerar que éste PIC tiene un excesivo número de pins y que además ya viene implementado en la placa... Creo que debería tomar un camino  para reprogramar el bootloader pero no sé que puedo utilizar para conseguir eso.

Siento ser tan confuso en mis explicaciones dado que solo soy un novato en ésto. Me consta que la descarga del software es independiente de la comunicación serie que deseo llevar a cabo. Me gustaría desarrollar mi propio ejecutable en C/C++ para poder leer desde el puerto USB de mi portatil, tan solo desconozco la librería y las instrucciones que debo utilizar para conseguirlo. Te agradecería si pudieses hacer referencia a algún ejemplo que pudise consultar para ese cometido.

Espero podamos seguir discutiendo sobre ésta aplicación, en realidad solo hago aprender cosas nuevas de todo ésto, y estoy muy agradecido por ello a toda persona que pueda despejar alguna de mis incognitas.

Un coordial saludo de un andaluz desde inglaterra


Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: pic18f8722 in serial communication with host
« Respuesta #3 en: 22 de Enero de 2007, 05:41:16 »
Lo ideal sería que te hicieras con el "downloader" que corresponda al bootloader que tiene el PIC. De esta manera sería muy fácil cargarle el programa a través del puerto serie que ya tiene implementada tu placa.

No obstante, sospecho que será complicado encontrarlo, por lo que te hago otra propuesta.

Se trata de localizar los pines Vpp, PGC y PGD de tu micro y sacar tres cablecitos desde tu placa. A estos tres hilos les puedes conectar cualquier programador ICSP (GTP USB +  recomendado) que lo programará sin ningún problema.
La única pega que puede haber es que los pines PGC y PGD se estén utilizando en tu placa para otra cosa y cause algún problema de programación, para lo cual habría que cortar la pista y colocar un switch que te permita seleccionar modo programación o modo ejecución.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: pic18f8722 in serial communication with host
« Respuesta #4 en: 22 de Enero de 2007, 08:30:41 »
Muy buenas de nuevo

Te agradezco el interés mostrado acerca de éste proyecto. Tengo dudas acerca del comentario que me haces de poder utilizar un programador.
Me consta que mi PICDEM viene desde la casa microchip con un bootloader ya programado. Mi cuestión es como puedo descargar mi propio programa en el Pic de éste PICDEM y actualizar de ese modo éste bootloader. Tampoco sé si puedo utilizar el PIC que viene en ésta placa para desarrollar mi aplicación o si por el contrario deberé implementar un segundo PIC18f8722. En cualquier caso te agradecería si pudieses explicarme como puedo programar en éste PICDEM HPC mi software en MPLAB C18 sin tener que recurrir al MPLAB ICD2. No me importaría construir mi propio programador pero al considerar que éste PIC tiene un excesivo número de pins y que además ya viene implementado en la placa... Creo que debería tomar un camino  para reprogramar el bootloader pero no sé que puedo utilizar para conseguir eso.

Siento ser tan confuso en mis explicaciones dado que solo soy un novato en ésto. Me consta que la descarga del software es independiente de la comunicación serie que deseo llevar a cabo. Me gustaría desarrollar mi propio ejecutable en C/C++ para poder leer desde el puerto USB de mi portatil, tan solo desconozco la librería y las instrucciones que debo utilizar para conseguirlo. Te agradecería si pudieses hacer referencia a algún ejemplo que pudise consultar para ese cometido.

Espero podamos seguir discutiendo sobre ésta aplicación, en realidad solo hago aprender cosas nuevas de todo ésto, y estoy muy agradecido por ello a toda persona que pueda despejar alguna de mis incognitas.

Un coordial saludo de un andaluz desde inglaterra



shagui, creo que estas confundiendo algunas cosas. 

Tu pic tiene un bootloader y con ese bootloader es muy probable que no puedas actualizar el bootloader.  Esto es común en las aplicaciones de teléfonos celulares donde uno puede actualizar el bootloader mismo pero aquí eso no es así. 

El bootloader es un software que estaría corriendo en el pic casualmente cuando lo estas actualizando, si quieres actualizar el bootloader con el bootloader mismo estarías sobreescribiendo el programa durante su ejecución logrando seguramente resultados inesperados y grandes chances de que no funcione al reencender el pic.

El camino que debes seguir es tener un programador para el PIC.   El que te apuntó Nocturno GTP-USB+ es muy bueno.

Con respecto a la comunicación desde el puerto USB de tu portátil no me queda claro bien que quieres hacer, pero te puedo ir adelantando que no es la cosa más fácil que puedes hacer con un pic. 

En mi opinión estás queriendo saltar muchos pasos de una sola vez, cuando debieras, a mi modo de ver las cosas, primero comprender lo que es un bootloader, lo que es un programador, encender un led, mandar datos por la usart a un puerto serie de la pc y mucho después recién ver de implementar una comunicación con USB.

No he hecho nada al respecto pero Microchip tiene algunas notas de aplicación al respecto del USB desarrolladas para C18.  En este foro, si te pegas una vuelta por proyectos podrás ver algunos ejemplos de proyectos hechos con comunicación USB, el tema es que están desarrollados en CCS con lo cual deberás migrar el código a C18.  Una migración de CCS a C18 no es tan simple como parece.

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado shagui

  • PIC10
  • *
  • Mensajes: 12
pic18f8722 in serial communication with host
« Respuesta #5 en: 22 de Enero de 2007, 10:01:41 »
Muy buenas de nuevo

Muchas gracias por contestar a mis plegarias. Estoy avanzando mucho en mis conocimientos desde que os encontré en este foro. Acabo de visitar la página de "Nocturno" y es de admirar todo lo que haces. Creo que cuando vuelva a mi tierra montaré un pequeño taller y comenzaré con esos PIC16f877 que tantas alegrías espero conseguir, se me ocurren miles de aplicaciones para aprender con ellos. Claro que ahora mi propósito es otro y además me es obligatorio continuar con él.

Acabo de conseguir un programador MPLAB ICD2, y respecto a lo que me comenta "Maunix", sé que debo estudiar mucho acerca del bootloader, pero estoy siguiendo un manual que dado he conseguido el programador supongo podré terminarlo pronto y entender hasta donde puedo llegar.

Respecto a la comunicación USB, mi principal propósito es poder mostrar por pantalla del PC el resultado de las operaciones llevadas a cabo por mi PIC. Y por eso se me ocurrió lo de programar un ejecutable en C/C++. He tenido la suerte de encontrar ejemplos en C de comunicaciones parecidas a través de RS232 pero éstos ejemplos tratan de la manera de comunicar Pc con Pc, y por eso creía que podría conseguirlo con mi PICDEM. Como no puedo utilizar Hyperterminal, ahora que poseo el ICD2, mi pregunta es si podré utilizar éste para conseguir mi objetivo para serial communication  o si sigo en las mismas teniendo que recurrir a librerias en C como la BIOS para hacerlo. Insisto tanto en ésto porque no tengo otra escapatoria, espero que pronto pueda ser más técnico en mis expresiones.

Un coordial saludo de un Andaluz en Inglaterra.



Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: pic18f8722 in serial communication with host
« Respuesta #6 en: 22 de Enero de 2007, 11:16:07 »
Amigo, por una parte hablas de una comunicación Serial y por otra parte de la comunicación USB.

La comunicación USB también es serial y de ahí mi confusión al respecto de lo que realmente quieres lograr.

Todo es posible, y en cuanto al uso de C/C++ del lado de la PC te sugiero te pegues una vuelta por el subforo dedicado al tema que versa sobre estos temas.  Si usas Windows XP , Windows 2000 o Linux verás que no se puede acceder al puerto serie directamente accediendo a la BIOS, ya que estos sistemas operativos protegen el acceso al hardware y encapsulan las aplicaciones.  Deberás usar algún componente y/o librería que interactúe con el sistema operativo para llevar a cabo esta gestión.

Respecto al ICD-2 te ayudará a programar a tu PIC y a que interactues con el MPLAB (podrás detener el funcionamiento del programa y ver en pantalla el valor de las variables).

Debes tener cuidado en que si usas el ICD-2 para programar a tu pic , al igual que si usas cualquier otro programador, el software previamente grabado en el PIC se borrará.  Te aclaro esto por si no tienes forma de recuperar el software bootloader estarás en problemas, de todas formas si viene de Microchip es casi seguro que lo puedes volver a bajar de su sitio web.

No conozco los pormenores de esa board que comentas pero sí conozco algo de los 18F para poderte guiar en su programación/debugging




- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
Re: pic18f8722 in serial communication with host
« Respuesta #7 en: 22 de Enero de 2007, 11:39:11 »
(Una broma tonta jugando con las distintas acepciones de una palabra  :mrgreen:)

Yo soy un programador(1) que programo(2) haciendo un programa(3) para que un programa(4) cree el programa(5) que con un programador(6) programo(7) en el área de programas(8) de un PIC programable(9)

(1) Por la persona que hace programas
(2) Por la acción de escribir el fuente de un programa
(3) Por el efecto de haber escrito un programa
(4) Por el Compilador/Ensamblador que transforma mi fuente
(5) Por el objeto producido por el Compilador/Ensamblador
(6) Por el artefacto que traslada el programa objeto al PIC
(7) Por la acción de efectuar realmente el traslado del programa objeto al PIC
(8) Por el área donde el PIC alamcena dicho programa objeto
(9) Por el concepto bajo el cúal un PIC admite diversos programas actualizables o intercambiables.

(Perdonad la disgresión, pero me lo pedía el cuerpo  :D :D :D)




Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: pic18f8722 in serial communication with host
« Respuesta #8 en: 22 de Enero de 2007, 12:40:28 »
Diego, me parece genial y acertado, jeje.  Confieso que de hecho mientras escribía el post hasta pensé en aclarar el uso de la palabra programar porque en este post se repite mucho y realmente es difícil a veces conseguir un 'sinónimo' adecuado ¿no?

 8) 8)
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado shagui

  • PIC10
  • *
  • Mensajes: 12
ICD2
« Respuesta #9 en: 26 de Enero de 2007, 17:29:54 »
Hola muy buenas

  :shock: hoy he experimentado conectando mi PICDEM HPC explorer board al host y al MPLAB ICD2 . Al comienzo esperaba comprobar el bootloader o programa preprogramado con una demostración del device.  Claro que no acertaba la contraseña que hay al encender ni con la posición de la MCU Enable Switch. Así que le programé mi propio código con la ayuda del debugger.
Considerando que lo más que he conseguido ha sido encender unos leds de la placa y dejar de verlos en cuestión de un par de minutos. Creo que puedo tener que decir acerca de ésto. Dado que eso no es lo que deseo conseguir ni mucho menos. Como he enviado código en previos post, seguiré en la rutina de eviar mi actual código.

#include<stdio.h>
#include<math.h>
#include "p18cxxx.h"
#include "p18f8722.h"
#include <adc.h>
#include <stdlib.h>
#include<timers.h>
#include <usart.h>

#include "blockdefinition.h"

//#include "FilterLowPass.c"

//unsigned char j;
//unsigned int y[30];
//extern unsigned int SignalFiltered[30];


void serial_setup(void)
{
   /*
    * Comms setup:9600/f=40 MHZ -> BRHG=1;SPBRGX=25
    */

   SPBRG1=25;
   BRG16= 0;
   BRGH=1;                           //data rate for sending--EUSART
   SYNC=0;                           //asynchronous
   SPEN=1;                           //enable serial port pins
   CREN=1;                           //enable recepton
   SREN=0;                           //no effect
   TX1IE=0;                        //disable tx interrups
   RC1IE=0;                        //disable rx interrups
   TX9=0;                           //8-bit transmission
   RX9=0;                           //8-bit reception
   TXEN=0;                           //reset transmitter
   TXEN=1;                           //enable the transmitter

}


void main(void)
{
     unsigned char i, j, sum;
   unsigned int adcv[30];
   TRISC=0x80; // PORT C output Except RX (RC7) serial_setup();
   ADCON2= 0b10001001;
         /*1....... = right justified in ADRESH:ADRESL */
         /*.0...... = unused */
         /*..001... = 2 adquisition time A/D
         /*.....001 = A/D conversion clock = Fosc/8 */
   ADCON1= 0b00001110;
         /*00...... = unused */
         /*..00.... = voltage reference: +AVdd, -AVss */
         /*....1110 = only NA0 is analog, Vref+=AVdd, Vref-=ground(AVss)*/
   ADCON0= 0b00000011;
         /*00...... = unused*/
         /*..0000.. = channel 0 (AN0 on RA0) */
         /*......0. = A/D conversion not in progress */
         /*.......1 = ADC on */
   T1CON = 0b11001001;
         /*1....... = mode enable bit in one 16-bit operations */
         /*.1...... = device clock derived from Timer1 oscilator */
         /*..00.... = 1:1 prescalar */
         /*....1... = Oscillator is enabled */
         /*.....0.. = !T1SYNC (ignored if TMR1CS is 0) */
         /*......0. = TMR1CS = internal clock (Fosc/4) */
         /*.......1 = TMR1ON (timer1 enabled) */

   serial_setup();

   while(1)
      
   {
         TMR1H = TMR1H_RESET;
         TMR1L = TMR1L_RESET;
         TMR1IF = OFF;
         RC0=0; //LED off
         for(i=0;i<30;i++) adcv=0;
         i=0;
         while (!TMR1IF)
         {
         TMR1H = TMR1H_RESET;
         TMR1L = TMR1L_RESET;
         TMR1IF = OFF;
         ADG0 = ON;
               while (ADG0); /*wait for ADC conversion */
               adcv = (ADRESH<<8)+ADRESL;
               sum=0;
               for(j=0;j<30;j++) sum+=adcv[j];      
               //a[j]=adcv[j];
               //FilterLowPass(&y[j]);
               //sum+= y[j];   
               sum=(sum)/30;
               sum=sum>>3; //valour betwen (0,511) (aprox. in hundredth of volt with 2% error)
               printf("Analogue value = %d, %d\n",sum/100,sum%100);
                    putch1((char) sum);
               i=i+1; if(i>30) i=0; //actualize index
         } //while(!t...
   } /* while(1) */
} /*main() */

//writes a character to the serial port
void putch1(char letter)
{
   while(!TX1IF);
   TXREG1=letter;
}

//gets a character from the serial port without timeout
unsigned char getch(void)
{
   while(!RC1IF);
   return RCREG1;
}


echame una cable primo con el ICD2. Por cierto me gustaría saber como podría hacerle llegar a microchip mis deseos de conseguir ese software que trae el PICDEM preprogramado en el PIC.

Saludos

Antonio, un Andaluz en Preston UK

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: ICD2
« Respuesta #10 en: 27 de Enero de 2007, 15:12:31 »
shagui qué es lo que pretendes hacer con ese código? No entiendo cual es tu duda.

Respecto a lo de microchip, creo que debieras contactar con tu proveedor local más cercano o distribuidor para que te asesoren sobre eso.

La otra alternativa es que preguntes en el foro de Microchip sobre ésta última duda.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado shagui

  • PIC10
  • *
  • Mensajes: 12
pic18f8722 in serial communication with host
« Respuesta #11 en: 28 de Enero de 2007, 00:50:24 »
Hola de nuevo

 Mi idea con éste código es transmitir el valor de tensión leído en el ADC converter del PICDEM para ser display en el windows hyperterminal en serial communication. Puedo visualizar el USART en MPLAB ya que mi código ha compilado y veo el printf("...  Ahora como he perdido el software preprogramado en el PICDEM, en el cuál podía comprobar si estaba bien la configuración de mi ordenador para serial communication ya que éste software de demostración transmitía el valor de varios valores al hyperterminal,  solo me queda rezar para configurarlo y que todo esté correcto.

Un coordial saludo

Antonio

Desconectado shagui

  • PIC10
  • *
  • Mensajes: 12
aplication firmware y boot loader
« Respuesta #12 en: 05 de Febrero de 2007, 22:27:24 »
hola, muy buenas de nuevo

 Llevo dos semanas dándole vueltas al mísmo manual:  Trouble shooting para mi demonstration board. He conseguido reprogramar el boot loader en el chip. Ahora me planteo el download mi aplicación a la board usando el bootloader. Siguiendo los pasos del manual obtengo un error diciendome que Error - could not find definition of symbol 'FPFLAGS' in file 'C:\bootloader\HPC Explorer V1_01\c018i.o'.

He intentado utilizar el workpace que contiene el bootloader y el código demo de la board para rebuild éste código y programarlo en la board, se supone que así conseguiría hacer funcionar la placa y ver que por lo menos hace algo. Pero me encuentro con el mísmo error que con el proyecto anterior.

Llevo varios días estancado en ésto y aún no entiendo como puedo mejorar mi aplicación firmware ni como puede pasar ésta el control al bootloader.


Un coordial saludo

Antonio

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: aplication firmware y boot loader
« Respuesta #13 en: 05 de Febrero de 2007, 22:47:38 »
Lo que yo entiendo del mensaje de error es lo siguiente

Que se debe definir 'FPFLAGS' el archivo 'C:\bootloader\HPC Explorer V1_01\c018i.o'.

El archivo objeto c018i.o no es más que un .C o .ASM compilado/ensamblado para ser usado como inicializador del código.

Evidentemente necesita la variable FPFLAGS la cual no está definida, realmente habría que ponerse a estudiar cómo funciona el bootloader o intentar recompilar el c018i .  Esto nunca lo he hecho pero está bien documentado en el foro de Microchip cómo se debe hacer.

Disculpa que no te pueda dar detalles más firmes y precisos pero no he usado ese board que mencionas y me tendría que poner a estudiar el mismo en detalle para eso.

Saludos



- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado shagui

  • PIC10
  • *
  • Mensajes: 12
Re: pic18f8722 in serial communication with host
« Respuesta #14 en: 11 de Abril de 2007, 14:30:35 »
Muy buenas de nuevo

 He conseguido progresar un poco en mi código C18. Os recuerdo que mi propósito era transmitir el valor de la potencia leida en la entrada del ADC de mi PICDEM por medio de elevar al cuadrado el valor de ese nivel de voltage para una impedancia de un ohmio. Todo ha ido muy bien en la simulación con MPLAB. Cuál es mi sorpresa que cuando le cargo mi firmware al PIC y lo comunico con el HyperTerminal de Windows, recibo una cantidad de valores erróneos sorprendente. Ni un solo número decimal. Por ello pensé en testear con el osciloscopio en la salida serie RS232 del PICDEM HPC explorer board. Cuál fué mi sorpresa al ver que la comunicación serie era demasiado rápida. Lo comparé con un demo que tengo y así era. Mi propósito es transmitir a 9600 baudios e incluso he intentado bajar la frecuencia de oscilación del PIC pero nada. Así que creo que tengo un problema con los tiempos del Timer1. Hasta ahora no he encontrado el error. Creo que la ecuacón que utilizo es correcta porque la simulación fué de lujo. Así que me pongo en vuestras manos, vuestros consejos siempre fueron brillantes. Como podéis ver en la última parte del código, utilizo un switch para transmitir al USART la representación del valor de la potencia que he hallado previamente, para ello considero el valor de cada número decimal entre 0 y 10,  y su correspondiente valor ASCII, siendo el #48 el valor decimal correspondiente para el número cero. No me pongo más pesado, dado que me consta que hacéis estupendos análisis de códigos, así que ahí va el mío.

Un coordial saludo de un Andaluz en la tierra de Los Escarabajos.



#include <stdio.h>
#include <math.h>
#include "p18cxxx.h"
#include "p18f8722.h"
#include <adc.h>
#include <stdlib.h>
#include <timers.h>
#include <usart.h>

#define __18F8722_H

/* Xtal frequency */
#define XTAL 16000000L

#define ON 1
#define OFF 0

#define   WDTCON   WDTCONbits.SWDTEN
#define TX1IF   PIR1bits.TX1IF
#define RC1IF   PIR1bits.RC1IF
#define TMR1IF  PIR1bits.TMR1IF
#define RC0    PORTCbits.RC0
#define ADG0    ADCON0bits.GO
#define BRG16   BAUDCONbits.BRG16
#define   BRGH   TXSTAbits.BRGH
#define   SYNC   TXSTA2bits.SYNC
#define   SPEN   RCSTAbits.SPEN
#define   CREN   RCSTAbits.CREN
#define   SREN   RCSTAbits.SREN
#define   TX1IE   PIE1bits.TX1IE
#define   RC1IE   PIE1bits.RC1IE
#define   TX9      TXSTAbits.TX9
#define   RX9      RCSTAbits.RX9
#define TXEN   TXSTA2bits.TXEN

#define RD0      LATDbits.LATD0
#define RD1      LATDbits.LATD1
#define RD2      LATDbits.LATD2
#define RD3      LATDbits.LATD3
#define RD4      LATDbits.LATD4
#define RD5      LATDbits.LATD5
#define RD6      LATDbits.LATD6
#define RD7      LATDbits.LATD7

#define HEIGHT   4
#define TRUE   0

#define UPDATES_PER_SECOND 1L
#define TMR1H_RESET ((65542L-((XTAL/32L)/UPDATES_PER_SECOND)) >> 8)
#define TMR1L_RESET ((65542L-((XTAL/32L)/UPDATES_PER_SECOND)) & 0xff)

/* NOTE: 65542 instead of 65536 for 6 cycles it takes to recognize TMR0
* 32=4 Instruction cycles per CLK * 8 (Preescaler value)
*   overflow and reload TMR1H/TMR1L:
*      while (!TMR1IF)
*      
*      TMR1H= TMR1H_RESET;
*      TMR1L= TMR1L_RESET;
*   becomes
*      Lxx:
*         BTFSS   0x0C, 0
*         GOTO   Lxx
*         MOVLW   xxxx
*         MOVWF   TMR1H
*         MOVLW   yyyy
*         MOVWF   TMR1L
*/


void putch1(char letter);
short FilterLowPass(short);
void delay(int loop_count);

#define num 2

void serial_setup(void)
{
   /*
    * Comms setup:9600/f=16 MHZ -> BRGH=0;SPBRGX=25
    */

   WDTCON=OFF;                           //watchdog disable
   SPBRG1=25;
   BRG16= 0;
   BRGH=0;                           //low data rate for sending--EUSART
   SYNC=0;                           //asynchronous
   SPEN=1;                           //enable serial port pins
   CREN=1;                           //enable recepton
   SREN=0;                           //no effect
   TX1IE=0;                        //disable tx interrups
   RC1IE=0;                        //disable rx interrups
   TX9=0;                           //8-bit transmission
   RX9=0;                           //8-bit reception
   TXEN=0;                           //reset transmitter
   TXEN=1;                           //enable the transmitter

}

   unsigned char i, j;
   unsigned char z, m, n;
   unsigned int adcv[30],out;
   unsigned int ArrNum[HEIGHT], Arr[HEIGHT];
    unsigned int sum, ssum, summ, ssumm;
   unsigned int numl, numL, numh, numH, numHh, numLl;
   unsigned char pos, post;
   int   loop_count;
   int    loop;
   long int number;

void main(void)
{

//    Query for direct boot entry
   if (!PORTBbits.RB0)    // used to pass the control to bootloader
   {
      _asm 
         clrf STKPTR, 0
         goto 0x0004
      _endasm
   }
 
   TRISC=0x80; // PORT C output Except RX (RC7) serial_setup();
   ADCON2= 0b10001001;
         /*1....... = right justified in ADRESH:ADRESL */
         /*.0...... = unused */
         /*..001... = 2 adquisition time A/D
         /*.....001 = A/D conversion clock = Fosc/8 */
   ADCON1= 0b00001110;
         /*00...... = unused */
         /*..00.... = voltage reference: +AVdd, -AVss */
         /*....1110 = only NA0 is analog, Vref+=AVdd, Vref-=ground(AVss)*/
   ADCON0= 0b00000001;
         /*00...... = unused*/
         /*..0000.. = channel 0 (AN0 on RA0) */
         /*......0. = A/D conversion not in progress */
         /*.......1 = ADC on */
   T1CON = 0b11001001;
         /*1....... = mode enable bit in one 16-bit operations */
         /*.1...... = device clock derived from Timer1 oscilator */
         /*..00.... = 1:1 prescalar */
         /*....1... = Oscillator is enabled */
         /*.....0.. = !T1SYNC (ignored if TMR1CS is 0) */
         /*......0. = TMR1CS = internal clock (Fosc/4) */
         /*.......1 = TMR1ON (timer1 enabled) */

   serial_setup();
   LED_Init();            // Setup and update LEDs
   LED_update();
   
   while(1)   
   {
         TMR1H = TMR1H_RESET;
         TMR1L = TMR1L_RESET;
         TMR1IF = OFF;
         RC0=0; //LED off
         for(i=0;i<30;i++) adcv=0;
         i=0;
         RD0= 0;
         RD1= 0;
         RD2= 0;
         RD3= 0;
         RD4= 0;
         RD5= 0;
         RD6= 0;
         RD7= 0;

         while (!TMR1IF)
         {
         TMR1H = TMR1H_RESET;
         TMR1L = TMR1L_RESET;
         TMR1IF = OFF;
         ADG0 = ON;
               while (ADG0); /*wait for ADC conversion */
               adcv = (ADRESH<<8)+ADRESL;
               sum=0;
               summ=0;
               for(j=0;j<3;j++)
               {               
               out=0;
               out = FilterLowPass(adcv[j]);
               sum+= out;
               }
               sum=sum/3;

               printf("\n\n binary, hexadecimal and decimal voltage resolution %b,%x, %u \n", sum, sum, sum);

               sum=sum>>2;                              //valour betwen (0,65025) (aprox. in hundredth of volt with 2% error)      
               sum= pow(sum, num);
               //sum=0xFFFF;                           //claibrate resolution betwen (0, 65535) decimal value
               ssum=sum;

               printf("binary power value %b\n", sum);
               printf("hexadecimal power value %x\n", sum);
   
               summ=sum/650;         //valour betwen (0,65025) (aprox. in hundredth of volt with 2% error) to represent in (0, 255) decimal for 8 bits

               printf("Power value = %u, %u watts\n",sum/650,sum%100);   //resolution (0, 100) watts

                if((summ&0x01)!=  TRUE)       // show binary value of power response result
               {
                  RD0= 1;
               }      
   
               if((summ&0x02)!=  TRUE)
               {
                  RD1= 1;
               }
               if((summ&0x04)!=  TRUE)
               {
                  RD2= 1;
               }
               if((summ&0x08)!=  TRUE)
               {   
                  RD3= 1;
               }
               if((summ&0x10)!=  TRUE)
               {
                  RD4= 1;
               }
               if((summ&0x20)!=  TRUE)
               {
                  RD5= 1;
               }
               if((summ&0x40)!=  TRUE)
               {
                  RD6= 1;
               }
               if((summ&0x80)!= TRUE)
               {
                  RD7= 1;
               }

               printf("LED1 --> %b | LED2 --> %b | LED3 --> %b | LED4 --> %b | LED5 --> %b | LED6 --> %b | LED7 --> %b\n", RD0, RD1, RD2, RD3, RD4, RD5, RD6, RD7);

               numHh=ssum/650;                //valour betwen (0,100) (aprox. in hundredth of watts with 2% error) to transmit by USART      
               numLl=ssum%100;




                numH=numHh/10;
               numh=numHh-(numH*10);
               numL=numLl/10;
               numl=numLl-(numL*10);

               printf("Power value %d %d,%d %d\n",numH,numh, numL, numl);
               
               ArrNum[1]=numH;
               ArrNum[2]=numh;
               ArrNum[3]=numL;
               ArrNum[4]=numl;

               n=1;
               ssumm=0;
            
               for(pos=1; pos<6; pos++)
               {
                  m= pos;

                        switch(m)
                  {
                        case 1:

                           Arr[n]= ArrNum[pos];
                           ssumm= 48 + Arr[n];               
                                    putch1((char) ssumm);
                           break;
                           
                  
                        case 2:

                           Arr[n]= ArrNum[pos];
                           ssumm= 48 + Arr[n];                           
                                    putch1((char) ssumm);
                           break;

                        case 3:

                           ssumm= 46;
                           putch1((char) ssumm);
                                    n= n-1;
                           break;

                        case 4:

                           post= pos-1;
                           Arr[n]= ArrNum[post];
                           ssumm= 48 + Arr[n];
                           putch1((char) ssumm);
                           break;      

                        case 5:      

                           post= pos-1;
                           Arr[n]= ArrNum[post];
                           ssumm= 48 + Arr[n];               
                           putch1((char) ssumm);
                            break;

                  }   n=n+1; if(n>HEIGHT) n=1;
               }

               for(j=0; j<10; j++)
               {
                  printf("\n");
                  putch1((char)32);    //spaces betwen measurement   
               }

               i=i+1; if(i>30) i=0; //actualize index
         } //while(!t...
   } /* while(1) */
} /*main() */

//writes a character to the serial port
void putch1(char letter)
{
   while(!TX1IF);
   TXREG1=letter;
   loop_count= 100;
   for(loop=1;loop<=loop_count;loop++);   
}

//gets a character from the serial port without timeout
unsigned char getch(void)
{
   while(!RC1IF);
   return RCREG1;
}

//int atoi(char s[])
//{
//   int m, n;
//
//   n=0;
//   for(m=0; s[m] >= '0' && s[m]<= '9'; ++m)
//         n=10*n+(s-'0');
//   return n;
//}

//void delay(loop_count)
//{
//   int loop;
//   for(loop=1;loop<=loop_count;loop++);
//}
//