skule.sormo.no

ORG NR 885 947 522

Interruptrutine for serieport 2 for MEGA

SerialEvent2() er ikke en interruptrutine. Den leses for hver runde i loop(). Det betyr at det er vanskelig å lese en datastrøm fra en GPS-enhet uten at noe av data går tapt dersom det er tidskrevende lesing av andre sensorer i programskissen. Under vises en iterruptrutine for UNO som kan brukes til å lese et tegn fra en GPS som bruker Serial2-porten, legge den i en buffer og gi en statusvariabel til loop()-rutinen når et linjeskift er påvist. loop()-rutinen kan da behandle GPS-strengen slik som man ønsker mens interruptrutinen fortsetter å samle data uavhenig av tid som brukes til å lese andre sensorer.

Her er de elementene som må legges til i programskissen for å lese tegn fra GPS-enheten med Serial2-porten.:

 

  #define FOSC 160000//// Clock Speed
  #define BAUD 4800
  #define MYUBRR F_CPU/(16UL*BAUD)-1

void setup()
{
  buf1.reserve(100);
  gpsbuffer.reserve(100);
 USART2_Init( MYUBRR);   //GPS
}

void loop()
{
 if (gps_ferdig==true)
   {
   Serial.println(gpsbuffer);
   gps_ferdig=false;
   }
  else
  { 
  // behandle andre sensorer

}

 

 

void USART2_Init( unsigned int ubrr){
  // Set baud rate 
  UBRR2H = (unsigned char)(ubrr>>8);
  UBRR2L = (unsigned char)ubrr;
  // Enable receiver and transmitter 
  UCSR2B =(1<<RXEN2)|(1<<TXEN2)|(3<<6);
  // Set frame format: 8data, 2stop bit 
  UCSR2C = (1<<USBS2)|(3<<UCSZ02);
}

 


ISR(USART2_RX_vect)
{
  char c=char(UDR2);
  if (int(c)==13)
       {
//    Serial.println(buf1.substring(0,6));
  if (buf1.substring(0,6)=="$GPRMC")
   {
      gpsbuffer=buf1;
      gps_ferdig=true;
   }
       buf1=""; 
    }   
     else if ((int(c)!=10) && (int(c)!=13))
     {
      buf1 +=c;
//Serial.println(buf1);
     }