Hola a todos, he hestado estos dias intentando realizar una comunicación entre el pc y el pic 18f2550 funcionando a 20MHz, el asunto es que he cogido del tutorial de mplab c18 que se puede encontrar por este foro, he cogido el ejemplo de 2 entradas analogicas y visualización por el puerto serie de este valor analogico, utilizando las funciones "putrsUSART" y la función "itoa".
el caso es que he adaptado: he quitado los valores de conversión, es decir, las entradas analogicas, y del mismo modo he cambiado que se incremente una variable o se decremente, en función si envio desde el pc un "1" o un "2". este es el código:
#include <p18f2550.h>
#include <delays.h>
#include <stdio.h>
#include <stdlib.h> //Libreria para conversiones.
#include <usart.h>
#include <math.h>
#include <timers.h>
#include <pwm.h>
#pragma config FOSC = HS,FCMEN = OFF,IESO = OFF, CPUDIV = OSC1_PLL2
#pragma config PWRT = ON,BOR = OFF,BORV = 0
#pragma config WDT = OFF,WDTPS = 32768
#pragma config MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,CCP2MX = ON
#pragma config STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF
#pragma config CP0 = ON,CP1 = ON,CP2 = ON
#pragma config CPB = ON,CPD = ON
#pragma config WRT0 = ON,WRT1 = ON,WRT2 = ON
#pragma config WRTB = ON,WRTC = ON,WRTD = ON
#pragma config EBTR0 = ON,EBTR1 = ON,EBTR2 = ON
#pragma config EBTRB = ON
#define IN1 PORTBbits.RB0
#define IN2 PORTBbits.RB1
#define IN3 PORTBbits.RB2
#define IN4 PORTBbits.RB3
#define EN1 PORTCbits.RC1
#define EN2 PORTCbits.RC2
#define EnviarEco PORTAbits.RA2 // Pin usado para el pulso de Disparo
#define RecibirEco PORTAbits.RA1 // Pin usado para recibir el eco ultrasónico
void ISRRecepcion(void);
volatile char Data, Kbhit;
// Creamos una nueva seccion de codigo a partir de la direccion 0x08.-
#pragma code Interrupcion = 0X0008
void VectorInterrupcion(void){
_asm goto ISRRecepcion _endasm
}
#pragma code // Cerramos seccion.-
// Rutina de Interrupcion.-
#pragma interrupt ISRRecepcion
void ISRRecepcion(void){
if(PIR1bits.RCIF==1){
Data=getcUSART(); // Leemos Dato recibido
Kbhit=1; // Indicamos que se ha recibido un dato.-
PIR1bits.RCIF=0; // Borramos bandera.-
}
}
long RecibirEco_delay;
long distance;
long value;
long motor1=300;
long motor2=300;
void main(void){
unsigned int Canal0, Canal1;
char String[5];
long lim_up,lim_down;
// ENTRADAS Y SALIDAS COMO DIGITALES
ADCON1=0x0F;
// RB4 Y RB5 COMO SALIDAS DIGITALES
TRISB = 0;
TRISA = 0x02;
TRISC = 0b10000000;
OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH,129); // 9600,8,n,1
//manual pic 18F2550, pagina 239 (ejemplo20-1):
// For a device with FOSC of 12 MHz, desired baud rate of 9600, Asynchronous mode, 16-bit BRG:
// Desired Baud Rate = FOSC/(16 ([SPBRGH:SPBRG] + 1)
// Solving for SPBRGH:SPBRG:
// X = ((FOSC/Desired Baud Rate)/16) – 1
// = ((12000000/9600)/16) – 1
// = [77.125] = 77
// Calculated Baud Rate = 12000000/(16 (77 + 1))
// = 9615
// Error = (Calculated Baud Rate – Desired Baud Rate)/Desired Baud Rate
// = (9615 – 9600)/9600 = 0.16%
// de esta forma sabemos que N=77, por eso en la configuración de la USART, el valor último que encontramos es 77
OpenTimer2 (TIMER_INT_OFF & T2_PS_1_1 & T2_POST_1_1);
OpenPWM1(0xFF); OpenPWM2(0XFF);
IN2=1; IN4=1; IN1=0; IN3=0;
lim_up=1020;lim_down=100;motor1=lim_down;motor2=lim_down;
SetDCPWM2(motor1);
SetDCPWM1(motor2);
Kbhit=0;
RCONbits.IPEN=0; // Deshabilitamos Prioridades
INTCONbits.PEIE=1; // Habilitamos interrupcion de perifericos.-
INTCONbits.GIE=1; // Habilitamos interrupcion Global.
printf("\n\rhola");
Delay10KTCYx(50);
putrsUSART("\n\rPrueba Comunicacion Serial\r\n");
Delay10KTCYx(50);
while(1){
while(Kbhit==0){}; // esperamos a recibir dato.-
Kbhit=0;
switch(Data){
case '1': // letra a
motor1=motor1+10;
motor2=motor2+10;
if (motor1>=lim_up){
motor1=lim_up;
}
if (motor2>=lim_up){
motor2=lim_up;
}
SetDCPWM2(motor1);
SetDCPWM1(motor2);
putrsUSART("MOTOR UP = ");
itoa(motor1, String); // Convertimos entero a string.-
putsUSART(String);
putrsUSART("\r\n");
break;
case '2': // letra c
motor1=motor1-10;
motor2=motor2-10;
if (motor1<=lim_down){
motor1=lim_down;
}
if (motor2<=lim_down){
motor2=lim_down;
}
SetDCPWM2(motor1);
SetDCPWM1(motor2);
putrsUSART("MOTOR DOWN = ");
itoa(motor1, String); // Convertimos entero a string.-
putsUSART(String);
putrsUSART("\r\n");
break;
}
}
}
---------------------------------------------------------------------
el problema es que tal y como esta el código funciona correctamente, se recive los siguientes campos:
MOTOR DOWN = 100
MOTOR DOWN = 100
MOTOR DOWN = 100
MOTOR UP = 110
MOTOR UP = 120
pero si quita las siguiente línea:
printf("\n\rhola");
Delay10KTCYx(50);
situada antes del wile(1), los datos recividos no son los correctos, obteniendo el siguiente resultado:
1101201301401301201101001101201301101201301201101001
que es el resultado de realizar:
itoa(motor1, String); // Convertimos entero a string.-
putsUSART(String);
de la misma forma que si ahora dentro del "Case '1'" pongo un "printf" este no sale....
me esta volviendo loco como puede ser que ocurra estas cosas? que hago mal?
gracias