PIC32 UART1 Problemi

Başlatan ogy, 02 Ocak 2015, 00:02:51

ogy

Merhaba,

MikroC PIC32 derleyicisini kullanıyorum.Çalıştığım işlemci PIC32MX220F032D.GPS modülden data okuyup LCD'ye konum bilgisini yazdırmaya çalışıyorum.Kodları 8 bitte çalıştırdım daha önce.Hatta MikroC ARM derleyicisi üzerinde STM32F4 Discovery Kit üzerinde de çalıştırdım.Fakat PIC32'de program sadece bir kere ekrana yazıyor ve kilitleniyor.Sigorta ayarlarınında resmini ekledim.Nerede hata yapıyorum acaba?

// GLCD module connections
sbit LCD_RS at LATB5_bit;
sbit LCD_EN at LATB13_bit;
sbit LCD_D4 at LATB3_bit;
sbit LCD_D5 at LATB2_bit;
sbit LCD_D6 at LATB1_bit;
sbit LCD_D7 at LATB0_bit;

sbit LCD_RS_Direction at TRISB5_bit;
sbit LCD_EN_Direction at TRISB13_bit;
sbit LCD_D4_Direction at TRISB3_bit;
sbit LCD_D5_Direction at TRISB2_bit;
sbit LCD_D6_Direction at TRISB1_bit;
sbit LCD_D7_Direction at TRISB0_bit;
// End GLCD module connections

// Variables
unsigned int received = 0;
unsigned char DataType[] = "GPXXX";
unsigned char NMEA[] = "$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
unsigned char receive;
// End Variables

void main() 
{
  ANSELA=0;
  ANSELB=0;
  ANSELC=0;
  
  UART1_Init(9600);         // Initialize UART for GPS board connectivity
  delay_ms(100);
  
  Unlock_IOLOCK();
  PPS_Mapping_NoLock(_RPA4, _INPUT, _U1RX);    // Sets pin PORTC.B7 to be Input and maps UART1 Receive to it
  Lock_IOLOCK();
  
  Lcd_Init();                        // Initialize LCD
  Lcd_Cmd(_LCD_CLEAR);               // Clear display
  Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off


  while(1) 
      {
          if (UART1_Data_Ready() == 1) 
              {
                   receive = UART1_Read();
                   if (receive == '$')  // Check if sentence begins.
                       {
                            received = 0;
                            do{
                                  if (UART1_Data_Ready() == 1)
                                      {
                                           UART1_Read_Text(DataType, ",", 10);  // Capture GPXXX word
                                           received = 1;
                                      }
                              } while(received == 0);
                                    // If it is GPGGA Data, then acquire it.
                              if ((DataType[2] == 'G') && (DataType[3] == 'G') && (DataType[4] == 'A'))
                              {
                                received = 0;
                                do{
                                      if (UART1_Data_Ready() == 1)
                                          {
                                             UART1_Read_Text(NMEA, "*", 100);   // Stop at *XX checksum data
                                             received = 1;
                                          }
                                  } while(received == 0);
                                // Fill LCD with relevant data

                                // Number of satellites being tracked
                                Lcd_chr(1,1,NMEA[10]);
                                Lcd_chr(1,2,NMEA[11]);

                                Lcd_chr(1,4,NMEA[12]);
                                Lcd_chr(1,5,NMEA[13]);

                                Lcd_chr(1,7,NMEA[15]);
                                Lcd_chr(1,8,NMEA[16]);
                                Lcd_chr(1,9,NMEA[17]);
                                Lcd_chr(1,10,NMEA[18]);
                                Lcd_chr(1,11,NMEA[19]);

                                Lcd_chr(1,13,NMEA[21]);

                                // Longitude
                                Lcd_chr(2,1,NMEA[23]);
                                Lcd_chr(2,2,NMEA[24]);
                                Lcd_chr(2,3,NMEA[25]);

                                Lcd_chr(2,5,NMEA[26]);
                                Lcd_chr(2,6,NMEA[27]);

                                Lcd_chr(2,8,NMEA[29]);
                                Lcd_chr(2,9,NMEA[30]);
                                Lcd_chr(2,10,NMEA[31]);
                                Lcd_chr(2,11,NMEA[32]);
                                Lcd_chr(2,12,NMEA[33]);

                                Lcd_chr(2,14,NMEA[35]);
                              }
                            receive = 'x';
                       }
              }
      }
}





Kabil ATICI

kiliteniyor mu, yoksa gelen veriyi değerlendirmiyor mu?
Gelen  verileri hiç işleme sokmadan  değerlendirme için yaptığın (algılama yaptığın) bellek alanlarını bir gözle. Belki sadece veri saklamak için kullandığın bellek alanları kayıyordur.
Programın geri kalanını bilmiyorum, veri alımı için kullandığın sayıcıyı sıfırlıyor musun?
Belki araya başka veriler karışıyordur.
Yerin varsa ikinci bir uart ile bilgisayara gönderip gelen veriyi incele.
Benimkisi sadece bir düşünce tabii.

ambar7