Moin Leute,
ich sitze grade zum ersten mal am UART und muss gestehen
hundertprozentig klar ist mir das ganze noch nicht.
Aber gut mit etwas hin und hergezappel und dem Tutorial gelesen, bekomme
ich schonmal eine Ausgabe über den TX hin,
kurz zu meinem Aufbau:
Ich habe einen ATmega32A, dessen TX in den TX pin vom Arduino UNO
gesteckt ist, die Masse habe ich von beiden ebenfalls verbunden.
Mein Code sieht folgendermaßen aus:
Im Seriellen Monitor von Arduino kommt allerdings nur Kauderwelsch
heraus:
÷÷÷××÷÷÷÷÷÷÷÷×÷÷÷Ö÷õ÷÷÷÷÷÷÷÷÷÷÷÷÷þ×÷÷÷÷õö÷÷ö÷÷õ÷÷õ÷÷ç÷÷ç÷÷ö÷÷÷÷÷÷÷÷÷÷÷÷÷
÷÷÷÷÷þ÷÷÷÷þ÷÷Ö÷þ÷Öõ÷÷õ÷÷þ÷þ÷÷÷Öþ÷÷÷÷Ö÷÷÷÷þ÷÷÷÷×÷÷÷þ÷÷÷÷÷÷÷÷Ö÷÷÷÷÷÷÷÷÷÷ö÷
÷÷
Die Baudrate ist im Seriellen Fenster von arduino ebenfalls auf 9600.
Ich denke mal irgendwo hab ich die Baudrate falsch berechnet oder etwas
vergessen, sehen tu ich den fehler allerdings nicht.
Wäre super wenn mir da jmd weiterhelfen könnte.
Grüße
Martin
Hi
>Interner RC Oszillator verwendet? Der liegt manchmal etwas daneben.
Braucht es nicht. Bei 1MHz und 9600Bd beträgt der Baudratenfehler 7%.
MfG Spess
Martin Kathke schrieb:> Ich habe einen ATmega32A, dessen TX in den TX pin vom Arduino UNO> gesteckt ist
TX sollte mit RX verbunden werden, wenn ich mich recht erinnere. Aber da
du ja anscheinend schon was empfängst hast du dich wohl verschrieben.
nichtGast schrieb:> TX sollte mit RX verbunden werden, wenn ich mich recht erinnere. Aber da> du ja anscheinend schon was empfängst hast du dich wohl verschrieben.
Bist du dir da sicher?!
Ich habe den Arduino UNO als DIL Variante und habe den Prozessor einfach
abgezogen und Kabel von meinem ATmega32A rübergezogen.
Hab in DatenBlatt geschaut wo TX und RX liegen und entsprechend
verbunden.
Ich will ja nur den kleinen Chip vom Arduino als Serielle Schnittstelle
zum debuggen nutzen ;)
Georg G. schrieb:> Interner RC Oszillator verwendet?
nein
hab auch leider kein quarz da
Hi
>Ich will ja nur den kleinen Chip vom Arduino als Serielle Schnittstelle>zum debuggen nutzen ;)
Begreife es endlich: 9600Bd gehen nicht mit deinem Programm. Die einzige
Möglichkeit wäre Doublespeed. Dazu must du aber die Baudratenberechnung
ändern.
MfG Spess
spess53 schrieb:> Begreife es endlich: 9600Bd gehen nicht mit deinem Programm. Die einzige> Möglichkeit wäre Doublespeed. Dazu must du aber die Baudratenberechnung> ändern.>> MfG Spess
Verstehe leider nur Bahnhof :S
Martin Kathke schrieb:> Georg G. schrieb:>> Interner RC Oszillator verwendet?>> nein> hab auch leider kein quarz da
WAS VERWENDEST DU? Lass Dir nicht alles aus der Nase ziehen.
Und Spess hat natürlich Recht, bei 1Mhz wird das mit 9600 Baud sowieso
nichts.
Klaus 2m5 schrieb:> WAS VERWENDEST DU? Lass Dir nicht alles aus der Nase ziehen.
Wenn ich keinen Quarz habe werde ich wohl den Internen Oszillator nutzen
und da oben im Code #define F_CPU 1000000UL steht, läuft der wohl mit
1mHz ;)
Oder versteh ich dich falsch und du wolltest andere Informationen?
Klaus 2m5 schrieb:> Und Spess hat natürlich Recht, bei 1Mhz wird das mit 9600 Baud sowieso> nichts.
Und auf was müsste ich gehen das es läuft?
im Tutorial machen sie das auch mit 1MHz
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART
Hab die Geschwindigkeit einfach mal auf 8Mhz angehoben.
Jetzt läufts. Wüsste denoch gerne warum das auf 1Mhz nicht läuft
schließelich machen die das im Tutorial ja auch
>Hab die Geschwindigkeit einfach mal auf 8Mhz angehoben.>Jetzt läufts. Wüsste denoch gerne warum das auf 1Mhz nicht läuft>schließelich machen die das im Tutorial ja auch
Weil
#define F_CPU 1000000UL
den Takt nicht umstellt. Das ist nur eine Angabe
wie hoch der Takt ist. DU musst schon selber dafür
sorgen das diese Angabe auch stimmt.
Übrigens, wenn du noch Probleme bei der Übertragung haben solltest,
speziell mit der Anzahl der übertragenen Datenbits, solltest du dir
diese Zeile noch einmal anschauen.
Martin Kathke schrieb:> UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
spess53 schrieb:>>Interner RC Oszillator verwendet? Der liegt manchmal etwas daneben.>> Braucht es nicht. Bei 1MHz und 9600Bd beträgt der Baudratenfehler 7%.
Richtig.
Wenn aber zufällig der interne Taktgeber seine 10% Toleranz der
Werkskalibrierung in die richtige Richtung ausnutzt, geht's dann doch
wieder...
Und wenn man sich nicht auf die Werkskalibrierung verläßt, sondern das
selber gezielt macht, geht's sogar ganz sicher. Jedenfalls solange die
Temperatur sich nicht nennenswert ändert. Und sogar dagegen kann man was
machen, denn der Tiny24 besitzt ja einen internen Temperatursensor und
eine interne Referenzspannungsquelle.
Also: mit der entsprechenden Software betrieben, genügt einmaliges
Kalibrieren anhand eines bekannten Signals (ich würde eine Folge von
ununterbrochen gesendeten 'U's empfehlen) während man das Teil mit einem
Fön aufheizt. Danach läuft die Scheiße bis in alle Ewigkeit. Amen.
holger schrieb:> Weil>> #define F_CPU 1000000UL>> den Takt nicht umstellt. Das ist nur eine Angabe> wie hoch der Takt ist. DU musst schon selber dafür> sorgen das diese Angabe auch stimmt.
Ich weiß, allerdings geh ich davon aus, dass wenn er das in dem Tutorial
macht seine Taktfrequenz auch auf 1Mhz steht.
Holger L. schrieb:> Übrigens, wenn du noch Probleme bei der Übertragung haben solltest,> speziell mit der Anzahl der übertragenen Datenbits, solltest du dir> diese Zeile noch einmal anschauen.>> Martin Kathke schrieb:>> UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0)
Das hab ich ich zwar direkt aus dem Datenblatt von Atmel übernommen aber
ich werde es mir nochmal genauer anschauen, so ganz hab ich UART noch
nicht verstanden. (Dich wundert wahrscheinlich die 3 beim UCSZO ?!) Ich
lese nochmal nach ;)
@c-hater klingt interessant, aber ich bleib für mich erstmal bei den
basics bis das sicher sitzt !
Martin Kathke schrieb:> Ich weiß, allerdings geh ich davon aus, dass wenn er das in dem Tutorial> macht seine Taktfrequenz auch auf 1Mhz steht.
Wenn du es nicht weißt, solltest du es überprüfen. Schreib ein kurzes
Programm, in dem du eine LED z.B. im 1 Hz Rhythmus blinken läßt. Wenn
sie das tatsächlich tut, stimmen Geschwindigkeitsangabe und
Geschwindigkeit überein.
Mike schrieb:> Wenn du es nicht weißt, solltest du es überprüfen. Schreib ein kurzes> Programm, in dem du eine LED z.B. im 1 Hz Rhythmus blinken läßt. Wenn> sie das tatsächlich tut, stimmen Geschwindigkeitsangabe und> Geschwindigkeit überein.
Damit überprüfe ich doch nur meine eigene Taktfrequenz?!
Und da bin ich mir sicher was ich in den Fuses eingestellt habe
Martin Kathke schrieb:> Damit überprüfe ich doch nur meine eigene Taktfrequenz?!
Nein, wenn der Prozessor mit einer anderen Frequenz läuft, als du im
Programm oder in der IDE als Prozessorfrequenz eingestellt ist, werden
die daraus abgeleiteten Wert nicht zur tatsächlichen Taktfrequenz passen
und die LED blinkt eben nicht in dem im Programm festgelegten Takt.
Martin Kathke schrieb:> Holger L. schrieb:>> Übrigens, wenn du noch Probleme bei der Übertragung haben solltest,>> speziell mit der Anzahl der übertragenen Datenbits, solltest du dir>> diese Zeile noch einmal anschauen.>>>> Martin Kathke schrieb:>>> UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0)>> Das hab ich ich zwar direkt aus dem Datenblatt von Atmel übernommen aber> ich werde es mir nochmal genauer anschauen, so ganz hab ich UART noch> nicht verstanden. (Dich wundert wahrscheinlich die 3 beim UCSZO ?!) Ich> lese nochmal nach ;)
Entschuldige, ich wollte keine Verwirrung stiften, das war ein
Schnellschuß.
Allerdings entzieht sich mir die Logik warum ausgerechnet in einem
Beispielcode so ein Mist steht der anscheinend nur dafür da ist damit es
hübsch aussieht.
Wenn man nur UCSZ1 setzten möchte schreibt man doch auch nicht
(2<<UCSZ0).
Deshalb nutze ich persönlich nur die ausführliche Schreibweise :
UCSRC = (1<<URSEL)|(1<<USBS)|(1<<UCSZ0)|(1<<UCSZ1);