Forum: Mikrocontroller und Digitale Elektronik Problem: Zeichen von Uart am Terminal empfangen


von Sepp H. (vali1991)


Lesenswert?

Schönen Abend,

habe wieder einmal ein kleines Problem. Möchte im Terminal ein zeichen 
senden und dieses soll wieder empfangen werden. Wäre nett, wenn mir 
jemand einen Tipp geben könnte, danke.



#include <avr/io.h>

#define F_CPU 3686400ul
#define BAUD 9600
#define UBRR_VAL = ((3686400/(9600*16))-1)


void uart_init(void) {
    UBRR0H = 0x00;
  UBRR0L = 0x17;


    UCSR0B = (1<<TXEN0) | (1<<RXEN0);  // UART TX und RX einschalten
    UCSR0C = (1<<USBS0)|(1<<UCSZ01)|(1<<UCSZ00);  // Asynchron 8N2
}

int main(void) {
  uart_init();
  /*while(1){
  while (!(UCSR0A & (1<<UDRE0))) {  // warten bis Senden moeglich
  }
    UDR0 = 'a';
  //_delay_ms( 10 );
  }
  */while(1){
    while (!(UCSR0A & (1<<RXC0))) {    //warten bis Zeichen verfuegbar
  }
    return UDR0;

  }
}
von Karl H. (kbuchegg)


Lesenswert?

Sepp Horst schrieb:
> Schönen Abend,
>
> habe wieder einmal ein kleines Problem. Möchte im Terminal ein zeichen
> senden und dieses soll wieder empfangen werden.

Kannst du senden?
(Also nur senden. warum ich frage: Weil das die Eintrittskarte dazu ist, 
dass die UART Verbdindung erst mal grundsätzlich klappt)

1
int main(void) {
2
  uart_init();
3
  /*while(1){
4
  while (!(UCSR0A & (1<<UDRE0))) {  // warten bis Senden moeglich
5
  }
6
    UDR0 = 'a';
7
  //_delay_ms( 10 );
8
  }
9
  */while(1){
10
    while (!(UCSR0A & (1<<RXC0))) {    //warten bis Zeichen verfuegbar
11
  }
12
    return UDR0;
return?
Warum return? Wohin möchtest du returnen. Du bist in main(), da gibt es 
nix mehr, wohin du returnen könntest.

Zeichen aus UDR0 abholen (zb in eine Zwischenvariable) und mit dem 
Schreibecode in umgekehrter Richtung wieder auf den Weg bringen.
von Krapao (Gast)


Lesenswert?

> #define UBRR_VAL = ((3686400/(9600*16))-1)
> UBRR0L = 0x17;

Die Berechung von UBRR_VAL ist fubbes, wenn sie letztendlich nicht 
benutzt wird.

Standardfrage: Läuft dein AVR bestimmt mit 3686400 Hz? D.h. wie sieht 
die Schaltung aus und wie sind die AVR Fuses gesetzt?

Dein main() macht gerade mal einen Versuch exakt ein Zeichen zu 
empfangen, ohne was mit dem Zeichen zu machen... das ist dünn.

Ein Echo in main() könnte so aussehen:
1
int main(void) 
2
{
3
  uart_init();
4
  while(1)
5
  {
6
    char c;
7
    // Zeichen empfangen
8
    while (!(UCSR0A & (1<<RXC0))){} //warten bis Zeichen verfuegbar
9
    c = UDR0;
10
    // Zeichen zurücksenden (Echo)
11
    while (!(UCSR0A & (1<<UDRE0))){} // warten bis Senden moeglich
12
    UDR0 = c;
13
  }
14
}
von Sepp H. (vali1991)


Lesenswert?

Danke, hat sich schon erledigt. =)
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.