Forum: Mikrocontroller und Digitale Elektronik ATTiny2313A-Problem mit UART


von Bruno M. (brumay)


Lesenswert?

Hallo,

ich versuche seit geraumer Zeit bei einem ATTiny2313A den UART zum 
Laufen zu bringen. Da sich der Controller bereits auf einer Platine 
befindet, habe ich bei der Hardware kaum noch Änderungsmöglichkeiten.

Was habe ich bisher gemacht:
- Ich habe einen kleinen Code geschrieben für einen ATMega48 in 
Verbindung mit einem RFM12B. Zum Testen habe ich mir dafür auch den UART 
eingerichtet.

-Nachdem alles problemlos funktionierte, habe ich mir die Platine 
gebaut, allerdings bestückt mit einem ATTiny2313A. Ich bekomme damit 
zwar eine UART-Verbindung, aber nur Hieroglyphen. Ich habe praktisch 
alle Baudraten durchbrobiert, kein Erfolg. Getaktet wird der Prozessor 
vom RFM12 mit 10MHz.

-Zum Testen habe ich dann noch eine Lochstreifenplatine mit einem 
einfachen ATTiny2313(DIL) bestückt. Anfangs gab es auch damit Probleme, 
aber nach Änderung der UBRR-Formel (ursprünglich hatte ich die Formel 
aus dem Tutorial) lief es eigentlich problemlos. Auch die C_Variante von 
Fleury lief einwandfrei.

-Diese Erkenntnis habe ich auf den 2313A übertragen, aber auch das war 
erfolglos. Auch die C-Funktion von Fleury habe ich getestet. Allerdings 
ist auch dort der 2313A nicht standardmäßig enthalten, sondern nur der 
2313. Da die beiden aber praktisch baugleich sein sollen, sollte diese 
Anpassung kein Problem darstellen. Leider funktioniert aber auch das 
nicht.

Nun bin ich mit meinem Latein am Ende, daher die Frage, ob jemand schon 
einschlägige Erfahrung mit dem 2313A gemacht hat.

von Karl H. (kbuchegg)


Lesenswert?

Bruno M. schrieb:

> -Nachdem alles problemlos funktionierte, habe ich mir die Platine
> gebaut, allerdings bestückt mit einem ATTiny2313A. Ich bekomme damit
> zwar eine UART-Verbindung, aber nur Hieroglyphen. Ich habe praktisch
> alle Baudraten durchbrobiert, kein Erfolg. Getaktet wird der Prozessor
> vom RFM12 mit 10MHz.

Sagst du.
Wenn die Baudratenberechnung korrekt ist (und mit Hilfe der Makros aus 
setbaud.h ist das ja keine Hexerei), dann deuten deine 'Hieroglyphen' 
zuallererst einmal dahin, dass der Tiny eben nicht mit 10Mhz fährt, 
sondern mit 1Mhz.

Das lässt sich aber auch leicht ausprobieren:
Häng eine LED an einen Portpin, und lass die mittels _delay_ms(1000) 
blinken. Wenn dein benutzten F_CPU mit der Realität übereinstimmt, dann 
ergibt ein _delay_ms(1000) dann auch wirklich eine Zeitdauer von 1 
Sekunde. Wenn du allerdings bei F_CPU 10Mhz hinschreibst, der Tiny aber 
nur mit 1Mhz arbeitet, dann ergibt gleicher _delay_ms(1000) eine reale 
Zeit von 10 Sekunden. Ein Unterschied, der mit freiem Auge leicht 
erkennbar ist.

> Nun bin ich mit meinem Latein am Ende, daher die Frage, ob jemand schon
> einschlägige Erfahrung mit dem 2313A gemacht hat.

Die allererste und oberste Frage lautet immer gleich: Arbeitet der µC 
mit der Taktfrequenz, die die annimmst oder nicht.

Wenn du noch nicht an den Fuses drann warst, dann kannst du dir den Test 
auch schenken, dann dann arbeitet dein Tiny mit Sicherheit nicht mit dem 
externen Takt.

von Paul B. (paul_baumann)


Lesenswert?

Denke aber auch dran, daß bei 10MHz Takt nur Baudraten bis 14400 einen 
Fehler <=0,9% aufweisen. Vielleicht bist Du zu schnel beim 
Senden/Empfangen.

MfG Paul

von Bruno M. (brumay)


Lesenswert?

Karl H. schrieb:
> dann deuten deine 'Hieroglyphen'
> zuallererst einmal dahin, dass der Tiny eben nicht mit 10Mhz fährt,
> sondern mit 1Mhz.

das kann ich ausschließen, da ich nicht nur eine sondern zwei Platinen 
(Sender und Empfänger) habe und bei beiden der gleiche Fehler auftritt. 
Das alleine ist zwar noch kein Beweis, aber daß der Sender zusätzlich 
mit dem ATmega48 kommuniziert schon. Außerdem reicht eine einfache 
Spannungsmessung.

Paul B. schrieb:
> Denke aber auch dran, daß bei 10MHz Takt nur Baudraten bis 14400 einen
> Fehler <=0,9% aufweisen. Vielleicht bist Du zu schnel beim
> Senden/Empfangen.

Auch darüber bin ich mir im Klaren. Ich habe wie gesagt alle Baudraten 
getestet und nichts geht. Beim 2313 funktionieren aber auch 56kBaud.

von c-hater (Gast)


Lesenswert?

Bruno M. schrieb:

> Außerdem reicht eine einfache
> Spannungsmessung.

Hä? Ganz bestimmt nicht zur Bestimmung der Taktfrequenz, mit dem der 
Controller läuft...

Außerdem hast du noch nicht einmal klargestellt, mit welchen Takt das 
Teil denn nun eigentlich laufen soll. Und du hast auch nicht die Fuses 
gepostet, die deiner Meinung nach dafür sorgen, dass er mit diesem Takt 
läuft.

Bis zum Beweis des Gegenteils ist ein Fehler an dieser Stelle überaus 
wahrscheinlich.

> Auch darüber bin ich mir im Klaren. Ich habe wie gesagt alle Baudraten
> getestet und nichts geht.

Wenn der Takt nicht stimmt, ist genau das das normale und erwartbare 
Ergebnis. Und wenn dann noch Änderungen an einer vielfach bewährten und 
getesteten Routine zur Einstellugn der Baudrate zu einem Teilerfolg 
führen, dann ist sogar praktisch sicher, dass der Takt nicht stimmt...

von OldMan (Gast)


Angehängte Dateien:

Lesenswert?

Es gibt beim -A gerade im Bereich des UART Unterschiede!
Siehe angehängtes Dokument (Atmel).

von Carl D. (jcw2)


Lesenswert?

Ja es gibt Unterschiede, aber es geht dabei darum, die USART auch als 
SPI zu verwenden. Dazu muß das Bit 7 in UCSRC gesetzt werden. Hat man 
dieses beim Initialisieren so wie früher schon empfohlen mit "0" belegt, 
dann aändert sich nichts.

von Bruno M. (brumay)


Lesenswert?

c-hater schrieb:
> Bis zum Beweis des Gegenteils ist ein Fehler an dieser Stelle überaus
> wahrscheinlich.

Ich muß Dich, aber besonders natürlich mich enttäuschen! Auch wenn ich 
auf Grund des Gesamtverhaltens der Schaltung nichts anderes erwartet 
hatte, habe ich es mit dem Oszi kontrolliert. Es bleibt bei 10MHz.

von Konrad S. (maybee)


Lesenswert?

Bruno M. schrieb:
> dem Oszi kontrolliert

Hast du dazu CKOUT aktiviert?

von Bruno M. (brumay)


Lesenswert?

Konrad S. schrieb:
> Hast du dazu CKOUT aktiviert?

nein, ich habe den Ausgang vom RFM12 geprüft.

In der Zwischenzeit habe ich die Lösung auch gefunden! Es ist mir zwar 
etwas peinlich, aber vielleicht hilft es ja auch mal anderen weiter.

Der 2313A ist einer von den Controllern, bei denen die CLKDIV8-Fuse 
standardmäßig gesetzt ist. Ich wußte bis jetzt allerdings nicht, daß 
diese Fuse auch bei externem Takt wirksam ist. Aber man lernt ja nie 
aus:-)

von Georg G. (df2au)


Lesenswert?

Bruno M. schrieb:
> Ich habe praktisch
> alle Baudraten durchbrobiert, kein Erfolg.

Bei 1/8 der Nenn-Baudrate hättest du dann korrekte Zeichen sehen müssen.

von c-hater (Gast)


Lesenswert?

Georg G. schrieb:

> Bei 1/8 der Nenn-Baudrate hättest du dann korrekte Zeichen sehen müssen.

Nicht, wenn mann bei Sender und Empfänger immer die gleiche einstellt, 
was normalerweise ja richtig und logisch ist...

Nur eben dann nicht, wenn die gleiche Einstellung bei einem der beiden 
Partner zu einer abweichenden tatsächlichen Rate führt. Was eben genau 
dann passiert, wenn der tatsächliche Takt zur Laufzeit eben nicht den 
Erwartungen der Routine entspricht, die aus angeblichem Takt zur 
Entwurfszeit und der angegebenen Baudrate die entsprechenden Teiler 
berechnet hat.

Meine Fresse, das kann doch nicht so schwer zu begreifen sein?!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Bruno M. schrieb:
> Der 2313A ist einer von den Controllern, bei denen die CLKDIV8-Fuse
> standardmäßig gesetzt ist.
Mit der Vorgehensweise, die Karl Heinz vorgeschlagen hat, wärst du einen 
Tag früher fertig gewesen:
Karl H. schrieb:
> Ein Unterschied, der mit freiem Auge leicht erkennbar ist.

c-hater schrieb:
> Nicht, wenn mann bei Sender und Empfänger immer die gleiche einstellt,
> was normalerweise ja richtig und logisch ist...
Einer der Partner ist offenbar ein PC. Da kann man die Baudrate ganz 
einfach durchklicken. Mir hätte ein Oszilloskop da nach 5 min Licht ins 
Dunkel gebracht: Ich hätte einfach mal 1 Bit ausgemessen und dann mit 
einem Blick auf den Blockschaltplan im Datenblatt über die Takterzeugung 
nachgedacht.

c-hater schrieb:
> Meine Fresse, das kann doch nicht so schwer zu begreifen sein?!
Dieser Satz ist unnötig (und) aggressiv.

: Bearbeitet durch Moderator
von Georg G. (df2au)


Lesenswert?

c-hater schrieb:
> Meine Fresse, das kann doch nicht so schwer zu begreifen sein?!

In Sachen "wie suche ich Fehler zielgerichtet" musst du offenbar noch 
viel dazu lernen. Über dein Sozialverhalten wollen wir besser nicht 
diskutieren.

von Bruno M. (brumay)


Lesenswert?

Lothar M. schrieb:
> Mit der Vorgehensweise, die Karl Heinz vorgeschlagen hat, wärst du einen
> Tag früher fertig gewesen:

Theoretisch stimmt das, bei einer fertigen SMD Platine aber auch nicht 
so einfach zu realisieren.

von Draco (Gast)


Lesenswert?

Bruno M. schrieb:
> nein, ich habe den Ausgang vom RFM12 geprüft.

Das war dann so sinnlos, wie festzustellen das das Licht nicht angeht - 
die Birne defekt ist, man aber mit absoluter Sicherheit feststellt: "Am 
Schalter ist aber Strom!"

Bruno M. schrieb:
> In der Zwischenzeit habe ich die Lösung auch gefunden! Es ist mir zwar
> etwas peinlich, aber vielleicht hilft es ja auch mal anderen weiter.
>
> Der 2313A ist einer von den Controllern, bei denen die CLKDIV8-Fuse
> standardmäßig gesetzt ist. Ich wußte bis jetzt allerdings nicht, daß
> diese Fuse auch bei externem Takt wirksam ist. Aber man lernt ja nie
> aus:-)
>


Also das was alle von Anfang an sagten: "Falscher Takt!". Und CLKDIV8 
ist bei jedem Tiny/Mega von Werk aus gesetzt, also ganz normal.

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.