Atmega32 seriell Zeichen übertragen

OP #4360623
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.
Angehängte Dateien:
Gast #4360638
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.
Gast #4361372
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.
OP #4366579
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 ?
Gast #4366608
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.
#4366682
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.
Gast #4366756
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren