Forum: Mikrocontroller und Digitale Elektronik Atmega32 und UM232R - kommt nix an am PC


von Seb A. (mbauer79)


Lesenswert?

Hallo liebe Leute,

ich habe eine Frage bezüglich des Zusammenspiels eines Atmega32 und 
eines UM232R.

Ich bin neu im Bereich µC, hab mittlerweile grundsätzliche Dinge gelernt 
wie LED, Taster und Servo in Betrieb genommen werden.

Nächstes Ziel ist es nun eine Kommunikation zum PC herzustellen. 
Dementsprechend habe ich mir einen UM232R zugelegt.

Nun habe ich schon mehrfach versucht ein Test...oder wenigstens 
irgendetwas zum PC zu senden. Es geht nichts. Wen wunderts? Ich denke 
niemanden.

Also ich habe den GND des UM an den GND des µC angeschlossen sowie den 
RX des UM an den TX des µC und den TX des UM an den RX des µC.

Allerdings passiert einfach nix. Komischerweise hatte ich vorher TX an 
TX und RX an RX und da kam wenigsten Müll am PC an. Nun kommt garnix 
mehr :(

Sollte ich eine RX bzw. TX LED mit rein bauen (weiß allerdings nich wie 
die in die Schaltung implementiert wird) oder sollte ich ein anderes 
Terminal als Hterm nutzen oder sollte ich einfach alles in den Müll 
hauen und mir n neues Hobby suchen? (letzteres war nur Spass, ich 
erwarte keine Antwort)

Ich weiß nicht wie ich weiter vor gehen soll :( (hab auch kein Oszi)

Hier mal der Code den ich aufm Mega laufen lasse möchte:

1. Assemblercode der angeblich Test ausgibt
1
.include "m32def.inc"
2
 
3
.def temp    = r16                              ; Register für kleinere Arbeiten
4
.def zeichen = r17                              ; in diesem Register wird das Zeichen an die
5
                                                ; Ausgabefunktion übergeben
6
 
7
.equ F_CPU = 16000000                            ; Systemtakt in Hz
8
.equ BAUD  = 9600                               ; Baudrate
9
 
10
; Berechnungen
11
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden
12
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))      ; Reale Baudrate
13
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille
14
 
15
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))       ; max. +/-10 Promille Fehler
16
  .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
17
.endif
18
 
19
    ; Stackpointer initialisieren
20
 
21
    ldi     temp, HIGH(RAMEND)
22
    out     SPH, temp
23
    ldi     temp, LOW(RAMEND)
24
    out     SPL, temp
25
 
26
    ; Baudrate einstellen
27
 
28
    ldi     temp, HIGH(UBRR_VAL)
29
    out     UBRRH, temp
30
    ldi     temp, LOW(UBRR_VAL)
31
    out     UBRRL, temp
32
 
33
    ; Frame-Format: 8 Bit
34
 
35
    ldi     temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
36
    out     UCSRC, temp
37
 
38
    sbi     UCSRB,TXEN                  ; TX aktivieren
39
 
40
loop:
41
    ldi     zeichen, 'T'
42
    rcall   serout                      ; Unterprogramm aufrufen
43
    ldi     zeichen, 'e'
44
    rcall   serout                      ; Unterprogramm aufrufen
45
    ldi     zeichen, 's'
46
    rcall   serout                      ; ...
47
    ldi     zeichen, 't'
48
    rcall   serout
49
    ldi     zeichen, '!'
50
    rcall   serout
51
    ldi     zeichen, 10
52
    rcall   serout
53
    ldi     zeichen, 13
54
    rcall   serout
55
    rcall   sync                        
56
    rjmp    loop
57
 
58
serout:
59
    sbis    UCSRA,UDRE                  ; Warten bis UDR für das nächste
60
                                        ; Byte bereit ist
61
    rjmp    serout
62
    out     UDR, zeichen
63
    ret                                 ; zurück zum Hauptprogramm
64
 
65
; kleine Pause zum Synchronisieren des Empfängers, falls zwischenzeitlich
66
; das Kabel getrennt wurde
67
                                    
68
sync:
69
    ldi     r16,0
70
sync_1:
71
    ldi     r17,0
72
sync_loop:
73
    dec     r17
74
    brne    sync_loop
75
    dec     r16
76
    brne    sync_1  
77
    ret

1. C-Code der angeblich das wiedergibt was ankommt:
1
#include <avr/io.h>
2
#include <inttypes.h>
3
4
// Sollte schon im Makefile definiert sein.
5
// In dem Fall hier einfach löschen.
6
#define F_CPU       16000000UL
7
8
#define BAUD        19200UL
9
#define UBRR_BAUD   ((F_CPU/(16UL*BAUD))-1)
10
11
// USART initialisieren
12
void uart_init(void)
13
{
14
    // Baudrate einstellen (Normaler Modus)
15
    UBRRH = (uint8_t) (UBRR_BAUD>>8);
16
    UBRRL = (uint8_t) (UBRR_BAUD & 0x0ff);
17
18
    // Aktivieren von receiver und transmitter
19
    UCSRB = (1<<RXEN)|(1<<TXEN);
20
21
    // Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
22
    UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
23
}
24
25
int main(void)
26
{
27
    uint8_t buffer;
28
29
    // USART initialisieren
30
    uart_init();
31
32
    while (1)
33
    {
34
        // Warten bis Daten empfangen wurden
35
        while ( !(UCSRA & (1<<RXC)) )
36
            ;
37
38
        // Empfangsregister auslesen
39
        buffer = UDR;
40
41
        // Warten bis der Sendepuffer frei ist
42
        while ( !( UCSRA & (1<<UDRE)) )
43
            ;
44
45
        // Daten in den Puffer schreiben und damit senden
46
        UDR = buffer;
47
    }
48
}

von holger (Gast)


Lesenswert?

>Allerdings passiert einfach nix. Komischerweise hatte ich vorher TX an
>TX und RX an RX und da kam wenigsten Müll am PC an. Nun kommt garnix
>mehr :(

Das war dann möglicherweise die richtige Beschaltung.
Nur die Baudrate stimmte noch nicht.

TX oder RX sagt ja noch nicht 100% wo was hin kommt.
TxDin und TxDout ist schon ein Unterschied;)

von Seb A. (mbauer79)


Lesenswert?

Danke für die Antwort!

Ich habe die RX und TX Pins jetzt wieder vertauscht. Jetzt kommt nicht 
mal mehr Müll an :(

Wie hoch ist denn die Wahrscheinlichkeit das ich was zerstört habe?!

von Helfer (Gast)


Lesenswert?

Welche Schaltung hast du aufgebaut?

Wurde die AVR Checkliste bereits abgearbeitet? Wichtigster Punkt: 
Lies die AVR Fuses aus und zeige das Ergebnis oder bestätige die 
korrekte Funktion des 16MHz Taktgebers durch ein definiertes Programm 
z.B. Blinkprogramm.

Wie stehen die Jumper auf dem UM232R-Modul?
http://www.mikrocontroller.net/part/UM232R

Ist der Atmega32 gesockelt oder sind dessen TXD/RXD Pins zugänglich, so 
dass man einfach einen Loopbacktest als Funktionstest für 
PC-Schnittstelle und UM232R-Modul machen kann?

Loopbacktest heisst Atmega32 aus dem Sockel nehmen (oder in RESET 
versetzen, wenn der aufgelötet ist) und Drahtbrücke zwischen TXD und RXD 
stecken. Terminalprogramm auf dem PC starten, Software-Echo ausschalten 
und Texte senden. Durch die Drahtbrücke sollte ein Echo erzeugt werden.

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.