Forum: Compiler & IDEs Funkübertragung mit Atmega169


von Martin (Gast)


Lesenswert?

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?

von Mike (Gast)


Lesenswert?

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?!

von Jörg Wunsch (Gast)


Lesenswert?

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.

von Martin (Gast)


Lesenswert?

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.

von Mike (Gast)


Lesenswert?

Weil das so nicht geht, du musst die Zahlen per Hand codieren und über
einen Pin ausgeben. Der USART hilft dir da nicht.

von Martin (Gast)


Lesenswert?

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.

von OldBug (Gast)


Lesenswert?

1MBit/s per Funk???

Einfach so? Möglicherweise noch mit so einem ISM-Band "Modem"?

Kann ich mir nicht vorstellen...

von Mike (Gast)


Lesenswert?

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.

von Martin (Gast)


Lesenswert?

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.

von Jörg Wunsch (Gast)


Lesenswert?

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.

von Martin (Gast)


Lesenswert?

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.

von Mike (Gast)


Lesenswert?

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...

von Martin (Gast)


Lesenswert?

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.

von Martin (Gast)


Lesenswert?

Nachtrag:

schau mal im Dokument doc4779.pdf auf Seite 15 (Figure 8-2) da ist
genau das was ich machen möchte.

von Mike (Gast)


Lesenswert?

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?

von Martin (Gast)


Lesenswert?

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.

von anderer Martin (Gast)


Lesenswert?

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

von Martin (Gast)


Angehängte Dateien:

Lesenswert?

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?

von anderer Martin (Gast)


Lesenswert?

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

von Mike (Gast)


Lesenswert?

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 ...

von Martin (Gast)


Lesenswert?

"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.

von Mike (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.