Problem: Zeichen von Uart am Terminal empfangen

OP #2456328
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;

  }
}
#2456336
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.
Gast #2456342
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
}

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