UART Problem beim ATMEGA328

Gast #1379121
Hallo,

ich hab ein Porblem meinem ATmega328 klar zu machen, dass er über UART 
senden soll.

Hier der Code:
1
#ifndef USART_C_
2
#define USART_C_
3

4
#include <avr/io.h>
5
#include <stdint.h>
6
#include <util/delay.h>
7
#include "usart.h"
8

9
#ifndef F_CPU
10
#error F_CPU not defined.
11
#endif
12
#define UBRR_VAL ((F_CPU+UART_BAUD*8)/(UART_BAUD*16)-1)
13
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))
14
#define BAUD_ERROR ((BAUD_REAL*1000)/UART_BAUD)
15
#if ((BAUD_ERROR>1010) || (BAUD_ERROR<990))
16
#error Baud-error above 1%
17
#endif
18

19
void UARTInit() {
20
  DDRD = (1<<PIND1);
21

22
  UBRR0H = (unsigned char) (UBRR_VAL >> 8);
23
  UBRR0L = (unsigned char) UBRR_VAL;
24

25
  UCSR0B = (1 << RXEN0) | (1 << TXEN0);
26

27
  UCSR0C = (1 << USBS0) | (3 << UCSZ00);
28

29
  //UCSR0B = (1 << TXEN0);
30
  //UCSR0C = (3 << UCSZ00);
31
  //UBRR0 = UBRR_VAL;
32
}
33

34
void UARTWriteChar(unsigned char Character) {
35
  while (!(UCSR0A & (1 << UDRE0)));
36
  UDR0 = Character;
37
}
38
  
39
[...]
40

41
#endif /* USART_C_ */

Die Baudrate habe ich im usart.h auf 38400 baud gestellt.

Wenn ich nun im Hauptprogramm die Init-Fkt. und direkt danach die 
WriteChar-Fkt. aufrufe, um mir das Zeichen 0xAA augeben zu lassen, 
passiert ... nix. Mein oszi gibt mir auf dem TX pin nur dauerhaft High 
aus, da ist keine veränderung zu beobachten....
Der Code der Funktionen ist übrigens der aus dem Datenblatt des µCs.

Meine Frage: Was hab ich falsch gemacht, dass ich überhaupt kein Signal 
am TX-Pin bekomme?

Vielen Dank in Vorraus.
Gast #1379151
Das Obere ist die datei usart.c, die über die usart.h in die main.c 
eingebunden ist.

In der main.c steht dann:
1
...
2

3
main () {
4

5
...
6

7
UARTInit();
8
UARTWriteChar('A'); // A oder ein beliebiger Char...
9

10
...
11

12
}
Persönliche Seite #1379171
Zwei Fragen:

1. Führt der AVR diese Zeilen auch aus?

UARTInit();
UARTWriteChar('A'); // A oder ein beliebiger Char...

Möglicherweise stockt der AVR bereits in den ... Codezeilen zuvor oder 
läuft bei untauglichem Hardwareaufbau überhaupt nicht. Ich beantworte 
mir solche Fragen gerne anhand einer einfachen Debug-LED in der Nähe der 
seltsamen Codestelle.

2. Misst du zu dem Zeitpunkt bereits mit dem Oszilloskop?

I.A. ist es nützlicher die Senderoutine nicht einmal sondern mehrmals 
durchzuführen, um eine mehrfache Messmöglichkeit zu haben
Gast #1379193
Okay... das wars, Timingproblem, hab jetzt hübsche Rechteckpulse auf dem 
Schirm ;) Danke Stefan.

Ist es sinnvoll nach der Init-Funktion die von AVR implementierte 
Delay-Funktion zu benutzen oder bringt die nix, weil der µC dann die 
ganze Zeit beschäftigt ist?
Persönliche Seite #1379200
Eine zwingend notwendige Wartezeit zwischen init und send ist mir 
noch nie aufgefallen. Müsste ich erst in den AVR Datenblättern stöbern.

Vielleicht hat sich das Problem bei mir auch nie gezeigt, weil ich 
üblicherweise Initialisierung und aktuelles Arbeiten im Programm 
getrennt habe. D.h. zwischen beidem sind noch andere Befehle z.B. 
Interrupts initialisieren, Ports konfgurieren etc.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.