Forum: Mikrocontroller und Digitale Elektronik UART Problem beim ATMEGA328


von Nick (Gast)


Lesenswert?

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.

von P. S. (Gast)


Lesenswert?

main() fehlt.

von Nick (Gast)


Lesenswert?

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
}

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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

von Nick (Gast)


Lesenswert?

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?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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.

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.