Autor Tema: c18 y rs232  (Leído 3266 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


 

anything