Forum: Mikrocontroller und Digitale Elektronik RS232 tut nicht - Hilfe bei Diagnose


von Marten P. (alias5000)


Lesenswert?

Hallo zusammen,
ich versuche derzeit an einer ATmega32-Platine mit einem max232 
(Verdrahtung nach 
http://www.rn-wissen.de/index.php/AVR-Einstieg_leicht_gemacht#Daten_und_Texte_zum_PC_.C3.BCbertragen) 
eine grundlegende µC<->PC-Kommunikation zum Laufen zu bringen.
Der µC wird von einem 16MHz Quarzoszillator auf Trab gehalten und 
scheint zuverlässig zu funktionieren.
Nun habe ich den Quellcode aus dem Wiki genommen (siehe hier: 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART#UART_initialisieren), 
um den UART zu initialisieren und periodisch alle 500ms ein 'x' zu 
senden.
Da ich leider kein Oszilloskop besitze, kann ich mir die generierte 
Signalform nicht ansehen, allerdings habe ich mittels einer LED erkennen 
können, dass auf der TxD-Leitung des µC alle 500ms etwas passiert.
Durch diverse Tests kann ich sicher sagen, dass das Beschreiben des 
Registers "UDR" alle 500ms periodisch durchgeführt wird; d.h. dass es in 
der Hinsicht keine Fehler im Quellcode gibt.

Das Problem ist allerdings, dass auf meinem PC-Terminal (GTKTerm unter 
Ubuntu) nichts passiert.

Um zu testen, ob es am PC liegen könnte, habe ich RxD und TxD der 
PC-Leitung überbrückt und vom PC aus etwas gesendet. Dies wurde im 
Terminal korrekt zurückgesendet. Am PC an sich liegt es wohl nicht.

Wie und wo würdet ihr weiter nach Problemen suchen? Ich stehe ein wenig 
auf dem Schlauch...

Vielen Dank!
alias5000

=======================================================================

Auszüge aus dem Quellcode:
1
/*
2
  UART-Init:
3
Berechnung des Wertes für das Baudratenregister
4
aus Taktrate und gewünschter Baudrate
5
*/
6
7
#ifndef F_CPU
8
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
9
   F_CPU im Makefile definiert werden, eine nochmalige Definition
10
   hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
11
   #ifndef/#endif
12
13
   Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio
14
   verwendet wird und dort eine andere, nicht zur Hardware passende
15
   Taktrate eingestellt ist: Dann wird die folgende Definition
16
   nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?)
17
   von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
18
   noch nicht definiert: */
19
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
20
#define F_CPU 16000000UL  // Systemtakt in Hz - Definition als unsigned long beachten
21
                         // Ohne ergeben sich unten Fehler in der Berechnung
22
#endif
23
24
#define BAUD 4800UL      // Baudrate
25
26
// Berechnungen
27
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
28
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
29
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
30
31
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
32
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
33
#endif
34
35
void initializeUART();
36
37
int main (void)
38
{
39
  char currentMode = 1;
40
  char lastMode = 0;
41
42
  //erstmal alles initialisieren
43
  initializePorts();
44
  initializeUART();
45
46
47
  while(1) {
48
            //hier wird sonstiges Getan, bei dem offensichtlich (durch LED-Anzeigen) sichergestellt ist, dass der Code hier nicht hängen bleibt
49
50
        while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
51
        {
52
        }
53
54
        UDR = 'x';                    /* schreibt das Zeichen x auf die Schnittstelle */
55
        //_delay_ms(500);
56
57
  }
58
59
}
60
61
void initializeUART() {
62
    UCSRB |= (1<<TXEN)|(1<<RXEN);  // UART TX/RX einschalten
63
    UCSRC |= (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);  // Asynchron 8N1
64
65
    UBRRH = UBRR_VAL >> 8;
66
    UBRRL = UBRR_VAL & 0xFF;
67
68
69
}

von PeterL (Gast)


Lesenswert?

einer der häufigsten Fehler: TX RX vertauscht, einfach mal umdrehen, 
geht schneller, als den Aufbau genau zu kontrollieren.

von Marten P. (alias5000)


Lesenswert?

Oh Mensch, das wars :-)

Ich habe extra einen Wannenstecker und keine Steckerleiste verwendet, 
damit die beiden nicht falsch kommen können. Und das Überprüfen der 
Pläne war offensichtlich auch nicht besser, denn sonst wäre mir 
aufgefallen, dass die vertauscht sind.

...vielen Dank für diesen Anschubser!

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.