Autor Tema: c18 y rs232  (Leído 3269 veces)

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

Desconectado illusionista_86

  • PIC10
  • *
  • Mensajes: 23
c18 y rs232
« en: 02 de Febrero de 2012, 20:36:29 »
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