TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: shagui en 21 de Enero de 2007, 13:07:20

Título: pic18f8722 in serial communication with host
Publicado por: shagui 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
Título: Re: pic18f8722 in serial communication with host
Publicado por: maunix 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.
Título: Re: pic18f8722 in serial communication with host
Publicado por: shagui 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

Título: Re: pic18f8722 in serial communication with host
Publicado por: Nocturno 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.
Título: Re: pic18f8722 in serial communication with host
Publicado por: maunix 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.

Título: pic18f8722 in serial communication with host
Publicado por: shagui 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.


Título: Re: pic18f8722 in serial communication with host
Publicado por: maunix 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




Título: Re: pic18f8722 in serial communication with host
Publicado por: RedPic 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)




Título: Re: pic18f8722 in serial communication with host
Publicado por: maunix 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)
Título: ICD2
Publicado por: shagui 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
Título: Re: ICD2
Publicado por: maunix 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
Título: pic18f8722 in serial communication with host
Publicado por: shagui 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
Título: aplication firmware y boot loader
Publicado por: shagui 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
Título: Re: aplication firmware y boot loader
Publicado por: maunix 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



Título: Re: pic18f8722 in serial communication with host
Publicado por: shagui 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++);
//}
//
 
Título: Re: pic18f8722 in serial communication with host
Publicado por: MGLSOFT en 11 de Abril de 2007, 15:18:53
Hola Shagui.
Estas seguro que lo que aqui pones configura la comunicacion correctamente a 9600bps ??
Código: [Seleccionar]
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

}

Para asegurarte lee bien la hoja de datos de tu micro y calcula el valor del registro SPBRG1 segun el valor del cristal que tiene el micro.
Yo en CCS no me preocupo de como debo poner estos registros, el lo hace solo.

Marcos
Título: Re: pic18f8722 in serial communication with host
Publicado por: shagui en 13 de Abril de 2007, 16:35:37
Muy buenas de nuevo

 Gracias por contestar tan pronto a mi auxilio. Respecto a tus iniciativas para comprobar la velocidad para la comunicación serie, te respondo que según el data sheet, éste valor para el registro SPBRG es el adecuado para el tiempo impuesto para el oscilador y una transmision de simbolos a 9600 baudios.

 Hoy mísmo he estado de nuevo programando el chip, he hecho algunos cambios para la transmitisión serie. Antes utilizaba una función putch1, la cual definía al final del código, mientras que ahora uso una función de la librería USART para escribir los caracteres en éste puerto. Claro está, el resultado que obtuve fué el mísmo, me puse a trastear el código y a hacer inventos. Tras varias modificaciones me dí cuenta que la única función que transmite cosas en mi código son los printf que utilizo. No sé como darle explicación a ésto. La historia es que si quito todos los printf, no logro recibir nada por el Hyperterminal del Windows, en cambio si pongo un printf ( otra causa es que si estos printf están dentro de loops como un bucle for tampoco transmite nada) dentro del bucle infinito  while empiezo a recibir una cantidad enorme de carácteres en el Hyperterminal  :shock: . Así que así está la situación ahora. Por supuesto como los printf solo eran señalizaciones que me servían durante el periodo de diseño de éste programa, los he inhabilitado. Así que ahora me pregunto:

-¿Por qué el EUSART1 Transmit Register llamado TXREG1, el cuál utilizo en la función putch1, o la mísma función void --> puts1USART (PARAM_SCLASS char *data); de la librería USART del C18, no envía los caracteres que recibe ese registro desde mi código?



PD: Para ver la forma en que utilizo esta función de librería comentada, tan solo hace falta sustituir cada función putch1 del main por: puts1USART(&ssumm);

    También quiero decir que al simular el código con MPLABSIM, recibo el mísmo resultado que obtenía con mi función putch:

-¿Por qué en la situación en la que estoy, cuando me dispongo a simular el código en MPLABSIM, si borro todos los printf me contesta la pantalla:  No stimulus file attached to ADRESL for A/D, y en cambio cuando le dejo todos los printf que podeis ver en el código del post anterior, la simulación funciona de forma tan sorprendente cojonuda para un principiante como yo?  ¡¡ además cuando simulo con los printf me funciona la transmisión del registro TXREG1, o la función de librería ahora, y sin los printf me sale ese error comentado pero nada en la SIM UART!!

 Creo que me estoy volviendo loco de leer y leer y decir claro si yo lo hago así... y de preguntarme por que? y por que? hasta  a veces dudo de la máquina. :?
Please, echen una manita a este primo que vino a ésta tierra de ingleses, ya los conoceis, pocos servicios humanitarios y muchos impuestos.

Un coordial saludo

 
Título: Re: pic18f8722 in serial communication with host
Publicado por: MGLSOFT en 13 de Abril de 2007, 16:55:10
La pregunta es:

Como transmite la funcion printf()??

Que diferencia hay respecto a las funciones creadas??

Seguramente alli esta la respuesta, ya que si usas el registro txreg1 seguramente estas usando interrupciones, y si no borras el flag de transmicion o lees si ya transmitio seguramente estas echando ruido al port.

No conozco de C18, pero creo que por alli debes buscar... :mrgreen: :mrgreen: :mrgreen:
Título: Re: pic18f8722 in serial communication with host
Publicado por: shagui en 14 de Abril de 2007, 21:32:35
Muy Buenas

  Después de analizar palmo a palmo el código, me doy cuenta que no tan solo los printf son los que transmiten al transmit register sino que además sin ellos, mi codigo no funciona ni en la simulación donde me dice que: ADC-W0001:   Tad time is less than 0.70us
                                                                                     ADC-W0008: No stimulus file attached to ADRESL for A/D.

 NI TAMPOCO FUNCIONA CUANDO LO PROGRAMO CON MPLAB ICD2. Puedo comprobarlo porque los LEDs de la placa solo se encienden cuando hay algún printf escrito en el programa. Os paso el código en el cual utilizo funciones de C18 para la USART.

#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 "Timer.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 TX9D   TXSTA1bits.TX9D
#define   RX9      RCSTAbits.RX9
#define TXEN   TXSTA2bits.TXEN
#define TMR0IF   INTCONbits.TMR0IF
#define TMR0IE   INTCONbits.TMR0IE
#define GIE      INTCONbits.GIE   
#define PEIE   INTCONbits.PEIE
#define CSRC   TXSTAbits.CSRC
#define SENDB   TXSTAbits.SENDB
#define TRMT   TXSTAbits.TRMT

#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);
void Transmit(unsigned char Value_To_Be_Transmitted);

#define num 2

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

   GIE=1;                           //enable Global Interrupt
   PEIE=0;                           //disable Peripheral Interrupt
   CSRC=0;                           //don´t care for asynchronous mode
   SENDB=1;                        //Send Sync Break on next transmission (cleared by hardware upon completion)
   TMR0IE=0;                        // enable TMR0 Overflow Interrupt Enable bit
   WDTCON=OFF;                        //watchdog disable
   SPBRG1=25;
   BRG16=0;                        //8-bit Baud Rate Generator – SPBRGx only (Compatible mode), SPBRGHx value ignored   
   BRGH=0;                           //low data rate for sending--EUSART
   SYNC=0;                           //asynchronous
   SPEN=1;                           //enable serial port pins
   CREN=1;                           //enable reception
   SREN=0;                           //no effect
   TX1IE=1;                        //enable 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
//   TX9D=0;                           //don´t used register for 8-bit transmission

//   SPBRG = 25;          // Speed transmission 9600 BAUD   
//   TXSTA = 0x24;      // 8-bit transmission | Transmit enable | Asynchronous mode | High speed | TSR full
//   RCSTA = 0x80;      // Serial port enabled and only transmitting Tx


}

   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 = 0b11111001;
         /*1....... = mode enable bit in one 16-bit operations */
         /*.1...... = device clock derived from Timer1 oscilator */
         /*..11.... = 1:8 prescalar */
         /*....1... = Oscillator is enabled */
         /*.....0.. = !T1SYNC (ignored if TMR1CS is 0) */
         /*......0. = TMR1CS = internal clock (Fosc/4) */
         /*.......1 = TMR1ON (timer1 enabled) */


   serial_setup();
   TimerInit();
   LATD = 0xFF;      // Initialize LEDs
   TRISD = 0;

   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<1;j++)
               {               
               out=0;
               out = FilterLowPass(adcv[j]);
               sum+= out;
               }
               //sum=sum/30;

         //      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;
               
         //      printf("   ");


               for(pos=1; pos<6; pos++)
               {
                  m= pos;
                  ssumm=0;
         
                        switch(m)
                  {
                        case 1:

                           Arr[n]= ArrNum[pos];
                           ssumm= 48 + Arr[n];
                        
                           if (TimerIsOverflowEvent())
                           {
                            Transmit(ssumm);
                           }
                            else
                           {
                           n=n-1;
                           pos=pos-1;
                           }
                           break;
                           
                  
                        case 2:
                              
                           Arr[n]= ArrNum[pos];
                           ssumm= 48 + Arr[n];   
                           
                           if (TimerIsOverflowEvent())
                           {
                            Transmit(ssumm);
                           }
                            else
                           {
                           n=n-1;
                           pos=pos-1;
                           }
                           break;

                        case 3:
   
                           ssumm= 46;
                  
                           if (TimerIsOverflowEvent())
                           {
                            Transmit(ssumm);
                           }
                               else
                           {
                           n=n-1;
                           pos=pos-1;
                           }
                                    n= n-1;
                           break;

                        case 4:

                           post= pos-1;
                           Arr[n]= ArrNum[post];
                           ssumm= 48 + Arr[n];
                                                      
                           if (TimerIsOverflowEvent())
                           {
                            Transmit(ssumm);
                           }
                            else
                           {
                           n=n-1;
                           pos=pos-1;
                           }
                           break;      

                        case 5:      

                           post= pos-1;
                           Arr[n]= ArrNum[post];
                           ssumm= 48 + Arr[n];   
                        
                           if (TimerIsOverflowEvent())
                           {
                            Transmit(ssumm);
                           }
                            else
                           {
                           n=n-1;
                           pos=pos-1;
                           }
                            break;

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

               for(j=0; j<10; j++)
               {
               
                  if(TimerIsOverflowEvent())
                  {
                         Transmit(32);
                  }
                   else
                  {
                         j=j-1;
                  }
               }

               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++);
//}
//

void Transmit(unsigned char Value_To_Be_Transmitted)
{
   while(!(TRMT));      // Are we transmitting ?
   //TXREG1 = (Value_To_Be_Transmitted);      // Send a char
   puts1USART(&Value_To_Be_Transmitted);
   //Write1USART(Value_To_Be_Transmitted); Called to restore the transmitted value
   //   loop_count= 1000;
   //   for(loop=1;loop<=loop_count;loop++);

}
Título: Re: pic18f8722 in serial communication with host
Publicado por: shagui en 14 de Abril de 2007, 21:35:12
Se me olvidaba, al ser un serial communicaction estoy utilizando el TIMER0 con interrupciones para controlar la transmision, aquí va el código:

 
#include   <P18cxxx.H>         // Hardware specific header



#define   TIMER_PERIOD_MS      8               // Period in milliseconds
#define   TIMER_FOSC            4000000L         // Frequency of the processor clock
//#define   TIMER_FOSC         19660000L         // Frequency of the processor clock
#define   TIMER_PRESCALE      4               // The desired prescale


#if    TIMER_PRESCALE == 0
   #define   TIMER_PRESCALE_VALUE   2
#elif    TIMER_PRESCALE == 1
   #define   TIMER_PRESCALE_VALUE   4
#elif   TIMER_PRESCALE == 2
   #define   TIMER_PRESCALE_VALUE   8
#elif   TIMER_PRESCALE == 3
   #define   TIMER_PRESCALE_VALUE   16
#elif   TIMER_PRESCALE == 4
   #define   TIMER_PRESCALE_VALUE   32
#elif    TIMER_PRESCALE == 5
   #define   TIMER_PRESCALE_VALUE   64
#elif   TIMER_PRESCALE == 6
   #define   TIMER_PRESCALE_VALUE   128
#elif   TIMER_PRESCALE == 7
   #define   TIMER_PRESCALE_VALUE   256
#else
   #define   TIMER_PRESCALE_VALUE   1
   #define   TIMER_PRESCALE   8
#endif


void TimerInit(void)
{   
   T0CON = 0xC0 | TIMER_PRESCALE;

   TMR0L = 255L - ((TIMER_PERIOD_MS * TIMER_FOSC) / 1000L / 4 / TIMER_PRESCALE_VALUE);
   
   INTCONbits.TMR0IF = 0;

}


unsigned char TimerIsOverflowEvent(void)
{
   static unsigned char temp;
   
   if (INTCONbits.TMR0IF==1)
   {
      temp = 256L - ((TIMER_PERIOD_MS * TIMER_FOSC) / 1000L / 4 / TIMER_PRESCALE_VALUE);
      TMR0L += temp;

      INTCONbits.TMR0IF = 0;
      //PIR1bits.TX1IF=PIR1bits.TX1IF+1;
      //TXSTAbits.TRMT=TXSTAbits.TRMT+1;
      return(1);
   }

   return(0);
}
Título: Re: pic18f8722 in serial communication with host
Publicado por: maunix en 17 de Abril de 2007, 12:03:19
Shaqui, aquí estoy , perdón la demora pero realmente ando muy ocupado en mi vida real.  :lol:

Dime , que es lo que no puedes hacer

1) Simular un estimulo al A/D ?
2) Hacer andar el ICD2 ?

Luego revisamos el código, pero comencemos por lo primero.

Saludos