mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART Problem beim ATMEGA328


Autor: Nick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Hier der Code:
#ifndef USART_C_
#define USART_C_

#include <avr/io.h>
#include <stdint.h>
#include <util/delay.h>
#include "usart.h"

#ifndef F_CPU
#error F_CPU not defined.
#endif
#define UBRR_VAL ((F_CPU+UART_BAUD*8)/(UART_BAUD*16)-1)
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))
#define BAUD_ERROR ((BAUD_REAL*1000)/UART_BAUD)
#if ((BAUD_ERROR>1010) || (BAUD_ERROR<990))
#error Baud-error above 1%
#endif

void UARTInit() {
  DDRD = (1<<PIND1);

  UBRR0H = (unsigned char) (UBRR_VAL >> 8);
  UBRR0L = (unsigned char) UBRR_VAL;

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

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

  //UCSR0B = (1 << TXEN0);
  //UCSR0C = (3 << UCSZ00);
  //UBRR0 = UBRR_VAL;
}

void UARTWriteChar(unsigned char Character) {
  while (!(UCSR0A & (1 << UDRE0)));
  UDR0 = Character;
}
  
[...]

#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.

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
main() fehlt.

Autor: Nick (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:

...

main () {

...

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

...

}


Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Nick (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.