Forum: Mikrocontroller und Digitale Elektronik AVR UART INTERUPT MEHRER BAUD


von Jens B. (jensbork)


Lesenswert?

Hallo das ist mein erste Beitrag ich versuche auf meinen atmega 128 mit 
4Mhz ein Programm zu schreiben das mehrere BAUDRATE unterstützt.

Kurze Info vorweg mit einer Baurate geht das Programm.

Funktion des Programmes ich lese auf der UART mit BAUD 300 einen String 
aus der mir sag mit welches max BAUD ich weiterlesen kann. Danach sende 
ich String zum Umstellen der BAUD siehe Code.

Mein Problem ist das sich die BAUD auf meine atmega nicht ändert ich 
vermutet das ich ein Register zu schrieben vergessen habe kann mir 
jemand helfen. Siehe Code

Ausschnitt der main

    // Befehl zum ändern der BAUD
    clstr[0]=0x06;
    clstr[1]='0';
    clstr[2]=baud;
    clstr[3]='1';
    clstr[4]=0x0D;
    clstr[5]=0x0A;
    clstr[6]=0;
    USART1_send(clstr);
    waitAnswer(0,0);
    //BAUD ändern
    setBaud(baud);

    //nächster Befehl mit neuer BAUD
    clstr[0]=0x01;
    clstr[1]='R';
    clstr[2]='2';
    clstr[3]=0x02;
    clstr[4]='C';
    clstr[5]='0';
    clstr[6]='0';
    clstr[7]='1';
    clstr[8]='(';
    clstr[9]=')';
    clstr[10]=0x03;
    clstr[11]=0;
    buildbcc(clstr);

    // Buffer 2 empfang bereit machen
    clpos=clbufferpos;
    csstpos=0;
    USART1_send(clstr);
    waitAnswer(0,40);

void setBaud(char baud){
  //cli();
  USART1_init(0);
  if(baud=='0')
    USART1_init(833); // init serial 1   300 baud 7E1
  if(baud=='1')
    USART1_init(415); // init serial 1   600 baud 7E1
  if(baud=='2')
    USART1_init(207); // init serial 1   1200 baud 7E1
  if(baud=='3')
    USART1_init(103); // init serial 1   2400 baud 7E1
  if(baud=='4')
    USART1_init(51); // init serial 1   4800 baud 7E1
  if(baud=='5')
    USART1_init(25); // init serial 1   9600 baud 7E1
  if(baud=='6')
    USART1_init(12); // init serial 1   19200 baud 7E1
  //sei();
}

void USART1_init(unsigned int baud){
  UCSR1A &= ~(1<<UDRE1);
  /* disable receiver and transmitter */
  UCSR1B &= ~((1<<RXEN1) | (1<<TXEN1)) ;
   /* disable interrupt */
  UCSR1B &= ~(1<<RXCIE1);
  /* set baudrate */
  UBRR1H = (unsigned char)(baud>>8);
  UBRR1L = (unsigned char)baud;
  /* enable receiver and transmitter */
  UCSR1B = (1<<RXEN1) | (1<<TXEN1) ;
   /* enable interrupt */
  UCSR1B |= (1<<RXCIE1);
  /* frame format */
  UCSR1C = 0x24;  //1stopp-bit
  //UCSR1C = 0x2C;    //2stopp-bit
}

von g ast (Gast)


Lesenswert?

- Großschreibung bedeutet Rumschreien und ist unhöflich!
- Deine Ausdrucksweise ist eine Katastrophe!
- C-Code als Anhang oder in [c ] [/c ] Tags.
- allgemein: lesen: Netiquette

von Eneloop (Gast)


Lesenswert?

Jens Bork schrieb:
1
 clstr[2]=baud;

was für einen datentyp hat "baud"?
Für "char" wäre schon 300 zuviel, für short / int wäre obige Zuweisung 
schmarrn.

von Frank B. (f-baer)


Lesenswert?

Ein "Bitte" oder "Danke" und korrekte Interpunktion würden deine 
Chancen, eine vernünftige Antwort zu erhalten, deutlich erhöhen. Wenn du 
darüber hinaus noch von der deutschen Orthographie Gebrauch machen 
würdest, dann fehlten wirklich nur noch die [c]-Tags und es wäre 
perfekt. Natürlich abgesehen von der Tatsache, dass die ausschliessliche 
Verwendung von Großbuchstaben die Chancen darauf, dass jemand deine 
Frage liest, nicht erhöht sondern ganz im Gegenteil sogar senkt.

In deinem Code sehe ich übrigens nicht ein einziges Mal, dass der 
Variable baud ein Wert zugewiesen würde.

von Jens B. (jensbork)


Lesenswert?

Entschuldigung für den Betreff wie gesagt mein erster Beitrag.  Hier der 
fehlende Code.
Clstart ist eine Char Array das über die Interrupt Rutine gefüllt wird.

char baud='0';
while( k<(CLSTARTSIZE-1)){
  if( (clstart[k]=='/') && ( clstart[k+1]!='?') ){
    baud=clstart[k+4];
    k=CLSTARTSIZE;
  }
k++;
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das führt irgendwie zu nichts.

Wie stellst Du Dir das mit der Baudrate vor? Codierst Du die irgendwie, 
damit sie in ein Byte hineinpasst, oder was stellst Du da an?

Der Schnipsel ist nicht "der fehlende Code", sondern nur ein 
Fragmentfetzen.

Poste vollständigen Code, beschreibe genau, was Du anstellen willst, 
beschreibe genau, wie die übertragenen Daten aussehen. Und beschreibe 
Deine Testumgebung, also: Wer ist mit dem µC verbunden, wer sendet 
Daten, wer empfängt sie, wie wertest Du wo was aus ...

Und überhaupt: Was bezweckst Du damit? Welches Problem willst Du lösen?

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.