mikrocontroller.net

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


Autor: Seb Astian (mbauer79)
Datum:

Bewertung
0 lesenswert
nicht 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
.include "m32def.inc"
 
.def temp    = r16                              ; Register für kleinere Arbeiten
.def zeichen = r17                              ; in diesem Register wird das Zeichen an die
                                                ; Ausgabefunktion übergeben
 
.equ F_CPU = 16000000                            ; Systemtakt in Hz
.equ BAUD  = 9600                               ; Baudrate
 
; Berechnungen
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))      ; Reale Baudrate
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille
 
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))       ; max. +/-10 Promille Fehler
  .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
.endif
 
    ; Stackpointer initialisieren
 
    ldi     temp, HIGH(RAMEND)
    out     SPH, temp
    ldi     temp, LOW(RAMEND)
    out     SPL, temp
 
    ; Baudrate einstellen
 
    ldi     temp, HIGH(UBRR_VAL)
    out     UBRRH, temp
    ldi     temp, LOW(UBRR_VAL)
    out     UBRRL, temp
 
    ; Frame-Format: 8 Bit
 
    ldi     temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
    out     UCSRC, temp
 
    sbi     UCSRB,TXEN                  ; TX aktivieren
 
loop:
    ldi     zeichen, 'T'
    rcall   serout                      ; Unterprogramm aufrufen
    ldi     zeichen, 'e'
    rcall   serout                      ; Unterprogramm aufrufen
    ldi     zeichen, 's'
    rcall   serout                      ; ...
    ldi     zeichen, 't'
    rcall   serout
    ldi     zeichen, '!'
    rcall   serout
    ldi     zeichen, 10
    rcall   serout
    ldi     zeichen, 13
    rcall   serout
    rcall   sync                        
    rjmp    loop
 
serout:
    sbis    UCSRA,UDRE                  ; Warten bis UDR für das nächste
                                        ; Byte bereit ist
    rjmp    serout
    out     UDR, zeichen
    ret                                 ; zurück zum Hauptprogramm
 
; kleine Pause zum Synchronisieren des Empfängers, falls zwischenzeitlich
; das Kabel getrennt wurde
                                    
sync:
    ldi     r16,0
sync_1:
    ldi     r17,0
sync_loop:
    dec     r17
    brne    sync_loop
    dec     r16
    brne    sync_1  
    ret

1. C-Code der angeblich das wiedergibt was ankommt:
#include <avr/io.h>
#include <inttypes.h>

// Sollte schon im Makefile definiert sein.
// In dem Fall hier einfach löschen.
#define F_CPU       16000000UL

#define BAUD        19200UL
#define UBRR_BAUD   ((F_CPU/(16UL*BAUD))-1)

// USART initialisieren
void uart_init(void)
{
    // Baudrate einstellen (Normaler Modus)
    UBRRH = (uint8_t) (UBRR_BAUD>>8);
    UBRRL = (uint8_t) (UBRR_BAUD & 0x0ff);

    // Aktivieren von receiver und transmitter
    UCSRB = (1<<RXEN)|(1<<TXEN);

    // Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
    UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}

int main(void)
{
    uint8_t buffer;

    // USART initialisieren
    uart_init();

    while (1)
    {
        // Warten bis Daten empfangen wurden
        while ( !(UCSRA & (1<<RXC)) )
            ;

        // Empfangsregister auslesen
        buffer = UDR;

        // Warten bis der Sendepuffer frei ist
        while ( !( UCSRA & (1<<UDRE)) )
            ;

        // Daten in den Puffer schreiben und damit senden
        UDR = buffer;
    }
}

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;)

Autor: Seb Astian (mbauer79)
Datum:

Bewertung
0 lesenswert
nicht 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?!

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.