www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega128 und USART/UART nicht hilfts


Autor: Psy Borg (psyborg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, Leute!

Versuche seit mehreren Stunden die Kommunikation zwischen µC und PC 
hinzubekommen. Habe entsprechende Schaltung mit MAX232 realisiert. 
µC-Board hat einen 16MHZ Quarz, die Clock-Fuses sind auf externen Quarz 
eingestellt.
D.h. ich habe nun alles mögliche gemacht, trotzdem kommt am PC-Terminal 
"fast" nur Müll an.

Here ist der Code:

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

// USART initialisieren
void uart_init(void)
{
    UBRR0H = (uint8_t) (UBRR_BAUD>>8);
    UBRR0L = (uint8_t) (UBRR_BAUD & 0x0FF);
    UCSR0B = (1<<RXEN0)|(1<<TXEN0);
  UCSR0C = (0 << USBS) | (3 << UCSZ00);
}


// Get data from the input
uint8_t get_data(void)
{
  while(!(UCSR0A & (1<<RXC)));
  return UDR0;
}

// put data to the output
void put_data(uint8_t c)
{
  while(!( UCSR0A & (1<<UDRE)));
  UDR0 = c;
}


// LOOP back
int main(void)
{
    // USART initialisieren
    uart_init();

  put_data(0x20);
  put_data('h');
  put_data('e');
  put_data('l');
  put_data('l');
  put_data('o');
  put_data('!');
  put_data('\n');

  // loopback schleife
    while (1)
    {
    //int i;
    //for (i=0; i < 100; i++) _delay_ms(10);
    put_data(0xFF);
  }
}


Das Board verfügt über einen ATmega128. Die Fusebits sind richtig 
gesetzt (stehen auf 1111, d.h. ext. Quarz). Am Board ist ein 16MHZ 
Quartz. Mit Hilfe von _delay_ms Schleifen konnte ich ein Zeichen am 
Terminal jede Sekunde empfangen, d.h. der Takt scheint wohl zu stimmen.

Wenn ich nun 0xFF sende, kommt immer nur 0x01 an. Das Terminalprogramm 
ist auf 8N1 eingestellt. Baudrate ist 9600.

Was kan ich denn noch tun, um die Signale korrekt zu senden.

Vielen Dank!

Autor: Psy Borg (psyborg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe nun herausgefunden, dass der FE0 ab und zumal gesetzt wird. D.h. 
ich habe Frame Errors, wenn ich Daten vom Rechner empfange. Dies kann 
aber kaum sein, da die Terminalsoftware genauso gesetzt ist, wie die 
avr.

Was nun?

Autor: Willi Wacker (williwacker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne mir Dein Programm detailliert angesehen zu haben: Welches 
Terminalprogramm nimmst Du denn? Wir haben mit Hyperlink (mit Windows 
mitgeliefert) sehr schlechte Erfahrungen gemacht. Vielleicht solltest Du 
einfach mal ein anderes versuchen.

Vielleicht auch einen anderen Rechner.

Oder einen anderen USB-Serial-Adapter. Oder hast Du noch eine "richtige" 
RS232-Schnittstelle, das wäre das allerbeste. Ist das BIOS richtig 
konfiguriert?

Hast Du eine Möglichkeit, den Pegel zu messen? Für den PC sollen es 
schon 12V sein.

Das mit den Frame-Errors würde ich erst einmal noch nicht so eng sehen.

Kurz zusammengefasst: Vielleicht ist es Deine Schaltung/Programm nicht, 
sondern der PC ?

Versuch doch auch mal, einen Kurzschluss zwischen RxD und TxD zu machen, 
um zu sehen, ob Du Deine eigenen Daten empfangen kannst. Auf beiden 
Seiten!

Möge es helfen
Willi Wacker

Autor: Psy Borg (psyborg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Willi Wacker wrote:
> Ohne mir Dein Programm detailliert angesehen zu haben: Welches
> Terminalprogramm nimmst Du denn? Wir haben mit Hyperlink (mit Windows
> mitgeliefert) sehr schlechte Erfahrungen gemacht. Vielleicht solltest Du
> einfach mal ein anderes versuchen.
Ich benutze minicom (Linux). Ausserdem habe ich versucht die ttyS1 
(Com1) Schnittstelle direkt in eine Datei umzuleiten (cat  /dev/ttyS1 > 
test.log). Zuvor natürlich mit stty die richtigen Parameter eingestellt. 
Tortzdem keine Verbesserung.

> Vielleicht auch einen anderen Rechner.
Das werde ich heute ausprobieren.

> Oder einen anderen USB-Serial-Adapter. Oder hast Du noch eine "richtige"
> RS232-Schnittstelle, das wäre das allerbeste. Ist das BIOS richtig
> konfiguriert?
Ich habe noch eine richtige RS232-Schnittstelle. Habe extra beim Kauf 
des Rechners darauf geachtet :-)

> Hast Du eine Möglichkeit, den Pegel zu messen? Für den PC sollen es
> schon 12V sein.
Der Pegel liegt im Bereich von +-10V. Mehr schafft der MAX232 auch 
nicht.

> Das mit den Frame-Errors würde ich erst einmal noch nicht so eng sehen.
>
> Kurz zusammengefasst: Vielleicht ist es Deine Schaltung/Programm nicht,
> sondern der PC ?
Kann auch sein. So langsam glaube ich wirklich dass dies der Fall sein 
könnte. Obowhl dieser Rechner schafft es Problemlos durch das 
Nullmodemkabel die dBox oder andere Reciever zu programmieren.

> Versuch doch auch mal, einen Kurzschluss zwischen RxD und TxD zu machen,
> um zu sehen, ob Du Deine eigenen Daten empfangen kannst. Auf beiden
> Seiten!
Bereits probiert und es klappt. Habe sogar einen Kurzschluss nach dem 
MAX232 ausprobiert, um zu sehen, ob die Daten vom PC zu MAX und zurück 
richtig ankommen. Und es scheint zu funktionieren.


Habe zudem anderes SUBD Kabel probiert und die VCC,GND von MAX232 an 
eigenes Netzwerk zu legen (also nicht die vom AVR board). Trotzdem kein 
Erfolg.

Autor: Torsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

nur mal so als Gedanke: F_CPU ist auch gesetzt?

Autor: Psy Borg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja F_CPU ist gesetzt. Am anderen Rechner ausprobiert und trotzdem das 
gleiche Problem. Komischerweise sind die Fehler, also die falschen 
Zeichen, immer gleich falsch. D.h. für gleichen Output ist fast immer 
das gleiche Zeichen was rauskommt. Tue ich im AVR ein Echo 
programmieren, dann sehe ich zwischen den komischsten Zeichen auch den 
den ich vom PC aus abgeschickt habe.

Sieht wirklich nach einem Timing Problem aus, nur das Problem ist, dass 
alles richtig eingestellt ist. Ich habe nun 1200 Baudrate probiert und 
die Fehler sind die gleichen.


Kann es vielleicht sein, dass der Quartz spinnt? Wie könnte man ihn 
prüfen?

Ich weiss nicht mehr weiter.

Autor: jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, bin jetzt nicht so der C-Experte, frage mich aber warum das 
Baudratensetting so kompliziert berechnet/eingestellt wird!? Für 9600 
Baud bei 16 MHz ist UBRR 103. Kommt das bei dieser komischen Berechnung 
auch raus? Hatte selber mit der USART und Mega128 nie Probleme.

Autor: Psy Borg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe auch dierekt 103 probiert anzugeben, tortzdem gab es Problemen.
Habe zum testen 4 mal 01010101, also 0xAA durchgeschickt.
Ich bekamm dann 0x58 0x58 0x58 0x15 zurück. In bitschreibweise sieht es 
fast so aus, wie die 01010101, dennoch nicht ganz.

Kann mir jemand seine Einstellungen von den UCSSR0A/B/C schicken, aber 
nur falls ihr auch mega128 habt.


Autor: jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab meinen Mega128 zufällig auch mit 9600 Baud laufen (aber bei 
14,7456MHz) hier meine Einstellungen:

clr    r16           ;Konfiguration RS232Funk
ldi    r17,$5f        ;Baudrate= 9600 ($5F)
sts    UBRR1H,r16
sts    UBRR1L,r17        ;Set Baudrate
ldi    r16,$6        ;8Data/1Stop/No Parity
sts    UCSR1C,r16         ;Set Configuration
ldi    r16,$98        ;Receiver+INT &
sts    UCSR1B,r16    ;Enable

Autor: Psy Borg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja deine Einstellungen ensprechen meinen. Trotzdem hilfts es nicht.
Das ist mein aktuelle Setup code:
  UCSR1A &= ~(1<<U2X);
  UCSR1B = (1<<TXEN1) | (1 << RXEN1);
  UCSR1C = (1 << UCSZ10) | (1 << UCSZ11);
  UBRR1H = (uint8_t) 0;//(UBRR_BAUD >> 8);
  UBRR1L = (uint8_t) 103;//(UBRR_BAUD & 0xFF);

  

Autor: Psy Borg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, danke.

Ich habe endlich mal den Bug gefunden. Nichts war an den Einstellungen 
falsch. Das Board was ich benutze hat bereits einen ICL3232 Chip 
eingebaut, der bereits die Pegelumwandlung vornimmt. Die Pegelumwandlung 
ist aber leider nur bis +-5V, und nicht +-10V wie bei MAX232. Im 
Internet konnte man wenig über den ICL Chip finden, und alle swas man 
fand, war irgendwie in chin. Sprache :-)

Warum ich das übersehen habe, weiss ich auch nicht. Ohne den MAX läuft 
die Verbindung zum Rechner problemlos. Hoffentlich hält der ICL3232 die 
RS-232 Spannung von bis zu 12V aus :-)

Autor: Willi Wacker (williwacker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schön, dass Du auch gesagt hast, wo Dein Fehler lag !

Ciao

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.