Forum: Mikrocontroller und Digitale Elektronik USART bei XMEGA-A1


von milan (Gast)


Lesenswert?

Hallo zusammen,
hat jemand ein beispiel wie mann über usart bei XMEGA-A1 eine char kette 
empfängt??

Ich will einen GPS sensor auslesen.

Der schickt die daten so:
$GPVTG,0.0,T,359.6,M,0.0,N,0.0,K*47

Besten dank
Gruss
Milan

von Carsten W. (eagle38106)


Lesenswert?

Siehe dort: Beitrag "Re: Xmega 256a3b Usart sendet immer ASCII 255"

Und dann einfach die empfangenen Zeichen in einem String/char[]-Array 
ablegen.

von milan (Gast)


Lesenswert?

Hallo
ich benutze volgende funktionen:
#define USARTF1_BSEL   1605
#define USARTF1_SCALE  0b1101  // -7

void USART_F1_Init(void)
{
  char data;

  // configuration of portpins
  PORTF.DIRCLR = 1<<PIN6;  // Pin6 input (RXD1)

  PORTF.OUTSET = 1<<PIN7;
  PORTF.DIRSET = 1<<PIN7;  // Pin7 output high (TXD1)

  // USARTF1, 8 Data bits, No Parity, 1 Stop bit.

  USARTF1.CTRLC = USART_CHSIZE_8BIT_gc | USART_PMODE_DISABLED_gc;
  USARTF1.CTRLA = 0;
  USARTF1.BAUDCTRLA = 0x33;
  USARTF1_BAUDCTRLB = 0x00;
  USARTF1.CTRLB = USART_RXEN_bm | USART_TXEN_bm; // enable receiver and 
transmitter
  data = (char)(USARTF1.DATA);    // Flush buffer

}


void USART_F1_Send(uint8_t data)
{

  while ((USARTF1.STATUS & USART_DREIF_bm) == 0) {};

  USARTF1.DATA = data;

}




char USART_F1_Receive(void)
{

  while ((USARTF1.STATUS & USART_RXCIF_bm) == 0) {};

  return USARTF1.DATA;

}

aber aus unbekanten gründen empfange ich nix!!

Kann mir bitte jemand helfen???

Gruss
Milan

von milan (Gast)


Lesenswert?

Das ist noch das Datenblat vom GPS Sensor.

http://www.perthold.de/BINARY/gps-st22.pdf

von Carsten W. (eagle38106)


Lesenswert?

Schau Dir mal Deine und meine Initialisierung (im o.a. Beitrag) an. Du 
definierst zwar am Anfang Werte mit #define, verwendest sie aber später 
nicht. Die einzustellende Baudrate ist auch abhängig vom eingestellten 
CPU-Takt. Hast Du das berücksichtigt? Aus Deinem Code-Auszug geht das 
nicht hervor.

Carsten

von Gerhard G. (xmega)


Lesenswert?

Hallo,

mit welcher Geschwindigkeit läuft dein Atxmega128a1?

GPS liefert 9600 Baut als Defaultwert.


Gruß xmega

von Milan (Gast)


Lesenswert?

Hallo zusammen,
das ist der xmega
http://mikrocontroller-praxis.de/de/Development-Tools/MC-Module/XMEGA-A1-USB.html

Das Modul ist mit einem 16MHz SMD-Quarz (XTAL1/2) und einem 32,768kHz 
SMD-Quarz (TOSC1/2) bestückt.

Welche werde muss ich für die Baudrate nehmen??

DAnke im Voraus
Gruss
Milan

von milan (Gast)


Lesenswert?

Hallo zusammen,
gefunden.
es war die Baudrate!!
So sieht es jetzt aus:
#define USARTF1_BSEL   207
#define USARTF1_SCALE  0

void USART_F1_Init(void)
{
  char data;

  // configuration of portpins
  PORTF.DIRCLR = 1<<PIN6;  // Pin6 input (RXD1)

  PORTF.OUTSET = 1<<PIN7;
  PORTF.DIRSET = 1<<PIN7;  // Pin7 output high (TXD1)

  // USARTF1, 8 Data bits, No Parity, 1 Stop bit.

  USARTF1.CTRLC = USART_CHSIZE_8BIT_gc | USART_PMODE_DISABLED_gc;
  USARTF1.CTRLA = 0;
  USARTF1.BAUDCTRLA = (uint8_t)(USARTF1_BSEL);   // BSEL
  USARTF1_BAUDCTRLB = (USARTF1_SCALE<<4) | (uint8_t)(USARTF1_BSEL>>8); 
// SCALE, BSEL
  USARTF1.CTRLB = USART_RXEN_bm | USART_TXEN_bm; // enable receiver and

  data = USARTF1.DATA;    // Flush buffer
}


Besten dank für Eure hilfe.
Gruss
Milan

von milan (Gast)


Lesenswert?

Hallo nochmahls,
das habe ich geendert:
   USARTF1.CTRLA = USART_RXCINTLVL_HI_gc; // enable Empfangsinterrupt 
(auf HI Level)


  PMIC.CTRL |= PMIC_HILVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_LOLVLEN_bm; 
//Interrupts (high-, medium- und lowlevel freigeben)


  sei(); // allegemeine interruptfreigabe

//--------------------------------------------------------------
und das habe ich hinzugefügt:

char rxbuffer[150]; /* Puffer für Empfang */
int rxpos = 0;     /* Zeiger auf nächstes Zeichen im Puffer */
bool rxvalid = 0;  /* 1= String vollständig */


ISR(USARTF1_RXC_vect)//Empfangen mit Interrupt
{
  int c=0;
  c = USARTF1.DATA;
  if (c=='\r')
  {
    c = 0x00;
    rxvalid = 1;
    rxbuffer[rxpos] = c;
    rxpos = 0;
  }
  if (c=='\n') {
    /* Windows Kompatibilität:
       c Verwerfen. */
  }
  else {
    /* Zeichen speichern */
    rxbuffer[rxpos++] = c;
  }

}
wenn ich rxbuffer am display ausgeben will kommt nichts.
kann mir jemand sagen warum???

oder muss ich die funktion ISR im main aufrufen???

Danke im voraus.
Gruss
Milan

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.