Printf-Ausgabe mit dem ATTINY2313 fehlerhaft

OP #5472921
Lesenswert?
• ▲
▼
Hallo Community,

um eine serielle Schnittstelle für mein Projekt zu realisieren, versuche 
ich mithilfe von UART vom µC aus einen String an einen "USB to TTL" 
Treiber zu schicken (CP2102), welchen dieser dann an den PC schicken 
soll.

Der "USB to TTL" Treiber funktioniert(Habe RX direkt an TX angeschlossen 
und über gtkterm getestet.)

Nur wenn ich das nachfolgende Programm auf den Tiny lade und mit dem 
Treiber verbinde, erhalte ich unter gtkterm immer nur: "Ha!" statt 
"Hallo Welt!"

Ich habe schon die Möglichkeit mit ein und zwei Stopbits ausprobiert, da 
dies ja bei langsameren Komponenten teilweise empfohlen wird. Hat sich 
aber nichts geändert.

Ihr wisst sicherlich mehr! Vielen Dank für eure Hilfe!


1
#include <avr/io.h>
2
#include <util/delay.h>
3

4

5
#define F_CPU 1000000UL
6

7

8
void init();
9
void UART_transmit(uint8_t);
10
void UART_transmit_String(char *);
11

12
int main() {
13
  init();
14
  
15
  while(1) {
16
    UART_transmit_String("Hallo Welt!\0");
17
    _delay_ms(1000);
18
    
19
  }
20
  
21
}
22

23
void init() {
24
  UBRRH = 0x00;    //Baudrate Initialisierung
25
  UBRRL = 0x33;    //0x33 fuer 1200, 0x0C fuer 4800
26
  
27
    
28
  UCSRB =  (1 << RXEN) | (1 << TXEN);        //Enable von Senden und Empfangen
29
  
30
  
31
  UCSRC = (0 << UCSZ2) | (1 << UCSZ1) | (1 << UCSZ0) | (1 << USBS);      //8 Daten Bits und 2 Stop Bits
32
}
33

34
void UART_transmit(uint8_t data) {
35
    while(UDRE == 0){}
36
    UDR = data;
37
    _delay_ms(1);
38
}
39

40
void UART_transmit_String(char * text) {
41
  while( *text != '\0') {
42
    UART_transmit(*text++);
43
  }
44
}
Gast #5472939
Lesenswert?
• ▲
▼
1. Das ist falsch rum:
1
#include <util/delay.h>
2

3

4
#define F_CPU 1000000UL

F_CPU muss VOR delay.h definiert sein, sonst kommt der Wert dort nicht 
an. Normalerweise definiert man das über Compiler Flags im Makefile.
Der Fehler sollte auch eine Compilerwarnung auslösen! Warnungen sind zum 
ernst nehmen da!

1
 while(UDRE == 0){}
2
    UDR = data;
3
    _delay_ms(1);
Zwei mal falsch.
2. UDRE ist eine Konstante:
1
#define    UDRE    5
Die ist immer != 0, die Schleife tut also nichts.
Du meinst das hier:
1
while (USR & (1 << UDRE)) {}

3. Das _delay_ms hat da nichts zu suchen und funktioniert aufgrund von 
Fehler 1 auch gar nicht richtig.

Grüße
da1l6
Gast #5473408
Lesenswert?
• ▲
▼
da1l6 schrieb:
> 3. Das _delay_ms hat da nichts zu suchen und funktioniert aufgrund von
> Fehler 1 auch gar nicht richtig.
in dem Fall: 8 Zeichen("llo Welt")=8ms 9 bitzeiten 1/1200 7,5ms ("!" bei 
8ms) zufällig richtig.
Ändert natürlich nichts daran, dass es unpassend/falsch ist. Vermutlich 
wäre 2) sogar ohne einfacher zu finden.

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.