Forum: Compiler & IDEs UART Übertragungsproblem


von Daniel (Gast)


Lesenswert?

Hallo zusammen,

ich habe mit Hilfe vom Tutorial folgenden C-Code erstellt:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include <avr/interrupt.h>
4
#include <stdlib.h>
5
6
7
#ifndef F_CPU
8
9
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
10
#define F_CPU 8000000UL    // Systemtakt in Hz - Definition als unsigned long beachten >> Ohne ergeben Fehler in der Berechnung
11
#endif
12
 
13
#define BAUD 9600UL          // Baudrate
14
 
15
// Berechnungen
16
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
17
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
18
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
19
 
20
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
21
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
22
#endif
23
24
  
25
void init(void)
26
{  
27
  UCSR0B  |= (1<<TXEN0);                // UART TX einschalten
28
    UCSR0C   |= (1<<UCSZ01)|(1<<UCSZ00);    // Asynchron 8N1 
29
 
30
    UBRR0H = UBRR_VAL >> 8;
31
    UBRR0L = UBRR_VAL & 0xFF;
32
}
33
34
35
int uart_putc(unsigned char c)
36
{
37
      while (!(UCSR0A & (1<<UDRE0)))  /* warten bis Senden moeglich */
38
      {
39
      }                             
40
 
41
      UDR0 = c;                      /* sende Zeichen */
42
      return 0;
43
}
44
 
45
 
46
/* puts ist unabhaengig vom Controllertyp */
47
void uart_puts (char *s)
48
{
49
      while (*s)
50
      {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
51
      uart_putc(*s);
52
      s++;
53
      }
54
}
55
56
void senden (uint16_t send_help)
57
{
58
    char s[7];
59
    uint16_t i = send_help;
60
   
61
       //uart_init();
62
 
63
       itoa( i, s, 10 ); // 10 fuer radix -> Dezimalsystem
64
       uart_puts( s );
65
 
66
       // da itoa einen Zeiger auf den Beginn von s zurueckgibt verkuerzt auch:
67
       //uart_puts( itoa( i, s, 10 ) );
68
}
69
70
71
72
int main(void)
73
{
74
75
init();
76
while(1)
77
{
78
  senden('A');
79
}
80
81
}


Ich hatte diesen Code in einem anderen Programm mit eingebaut. Am Anfang
hat alles wunderbar funktioniert, doch jetzt bekomme ich nur noch 
komische Zeichen ausgegeben. Um dem Fehler auf den Grund zu gehen hab 
ich eben nur diesen Code auf den Controller (mega88) aufgespielt, aber 
auch hier kommen nur komische Zeichen an bzw. in HyperTerminal kommt 
sogar gar nichts an. Die Empfangsprogramme sind auf 9600Baud eingestellt 
mit 8 Datenbit und 1 Stoppbit.
Hab ich oben irgendeinen Fehler mittlerweile mit eingebaut?

Hoffe ihr könnt mir helfen.

Gruß
Daniel

von Daniel (Gast)


Lesenswert?

Aber richtig strange ist, dass wenn ich den Takt auf 1MHz und 4800Baud 
runternehm, dann wird einwandfrei übertragen.

von Norgan (Gast)


Lesenswert?

Interner RC Oszillator? Sein nix gut für genaues RS232 Timing. Müssen 
kalibriert werden. Auf internen Takt-Teiler müssen Du achten auch.
Besser gehen externer Baudraten-Quarz mit zwei Kondensatoren. Kost fast 
nix. Kriegst du < 1 Euro. Machen viel mehr Spaß.

Extra aufpassen müssen bei Fuse setzen.

Steht alles in Tutorial. Guggst du.

von Daniel (Gast)


Lesenswert?

@Norgan:
Auf so eine dumme Antwort kann ich auch verzichten!!!
Und außerdem geht es auch mit dem internen Takt!!!
Habe den Fehler gefunden.

von Norgan (Gast)


Lesenswert?

Krass Alder, bist da suapa Hacker mit voll die Ansprüche hier.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Daniel wrote:
> Aber richtig strange ist, dass wenn ich den Takt auf 1MHz und 4800Baud
> runternehm, dann wird einwandfrei übertragen.

Was soll das heissen wenn Du den Takt "runternimmst". Mal etwas genauer 
und vor allem welchen Quarz verwendest Du? Interner Oszillator ist 
generell nicht geeignet fuer die USART, wurde ja schon gesagt.

von Falk B. (falk)


Lesenswert?


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.