Forum: Mikrocontroller und Digitale Elektronik UART auf ATMega328p sendet nicht


von Lukas B. (lukas_be)


Lesenswert?

Hallo zusammen,

Ich versuche auf dem ATMega328p über UART zu senden.
Der TX Pin geht zwar nach aktivieren und setzen der Baud Rate auf 5V 
aber leider wird nichts gesendet. Der TX Pin bleibt dauerhaft auf 5V 
(Oszilloskop).
Der interne Oszillator (auf 8Mhz gefused) wird benutzt.

Der benutzte Quellcode ist:
1
#include <avr/io.h>
2
3
#define UBRR_9600 51 //value for UBRR for baud rate 9600 with 8Mhz
4
5
void uart_init(uint16_t ubrr)
6
{
7
  UCSR0B |=  (1 << TXEN0) | (1 << RXEN0);
8
    // set baudrate in UBRR
9
    UBRR0L = (uint8_t)(ubrr & 0xFF);
10
    UBRR0H = (uint8_t)(ubrr >> 8);
11
}
12
13
14
void uart_putc(unsigned char data)
15
{
16
  // wait for transmit buffer to be empty
17
    while(!(UCSR0A & (1 >> UDRE0)));
18
    // load data into transmit register
19
    UDR0 = data;
20
}
21
22
23
int main () 
24
{
25
  uart_init(UBRR_9600);
26
  while(1)
27
  {
28
    uart_putc('c');
29
  }
30
}

Hat jemand eine Idee warum der TX Pin einfach auf 5V bleibt?

Viele Grüße

von Carl D. (jcw2)


Lesenswert?

(1 >> UDRE0)

hat welchen Wert?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Schon mal wichtig :-P
Im Moment noch nicht interessant, aber wenn UCSZ02 - UCSZ00 im UCSR0C 
Register alle 0 sind, dann sendest du im 5-Bit Format.

von Carl D. (jcw2)


Lesenswert?

Matthias S. schrieb:
> Schon mal wichtig :-P
> Im Moment noch nicht interessant, aber wenn UCSZ02 - UCSZ00 im UCSR0C
> Register alle 0 sind, dann sendest du im 5-Bit Format.

Aber auch 5-Bit würden mit einem Startbit beginnen. ;-)

von Veit D. (devil-elec)


Lesenswert?


von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Carl D. schrieb:
> Aber auch 5-Bit würden mit einem Startbit beginnen. ;-)

Da hast du recht. Ich wollte nur der nächsten Frage vorbeugen :-)
Sicher ist dein Tip der wichtige Schritt, wie ich neidlos anerkenne.

von Carl D. (jcw2)


Lesenswert?

Hoffen wir mal, daß 3 Posts in 6 Jahren nichts besonderes bedeuten.

von Lukas B. (lukas_be)


Lesenswert?

Carl D. schrieb:
> (1 >> UDRE0)
>
> hat welchen Wert?

Das Bit ist dauerhaft gesetzt.

Überprüft mit:
1
void uart_putc(unsigned char data)
2
{
3
  // wait for transmit buffer to be empty
4
  if (UCSR0A & (1 << UDRE0))
5
  {
6
    PORTC |= (1 << PC0);
7
  }
8
  else
9
  {
10
    PORTC &=~(1 << PC0);
11
  }
12
  while(!(UCSR0A & (1 >> UDRE0)));
13
  // load data into transmit register
14
  UDR0 = data;
15
}

von Lukas B. (lukas_be)


Lesenswert?

Matthias S. schrieb:
> Schon mal wichtig :-P
> Im Moment noch nicht interessant, aber wenn UCSZ02 - UCSZ00 im UCSR0C
> Register alle 0 sind, dann sendest du im 5-Bit Format.

Danke, das behalte ich im Hinterkopf.
Allerdings sollte wie bereits angemerkt, auch so schon etwas auf dem 
Oszilloskop zu sehen sein.

Viele Grüße

von Carl D. (jcw2)


Lesenswert?

Lukas B. schrieb:
> Matthias S. schrieb:
>> Schon mal wichtig :-P
>> Im Moment noch nicht interessant, aber wenn UCSZ02 - UCSZ00 im UCSR0C
>> Register alle 0 sind, dann sendest du im 5-Bit Format.
>
> Danke, das behalte ich im Hinterkopf.
> Allerdings sollte wie bereits angemerkt, auch so schon etwas auf dem
> Oszilloskop zu sehen sein.
>
> Viele Grüße

Das wird es auch wenn du nicht darauf wartest, ob
 (irgendwas & (1 >> 5))
Jemals ungleich 0 wird.

Hint: >> Shift nach rechts

PS: meinen Vorwurf nehme ich zurück.
Typisch ist "User vor Jahren angelegt mit ganz wenigen Posts -> Troll".

: Bearbeitet durch User
von jo mei (Gast)


Lesenswert?

Lukas B. schrieb:
> while(!(UCSR0A & (1 >> UDRE0)));
----------------------^^-------------

Ja, das Shift Right ist hier generell falsch.

von Lukas B. (lukas_be)


Lesenswert?

Carl D. schrieb:
> Lukas B. schrieb:
>> Matthias S. schrieb:
>>> Schon mal wichtig :-P
>>> Im Moment noch nicht interessant, aber wenn UCSZ02 - UCSZ00 im UCSR0C
>>> Register alle 0 sind, dann sendest du im 5-Bit Format.
>>
>> Danke, das behalte ich im Hinterkopf.
>> Allerdings sollte wie bereits angemerkt, auch so schon etwas auf dem
>> Oszilloskop zu sehen sein.
>>
>> Viele Grüße
>
> Das wird es auch wenn du nicht darauf wartest, ob
>  (irgendwas & (1 >> 5))
> Jemals ungleich 0 wird.
>
> Hint: >> Shift nach rechts
>
> PS: meinen Vorwurf nehme ich zurück.
> Typisch ist "User vor Jahren angelegt mit ganz wenigen Posts -> Troll".

Ah natürlich. Jetzt funktioniert es. Schon ein bisschen peinlich.
Vielen Dank!

: Bearbeitet durch User
von Carl D. (jcw2)


Lesenswert?

Lukas B. schrieb:
>
> Ah natürlich. Jetzt funktioniert es. Schon ein bisschen peinlich.
> Vielen Dank!

Das gibt es auch 35Jahren noch, daß man Tomaten auf den Augen hat, wie 
ich ab und an feststellen muß. ;-)

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.