Forum: Mikrocontroller und Digitale Elektronik Atmega32 seriell Zeichen übertragen


von Thomas S. (endress)


Angehängte Dateien:

Lesenswert?

Hallo Mikrocontroller Gemeinde,

ich hab ein eigentlich kleines Problem, dass ich aber nicht in den Griff 
bekomme. Daten seriell an einen zweiten PC übertragen.

Ich benutze ein STK500 mit einer Atmega32-16PU und bekomme einfach keine 
korrekte Übertragung hin.

Vielleicht habt ihr eine Idee, woran es liegen könnte.

Ich hab die beiden Rechner schon mit einem Nullmodemkabel direkt 
zusammengehängt und die Übertragung über ein Terminalprogramm getestet: 
Funktioniert einwandfrei, von meinem Versuchsaufbau bekomme ich nur 
Sonderzeichen, was ja auf falsche Baudrate etc hindeutet, das hab ich 
aber 20 mal mit allen möglichen Parametern versucht, ohne Erfolg.
Derzeit sind eingestellt: 9600/8N1
Code im Anhang. Bin für jeden Vorschlag dankbar.

von Ulrich F. (Gast)


Lesenswert?

Meine Glaskugel sagt:
Du hast einen Knick im Rechenschieber.

Stelle mal den Seriellen Port des PCs auf 1200 Baud...
Das dürfte den 51 in UBRR bei 1MHz entsprechen.



PS:
1MHz und 9600 Baud ist recht Aussichtslos.
Das liegt um rund 7% daneben.

von Johannes (Gast)


Lesenswert?

#define F_CPU 1000000UL

Evtl. ist deine Abweichung zu groß? Da ist ja kein Baudratenquartz 
verbaut.

Bzw. wie füllst du UBBRH und L? Ich seh da nirgends die soll Baudrate.

von Thomas S. (endress)


Lesenswert?

@Ulrich: Kannst du mir deine Glaskugel gelegentlich mal ausleihen ? 
Volltreffer... Wer rechnen kann ist klar im Vorteil. Vielen Dank !

Problem gelöst.

von Ulrich F. (Gast)


Lesenswert?

Thomas S. schrieb:
> Kannst du mir deine Glaskugel gelegentlich mal ausleihen ?
Lieber nicht...


Als bekennender Arduino Jünger habe ich meine Kugel auf meine 
Bedürfnisse getrimmt, sie ist also recht selektiv. Und mit den 
Sprüchlein, welche sie liefert, macht man sich hier u.U. unbeliebt.

von Thomas S. (endress)


Lesenswert?

Jetzt muss ich den Thread doch nochmal ausgraben.

Mittlerweile läuft die Atmega32 mit einem externen Quarz auf 8Mhz, aber 
ich kann nach wie vor keine Baudraten jenseits der 2400 nutzen.

Bei 2400 Baud funktioniert es wunderbar, aber ab 4800 kommt nur noch 
Mist an...

Ich hab jetzt auch einen anderen PC als Empfänger getestet, der direkt 
eine Serielle Schnittstelle onboard hat, ändert sich nichts.

Hat jemand noch eine Idee woran das noch liegen kann ?

: Bearbeitet durch User
von Thomas E. (thomase)


Lesenswert?

Thomas S. schrieb:
> Hat jemand noch eine Idee woran das noch liegen kann ?

Da gibt es jetzt 2 Möglichkeiten:

1. Du wartest auf den mit der Glaskugel.
2. Du postest dein Programm. Vollständig und als *.c-File!

mfg.

von Karl M. (Gast)


Lesenswert?

Hallo Thomas S.,

bitte poste doch alle Infos:

a) das vollständige Programm
b) den Aufbau
b.1) den Schaltplan
b.2) Bilder vom Aufbau
c) die gesetzten und gedachten Fuse-Bits

Danke.

Ich verwende laut Datenblatt Table 60 /Equations for Calculating Baud 
Rate Register Setting/ des Atmel Atmega32 eine von zwei Formeln zur 
Berechnung der Daten für die Register UBRRH:UBRRL.
a) U2X=0: UBBR := f_CPU /(Baudrate *16) -1
b) U2X=1: UBBR := f_CPU /(Baudrate  *8) -1

Welchen Wert hat das Bit U2X in UCSRA "USART Control and Status 
Register A" ?

Beachtest Du auch das Datenformat, bzgl. Baudrate, Parity, Start- und 
Stoppbits auf beiden Seiten ?

Beachtest Du auch die Notwendigkeiten des Bits URSEL in UCSRC ?
Siehe: "USART Baud Rate Registers - UBRRL and UBRRH" im Datenblatt.

von wendelsberg (Gast)


Lesenswert?

Thomas S. schrieb:
> Mittlerweile läuft die Atmega32 mit einem externen Quarz auf 8Mhz, aber
> ich kann nach wie vor keine Baudraten jenseits der 2400 nutzen.

Welche Baudraten bekommst Du denn tatsaechlich mit dem Quarz, dem 
Vorteiler, den UART-Einstellungen?

wendelsberg

von Wolfgang (Gast)


Lesenswert?

Johannes schrieb:
> Evtl. ist deine Abweichung zu groß? Da ist ja kein Baudratenquartz
> verbaut.

Dieses "evtl." sollte sich durch einen Blick ins Datenblatt Tabellen 
19-9 ... 19-12 /Examples of UBRR Settings for Commonly Used Oscillator 
Frequencies/ leicht klären lassen.

von Dieter F. (Gast)


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

Wolfgang schrieb:
> Johannes schrieb:
>> Evtl. ist deine Abweichung zu groß? Da ist ja kein Baudratenquartz
>> verbaut.
>
> Dieses "evtl." sollte sich durch einen Blick ins Datenblatt Tabellen
> 19-9 ... 19-12 /Examples of UBRR Settings for Commonly Used Oscillator
> Frequencies/ leicht klären lassen.

Man könnte auch einfach die Berechnungsmakros aus baud.h benutzen. Die 
geben Alarm wenn die Abweichung zu gross ist und haben den Vorteil, dass 
man sich bei korrekt angegebene F_CPU und der gewünschten Baudrate nicht 
händisch verrechnen kann oder in einer Tabelle aus der falschen Spalte 
abliest.
Use the force!
Der Compiler kann das.

: Bearbeitet durch User
von Ulrich F. (Gast)


Lesenswert?

Thomas E. schrieb:
> 1. Du wartest auf den mit der Glaskugel.

Anwesend!

Thomas S. schrieb:
> Mittlerweile läuft die Atmega32 mit einem externen Quarz auf 8Mhz, aber
> ich kann nach wie vor keine Baudraten jenseits der 2400 nutzen.
Ein 8MHZ Quarz, statt intern 1MHz, ist schön und gut...
Aber wenn die CKDIV8 Fuse weiterhin gesetzt ist, ändert sich genau 
NICHTS in Bezug auf die Baudrate.
OK, die Fehlerrate wird genauer eingehalten....
Aber mehr auch nicht.

von spess53 (Gast)


Lesenswert?

Hi

>Aber wenn die CKDIV8 Fuse weiterhin gesetzt ist, ändert sich genau
>NICHTS in Bezug auf die Baudrate.

Der ATMega32 kennt keine CKDIV8-Fuse.

MfG Spess

von Ulrich F. (Gast)


Lesenswert?

spess53 schrieb:
> Der ATMega32 kennt keine CKDIV8-Fuse.

OK...
Danke.
Dann behaupte ich ab jetzt das Gegenteil...

Es wäre dann wirklich interessant, womit das/die Baudrateregister 
gefüllt 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.