UART Übertragungsproblem

Gast #932191
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
Gast #932234
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren