www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik usart xmega probleme


Autor: Jens D. (gandalf1983)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo leute,

irgendwie funktioniert das alles nicht

hab folgenden code zur initialisierung der uartc0
 
    // PD3 (TXD0) as output, Transmitter
  PORTC.DIRSET   = PIN3_bm;
  // PD2 (RXD0) as input, Receiver
  PORTC.DIRCLR   = PIN2_bm;
  USARTC0.CTRLA = 0b00001000;
  USARTC0.CTRLB = 0b00011001;
  USARTC0.CTRLC = 0b00000011;
  /* Set Baudrate to 9600bps:
   * Use the default I/O clock frequency that is 32 MHz.
   * Do not use the baudrate scale factor
   *
   * Baudrate select =             F_CPU
                        -------------------------
                            ( 16 * BAUDRATE - 1)
   *                 = 208
   */
  USARTC0.BAUDCTRLA = F_CPU/((16*9600)-1);
  USARTC0.BAUDCTRLB = 0;
  
in der main steht nicht anderes als

UARTC0.DATA = 'A';


auf meinem Terminal programm kommt nur éh raus

verstehe das alles nicht

gruß jens

Autor: Helmut Ru (heru01)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Gandalf,

Du hast eine falsche Baudrate. Wenn 'eh' ausgegeben wird, heisst das: 
der Rest der Initialisierung ist ok.
Was für fcpu hast Du?
Du tust Dich übrigens leichter, wenn Du nicht binär, sondern in C die 
Defines benutzt.

Gruß
Helmut

Autor: Jens D. (gandalf1983)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe dei pll auf 32MHz stehen!!!

ist denn die formel da richtig? oder kann ich das so nicht machen?

was für defines meinst du?

Autor: XMEGA (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,


so stelle ich meine Geschwindigkeit ein:

Init USART 115200bps ->

(F_CPU 8000000  0xAC/91)
(F_CPU 16000000 0xD7/0x93)
(F_CPU 32000000 0x17/A4)

Init USART 9600 bps  ->

(F_CPU 32000000 0x7B/0xD6)

Wert für USARTE0.BAUDCTRLA/USARTE0.BAUDCTRLB

Nach Atmel Formel errechnet, 0,01 % genau

Gruß XMEGA

Autor: Jens D. (gandalf1983)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hat sich erledigt,

hatte in ein 8bit integer ein 16bit integer geschrieben


gruß

Autor: Jens D. (gandalf1983)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so leute nun kann ich auf der usart einfand frei senden aber leider noch 
nicht richtig empfangen.

und zwar hab ich folgendes phenomaen

wenn ich in der main einen dauerhafte ausgabe über die usart mache 
funktioniert die eingabe.

wenn ich nun denn sende befehl ausm xmega raus hole kann ich nichts mehr 
eingeben.

folgenden Code habe ich

die main.c
volatile static usart usartC0;

/****************************************************************************/
/* definition for EEPROM memory for ATMega(16-128) and newer*/
/****************************************************************************/
uint16_t outC0 = 0;
uint16_t ui16TimerC0Config = 0;
char usartC0out[100];




/****************************************************************************/
/*MAIN Function*/
/****************************************************************************/




int main(void)
{
  
  portinit();       //Portinit for XMEGA
  oscilatorinit();  //Oscilator set to 32MHz
  USARTC0_Init(9600, &usartC0);   //USART Init
  usartC0_puts("Uart C0 ist now online with 9600 Baud\r\n");
  TimerInterruptInit();  //Timer Interrupt
  ui16TimerC0Config = TimerInitC0(1024,500);
  sprintf_P(usartC0out,PSTR("The Timer C0 is now working with %u \r\n"),ui16TimerC0Config);
  usartC0_puts(usartC0out);
  
  sprintf_P(usartC0out,PSTR("compile date %s and time %s\r\n"),__DATE__,__TIME__);
  usartC0_puts(usartC0out);
  
    

  while(1)
  {
    
     // sprintf_P(usartC0out,PSTR("The Comflag is \r"));
     // usartC0_puts(usartC0out);
     
     PORTE.DIRTGL = 0x03;    
     
    if(usartC0.comflags>0)
    {
      handlecom(&usartC0);
    }
  }  
  return 0;
}



die usartC0.c

/****************************************************************************/
/* definition for EEPROM memory for ATMega(16-128) and newer*/
/****************************************************************************/

/****************************************************************************/
/*MAIN Function*/
/****************************************************************************/


void USARTC0_Init(unsigned long ulBaudrate, usart *usartPtr)
{
  unsigned long ulBaudratCalc = 0;

  usartC0 = usartPtr; // Set scope pointer to the parameter
  // PC3 (TXD0) as output, Transmitter
  PORTC.DIRSET   = PIN3_bm;
  // PC2 (RXD0) as input, Receiver
  PORTC.DIRCLR   = PIN2_bm;
  USARTC0.CTRLA = 0b00111100;
  USARTC0.CTRLB = 0b00011000;
  USARTC0.CTRLC = 0b00000011;
  /* Set Baudrate to 9600bps:
   * Use the default I/O clock frequency that is 32 MHz.
   * Do not use the baudrate scale factor
   *
   * Baudrate select =             F_CPU
   -------------------------
   ( 16 * BAUDRATE - 1)
   *                 = 208*/
  ulBaudratCalc = (unsigned long)(F_CPU / (16 * ulBaudrate -1));
  USARTC0.BAUDCTRLA = ulBaudratCalc;
  USARTC0.BAUDCTRLB = 0;
}

ISR (USARTC0_RXC_vect)
{
  char c;
  //while(!(USARTC0.STATUS & USART_RXCIF_bm));
  c = USARTC0.DATA;
 
  if (c == 0x0D)  
  {
    usartC0->comflags|=(1<<RXLINERECEIVED);
    usartC0->rxbuffer[usartC0->rxptr]='\0';
    usartC0->rxptr=0;
    // to deactivate this function you must set in the makefile CDEFS += -DUARTMODE=$(USARTMODE)
#ifndef UARTMODE
    usartC0_puts_p(PSTR("\r\n"));
#endif
  
  }
  else
  {
#ifndef UARTMODE 
    usartC0_putc(c);
#endif
    usartC0->rxbuffer[usartC0->rxptr]=c;
    usartC0->rxptr++;
 
    // delete the uart buffer and the pointer when buffer overflow
    if(usartC0->rxptr==UARTBUFFERLENGTH-2)
    {
      usartC0->rxptr=0;
      usartC0->rxbuffer[0]='\0';
#ifndef UARTMODE
      usartC0_puts_p(PSTR("Buffer overflow usartC0\r\n"));
#endif
    }
  }
}



void usartC0_putc(char c)
{
  while((USARTC0.STATUS & USART_DREIF_bm) == 0 ) 
  { };
  USARTC0.DATA = c;
}

void usartC0_puts(const char *s)
{
  while (*s)
  {  
    usartC0_putc(*s);
    s++;
  }
}

void usartC0_puts_p(const char *s)
{
  register char c;
  while ( (c = pgm_read_byte_far((unsigned int)s++)) ) 
    usartC0_putc(c);
}


die define.h

#ifndef DEFINE_H
#define DEFINE_H 1


/***************************************************************************/
/* INCLUDES*/
/***************************************************************************/



/****************************************************************************/
/* definition for EEPROM memory for ATMega(16-128) and newer*/
/****************************************************************************/
#define UARTBUFFERLENGTH 30
#define RXLINERECEIVED 0

#define UP(Anz)            sprintf_P(out,PSTR("\033[%dA"),Anz)
#define UP_LINE            sprintf_P(out,PSTR("\033[A"))

#define RIGHT(Anz)         sprintf_P(out,PSTR("\033[%dC"),Anz);uart1_puts(out)
#define ONE_POS_RIGHT      sprintf_P(out,PSTR("\033[C"));uart1_puts(out)

#define POSITION(Ze, Sp)   sprintf_P(out,PSTR("\033[%d;%dH"),Ze,Sp);uart1_puts(out)

#define CLEAR              sprintf_P(out,PSTR("\033[2J"));uart1_puts(out)


#define FORECOLOR_BLACK      sprintf_P(out,PSTR("\033[30m"));uart1_puts(out)
#define FORECOLOR_RED        sprintf_P(out,PSTR("\033[31m"));uart1_puts(out)
#define FORECOLOR_GREEN      sprintf_P(out,PSTR("\033[32m"));uart1_puts(out)
#define FORECOLOR_YELLOW     sprintf_P(out,PSTR("\033[33m"));uart1_puts(out)
#define FORECOLOR_BLUE       sprintf_P(out,PSTR("\033[34m"));uart1_puts(out)
#define FORECOLOR_VIOLETT    sprintf_P(out,PSTR("\033[35m"));uart1_puts(out)
#define FORECOLOR_KOBALTBLUE sprintf_P(out,PSTR("\033[36m"));uart1_puts(out)
#define FORECOLOR_WHITE      sprintf_P(out,PSTR("\033[37m"));uart1_puts(out)
#define BACKCOLOR_BLACK      sprintf_P(out,PSTR("\033[40m"));uart1_puts(out)
#define BACKCOLOR_RED        sprintf_P(out,PSTR("\033[41m"));uart1_puts(out)
#define BACKCOLOR_GREEN      sprintf_P(out,PSTR("\033[42m"));uart1_puts(out)
#define BACKCOLOR_YELLOW     sprintf_P(out,PSTR("\033[43m"));uart1_puts(out)
#define BACKCOLOR_BLUE       sprintf_P(out,PSTR("\033[44m"));uart1_puts(out)
#define BACKCOLOR_VIOLETT    sprintf_P(out,PSTR("\033[45m"));uart1_puts(out)
#define BACKCOLOR_KOBALTBLUE sprintf_P(out,PSTR("\033[46m"));uart1_puts(out)
#define BACKCOLOR_WHITE      sprintf_P(out,PSTR("\033[47m"));uart1_puts(out)



typedef struct
{
 unsigned char rxptr;
 unsigned char comflags;
 char rxbuffer[UARTBUFFERLENGTH];
}usart;

#endif


ich danke euch schon mal im vorraus

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.