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


von Psy B. (psyborg)


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!

von Psy B. (psyborg)


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?

von Willi W. (williwacker)


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

von Psy B. (psyborg)


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.

von Torsten (Gast)


Lesenswert?

Hallo,

nur mal so als Gedanke: F_CPU ist auch gesetzt?

von Psy Borg (Gast)


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.

von jens (Gast)


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.

von Psy Borg (Gast)


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.


von jens (Gast)


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

von Psy Borg (Gast)


Lesenswert?

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

  

von Psy Borg (Gast)


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 :-)

von Willi W. (williwacker)


Lesenswert?

Schön, dass Du auch gesagt hast, wo Dein Fehler lag !

Ciao

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.