USART bei XMEGA-A1

Gast #2500032
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
#2500140
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
Gast #2500719
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
Gast #2500731
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren