Atmega 128 USART Problem

Gast #580193
Lesenswert?
• ▲
▼
Ich habe die uart_puts und uart_putc für meinen Atmega128 eingebunden, 
wie hier beschrieben:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Schreiben_einer_Zeichenkette_.28String.29

Die Registernamen habe ich geändert.

Konfiguration auf 9600, 8 Datenbits, 1 Stopbit, No Parity, Asynchronous.

Am PC ist ein Terminal-Programm eingeschaltet, was für den String 
("Hallo") aber nur ‹Ë½!…±ÙoHal¶oHal¶ und noch ein paar mehr wirre 
Zeichen ausgibt. Außerdem wundert mich, dass die Zeichen ständig 
ausgegeben werden, obwohl keine Schleife implementiert ist. Bei 9600 
Baud dürfte das doch eigentlich nicht passieren. Woran kann das liegen?

Hier der Code:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include <stdio.h>
4

5
#ifndef F_CPU
6
#define F_CPU 16000000UL
7
#endif
8
  
9
  
10

11
int uart_putc(unsigned char c)
12
{
13
    while (!(UCSR0A & (1<<UDRE0)))  /* warten bis Senden moeglich */
14
    {
15
    }
16
 
17
    UDR0 = c;                      /* sende Zeichen */
18
    return 0;
19
}
20
 
21
 
22
/* puts ist unabhaengig vom Controllertyp */
23
void uart_puts (char *s)
24
{
25
    while (*s)
26
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
27
        uart_putc(*s);
28
        s++;
29
    }
30
}
31

32

33
 
34
int main(void)
35
{                                                   // RS232 Buffer
36

37
    // USART initialization
38
    // Communication Parameters: 8 Data, 1 Stop, No Parity
39
    // USART Receiver: On
40
    // USART Transmitter: On
41
    // USART Mode: Asynchronous
42
    // USART Baud rate: 9600
43
    UCSR0A=0x00;
44
    UCSR0B=0x18;
45
    UCSR0C=0x86;
46
    UBRR0H=0x00;
47
    UBRR0L=0x67;
48

49
   uart_puts("Hallo");
50
    return 0;
51

52
}
Persönliche Seite #580205
Lesenswert?
• ▲
▼
Wohin führt das return in main und was macht der µC dann? Ist der UART 
bei diesem return bereits fertig mit dem Senden?

Bist du sicher, dass

    UCSR0A=0x00;
    UCSR0B=0x18;
    UCSR0C=0x86;
    UBRR0H=0x00;
    UBRR0L=0x67;

dem entspricht?

    // Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART Receiver: On
    // USART Transmitter: On
    // USART Mode: Asynchronous
    // USART Baud rate: 9600

Üblicherweise arbeitet man hier mit symbolischen Konstanten oder Makros, 
um ohne Datenblattstudium schnell auf Plausibilität prüfen zu können.

Wie gross ist der angegebene Baudratenfehler bei 16 MHz und 9600 Baud 
(Tabelle im Datenblatt).

Antwort schreiben

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.

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.