Sehr geehrtes Forum,
ich verzweifle schon seit zwei Tagen eine läpische UART Kommunikation
zum PC hinzubekommen, mit einem Atmega48.
Das RS232 Modul und die Verbindung zum PC können es nicht sein, da habe
ich schon versuche unternommen, dort eine Fehlerquelle zu entdecken.
Ich verwende am PC das Terminalprogramm H-Term.
Dies ist mein Quellcode:
Wirre Daten, immer die gleichen.
Meine Einstellung bei Hterm:
Baud 9600, Stopbit 1.
Was mache ich falsch, was kann ich tun damit es funktioniert?
Danke,
m.f.G:: Developer_X
Was für eine Chip hängt zwischen den uC und dem PC?
Wie bereits vorgeschlagen, die Frequenz des uCs kontrollieren. Versuch
einfach mal ein anderes Terminalprogram zu nutzen(z.B Putty) bei mir
hatte sich Hterm am Anfang auch ein wenig zickig verhalten, als ich mit
meinem ATMEGA644 mit dem PC kommunizieren wollte. Versuche erst mal ein
einfaches Zeichen zu senden, bevor du den String sendest. Oder
funktioniert das bereits?
Nein dies funktioniert ebenfalls nicht.
Der ist nicht kalibriert, interner Takt.
Ich habe es auch schon mit einer sehr niedrigen Baud
Frequenz benutzt, und es hat nicht geklappt.
Früher hat es mit dem Chip zwischen Rs232 und Atmega auch
geklappt, und klappt es weiterhin mit z.B. einem Atmega88.
Mit einem Atmega48 habe ich es nur noch nie hinbekommen.
Mit hterm hatte es auch immer geklappt bis jetzt.
Nimm dir die Datenblätter für den Atmega8 und den Atmega48 vor und
setzte die Registereinstellungen vernünftig um. Bei deiner
Umdefinierungsorgie eines Beispiels für den Atmega8 steigt ja überhaupt
keiner durch.
K. R. schrieb:> Es funktioniert trotzdem immer noch nicht
RXD und TXD sind beim ATMega48 auf PD0 und PD1 gemappt.
Ich finde jedoch keine Einstellung für Port D.
Mindestens müsste PD1 auf Output gesetzt werden damit TXD
was tun kann.
> Jemand ne Idee was man sonst noch tun kann?
Hast Du den Takt auch schon mal ∗überprüft∗, z.B. Blinken-LED im
Sekundentakt oder mit einem Ossi? Wie sie die Baudrate auf einem Ossi
aus?
ich habe DDRD auf output gesetzt, und trotzdem funktioniert es nicht.
es hat doch schon vorher funktioniert, er sendet doch daten, doch nur
leider müll, und keine vernünftigen sachen.
K. R. schrieb:> ich habe DDRD auf output gesetzt, und trotzdem funktioniert es nicht.
Wo? Ich habe es nicht gefunden in dem Mini Code Urwald.
Das würde bedeuten dass alle Pins auf Output stehen, damit bekommst
du einen Treiberkonflikt mit dem RXD Pfad deines RS232 Bausteins.
Ach verdammt, es lag an dem Atmega48, mit diesen
Mistdingern werde ich wohl einfach nicht mehr arbeiten.
Ich habe einfach nen anderen Atmega eingesetzt, e voila, es
funktioniert.
Damit hätte ich mir viel Zeit und Ärger sparen können.
Übrigstens geht es auch ohne DDRB = 0xFF;
Danke und
m.f.G.: Developer_X
K. R. schrieb:> Ich habe leider keinen Ossi, und bei den Blinkenden LEDs wird klar,> dass bei _delay_ms(100) durchaus ne halbe sekunde gewartet wird.
Dann wirst Du in Wirklichkeit keine 4 MHz CPU-Takt haben. Wenn Du die
Fuses nicht verändert hast, hast Du 1 MHz mit +/-10% Genauigkeit:
"The device is shipped with internal RC oscillator at 8.0MHz and with
the fuse CKDIV8 programmed, resulting in 1.0MHz system clock."
Also erstmal #define F_CPU 4000000UL auf #define F_CPU 1000000UL ändern.
Gruß Dietrich
K. R. schrieb:> Ach verdammt, es lag an dem Atmega48, mit diesen> Mistdingern werde ich wohl einfach nicht mehr arbeiten.
Ja echd, dieser Misd ..... dass der überhaupt noch verkauft
wird bzw. verkauft werden darf ....
Im Zeifelsfall liegt es ja immer am Hersteller, gelle ?
Und wenn der nicht Schuld sein kann, dann war es der
Verkäufer, gelle?
> [..] und bei den Blinkenden LEDs wird klar,> dass bei _delay_ms(100) durchaus ne halbe sekunde gewartet wird.
^^^^^^ ^^^^^^^^^^^^^
Takt richtig einstellen und gut iss - mit Rundungsfehler läuft Dein m48
mit 1MHz statt mit 4MHz.
g457 schrieb:> Takt richtig einstellen und gut iss - mit Rundungsfehler läuft Dein m48> mit 1MHz statt mit 4MHz.
Die Clock Fuses scheinen sich noch nicht zum Thread-Ersteller
durchgesprochen zu haben .....
Also ich habe das ganze jetzt mit nem Atmega88 hinbekommen, 8MHz.
Das Problem jetzt: Wenn ich Buchstaben senden lasse, indem ich sie über
ihre Nummer definiere, z.B. 042, kommt bei Hterm auch 42 an.
Wenn ich chars aber über 'T' definiere, kommen sie auch an, sind aber in
HTerm nicht dargestellt.
Wenn man die berühmte Methode itoa benutze, in Verbindung mit
uart_puts (char * s)
dann kommen bei mir nur wirre Zeichen an,
ich weiß nicht woran das liegt.
Liegt das daran, dass Hterm falsch eingestellt ist, oder dass
Atmegas ein Problem mit ASCII haben?
kommt bei hterm zwar die richtige Anzahl an Zeichen an, aber nur
das D und das T werden dargestellt, die anderen Buchstaben werden durch
Rechtecke ersetzt.
Woran könnte das liegen?
Danke,
m.f.G.: Developer_X
Hi
>Also ich habe das ganze jetzt mit nem Atmega88 hinbekommen, 8MHz.
Wenn das der interne RC-Oszillator ist, sind die beschriebenen Probleme
nicht verwunderlich.
MfG Spess
Ähnliches habe ich gestern durch: ein gebrauchter mega8, der schon 1
Jahr im outdoor-Einsatz war, hat in 1MHz intern nur 0.9 MHz. Kein
Zeichen erkennbar. Dank Anfangsverdacht und Logikanalyzer aber kein
wirkliches Problem. Ein neuer m8 ist besser, aber nicht gut. Ein 8MHz
Quarz ist noch besser, wenn vorhanden, ist aber nur ein baudrate-Quarz
optimal.
Am Besten, Du nimmst eine fertige lib, zB von Peter Dannegger oder
andere. Dann hast Du ggf einen Puffer für RX und TX gleich mit dabei.
Und Beispiele, die funktionieren.
K. R. schrieb:> Das Problem jetzt: Wenn ich Buchstaben senden lasse, indem ich sie über> ihre Nummer definiere, z.B. 042, kommt bei Hterm auch 42 an.
Das ist totaler Mist. Eine vorangestellte '0' kennzeichnet in C eine
Oktalzahl.
Mach einen ganz einfachen Test:
Klemm dein Terminal an und sende irgendwas. Wenn das Zeichen nicht
quittiert wird, stimmt entweder deine Baudrate(CPU-Takt?) nicht oder an
deiner Hardware ist was faul. Die LED an PB0 toggelt bei jedem
empfangenen Zeichen.
spess53 schrieb:> Mit den Werkseinstellungen darf er irgendwo zwischen 7,2 und 8,8MHz> liegen.
Kommt auf die Spannung und Temperatur an. Bei 3V und 25° liegt er 0,1%
daneben.
mfg.
spess53 schrieb:> Das Datenblatt (Table 29-1) sagt>> Frequency VCC Temperature Calibration Accuracy> Factory 8.0MHz 3V 25°C ±10%> Calibration>> MfG Spess
0,1% stimmt auch nicht. 1% ist richtig.
Der Takt ist bei 3V/25°C kalibriert. Dabei hat er eine Toleranz von 1%.
Über den gesamten zulässigen Temperatur- und Spannungsbereich hat er
eine Abweichung von 10%. Mit User-Calibration dagegen lässt sich zu
jeder Spannung und Temperatur 1% Toleranz herstellen.
Das steht da zwar nicht eindeutig so, lässt sich aber eindeutig
nachmessen.
mfg.