Hallo, ich möche mit dem Atmega169 anagolge Signale aufnehmen, diese mit dem AD Wandler wandeln und dann als Manchestercodiertes diditales Signal über UART (RS232) ausgeben. Wie kann ich das in C realisieren? Hat jemand einen entsprechenden Quellcode in C?
Threads über geeignete Funkmodule gab es schon massig, musst nur einmal suchen. Was der UART mit deiner Manchestercodierung zu tun hat, weißt du wohl wahrscheinlich selbst nicht?!
Nun, er wird einen Funkmodul haben, der zwar ,,im Prinzip'' via RS-232 gespeist wird (bzw. dessen TTL-Pegel-Variante), aber trotzdem die Signale 1:1 auf die HF schickt, sodass diese gleichspannungsfrei sein müssen.
genau so wie Jörg sagt, die Hadrware habe ich, mir geht es nur um den C-Code für so eine Anwendung, -also AD Signal aufnehmen, Manchestercodieren und über UART permanendt ausgeben. In den anderen Beiträgen habe ich keinen entsprechenden Code gefunden.
Weil das so nicht geht, du musst die Zahlen per Hand codieren und über einen Pin ausgeben. Der USART hilft dir da nicht.
das ist ja prinzipiell auch möglich, ich muss halt nur eine Datenrate von 1MBit/s erreichen, das heißt die Daten müssen auch schnell genug vom AVR zum Funkmodul übertragen werden. Deshalb wollte ich das über UART machen, da man hier die Datenraten entsprechend hoch einstellen kann. Für jeden Tip, wie ich das sonst realisieren kann -insbesondere softwareseitig- bin ich sehr dankbar.
1MBit/s per Funk??? Einfach so? Möglicherweise noch mit so einem ISM-Band "Modem"? Kann ich mir nicht vorstellen...
Aber du weißt, wie man einen Pin toggelt? 1MBit halte ich für ein wenig utopisch. Kannst es ja versuchen, aber netto wird etwas wesentlich geringeres rauskommen. Kannst dir ja mal selbst ausrechnen, wieviel Takte du dann pro Bit Zeit hast, um es korrekt formatiert auszugeben.
was meinst du mit Pin toggeln? Das Funkmodul kann mehr als 1MBit/s wichtig ist nur, dass der AVR die Daten schnell genug seriell auf das Funkmodul gibt (innerhalb weniger µs). So dass z.B. ein 10 Bit Datenwort vom AD erzeugt wird, und dann übertragen werden kann.
Was für ein Funkmodul hast du denn (und in welchem Band)? Für diese Datenrate kannst du eigentlich nur SPI machen, RS-232 framing + UART ist da chancenlos.
das Funkmodul ist auch von Atmel der Transceiver ATR2406 (im 2,4GHz Band). Mir wäre sehr geholfen, wenn mir jemand einen Quellcode zur Verfügung stellen könnte mit dem ich das über SPI, oder UART realisieren kann. Ich weiß von Atmel, das das über UART funktionieren soll.
Das Projekt ist für dich ne Nummer zu groß. Du hast es nicht mal geschafft, bis Punkt 7.8 in doc4779.pdf zu lesen. Dort steht klar, dass das SPI genutzt werden muss. Quellcode gibt es im Datenblatt jedes beliebigen Atmegas...
so weit bin ich sehr wohl gekommen. Unter Punkt 7.8 ist beschrieben, wie der ATR2406 Programmiert wird, was nämlich über SPI geht. Das hat nichts mit der Datenübertragung zu tun, sondern nur das setzen der Register des ATR2406 um bspw. die Datenrate und Trägerfrequenz einzustellen. Ich habe von Atmel ein Layout für den Transceiver und Mikrokontroller, wo der Transceiver über UART angeschlossen ist. Leider habe ich keine Software dazu und dachte hier etwas Hilfe zu bekommen. Nun muss ich mich eben doch in die Programmierung reindenken und versuchen das selber zu schreiben. Vielen Dank für Eure Mühen.
Nachtrag: schau mal im Dokument doc4779.pdf auf Seite 15 (Figure 8-2) da ist genau das was ich machen möchte.
Hmm, musst du die Signale dort wirklich noch Manchester-Codieren? Ansonsten müsstest du den USART einfach nur so konfigurieren, dass er die Baudrate via XCK erhält (nicht vom internen Baudratengenerator) und könntest, vorausgesetzt das Ding ist richtig konfiguriert, einfach Testbytes in die Luft schicken. Ich würde mit niedrigen Datenraten anfangen. Kannst du das Teil schon via SPI korrekt ansprechen?
Die Manchestercodierung ist von daher wichtig, da ich permanent senden möchte. So muss das Signal im Mittel gleichstromfrei sein, damit die PLL nicht ständig einen Einschwingvorgang macht, was Zeit kostet. Sicher kann ich erst mal mit geringenern Datenraten anfangen, das löst aber auch nicht mein Problem. Ich habe noch nicht probiert, ob ich den Transceiver über SPI ansprechen kann, ich denke aber das ist das geringste Problem. Ich muss erst mal sicher sein, ob der AVR geeignet ist, was ich ohne Software nicht kann.
Hallo, ja dann mal ran. Jetzt hast du schon einen Tag im Forum vertrödelt. In der Zeit hättest du die Software schon längst selber schreiben können. Wie man den UART programmiert steht im Datenblatt des Atmega. Martin
Ich habe bereits ein Programm für die UART geschrieben, siehe Anhang. Was ich nicht ganz verstehe, das gewandelte Signal gebe ich sowohl über UART als auch über PORTD aus. An PORTD habe ich einfach das digitalisierte Signal, an dem UART liegt irgendetwas undefinierbares an. Selbst wenn ich kein analoges Signal auf den Eingang gebe, liegt am UART was an, an PORT D nichts. Ich denke das kann am UART nicht nur Start und STOP Bit sein. 2. Frage: Wie muss ich das Programm um die Manchestercodierung erweitern?
Hallo, wie wäre es mit einer interruptgesteuerten UART Übertragung? Manchester mit dem UART geht so direkt nicht. Du kannst aber pseudo gleichspannungsfreie Übertragung machen (einfach 8bi ACSII Zeichen nehmen die die gleiche Anzahl 0 und 1 haben). Ansonsten scheint es mir so das du noch eine Menge Hausaufgaben machen musst. Martin
Das Programm ist ne mittlere Katastrophe: - ein AD-Wandler stellt das Ergebnis erst nach einer bestimmten Zeit zur Verfügung, da muss ein Bit gepollt werden - du hast im Moment keine kontinuierliche AD-Wandlung (beabsichtigt?) - wenn du PORTD einen 16-Bit Wert zuweist kommt keine Warnung? "an dem UART liegt irgendetwas undefinierbares an" Ich nehme an, eine Folge von Nullen und Einsen ?! "wenn ich kein analoges Signal auf den Eingang gebe" Alle was reale Welt ist, ist analog ...
"Das Programm ist ne mittlere Katastrophe:" -deshalb wollte ich mit mit dem Programmieren nicht rumschlagen. "du hast im Moment keine kontinuierliche AD-Wandlung (beabsichtigt?)" -ja sollte so sein. was muss ich ändern? Am UART liegt ein Siganl an, welches einer fallenden e-Funktion gleicht, und dann mit steiler Flanke wieder steigt. Sonst aber periodisch ist. Also wie ne Folge von Nullen und Einsen, blos das die fallende Flanke einer e-Funktion gleicht.
Die e-Funktion kommt daher, dass dein Messfunzeleingang bzw. deine Übertragungsstrecke als Tiefpass wirkt. Zum AD-Wandler: Es gibt nen Unterschied zwischen Single Conversion und Free Running (näheres im Datenblatt). So eine Aufgabenstellung ohne programmieren lösen zu wollen, ist ein kühnes Unterfangen. Wünsche dir viel Erfolg und empfehle dir das Tutorial dieser Seite. Das wird dir deine nächsten 10 Fragen auch beantworten.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.