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


von Frederik R. (f8bit)


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)


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)


Lesenswert?

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

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

von Dirk B. (Gast)


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.

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.