Autor Tema: enviar datos de un sensor de temperatura y de un pot por el puerto serie RS232  (Leído 25856 veces)

0 Usuarios y 8 Visitantes están viendo este tema.

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: enviar datos de un sensor de temperatura y de un pot por el puerto serie RS2
« Respuesta #45 en: 13 de Diciembre de 2010, 19:00:19 »
Gracias, ahora mirare lo de la configuracion del cristal y de los 4Mhz.

A lo que me refiero es que lo grabare en mi placa PICDEM  Aqui!

Lo que no entiendo es como relacionar el LED que yo tengo conectado al puerto RB0 por ejemplo con el LED1 de mi placa.

Gracias de antemano.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: enviar datos de un sensor de temperatura y de un pot por el puerto serie RS2
« Respuesta #46 en: 13 de Diciembre de 2010, 19:13:18 »
Gracias, ahora mirare lo de la configuracion del cristal y de los 4Mhz.

A lo que me refiero es que lo grabare en mi placa PICDEM  Aqui!

Lo que no entiendo es como relacionar el LED que yo tengo conectado al puerto RB0 por ejemplo con el LED1 de mi placa.

Gracias de antemano.

  Supongo que en el manual de la placa debería decirlo. Si en el manual dice que el Led 3 de tu placa está conectado a RB5, vas a tener que cambiar el programa para que al led lo maneje RB5.
  De hecho en la descripción del link que vos dejaste dice por ejemplo, que el potenciómetro, está conectado a RA0 (que es AN0).
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: enviar datos de un sensor de temperatura y de un pot por el puerto serie RS2
« Respuesta #47 en: 13 de Diciembre de 2010, 19:52:33 »
Que tonteria! muchas gracias! ya lo entiendo todo, a ver como va mañana.

Un abrazo y gracias.

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: enviar datos de un sensor de temperatura y de un pot por el puerto serie RS232
« Respuesta #48 en: 14 de Diciembre de 2010, 06:27:58 »
Hola de nuevo:
Les cuento, he probado de enviar datos desde proteus( con el compim) a otro PC y a funcionado perfectamente.
Ahora he cambiado el cable que unia los dos PC por Bluetooth. He conectado un modulo a un pc y el otro al otro pc. He hecho la conexion y lo que escribo en el terminal de PC1 lo veo en el PC2 y viceversa pero cuando lo simulo ( tambien con el compim claro) no envia los datos al PC2. No me permite tener el programa corriendo y el terminal del PC1 abierto.

He utilitzado un programa que crea un puerto virtual entre el compim y el terminal del PC1 ( para que envies los datos al terminal), lo que me gustaria hacer es ya tener la conexion hecha y cuando haga este puerto virtual que saliese automaticamente en el PC2.

El problema es que si establezco conexion entre pc1 y pc2 no puedo utilitzar compim. Alguna idea?
_________________________________________________________________________________________________________________________________
Por otro lado estoy configurando los fuses del PIC y me salen errores. A partir de un ejemplo de un pic16XXXXX he visto que lo hacia asi:
Código: [Seleccionar]
__CONFIG(WDTDIS & XT & UNPROTECT& PWRTEN &LVPDIS & DUNPROT & WRTEN & UNPROTECT & BOREN &DEBUGDIS);

Por lo que yo he configurado los fuses de la siguiente manera:
Código: [Seleccionar]
// WDTDIS: Watchdog disabled;
WDTEN=0;

// XT: --> crystal 4MHz;
CPUDIV1=0;
CPUDIV0=0;  // Primary oscillator used directly for system clock

FOSC3=0;
FOSC2=0;   // XT Oscillator (XT)
FOSC1=0;
FOSC0=0;



// UNPROTECT: unprotected code;
CP3=1;
CP2=1;
CP1=1;
CP0=1;
CPD=1;
CPB=1;

// PWRTEN: Power UP timer enabled;
PWRTEN=0;

// LVPDIS: Low voltage programming disabled;
LVP=0;

Gracias de antemano.
« Última modificación: 14 de Diciembre de 2010, 09:17:43 por edu1989 »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: enviar datos de un sensor de temperatura y de un pot por el puerto serie RS232
« Respuesta #49 en: 14 de Diciembre de 2010, 10:20:52 »
_________________________________________________________________________________________________________________________________
Por otro lado estoy configurando los fuses del PIC y me salen errores. A partir de un ejemplo de un pic16XXXXX he visto que lo hacia asi:
Código: [Seleccionar]
__CONFIG(WDTDIS & XT & UNPROTECT& PWRTEN &LVPDIS & DUNPROT & WRTEN & UNPROTECT & BOREN &DEBUGDIS);

Por lo que yo he configurado los fuses de la siguiente manera:
Código: [Seleccionar]
// WDTDIS: Watchdog disabled;
WDTEN=0;

// XT: --> crystal 4MHz;
CPUDIV1=0;
CPUDIV0=0;  // Primary oscillator used directly for system clock

FOSC3=0;
FOSC2=0;   // XT Oscillator (XT)
FOSC1=0;
FOSC0=0;



// UNPROTECT: unprotected code;
CP3=1;
CP2=1;
CP1=1;
CP0=1;
CPD=1;
CPB=1;

// PWRTEN: Power UP timer enabled;
PWRTEN=0;

// LVPDIS: Low voltage programming disabled;
LVP=0;

Gracias de antemano.

  Con respecto al tema del bluetooth no puedo ayudarte ya que no experimenté nada de nada.

  Con respecto a la configuración de los FUSES, sí hay que usar la forma

Código: C
  1. __CONFIG(x, ..........)

  Siendo x el número de palabra que querés configurar.
Para saber que parámetros se pueden usar dentro de cada palabra tenés que leer el archivo .h correspondiente al pic que quieras usar, en tu caso PIC18F4550.h

  Un ejemplo sería....

Código: C
  1. __CONFIG(1, CPUDIV1 & PLLDIV1 & IESODIS & FCMDIS);  // palabra de configuracion 1
  2. __CONFIG(2, VREGDIS & PWRTEN & WDTDIS); // palabra de configuracion 2
  3. __CONFIG(3, PBADEN & MCLRDIS);

De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: enviar datos de un sensor de temperatura y de un pot por el puerto serie RS232
« Respuesta #50 en: 14 de Diciembre de 2010, 16:00:00 »
Muchas gracias! Al final lo he puesto de esta manera, a ver que te parece.

Código: [Seleccionar]
__CONFIG(1, CPUDIV1 & PLLDIV1 & XT & FCMDIS);  
__CONFIG(2, VREGDIS & PWRTEN & WDTDIS);
__CONFIG(3, PBADEN & MCLRDIS);
__CONFIG(4,LVPDIS & ICPORTEN & DEBUGEN);
__CONFIG(5,UNPROTECT);
__CONFIG(6,UNPROTECT);
__CONFIG(7,UNPROTECT);



Por otro lado, voy a grabar el programa a ver si funciona... el tema de los pins creo que ya esta bien porque para hacer la simulacion mire la tabla donde ponia como conectarlo. Subo el programa:

Código: [Seleccionar]
#include <htc.h>
#include <stdlib.h>  // para poder usar la funcion itoa
#include <pic18.h>
 
/* =================================================================================
Definitions
    ================================================================================= */
#define PORTBIT(adr, bit) ( (unsigned)(&adr)*8 + (bit) )
 
#define Idle_Low 1 // No envia datos
#define Idle_High 2 // Envia datos
 
#define true 1
#define false 0
 
#define BAUD  9600 // Configuramos la velocidad, tanto puede ser 19200 o de 9600 kbaud/s pero hay q cambiarlo tb en la simulacion de proteus
#define PIC_CLK 4000000 // Clock de 4MHz (Cristal)
 
#define CS RB3
 


/* =================================================================================
Global variables 
  ================================================================================= */
//static bit potenciometro @ PORTBIT(PORTA, 0); // Declaración del potenciometro
//static bit sensor_temperatura @ PORTBIT(PORTB, 0);
//static bit sensor_datos_salida @ PORTBIT(PORTC, 7);  // SD0 disabled in master mode (configuración como entrada)
 
static bit LED @ PORTBIT(PORTB, 2);
char present_state = Idle_Low; // state variable
char future_state = Idle_Low; // state variable
unsigned int  valor_potenciometro;
unsigned int  valor_sensor_temperatura;
unsigned char pote_buf[6];
unsigned char sensor_buf[10];
char * valor_pote_en_texto;           // un puntero para almacenar el numero en texto
char * valor_sensor_en_texto;         // un puntero para almacenar el numero en texto
char byte_alto, byte_bajo;

unsigned char caracter_recibido;
unsigned char dummy;
 



/* =================================================================================
Function prototypes
    ================================================================================= */
//static void interrupt service_routine (void); // This is the interrupt service routine
 
void init_system (void);
void time_delay (unsigned int );
char output_logic(void);
char future_state_logic(void);

void setup_sensor(void);
void setup_adc(void);
void serial_setup(void);
 
void putst(const char *str);
void putch(unsigned char c);

unsigned char getch(void);
unsigned char UsartReadChar_nonstop(void);
unsigned char getch_available(void);
void clear_usart_errors(void);

unsigned char read_spi (void);
unsigned int read_adc(void);

 
 
/* =================================================================================
Main function
  ================================================================================= */
void main(void)
{
  valor_potenciometro = 0;
  valor_sensor_temperatura = 0;
  LED = 0;
  init_system();
  setup_sensor();
  setup_adc();
  serial_setup();
 
time_delay(30000);
while(1)
  {
    CS = 0;
    byte_alto = read_spi();
    byte_bajo = read_spi();
    CS = 1;
    valor_sensor_temperatura = (byte_alto << 8) + byte_bajo;
    valor_sensor_temperatura = valor_sensor_temperatura >> 7;
    //valor_sensor_temperatura = read_spi();  // Las pongo aqui porque es donde hago la lectura de los datos.
    valor_potenciometro = read_adc();
   
    valor_pote_en_texto = itoa (pote_buf, valor_potenciometro, 10);
    valor_sensor_en_texto = itoa (sensor_buf, valor_sensor_temperatura, 10);
   
output_logic();
    future_state_logic();
 
}
}

/* =================================================================================
Function definitions
  ================================================================================= */

//*****************************************************************************
//Future_state_logic routine
//*****************************************************************************
char future_state_logic(void)
{
  char error = 0;
  switch (present_state)
  {
    case Idle_Low:
                 
                  if ((valor_sensor_temperatura < 20) || (valor_potenciometro < 25))
                 { // Menor de 20ºC o la resistencia menos a 25Kohms
                    //future_state = Idle_High;
                    present_state = Idle_High;
                 }
                  else
                  if (getch_available() == true) //Si hay un caracter disponible recibido por el puerto serie
                  {
                    caracter_recibido = getch();
                    if (caracter_recibido == 'a')
                    {
                      present_state = Idle_High;
                    }
                    else
                    {
                     
                      present_state = Idle_Low;
                      error = 1;
                    }
                 }
                  break;
    case Idle_High:
                   if (TXIF == 0)
                   { // Buffer de transmision vacio
                     //future_state = Idle_Low;
                     present_state = Idle_Low;
                   }
                   else
                   {
                     error = 1;
                   }
                   break;
    default:
  error = 1;
  }
  return (error);
}

//*****************************************************************************
//Output logic routine
//*****************************************************************************
char output_logic(void)
{
  unsigned char error = 1;
  switch (present_state)
  {
    case Idle_Low:
                   LED = 0;
                   error = 0;
                   break;
    case Idle_High:
                   putst ("\n");
   putst ("Valor del pote: ");
                   putst (valor_pote_en_texto);
                   putst ("\n");  //cambio de linea
                   putst ("Valor del sensor: ");
                   putst (valor_sensor_en_texto);
                   //putst ("Suponemos un valor de 25 grados");
                   putst ("\n");
                   LED = 1;
                   error = 0;
                   break;
    default:
                   error = 1;
                   LED = 0;
                   break;
  }
  return (error);
}

//*****************************************************************************
//Init operations 
//*****************************************************************************
void init_system (void)
{
 
__CONFIG(1, CPUDIV1 & PLLDIV1 & XT & FCMDIS); 
__CONFIG(2, VREGDIS & PWRTEN & WDTDIS);
__CONFIG(3, PBADEN & MCLRDIS);
__CONFIG(4,LVPDIS & ICPORTEN & DEBUGEN);
__CONFIG(5,UNPROTECT);
__CONFIG(6,UNPROTECT);
__CONFIG(7,UNPROTECT);


//TRISB = 1; //LED. Todos los pines se comportaran como salidas menos RB0 2^0=1
  //TRISA = 32; // SS( Select Slave) must have TRISA<5> bit set
   TRISA = 255;
  CS = 1;
  TRISB = 1; // SDI. El bit 0 a 1.Configurado en master mode (bit 1 cleared, en mode slave bit 1 set)
  TRISC = 192; // SDO. Tots els bits a 1 menys la sortida 7
}

 
//*****************************************************************************
//Time delay routine.   
//*****************************************************************************
void time_delay(unsigned int delay)
{
  unsigned int i;

  for (i = 0; i <= delay; i++)
  {
    NOP();
  }
}
 
//*****************************************************************************
// SERIAL SETUP 
//*****************************************************************************
void serial_setup(void)
{
  #define SPBRG_VALUE ((PIC_CLK/(16UL*BAUD)) -1)
  BRGH = 1;
  BRG16 = 0;
  SPBRG = SPBRG_VALUE;
  SPEN = 1; // Enable serial port
  SYNC = 0; // Asincrono
  TXIE = 0; // Desactivar interrupciones en tx
  TXEN = 1; // Enable the transmitter
  TX9 = 0; // 8 bits transmission
  RCIE = 1; // Activar interrupciones en rx
  RX9 = 0; // 8 bits reception
  CREN = 1; //Enable reception
  #define clear_usart_errors_inline if (OERR)\
                                   {\
                                      TXEN = 0;\
                                      TXEN = 1;\
                                      CREN = 0;\
                                      CREN = 1;\
                                    }\
                                   if (FERR)\
                                  {\
                                     dummy = RCREG;\
                                      TXEN = 0;\
                                      TXEN = 1;\
                                    }
}
 
 
//*****************************************************************************
// Enviar datos ( un caracter)
//*****************************************************************************
 
void putch(unsigned char c)
{
  while (!TXIF)
  {
    clear_usart_errors_inline;
    CLRWDT();
  }
  TXREG = c;
}
//*****************************************************************************
// Enviar datos (un buffer)
//*****************************************************************************
void putst(register const char *str)
{
  while ((*str) != 0)
  {
    putch (*str);
    if (*str == 13) putch (10);
    if (*str == 10) putch (13);
    str++;
  }
}


//*****************************************************************************
//Leer datos ( un caracter)
//*****************************************************************************
 
unsigned char getch(void)
{
  while (RCIF != 1)
 { //1 = The EUSART receive buffer, RCREG, is full
    CLRWDT();
    clear_usart_errors_inline;
  }
  return RCREG;
}
 
//*****************************************************************************
//Leer datos (un buffer)
//*****************************************************************************
unsigned char UsartReadChar_nonstop(void)
{
  if (!RCIF)
    return 0;   
 return RCREG;
}
 
 
//*****************************************************************************
//Comprueba si aun faltan datos o no
//*****************************************************************************
unsigned char getch_available(void)
{
  if (RCIF)
    return true;
  else
    return false;
}
 
 
//*****************************************************************************
//Errores USART
//*****************************************************************************
void clear_usart_errors(void)
{
  clear_usart_errors_inline;
}
 

//*****************************************************************************
//Leer entradas.
//*****************************************************************************
 
//*****************************************************************************
//Leer bytes recibidos del bus del modulo SPI
//*****************************************************************************
 
void setup_sensor(void)  // SPI Master mode:
{
  SSPEN = 1; //Enables serial port and configures SCK, SDO, SDI and SS as serial port pins
  BF = 0;        //Receive not complete, SSPBUF is empty
  //SCK is the clock output (Master Mode)
  //Clock Polarity(Idle state of SCK)
  SMP = 0;      //Input data sampled at end of data output time
  CKE = 0;      //Transmit occurs on transition from Idle to active clock state
  SSPM3 = 0;
 SSPM2 = 0; //SPI Master mode, clock = FOSC/4
  SSPM1 = 0;
  SSPM0 = 0;
  CKP = 0; //Idle state for clock is a low level
  SSPIF = 0;   
}
 
void setup_adc(void)
{
  ADFM = 1;
  ADCON1 = 14; // PCFG3=1,PCFG2=1,PCFG1=1,PCFG0=0. Todas las entradas digitales
  CHS3 = 0;
  CHS2 = 0; // Seleccionamos el canal 0 (AN0) que es donde esta conectado el potenciometro
  CHS1 = 0;
  CHS0 = 0;
  //Tiempo de adquisicion
  ACQT2 = 0;
  ACQT1 = 0;  // 2Tad (Tad=1us) Por tanto 2x1us =2us >= 1.65us( Tacq calculado teoricamente)
  ACQT0 = 1;
  ADCS2 = 1;
  ADCS1 = 0;    // Idem a 4Tosc. 4*Tosc(1us) es el primer valor que hace que sea superior a 0.7us( el minimo)
  ADCS0 = 0;
  ADON = 1; // A/D converter module is enabled
  /* Configure A/D interrupt*/
  ADIF = 0;
  //ADIE = 1;
}
 
//*****************************************************************************
//Leer entradas.
//*****************************************************************************
 
//*****************************************************************************
//LEER DATOS SENSOR
//*****************************************************************************
unsigned char read_spi (void)
{
/*
  if ((BF == 1) && (SSPIF == 1))
  { //Receive complete, SSPBUF is full && The transmission/reception is complete (must be cleared in software)
    SSPIF = 0; ////Waiting to transmit/receive
    BF = 0;
    return SSPBUF;
 }
*/
  TRISC7 = 1; // así pongo en alta impedancia el pin SDO
  SSPBUF = 16;
  while (SSPIF == 0);
  SSPIF = 0;
  return SSPBUF;
}
 
//*****************************************************************************
//LEER DATOS POTENCIOMETRO
//*****************************************************************************
unsigned int read_adc(void)
{
  //Empezar a leer
  GODONE = 1; // A/D conversion in progress
  while (GODONE == 1);
  ADIF = 0;
  return ((ADRESH << 8) + (ADRESL));
}

Gracias!
« Última modificación: 14 de Diciembre de 2010, 16:02:33 por edu1989 »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: enviar datos de un sensor de temperatura y de un pot por el puerto serie RS232
« Respuesta #51 en: 14 de Diciembre de 2010, 16:18:34 »
  Creo que la línea

Código: C
  1. #include <pic18.h>

no es necesaria. En teoría basta con incluir htc.h sólamente.

  Y las líneas "__CONFIG(.....)" yo las pondría inmediatamente después de "#include <htc.h>" o a lo sumo después de todos los #include iniciales.

Código: C
  1. #include <htc.h>
  2. #include <stdlib.h>
  3. __CONFIG (......);
  4. __CONFIG (......);
  5. ....
  6. ....
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: enviar datos de un sensor de temperatura y de un pot por el puerto serie RS2
« Respuesta #52 en: 14 de Diciembre de 2010, 16:20:21 »
De acuerdo. Gracias.
El grabador icd2 que tal funciona? voy a probarlo immediatamente...

Edito: Voy a grabar de la forma siguiente:

Conectar la alimentacion al icd2
Conecta el icd2 con el pic mediante el cable de red
Conectar el PIC al USB del ordenador

Necesito tambien conectar el usb del icd2 al ordenador? creo que eso es solo para alimentar al icd2 a partir del usb..
Pregunto porque no me gustaria fastidiarla en esto.. no es mio el material y... en fin hay que ir con cuidado :)

Edito: Estoy haciendo pruebas y cuando hago el paso previo antes de grabar "Programmable , Blank Check" me sale un error:
Verify failed(MemType=Program,Address=0x0, Expected Val=0xFFFF, Val Read=0xEE00)
Gracias
« Última modificación: 14 de Diciembre de 2010, 18:41:28 por edu1989 »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: enviar datos de un sensor de temperatura y de un pot por el puerto serie RS2
« Respuesta #53 en: 14 de Diciembre de 2010, 18:49:18 »
De acuerdo. Gracias.
El grabador icd2 que tal funciona? voy a probarlo immediatamente...

Edito: Voy a grabar de la forma siguiente:

Conectar la alimentacion al icd2
Conecta el icd2 con el pic mediante el cable de red
Conectar el PIC al USB del ordenador

Necesito tambien conectar el usb del icd2 al ordenador? creo que eso es solo para alimentar al icd2 a partir del usb..
Pregunto porque no me gustaria fastidiarla en esto.. no es mio el material y... en fin hay que ir con cuidado :)

Edito: Estoy haciendo pruebas y cuando hago el paso previo antes de grabar "Programmable , Blank Check" me sale un error:
Verify failed(MemType=Program,Address=0x0, Expected Val=0xFFFF, Val Read=0xEE00)
Gracias

  Me pareció leer, en el enlace que dejaste respecto de la placa que vas a usar, que dicha placa tiene un micro incorporado y dicho micro viene pregrabado con un programita y un bootloader. Los bootloader son programas que están en los micros y se usan para regrabar los mismos a travez de puerto serie o  usb, así que no sé si será necesario usar un grabador...
  Yo sólo tengo un grabador por puerto paralelo, y no conozco el ICD.

  Me parece que vas a tener que leerte todos los documentos que encuetres respecto de esa placa, para saber como programar el micro sin causar ningún daño.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: enviar datos de un sensor de temperatura y de un pot por el puerto serie RS232
« Respuesta #54 en: 14 de Diciembre de 2010, 18:51:09 »
Se puede usar el implab icd2 tambien. Has utilitzado alguna vez el ICD2?

Edito: El datasheet lo puedes ver Aqui
Es mejor usar el bootloader?
« Última modificación: 14 de Diciembre de 2010, 18:54:52 por edu1989 »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: enviar datos de un sensor de temperatura y de un pot por el puerto serie RS232
« Respuesta #55 en: 14 de Diciembre de 2010, 18:55:47 »
  No, los únicos programadores que use fueron el JDM y el ProPic2.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: enviar datos de un sensor de temperatura y de un pot por el puerto serie RS232
« Respuesta #56 en: 14 de Diciembre de 2010, 19:11:38 »
He estado leyendo y tengo dos opciones, seguir programando con ICD2 o volver a reprogramar con el programa que venia y asi poder usar el Bootloader. Como vuelvo a poner el programa en el pic? dice que esta en la carpeta MCHPFSUSB\fw\_factory_hex\ pero que hay que reprogramarlo con un conector ICD

Edito: Voy a seguir con el ICD2. Lo que hay que resolver es el siguiente error que antes he comentado. Verify failed(MemType=Program,Address=0x0, Expected Val=0xFFFF, Val Read=0xEE00)

Edito1: Mejor voy a abrir un post nuevo que esto se va del tema...

Muchas gracias de antemano, a ver si alguien puede ayudarme
« Última modificación: 14 de Diciembre de 2010, 19:41:02 por edu1989 »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: enviar datos de un sensor de temperatura y de un pot por el puerto serie RS232
« Respuesta #57 en: 14 de Diciembre de 2010, 19:57:24 »
  En la sección 5.2.3 de la guia de usuario dice.

5.2.3
ICSP/ICD Configuration
Using the MPLAB IDE and MPLAB ICD 2, users can reprogram the board’s
microcontroller using In-Circuit Serial Programming™ (ICSP™), and debug firmware
code using In-Circuit Debugger. The RJ-11 receptacle (J3), also known as the
ICSP/ICD connector, is the standard MPLAB ICD 2 interface found on most Microchip
development boards.
Most PIC18 microcontrollers only have one legacy ICSP/ICD port, which shares I/O
pins RB6 and RB7. When used, the legacy port prevents applications from using these
pins as normal I/O ports. The 44-pin TQFP version of the PIC18F4550 is the only vari-
ant of the full-speed USB family of devices to have a second ICSP/ICD port on pins not
used for I/O. This dedicated port allows RB6 and RB7 to be utilized by the user’s
application.
The PICDEM FS USB board can be configured to work with either the legacy or dedi-
cated port by using jumpers, JP14 through JP16. As shipped, the demonstration board
is hardware-configured for the legacy port. To change this, the user must cut the traces
indicated in Figure 5-1 (item 14), and install pins and box jumpers. When installed, the
ICD connector is configured by the jumpers as shown in Table 5-2.
In addition to setting the jumpers, the ICPRT Configuration bit in CONFIG4L must also
be properly set. To enable the dedicated ICSP/ICD port, ICPRT must be set (= 1).
When the board is configured to use the dedicated ICSP/ICD port, the Reset switch,
S1, will no longer function. The ICRST pin acts only as an active-high Reset port, which
works when the MPLAB ICD 2 sends a high-voltage programming signal, (VIHH). The
MCLR pin acts as both active-low and active-high Reset ports. Thus, the Reset switch,
S1, only works when connected to the MCLR pin.
Additional information regarding the dedicated ICSP/ICD port can be found in the
“Special Features” section of the device data sheet (DS39632).

TABLE 5-2:
JUMPER CONFIGURATION FOR THE ICSP™/ICD CONNECTOR

ICD Connector Configuration                      JP14          JP15          J16
Legacy ICD (CHP_MCLR/RB7/RB6)            Pins 1-2     Pins 1-2    Pins 1-2
Dedicated Port (ICRST/ICPGD/ICPGC)      Pins 2-3     Pins 2-3    Pins 2-3

Note
1: For JP14 through JP16, pin 1 is the location closest to the microcontroller.
2: Before using the ICD connector for programming or debugging, verify
    that all three jumpers are set correctly. Failure to do so may result in
     programming or debugger failure.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: enviar datos de un sensor de temperatura y de un pot por el puerto serie RS232
« Respuesta #58 en: 14 de Diciembre de 2010, 20:06:34 »
No entiendo que quieres decirme con esto... lo siento
He conseguido grabar pero debo estar haciendo algo mal seguro..

A ver si puedes explicarme que quieres decir con eso por favor
Gracias.

Edito: Estoy debugando y me salen dos errores:
ICD0083: Debug:  Unable to enter debug mode.  Please double click this message for more information.
ICD0069: Debug:  Unable to run target

Adjunto codigo:
Código: [Seleccionar]
#include <htc.h>
#include <stdlib.h>  // para poder usar la funcion itoa
__CONFIG(1, CPUDIV1 & PLLDIV1 & XT & FCMDIS); 
__CONFIG(2, VREGDIS & PWRTEN & WDTDIS);
__CONFIG(3, PBADEN & MCLRDIS);
__CONFIG(4,LVPDIS & ICPORTEN & DEBUGEN);
__CONFIG(5,UNPROTECT);
__CONFIG(6,UNPROTECT);
__CONFIG(7,UNPROTECT);
 
/* =================================================================================
Definitions
    ================================================================================= */
#define PORTBIT(adr, bit) ( (unsigned)(&adr)*8 + (bit) )
 
#define Idle_Low 1 // No envia datos
#define Idle_High 2 // Envia datos
 
#define true 1
#define false 0
 
#define BAUD  9600 // Configuramos la velocidad, tanto puede ser 19200 o de 9600 kbaud/s pero hay q cambiarlo tb en la simulacion de proteus
#define PIC_CLK 4000000 // Clock de 4MHz (Cristal)
 
#define CS RB3
 


/* =================================================================================
Global variables 
  ================================================================================= */
//static bit potenciometro @ PORTBIT(PORTA, 0); // Declaración del potenciometro
//static bit sensor_temperatura @ PORTBIT(PORTB, 0);
//static bit sensor_datos_salida @ PORTBIT(PORTC, 7);  // SD0 disabled in master mode (configuración como entrada)
 
static bit LED @ PORTBIT(PORTB, 2);
char present_state = Idle_Low; // state variable
char future_state = Idle_Low; // state variable
unsigned int  valor_potenciometro;
unsigned int  valor_sensor_temperatura;
unsigned char pote_buf[6];
unsigned char sensor_buf[10];
char * valor_pote_en_texto;           // un puntero para almacenar el numero en texto
char * valor_sensor_en_texto;         // un puntero para almacenar el numero en texto
char byte_alto, byte_bajo;

unsigned char caracter_recibido;
unsigned char dummy;
 



/* =================================================================================
Function prototypes
    ================================================================================= */
//static void interrupt service_routine (void); // This is the interrupt service routine
 
void init_system (void);
void time_delay (unsigned int );
char output_logic(void);
char future_state_logic(void);

void setup_sensor(void);
void setup_adc(void);
void serial_setup(void);
 
void putst(const char *str);
void putch(unsigned char c);

unsigned char getch(void);
unsigned char UsartReadChar_nonstop(void);
unsigned char getch_available(void);
void clear_usart_errors(void);

unsigned char read_spi (void);
unsigned int read_adc(void);

 
 
/* =================================================================================
Main function
  ================================================================================= */
void main(void)
{
  valor_potenciometro = 0;
  valor_sensor_temperatura = 0;
  LED = 0;
  init_system();
  setup_sensor();
  setup_adc();
  serial_setup();
 
time_delay(30000);
while(1)
  {
    CS = 0;
    byte_alto = read_spi();
    byte_bajo = read_spi();
    CS = 1;
    valor_sensor_temperatura = (byte_alto << 8) + byte_bajo;
    valor_sensor_temperatura = valor_sensor_temperatura >> 7;
    //valor_sensor_temperatura = read_spi();  // Las pongo aqui porque es donde hago la lectura de los datos.
    valor_potenciometro = read_adc();
   
    valor_pote_en_texto = itoa (pote_buf, valor_potenciometro, 10);
    valor_sensor_en_texto = itoa (sensor_buf, valor_sensor_temperatura, 10);
   
output_logic();
    future_state_logic();
 
}
}

/* =================================================================================
Function definitions
  ================================================================================= */

//*****************************************************************************
//Future_state_logic routine
//*****************************************************************************
char future_state_logic(void)
{
  char error = 0;
  switch (present_state)
  {
    case Idle_Low:
                 
                  if ((valor_sensor_temperatura < 20) || (valor_potenciometro < 25))
                 { // Menor de 20ºC o la resistencia menos a 25Kohms
                    //future_state = Idle_High;
                    present_state = Idle_High;
                 }
                  else
                  if (getch_available() == true) //Si hay un caracter disponible recibido por el puerto serie
                  {
                    caracter_recibido = getch();
                    if (caracter_recibido == 'a')
                    {
                      present_state = Idle_High;
                    }
                    else
                    {
                     
                      present_state = Idle_Low;
                      error = 1;
                    }
                 }
                  break;
    case Idle_High:
                   if (TXIF == 0)
                   { // Buffer de transmision vacio
                     //future_state = Idle_Low;
                     present_state = Idle_Low;
                   }
                   else
                   {
                     error = 1;
                   }
                   break;
    default:
  error = 1;
  }
  return (error);
}

//*****************************************************************************
//Output logic routine
//*****************************************************************************
char output_logic(void)
{
  unsigned char error = 1;
  switch (present_state)
  {
    case Idle_Low:
                   LED = 0;
                   error = 0;
                   break;
    case Idle_High:
                   putst ("\n");
   putst ("Valor del pote: ");
                   putst (valor_pote_en_texto);
                   putst ("\n");  //cambio de linea
                   putst ("Valor del sensor: ");
                   putst (valor_sensor_en_texto);
                   //putst ("Suponemos un valor de 25 grados");
                   putst ("\n");
                   LED = 1;
                   error = 0;
                   break;
    default:
                   error = 1;
                   LED = 0;
                   break;
  }
  return (error);
}

//*****************************************************************************
//Init operations 
//*****************************************************************************
void init_system (void)
{
 
//TRISB = 1; //LED. Todos los pines se comportaran como salidas menos RB0 2^0=1
  //TRISA = 32; // SS( Select Slave) must have TRISA<5> bit set
   TRISA = 255;
  CS = 1;
  TRISB = 1; // SDI. El bit 0 a 1.Configurado en master mode (bit 1 cleared, en mode slave bit 1 set)
  TRISC = 192; // SDO. Tots els bits a 1 menys la sortida 7
}

 
//*****************************************************************************
//Time delay routine.   
//*****************************************************************************
void time_delay(unsigned int delay)
{
  unsigned int i;

  for (i = 0; i <= delay; i++)
  {
    NOP();
  }
}
 
//*****************************************************************************
// SERIAL SETUP 
//*****************************************************************************
void serial_setup(void)
{
  #define SPBRG_VALUE ((PIC_CLK/(16UL*BAUD)) -1)
  BRGH = 1;
  BRG16 = 0;
  SPBRG = SPBRG_VALUE;
  SPEN = 1; // Enable serial port
  SYNC = 0; // Asincrono
  TXIE = 0; // Desactivar interrupciones en tx
  TXEN = 1; // Enable the transmitter
  TX9 = 0; // 8 bits transmission
  RCIE = 1; // Activar interrupciones en rx
  RX9 = 0; // 8 bits reception
  CREN = 1; //Enable reception
  #define clear_usart_errors_inline if (OERR)\
                                   {\
                                      TXEN = 0;\
                                      TXEN = 1;\
                                      CREN = 0;\
                                      CREN = 1;\
                                    }\
                                   if (FERR)\
                                  {\
                                     dummy = RCREG;\
                                      TXEN = 0;\
                                      TXEN = 1;\
                                    }
}
 
 
//*****************************************************************************
// Enviar datos ( un caracter)
//*****************************************************************************
 
void putch(unsigned char c)
{
  while (!TXIF)
  {
    clear_usart_errors_inline;
    CLRWDT();
  }
  TXREG = c;
}
//*****************************************************************************
// Enviar datos (un buffer)
//*****************************************************************************
void putst(register const char *str)
{
  while ((*str) != 0)
  {
    putch (*str);
    if (*str == 13) putch (10);
    if (*str == 10) putch (13);
    str++;
  }
}


//*****************************************************************************
//Leer datos ( un caracter)
//*****************************************************************************
 
unsigned char getch(void)
{
  while (RCIF != 1)
 { //1 = The EUSART receive buffer, RCREG, is full
    CLRWDT();
    clear_usart_errors_inline;
  }
  return RCREG;
}
 
//*****************************************************************************
//Leer datos (un buffer)
//*****************************************************************************
unsigned char UsartReadChar_nonstop(void)
{
  if (!RCIF)
    return 0;   
 return RCREG;
}
 
 
//*****************************************************************************
//Comprueba si aun faltan datos o no
//*****************************************************************************
unsigned char getch_available(void)
{
  if (RCIF)
    return true;
  else
    return false;
}
 
 
//*****************************************************************************
//Errores USART
//*****************************************************************************
void clear_usart_errors(void)
{
  clear_usart_errors_inline;
}
 

//*****************************************************************************
//Leer entradas.
//*****************************************************************************
 
//*****************************************************************************
//Leer bytes recibidos del bus del modulo SPI
//*****************************************************************************
 
void setup_sensor(void)  // SPI Master mode:
{
  SSPEN = 1; //Enables serial port and configures SCK, SDO, SDI and SS as serial port pins
  BF = 0;        //Receive not complete, SSPBUF is empty
  //SCK is the clock output (Master Mode)
  //Clock Polarity(Idle state of SCK)
  SMP = 0;      //Input data sampled at end of data output time
  CKE = 0;      //Transmit occurs on transition from Idle to active clock state
  SSPM3 = 0;
 SSPM2 = 0; //SPI Master mode, clock = FOSC/4
  SSPM1 = 0;
  SSPM0 = 0;
  CKP = 0; //Idle state for clock is a low level
  SSPIF = 0;   
}
 
void setup_adc(void)
{
  ADFM = 1;
  ADCON1 = 14; // PCFG3=1,PCFG2=1,PCFG1=1,PCFG0=0. Todas las entradas digitales
  CHS3 = 0;
  CHS2 = 0; // Seleccionamos el canal 0 (AN0) que es donde esta conectado el potenciometro
  CHS1 = 0;
  CHS0 = 0;
  //Tiempo de adquisicion
  ACQT2 = 0;
  ACQT1 = 0;  // 2Tad (Tad=1us) Por tanto 2x1us =2us >= 1.65us( Tacq calculado teoricamente)
  ACQT0 = 1;
  ADCS2 = 1;
  ADCS1 = 0;    // Idem a 4Tosc. 4*Tosc(1us) es el primer valor que hace que sea superior a 0.7us( el minimo)
  ADCS0 = 0;
  ADON = 1; // A/D converter module is enabled
  /* Configure A/D interrupt*/
  ADIF = 0;
  //ADIE = 1;
}
 
//*****************************************************************************
//Leer entradas.
//*****************************************************************************
 
//*****************************************************************************
//LEER DATOS SENSOR
//*****************************************************************************
unsigned char read_spi (void)
{
/*
  if ((BF == 1) && (SSPIF == 1))
  { //Receive complete, SSPBUF is full && The transmission/reception is complete (must be cleared in software)
    SSPIF = 0; ////Waiting to transmit/receive
    BF = 0;
    return SSPBUF;
 }
*/
  TRISC7 = 1; // así pongo en alta impedancia el pin SDO
  SSPBUF = 16;
  while (SSPIF == 0);
  SSPIF = 0;
  return SSPBUF;
}
 
//*****************************************************************************
//LEER DATOS POTENCIOMETRO
//*****************************************************************************
unsigned int read_adc(void)
{
  //Empezar a leer
  GODONE = 1; // A/D conversion in progress
  while (GODONE == 1);
  ADIF = 0;
  return ((ADRESH << 8) + (ADRESL));
}
« Última modificación: 14 de Diciembre de 2010, 20:30:20 por edu1989 »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: enviar datos de un sensor de temperatura y de un pot por el puerto serie RS232
« Respuesta #59 en: 14 de Diciembre de 2010, 21:15:59 »
  Te había puesto ese texto porque pensé que no sabías como configurar la placa PICDEM para poder usar el ICD. Y como en esos párrafos explicaba como configurar los jumpers y también mencionaba algo acerca de usar unos pines dedicados únicamente a ICD o usar RB6 y RB7 para ICD y no usarlos como I/O en tu programa.

  Pregunta ¿El programador ICD 2 genera VPP de 13V? porque si no genera VPP alta vas a tener que dejar habilitado LVP.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas