Forum: Mikrocontroller und Digitale Elektronik Uart schnittstelle erscheint leer im Seriellen Monitor mit AVR


von Alexander W. (awe90)


Lesenswert?

Servus,
nachdem mich Google nicht weiter gebracht hat und ich auch nich mehr 
weiter weiß, hier mal die Frage an alle.
Ich habe einen Atmega 328P der mit Atmel Studio 6 und AVRISP mkII 
programmiert wird. Wenn ich nun allerdings über die Serielle 
Schnittstelle was schicken will, erscheint bei mir auf dem PC nur 
"unsichtbare" Zeichen (soll heißen: im Monitor kommt etwas an, es ist 
aber so zu sagen, weiße Schrift auf weißem Hintergrund). Zum empfangen 
nutze ich einen Parallel Programmer oder eine Bluetooth-Verbindung (lief 
vorher bei einem Arduino ohne Probleme).
Habe es jetzt schon mit verschiedenen Monitoren versucht (Arduino, 
CoolTerm, Q Serial, Tera Term).
Vielleicht hat ja jemand eine Idee woran es liegen könnte.
Gruß Alex
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
#define F_CPU 8000000UL // Systemtakt in Hz
5
6
#define BAUD 9600UL // Baudrate
7
 
8
#define TEILER ((F_CPU+BAUD*8)/(BAUD*16)-1) // Runden
9
#define BAUD_REAL (F_CPU/(16*(TEILER+1))) // Reale Baudrate
10
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille
11
 
12
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
13
  #error Systematischer Fehler der Baudrate grösser 1%! 
14
#endif 
15
16
void usart_init(void);
17
void usart_transmit(unsigned char c);
18
void usart_write (char* s);
19
20
int main(){
21
  
22
  usart_init();
23
  while(1){
24
    
25
    usart_write("Hallo Welt\n");
26
    _delay_ms(1000);  
27
  }
28
}
29
30
// USART initialisieren
31
void usart_init(void){
32
  // Teiler der Baudrate in Register schreiben
33
  UBRR0H = TEILER >> 8;
34
  UBRR0L = TEILER & 0xFF;
35
 
36
  // Sender einschalten
37
  UCSR0B |= (1<<TXEN0);
38
  // Asynschron, 8 Datenbit, Kein Paritätsbit, 1 Stoppbit = 8N1
39
  UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);
40
}
41
42
// Ein Zeichen senden
43
void usart_transmit(unsigned char c){
44
  // Warten bis UDR0 leer ist
45
  while (!(UCSR0A & (1<<UDRE0)));
46
  
47
  // Zeichen in Puffer schreiben
48
  UDR0 = c; 
49
}
50
51
// Eine Zeichenkette senden
52
void usart_write (char* s)
53
{
54
  // s ist ein Zeiger auf eine Zeichenkette
55
  // *s ist der Inhalt (also das Zeichen an der Stelle)
56
  // solang der Zeiger auf die Zeichenkette nicht auf \0 zeigt
57
    while (*s)
58
    {  
59
    usart_transmit(*s);
60
    s++; // Zeiger um 1 erhöhen
61
    }
62
}

von Alexander W. (awe90)


Lesenswert?

Also Problem gelöst.
Es lag an einer Fuse die den System takt um Faktor 8 reduziert. Daher 
lief der uC nicht mit 8 Mhz sondern mit 1 Mhz

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.