Forum: Mikrocontroller und Digitale Elektronik Printf-Ausgabe mit dem ATTINY2313 fehlerhaft


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Frederik R. (f8bit)


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

von da1l6 (Gast)


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

von Dirk B. (dirkb2)


Bewertung
0 lesenswert
nicht lesenswert
Frederik R. schrieb:
> "Hallo Welt!\0"

Für die Null sorgt der Compiler. Die musst du nicht explizit angeben.

von Dirk B. (Gast)


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

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]
  • [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.