Hola a todos, por favor si me pueden ayudar tengo un problema con el texto de mi comunicación serial, al momento de enviar un mensaje o un dato, en la simulación en proteus con el virtual terminal me sale los mensajes uno a continuación del otro, asi:
Comunicación serial El valor es= 573
y yo quisiera asi:
Comunicación serial
El valor es= 573
y no se que instruccion o como configurar para que me salga el mensaje en cada línea, por favor si alguien me puede ayudar con este problema, gracias
Mi programa es:
#include <p18f25k20.h>
#include <delays.h>
#include "lcd.h"
#include <stdlib.h>
#include <stdio.h>
#include <usart.h>
//**********Declaración de funciones**********
void low_isr(void);
void high_isr(void);
void interrupcion_timer(void);
void interrupcion_externa1(void);
void interrupcion_1(void);
//**********Declaración de variables***********
unsigned int contador2;
unsigned int var;
unsigned int contador;
int varia;
char str[7]; //para pasar de entero a string
volatile char Data; //para almacenar la tecla que presiono del computador
//*********************************************
#pragma romdata CONFIG1H = 0x300001
const rom unsigned char config1H = 0b00001000; // interno oscillator
#pragma romdata CONFIG2L = 0x300002
const rom unsigned char config2L = 0b00011111; // Brown-out Reset Enabled in hardware @ 2.0V, PWRTEN disabled
#pragma romdata CONFIG2H = 0x300003
const rom unsigned char config2H = 0b00000000; // HABILITADO EL WATCH DOG
#pragma romdata CONFIG3H = 0x300005
const rom unsigned char config3H = 0b00000000; //MCLRE_ON & espera sistema hasta estabilizar HFINTOSC & TMR1 a potencia superior & PORTB digital & CCP2 en RB3
//********Configuración de baja prioridad************
#pragma code low_vector=0x18
void interrupt_at_low_vector(void)
{
_asm GOTO low_isr _endasm
}
#pragma code
#pragma interruptlow low_isr
void low_isr (void)
{
if(PIR1bits.RCIF=1) // si es por recepción de datos
{
interrupcion_1();
}
}
//*************Configuración para alta prioridad***********
#pragma code high_vector=0x08
void interrupt_at_high_vector(void)
{
_asm GOTO high_isr _endasm
}
#pragma code
#pragma interrupt high_isr
void high_isr (void)
{
if (PIR1bits.TMR1IF==1) //se se levanta la bandera de desbordamiento del TIMER1
{
interrupcion_timer();
}
}
//*********************lcd**************************
char buf[15];
void DelayFor18TCY(void)
{
Delay10TCYx (2);
}
void DelayPORXLCD (void)
{
Delay1KTCYx(15); // Delay of 15ms
// Cycles = (TimeDelay * Fosc) / 4
// Cycles = (15ms * 16MHz) / 4
// Cycles = 60,000
}
void DelayXLCD (void)
{
Delay1KTCYx(2); // Delay of 5ms
// Cycles = (TimeDelay * Fosc) / 4
// Cycles = (5ms * 16MHz) / 4
// Cycles = 20,000
}
void comandXLCD(unsigned char a) // Envia comando al LCD
{
BusyXLCD();
WriteCmdXLCD(a);
}
// Ubica cursor en (x = Posicion en linea, y = nº de linea)
void gotoxyXLCD(unsigned char x, unsigned char y)
{
unsigned char direccion;
if(y != 1)
direccion = 0x40;
else
direccion=0;
direccion += x-1;
comandXLCD(0x80 | direccion);
}
//*********************************************************
void main()
{
ANSEL=0; //deshabilita las entradas analogas en puerto A
//ANSELH=0b00000001;
OSCCON=0b01110111; //frecuencia interna a 16 MHrz
OSCTUNEbits.PLLEN=0 ; //desactivo el multiplicador *4 del oscilador
//***********Configuración de puertos******************
TRISB=0b00000110; //Entrada de la INT1 y de el ADC
PORTB=0;
//*************ADC**********************
ANSELH=0b00000001; //Solo RB2 como entrada análoga
ADCON2=0b10101001; //Selecciono A/D conversion clock, 12 TAD,result format
ADCON0=0b00100001; //Selecciono AN8 como mi entrada análoga, habilito el ADC
ADCON1=0b00000000; //Referencia interna Vss, Referencia externa positiva Vdd
//**************************************
//********configuracion del timer 1 interrupcion cada 10 ms********************
T1CON=0b11110101; //habilitado TMR1 / formato de 16 bit/interna (FOSC/4)/prescaler 8 /oscilador apagado
PIE1bits.TMR1IE=1; //habilitada interrupcion de sobreflujo
//************63035=1111011000111011=2^16*************************
TMR1H=0b11110110; //byte más significativo
TMR1L=0b00111011; //byte menos significativo
//****************************************************************
INTCONbits.GIEH = 1; //Habilita todas las interrupciones
INTCONbits.GIEL = 1; //Habilita interrupciones de baja prioridad
//************Comunicacion serial******************************
TRISCbits.TRISC6=0; // salida de transmisión
TRISCbits.TRISC7=1;
RCSTAbits.SPEN=1; // puerto serial (EUSART) habilitado
TXSTAbits.SYNC=0; // modo asincronico
TXSTAbits.TXEN=1; // habilitar transmisor
TXSTAbits.TX9=0; // transmision para 8 bits
RCSTAbits.CREN=1; //habilita recepcion continua
RCSTAbits.RX9=0; //recepcion para 8 bits
TXSTAbits.BRGH=0; // baja velocidad del generador de bauds
SPBRG=12; // generador a 9600 bauds con osc de 16MHz
//************CONFIGURACION DE INTERRUPCIONES********************
//TCONbits.INT0IE = 1; //habilito interrupcion externa INT0
//INTCON3bits.INT1IE = 1; //habilito interrupcion externa INT1
//TCON2bits.INTEDG0 = 0; //por flanco de bajada INT0
//INTCON2bits.INTEDG1 = 0; //por flanco de bajada INT1
//INTCON2bits.RBPU = 1; //activo Pull-up del puerto B
//INTCON3bits.INT1IP= 0; //Habilito la INT1 como baja prioridad
RCONbits.IPEN=1; //Habilito las interrupciones por prioridad
INTCONbits.GIEL = 1; //Habilita interrupciones de baja prioridad
INTCONbits.GIEH = 1; //Habilita todas las interrupciones
IPR1bits.TMR1IP=1; //Pongo en alta prioridad al timer1 por desbordamiento
IPR1bits.RCIP=0; //Interrupcion de recepción del EUSART con prioridad baja
IPR1bits.TXIP=0; //Interrupcion de transmisión del EUSART con prioridad baja
PIE1bits.RCIE=1; // habilita interrupcion por recepcion
OpenXLCD( FOUR_BIT & LINES_5X7 );
comandXLCD(0x06); // Nos aseguramos incremento de direccion, display fijo
comandXLCD(0x0C); // Encendemos LCD
putrsUSART("COMUNICACION SERIAL "); // Escribo un texto en la pantalla
putrsUSART("EL VALOR DE LA VARIABLE ES: ");
varia=10;
ultoa( varia, str ); // convierto a string la variable "var"
putsUSART( str );
contador=0;
while(1)
{
_asm CLRWDT _endasm //resetear WDT
if(PIR1bits.ADIF)
{
if(ADRES>=600)
{
PORTBbits.RB6=1;
}
else
{
PORTBbits.RB6=0;
}
PIR1bits.ADIF=0; //Encero la bandera que me indica si la conversión está lista
var=ADRES; //En ADRES se encuentran los 10 bits de la conversión
}
sprintf(buf, "el valor= %d", var); //Guardo los caracteres en la variable buf
if(contador>=100)
{
ADCON0bits.GO_DONE=1; //Mando a hacer la conversión
contador=0; //Encero el contador
comandXLCD(0x01); // Borra pantalla y vuelve al origen.-
gotoxyXLCD(1,1);
putrsXLCD("CONVERSION ADC");
gotoxyXLCD(1,2);
putsXLCD(buf); //Muestro la variable "buf" (contiene los 10bits de la conversión) por al LCD
putsUSART( buf );
}
}
}
void interrupcion_timer()
{
contador++;
PIR1bits.TMR1IF=0;
TMR1H=0b11110110;
TMR1L=0b00111011;
}
void interrupcion_1()
{
Data=getcUSART(); // leemos dato recibido
while(1){
Data=getcUSART();
switch(Data){
case 'a': // tambien se puede poner en ASCII 0x61 hexadecimal o se puede escribir en decimal 97
PORTBbits.RB5=1; // prendo led
break;
case 'b':
PORTBbits.RB5=0; // apago led
break;
PIR1bits.RCIF=0; // Ensero la bandera de interrupción del EUSART
}
}
}