Forum: Mikrocontroller und Digitale Elektronik Anfängerfrage zu UART Kommunikation


von Udo F. (utm)


Lesenswert?

Nabend zusammen,

ich möchte mit meinem Atmega88 mittels SH-U09C5 und HTerm mittels UART 
kommunizieren. Leider scheitert es bereits an den Basics.
Ein 'Hello World' - Blink Programm funktioniert problemlos.
1
#include <avr/io.h>
2
int main(void) {
3
    DDRB |= (1<<PB7);
4
    while(1){
5
        PORTB = (1<<PB7);
6
    }
7
}

Jetzt habe ich hier aus den Anleitungen versucht via RX/TX Kommunikation 
ein sehr simples Beispiel zu basteln:
1
#include <avr/io.h> 
2
#include <util/setbaud.h>
3
#include <util/delay.h>
4
5
int uart_putc(unsigned char c)
6
{
7
    while (!(UCSR0A & (1<<UDRE0)))  /* warten bis Senden moeglich */
8
    {
9
    }                             
10
11
    UDR0 = c;                      /* sende Zeichen */
12
    return 0;
13
}
14
void uart_puts (char *s)
15
{
16
    while (*s)
17
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
18
        uart_putc(*s);
19
        s++;
20
    }
21
}
22
23
void uart_init(void)   
24
{
25
   UBRR0H = UBRRH_VALUE;
26
   UBRR0L = UBRRL_VALUE;
27
#if USE_2X
28
   /* U2X0-Modus erforderlich */
29
   UCSR0A |= (1 << U2X0);
30
#else
31
   /* U2X0-Modus nicht erforderlich */
32
   UCSR0A &= ~(1 << U2X0);
33
#endif
34
}
35
36
int main(void)
37
{
38
   char s[7];
39
   DDRB |= (1<<PB7);
40
   int16_t i = 123;
41
   PORTB = (1<<PB7);
42
   uart_init();
43
44
   itoa( i, s, 10 ); // 10 fuer radix -> Dezimalsystem
45
   while (1) {
46
      uart_puts( itoa( i, s, 10 ) );
47
      _delay_ms(2000);
48
   }
49
50
   return 0; // never reached 
51
}

Nicht nur das die Kommunikation nicht funktioniert, nichtmal die LED von 
PB7 leuchtet.
Ich habe dann rumprobiert und was ich überhaupt nicht verstehe ist, 
selbst wenn ich aus der main Methode alles rausnehme bis auf den LED 
Teil, es dennoch nicht klappt. Das kann ja eigentlich nicht sein, da ich 
die anderen Methoden ja nicht einmal aufrufe.

Ich bin sicher, dass es sich hierbei um eine Kleinigkeit handelt aber 
ich komme leider nicht drauf und würde mich freuen, wenn ihr mir einen 
Hinweise geben könntet.

: Verschoben durch Moderator
von Paul S. (mrpaul)


Lesenswert?

Udo F. schrieb:
> Nabend zusammen,
>
> ich möchte mit meinem Atmega88 mittels SH-U09C5 und HTerm mittels UART
> kommunizieren. Leider scheitert es bereits an den Basics.
> Ein 'Hello World' - Blink Programm funktioniert problemlos.

Wenn bei diesem Programm etwas blinkt, stimmt etwas nicht. Du schaltest 
wenn überhaupt die LED an. Mehr nicht.

Zum Rest:
Es gibt sowohl für das Senden eines Bytes als auch das Empfangen zwei 
Bits, mit denen Sender und Empfänger eingeschaltet wird. Die fehlen.
D.h. am Ende deiner Init-Funktion muss
1
UCSR0B |= RXEN0

stehen, um den Empfänger anzuschalten.
Gleiches gilt beim Senden. Nachdem UDR0 beschrieben wurde, muss der 
Transmitter auch eingeschaltet werden
1
UCSR0B |= TXEN0

Wenn das Senden durch ist (TXC0=1), dann auch gern wieder ausschalten.

Außerdem fehlt noch die Angabe der Bitzahl im Register UCSR0C.

: Bearbeitet durch User
von Udo F. (utm)


Lesenswert?

Paul S. schrieb:
> Wenn bei diesem Programm etwas blinkt, stimmt etwas nicht. Du schaltest
> wenn überhaupt die LED an. Mehr nicht.
>
Natürlich hast du recht. Es blinkt nicht-es leuchtet einfach nur.

> Zum Rest:
> Es gibt sowohl für das Senden eines Bytes als auch das Empfangen zwei
> Bits, mit denen Sender und Empfänger eingeschaltet wird. Die fehlen.
> D.h. am Ende deiner Init-Funktion muss
>
>
1
UCSR0B |= RXEN0
>
> stehen, um den Empfänger anzuschalten.
> Gleiches gilt beim Senden. Nachdem UDR0 beschrieben wurde, muss der
> Transmitter auch eingeschaltet werden
>
>
1
UCSR0B |= TXEN0
>
> Wenn das Senden durch ist (TXC0=1), dann auch gern wieder ausschalten.
>
> Außerdem fehlt noch die Angabe der Bitzahl im Register UCSR0C.
Danke für den Hinweis. Das werde ich direkt morgen mal ausprobieren.

Jedoch versteh ich weiterhin nicht, warum die LED nicht leuchtet, wenn 
ich in der main Funktion die init Methode (und / oder alles andere bis 
auf den LED Teil) auskommentiere.

von Sebastian (Gast)


Lesenswert?

Muss nicht BAUD definiert werden bevor man setbaud.h inkludiert?

LG, Sebastian

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.