Hallo,
ich versuche zwei Mikrocontroller (Atmega32 mit 8 MHz und Atmega 169 an
einem AVR Butterfly mit 32kHz RC oscillator) zu verbinden und nutze
dabei ein einfaches Testprogramm.
Aber es funktioniert einfach nicht, auch wenn ich TX messe und dabei
eine "1" sende, sehe ich keine digitale 1.
Vielleicht hatte jemand schon ein ähnliches Prolem und könnte mir da
weiterhelfen, ich wäre sehr dankbar!
Transceiver Code:
... schrieb:
> Ein Word ist nie negativ. Teilen tut's immer.
Blödsinn. Ob ein Word negativ ist oder nicht, ist nur eine Frage wie man
den Wert darin interpretiert. Und was meinst du eigentlich mit "Teilen
tut's immer"?
Auf jeden Fall aber ergibt die Berechnung oben keinen UBRR Wert, der
auch nur ansatzweise für 9600 Baud zu gebrauchen wäre. Mit einem
Systemtakt von 32 kHz lassen sich 9600 Baud höchstens durch Zauberei
erzeugen.
Vielen Dank für den Hinweis mit dem UBRR Register!
Jetzt habe ich den internen Oszillator auf 6 MHz umgestellt mit der
größten Einschwingzeit. Und sende alle 100ms eine "5" --> 101, aber
irgendwie sieht das Signal trotzdem nicht wie gewünscht aus.
Könnte der USART defekt sein?
RichieRich schrieb:
> Jetzt habe ich den internen Oszillator auf 6 MHz umgestellt mit der
Das glaube ich nicht.
Man kann den internen RC beim ATmega32 nämlich nur auf 1,2,4 oder 8 MHz
einstellen.
RichieRich schrieb:
> Das ist ein ATMega169 an einem AVR Butterfly.
Wenn Du das Butterfly nicht umgebaut hast, verwendet es entweder den
externen 32,768kHz Quarz, oder den internen RC vom ATmega169, der mit 8
MHz arbeitet und per Fuse auf 1 MHz geteilt werden kann.
Wo Du 6 MHz herhaben willst, ist mir schleierhaft.
@Andreas Vogt: Ja es stimmt es arbeitet mit 8 MHz.
Ich habe jetz auch versucht anstatt "1", eine '1' zu senden, klappt
trotzdem nicht. Fuse bits & Co. scheinen richtig zu sein, also keine
Ahnung wo der Fehler sein könnte.
Übrigens ich habe gemerkt, dass im AVR Studio für AtMega169 device,
rechts wo die Ganze Portübersicht ist USART0 bzw. UDR0 anstatt USART
bzw. UDR verwendet wird. Einen UDR0 konnte ich auch im Datasheet nicht
finden.
Dabei benutze ich die letzte Version von AVR Studio, ist es ein Programm
bug?
RichieRich schrieb:
> Ich habe jetz auch versucht anstatt "1", eine '1' zu senden, klappt> trotzdem nicht. Fuse bits & Co. scheinen richtig zu sein, also keine> Ahnung wo der Fehler sein könnte.
Dann fang an, systematisch an die Fehlersuche ranzugehen
Frage 1:
Wer verbockts. Der Sender oder der Empfänger?
Da man das keinem der Prozessoren ansehen kann, musst du mal einen der
beiden durch einen anderen Computer austauschen von dem du 100% weißt,
das er seine serielle Schnittstelle richtig bedient.
Tausche als mal den Empfänger gegen einen PC aus.
Der Sender soll "1" oder '1' an den PC senden (auf dem natürlich ein
entsprechendes Terminal-Programm läuft). Taucht dort das Gewünschte auf?
Wenn ja, dann wird wohl dein Sender richtig senden aber der Empfänger
empfängt was Falsches.
Wenn nein ... jetzt sollte das Spielchen schon klar sein, wies weiter
geht.
@ Karl heinz Buchegger: Leider habe ich keinen RS232 Kabel hier um es an
dem PC auszuprobieren.
@Christopher G.: Du hattest Recht mit den Klammern. Durch einen Aufruf
mit "1", kommt nur Mist raus. Dagegen wenn ich '1' sende, sieht es schon
besser aus.
Aber ich habe jetzt einige Messungen durchgeführt, das Ergebnis sieht
viel besser aus und dennoch, schein mir das Signal "unsauber" zu sein,
ob es an der Genauigkeit des Oszis liegt ?!
Ein Problem war, dass in den Makros, die Taktfrequenz und die Baudrate
nicht als unsigned long (UL) definiert, deshalb gab es einen Überlauf.
Im folgenden habe ich das Signal für '0', '1', '2', '3', '4' und '5'
fotografiert. Die Baudrate liegt auf den Photos bei 9600 Bit/s --> 104,2
us pro ein einzelnes Bit.
Aber trotzdem erkenne ich keine sauberen Start, Stopbits und Datenbits
oder sieht es jemand anders?
Deine Bitmuster sehen vollkommen ok aus. Du misst anscheinend hinter dem
Pegelwandler, daher ist es invertiert. Wo siehst du da einen
entscheidenden Unterschied zu dem "so soll es aussehen"?
PS: Baudrate habe ich jetzt nicht kontrolliert, weil ich nicht sehe was
da jetzt genau die Zeitbasis ist.
RichieRich schrieb:
> Die Zeitbasis ist 250 us.
Also ca. 850 µs für 9 Bit = ca 10600 Baud.
Du wirst den internen Oszillator kalibrieren müssen, sonst wird das
nichts.
Ja das mit der Kalibration habe ich mir auch gedacht, dass der interne
Oszilllator wohl zu ungenau ist.
Vielen Dank für all die Hinweise, am Ende läufts zwar nicht wie
gewünscht, dafür aber einiges auf dem Weg hin gelernt.