Forum: Mikrocontroller und Digitale Elektronik Funkverbindung zwischen 2 AVR´s in Assembler


von Daniel B. (dannyboy1994)


Lesenswert?

hallo zusammen. Ich bin gerade dabei aus folgenden Bauteilen:

Tiny13/85
PTC 10k
und einem funksender und empfänger kit für cent beträge ala China in 
einem kleinem 60x40x30 gehäuße eine mit einer 3V knopfzelle betriebenen 
Sender zu verwirklichen welcher kontinuirlich die Außentemperatur misst( 
alle 30min). Als gedankengang um energie zu sparen und die Batterie mit 
ihrer geringen kapazität bei nidrigen temperaturen zu schonen soll 
zwischenzeitlich ein sleepmodus verwendet werden.

Nun auf dem Empfängermodul steht XY-FS-5V
und auf dem empfänger FS1000A

nun das die Module nicht der brüller sind war mir vorher durchaus 
bewusst nur:

Ein aufbau auf dem breadboard bei welchem ich per taster Signale auf den 
Eingang gegeben habe und per (über transistor geschaltene) LED am 
Empfänger ablesen wollte um die Funktion der Module zu testen, war 
höchst merkwürdig. Die LED funzelt immer ein wenig vor sich hin und geht 
bei einem tasterdruck kurz an.
Der zweite vesuch war per uart zwischen 2 tiny2313 signale hin und her 
zu schicken.

Der eine tiny zählt ein register hoch, gibt den wert am USART aus von 
welchem der tx pin am Sender anliegt. der andere wartet auf eingehende 
Daten vom USART und gibt diese in einer interruptroutine am portb 
aus(LED´S angeschlossen)..Nun der Erfolg dieses vesuchs...nichts kommt 
an..keine LED leuchtet. nun wurde ich stuzig. Die Reichweite konnte doch 
nicht geringer als 20 cm sein....=> sender und empfänger neben 
einander==> ebenfalls nichts.

dann hatte ich die schnautze voll. Ich schrieb ein Programm welches mir 
seriell die Daten ohne Manchester Code, also ganz simpel TTL Pegel 5V=1 
0V ist 0 ausgab...=> der Andere tiny bekahm nichts.

Nun wollte ich fragen ob schon einmal jemand solche module zum laufen 
gebracht hat...
dar der tiny2313 eigentlich für die Aufgabe ziemlich ungeeignet ist 
welche das ganze später einmal erfüllen soll kahm mir mein tiny13 - 
Lager in den Sinn.. Ich kaufte einmal etliche zum schnäppchen 
Preis...leider hatten sie bis heute immer so wenig IO´s...zuwenig Flash 
oder waren mangels externen Quarz ungeeignet. Leider besitzt der Tiny13 
leider keinen Usart...

hat jemand evtl Codebeispiele in Assembler zur Hand und kann mir evtl 
die Funktionsweise und worauf zu achtne ist näher erklären?

MFG Daniel

von JoeS (Gast)


Lesenswert?

Stichhwort OOK.
Such mal nach virtualwire und schau Dir den Quellcode an.

von Daniel B. (dannyboy1994)


Lesenswert?

Das Problem ander Sache ist nur das Ich mit C absolut nichts am Hut 
habe. Sogut kann der Quellcode garnicht kommentiert sein, das ich fähig 
wäre es in ASM nachzubilden. Desweitern (auch wenn es einige Leute gibt 
die anders denken, halte ich ASM immer noch für die simpelste 
Programmiersprache..Der einzige mir ersichtliche Nachteil, auch wenn es 
eigentlich keiner ist, ist das es keine libs und weniger fertige 
routinen gibt.)

Ich habe mich etwas eingelsen und verstehe leider garnichts in dem 
quellcode:/

von holger (Gast)


Lesenswert?

>halte ich ASM immer noch für die simpelste
>Programmiersprache.

ASM ist die komplizierteste Programmiersprache.

a = a + 1;

versteht jeder Depp.

von JoeS (Gast)


Lesenswert?


von Daniel B. (dannyboy1994)


Lesenswert?

Leider hilft mir der Quellcode wirklich nicht weiter.
Ach ja was ich vergessen habe zu erwähnen. Die Reichweite des ganzen 
sollte ca 15-20m sein.
Wie funktioniert das VirtualWire Protokol? und gibt es dazu keinerlei 
deutschen infos?

von Arduinoquäler (Gast)


Lesenswert?

Daniel B. schrieb:
> hat jemand evtl Codebeispiele in Assembler zur Hand und kann mir evtl
> die Funktionsweise und worauf zu achtne ist näher erklären?

JoeS hat es dir schon gesagt.

JoeS schrieb:
> Such mal nach virtualwire und schau Dir den Quellcode an.

Alles was weniger tut als VirtualWire wird mit Sicherheit sehr
schlecht oder überhaupt gar nicht funktionieren.

Daniel B. schrieb:
> halte ich ASM immer noch für die simpelste Programmiersprache.

Dann würde ich vorschlagen du baust VirtualWire in Assembler
nach. Das wird sicher zum Erfolg führen aber einige Zeit in
Anspruch nehmen.


PS: Es haben schon viele Leute geglaubt man könne mit besagten
Modulen einfach über die serielle Schnittstelle kommunizieren.

von Stefan F. (Gast)


Lesenswert?

Ich gehe davon aus, dass die die Daten auf eine bestimmte Art codieren 
musst, damit sie über diese Module übertragen werden können. Die sind 
nicht so Intelligent, wie Modems.

Ich kenne das von anderen ähnlich aussehenden Modulen so, dass du 
zunächst ein Startsignal aus 101010 Wechseln mit einer bestimmten 
Frequenz und einigen hundert ms Dauer senden musst. Erst wenn sich der 
Empfänger auf dieses Signal eingeschwungen hat, kannst du anfangen, 
Nutzdaten zu senden. Und die müssen so codiert sein, dass sowohl High- 
als auch Low Pegel weder zu kurz noch zu lang andauern und dass das 
Signal im Durchschnitt 50% High ist. Bit-Folgen wie 10000000 sind tabu.

Wenn Du keine detaillierte Beschreibung für die Module findest, brauchst 
du wohl ein Oszilloskop um zu sehen, was der Empfänger gut und was er 
weniger gut empfangen kann.

Das könnte helfen: 
http://www.pocketmagic.net/using-fs1000axy-fst-rf-radio-module-with-avrs/

von S. R. (svenska)


Lesenswert?

Achte mal bitte ein bisschen auf deine Rechtschreibung. Wenn du deinen 
Chef was fragst, nuschelst du ihm schließlich auch nichts vor. Eine 
Rechtschreibschwäche ist keine Entschuldigung für Unhöflichkeit! Nutze 
die Rechtschreibprüfung deines Browsers, wenn du es selbst nicht kannst.

Die Module scheinen empfindlich auf schlechte Versorgung zu reagieren. 
Möglicherweise bricht dir die Versorgungsspannung ein. Schließe mal 10 
nF Keramik und 10 uF Elko parallel direkt an die Versorgung der Module 
an und schaue, ob's besser wird.

Sorge für eine gute Antenne. Bei 315 MHz möchtest du λ/4 = ungefähr 25cm 
Draht haben.

VirtualWire ist eine C-Bibliothek für das, was du suchst. Schaue da 
rein. Selbst, wenn du C nicht magst, solltest du es wenigstens in 
Grundzügen lesen können. Gilt für Englisch übrigens auch.

von Einer K. (Gast)


Lesenswert?

Daniel B. schrieb:
> mit einer 3V knopfzelle
Die Sender leben erst richtig auf, wenn sie mit 12V betrieben werden.
Mein Versuche mit 3,3V habe ich für gescheitert erklärt.

von Daniel B. (dannyboy1994)


Lesenswert?

Ein Step-Up regler welcher die wenigen mA für den sender liefert wäre 
diesbezüglich evtl die Lösung. Die Frage die sich mir bei dem ganzen 
Suche nach informationen und Tipps für die umsetzung stellt, ist ob sich 
der Aufwand lohnt das ganze zu verinnerlichen und in Asm umzusetzen,oder 
es nicht sinnvoller wäre auf ein anderes Modul umzusatteln. Die Frage 
die sich dann stellt ist natürlich..Welches. Es ist ja nur eine 
übertragung in eine richtung notwendig, RFM01+RFM02 mit SPI 
schnittstelle? Der Aufwand um diese Module vernünftig in betrieb zu 
nehmen scheint mir doch unrentabel.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Daniel B. schrieb:
> Wie funktioniert das VirtualWire Protokol? und gibt es dazu keinerlei
> deutschen infos?

 Manchester encoding funktioniert genauso zuverlässig und es gibt jede
 Menge Infos dazu.
 Nachteil, wenn überhaupt: es braucht 16 bit pro Byte.

Arduino F. schrieb:
> Die Sender leben erst richtig auf, wenn sie mit 12V betrieben werden.
> Mein Versuche mit 3,3V habe ich für gescheitert erklärt.

 Ja, allerdings geht es mit 5V ohne Probleme.

von Georg G. (df2au)


Lesenswert?

Diese OOK Sender/Empfänger wollen eine relativ lange Einschwingzeit 
sehen, 100ms 0-1 Wechsel vorweg, sonst passiert nichts sinnvolles. Nimm 
dir das Scope und sieh dir den Empfänger Ausgang an. Im Ruhezustand 
kommt da Rauschen=Müll heraus. Das muss deine Software alles sortieren.

von Jan W. (jannyboy)


Lesenswert?

holger schrieb:
>>halte ich ASM immer noch für die simpelste
>>Programmiersprache.
>
> ASM ist die komplizierteste Programmiersprache.
>
> a = a + 1;
>
> versteht jeder Depp.

Das geht in ASM noch einfacher:
incf a

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Jan W. schrieb:
> Das geht in ASM noch einfacher:  incf a

"noch noch kompakter" kann man es auch in C schreiben:

a++;

: Bearbeitet durch User
von Daniel B. (dannyboy1994)


Lesenswert?

Und dann sehen wir uns an wie viele Takte der Compiler hierfür 
verdaddelt :) und is wird sicher mehr als 1 sein.
Aber back to topic. Ich habe gestern den gesamten abend geopfert und 
Sitze nun seit Feierabend wieder hier vor meinem PC und dem breadboard. 
Die Problematik die sich mir stellt ist. Eine Manchester code zu senden 
mit dem Tiny sollte sich bewerkstelligen lassen. Aber das ganze zu 
empfangen, bei wahrscheinlich relativ ungenauer Taktung des signals wird 
noch interessanter..

von Stefan F. (Gast)


Lesenswert?

Den seriellen Port kannst du dafür vergessen.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Daniel B. schrieb:
> Die Problematik die sich mir stellt ist. Eine Manchester code zu senden
> mit dem Tiny sollte sich bewerkstelligen lassen. Aber das ganze zu
> empfangen, bei wahrscheinlich relativ ungenauer Taktung des signals wird
> noch interessanter..

 Weder senden noch empfangen ist ein Problem.
 Kein Tiny hat einen Taktfehler > 3% aber nehmen wir mal an, dass dein
 Tiny 10% hat.

 Wenn man die Bitlänge mit 100 annimmt, dann kann es nur folgende
 2 Zeiten bei Manchester geben: 100 und 200.
 Mit 10% Fehler sind es 90-110 und 180-220.

 Und wenn du diese 2 Zeiten nicht richtig decodieren kannst, dann
 nimm lieber Arduino und seine Bibliotheken dafür.

 Oder noch besser, such dir ein anderes Hobby.

: Bearbeitet durch User
von Georg G. (df2au)


Lesenswert?

Stefan U. schrieb:
> Den seriellen Port kannst du dafür vergessen.

Meine Erfahrung ist anders. Sofern die Telegramme hinreichend kurz sind, 
kann man mit genügend Vorspann auch die Daten direkt aus dem seriellen 
Port verwenden. Manchester Kodierung ist nicht unbedingt notwendig.

von Einer K. (Gast)


Lesenswert?

Marc V. schrieb:
> Und wenn du diese 2 Zeiten nicht richtig decodieren kannst, dann
>  nimm lieber Arduino und seine Bibliotheken dafür.

Ich danke dir, dass du die Brauchbarkeit der Arduinolibs anerkennst.
Nur, die Stechrichtung, behagt mir nicht.

Wobei ich aber doch anmerken möchte, das auch einige wenige Arduino 
Jünger Probleme beim Verständnis der Manchester Kodierung zeigen.

von Einer K. (Gast)


Lesenswert?

Georg G. schrieb:
> Sofern die Telegramme hinreichend kurz sind,
> kann man mit genügend Vorspann auch die Daten direkt aus dem seriellen
> Port verwenden.

Es muss ein gleichspannungsfreier Leitungskode verwendet werden.
Nur so lassen sich eine ansprechende Datendichte und Qualität erreichen.

von Georg G. (df2au)


Lesenswert?

Arduino F. schrieb:
> gleichspannungsfreier Leitungskode

Wenn du die passende Präambel verwendest und nur ein kurzes Telegramm 
hast, geht es hervorragend auch nicht-gleichstromfrei. Niemand 
bezweifelt, dass Manchester Kodierung oder ein Pseudo-Scrambler helfen. 
Wenn ich den TO richtig verstehe, will er nicht an die technischen 
Grenzen sondern braucht etwas quick and dirty.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Arduino F. schrieb:
> Ich danke dir, dass du die Brauchbarkeit der Arduinolibs anerkennst.
> Nur, die Stechrichtung, behagt mir nicht.

 Hat nichts mit Arduino zu tun, nur mit dem Umstand, dass es dort
 praktisch für alles schon fertige Bibliotheken gibt.

 Ich persönlich habe nichts gegen Arduino User, habe diese auch
 niemals angespuckt oder sonstwie beleidigt.

 Im Gegenteil, für mich ist Arduino Code == C oder C++ code. Dass
 die Herren, die herablassend auf Arduino runterschauen das nicht
 wahrhaben wollen, ist ihr Problem, nicht meins.

von Einer K. (Gast)


Lesenswert?

Marc V. schrieb:
> Dass
>  die Herren, die herablassend auf Arduino runterschauen das nicht
>  wahrhaben wollen, ist ihr Problem, nicht meins.

Die Welt ist schlecht!
Und viel besser, werde ich wohl auch nicht sein.
:-)

von Walter S. (avatar)


Lesenswert?

Jan W. schrieb:
> Das geht in ASM noch einfacher:
> incf a

das heißt doch vermutlich "input carry flag in Akkumulator a",
oder ist es doch nicht so einfach :-)

von Daniel B. (dannyboy1994)


Lesenswert?

HAt den noch niemand diese Art von Module verwendet und eine brauchbare 
sende und empfangsroutine realisiert. Ich habe, auch wenn es Leute geben 
wird die dies falsch verstehen, leider des öfteren das gefühl das die 
hilfsbereitschaft im Forum leider etwas nachlässt. Wenn jemand etwas 
benötigt, das ich bereits funktionstüchtig umgesetzt habe, bin ich immer 
wieder gerne bereit selbiges zu teilen. Ich habe leider die erfahrung 
gemacht das mit dem USART wirklich keine effektive Art der 
Datenübertragung möglich ist. Das ganze ist einfach viel zu 
Fehleranfällig..In einem Testprogramm(AVR sendet über das Modul, 
Empfänger über MAX232 an PC. Beides aus einer 4,5V Flachbatterie 
gespeist), bekomme ich wenn ich etwas empfange nur sinnlose hyroglyphen 
anstatt dem gesendeten "abcdefghijk....". Mit Manchestercodierung habe 
ich es ebenfalls aufgegeben, dar das Senden sich relativ einfach 
gestalltet, das empfangen allerdings für mich eine unlösbare problematik 
darstellt...
Mein aktueller gedanke ist, das ich shcon viel zu viel Zeit damit vertan 
habe um meinem Ziel keinen millimeter näher zu kommen.
Ich würde diese Module gerne in betrieb nehmen...Die alternativen ala 
RFM12 scheinen mir für das bisschen Daten welche anfallen einfach ein 
bisschen zu oversized... Desweitern sind diese Module Preismäßig 
natürlich unschalgbar. 3 Empfänger und 3 Sender für 4 €....

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

zeig doch einfach mal, was du bisher hast, was wo nicht funktioniert, 
und was du bisher schon alles unternommen hast, um das Problem 
einzukreisen.

Zeigen ist NICHT der Prosa-Text dessen was du gemacht hast, sondern Code 
Schnipsel.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Daniel B. schrieb:
> HAt den noch niemand diese Art von Module verwendet und eine brauchbare
> sende und empfangsroutine realisiert.

 Ja, habe ich, warum ?

Daniel B. schrieb:
> Ich habe leider die erfahrung
> gemacht das mit dem USART wirklich keine effektive Art der
> Datenübertragung möglich ist. Das ganze ist einfach viel zu
> Fehleranfällig..In einem Testprogramm(AVR sendet über das Modul,
> Empfänger über MAX232 an PC. Beides aus einer 4,5V Flachbatterie
> gespeist), bekomme ich wenn ich etwas empfange nur sinnlose hyroglyphen

 Klar, Empfänger muss sich erst mal einschwingen, deswegen sendet man
 zuerst ein Synch-Burst und erst danach kommen die Daten.
 Sende doch 10 Mal unmittelbar hintereinander 0xAA, eine Pause von
 5-10ms und dann ein Telegramm mit z.B. 4 Bytes.
 Falls es nicht funktioniert, sende 20 Mal 0xAA.
 Synch-Burst und Daten unterscheidest du eben mit dieser Pause von
 5-10ms Dauer.

 Kann doch nicht so schwer sein, wenn du schon mit Manchester nicht
 klar kommst...

> Ich habe, auch wenn es Leute geben
> wird die dies falsch verstehen, leider des öfteren das gefühl das die
> hilfsbereitschaft im Forum leider etwas nachlässt. Wenn jemand etwas

 Hilfsbereitschaft ist eine Sache, eine  Routine für jemanden zu
 schreiben, ist etwas ganz anderes.

 Hast du schon etwas versucht, geschrieben, wenn ja, was ?

 So, wie du dir das vorstellst, geht es bestimmt nicht, zumindest
 nicht ohne dass du ein bisschen dazu beiträgst.
 Und wenn du schon bei Manchester gescheitert bist, sehe ich Schwarz.

: Bearbeitet durch User
von Herr M. (herrmueller)



Lesenswert?

hallo

ich habe mit mit der Fernsteuerung (s. Bild) eine 2 Servo-Fernsteuerung 
mit Attiny 2313 programmiert. Als Empfänger habe ich einen ganz 
einfaches 'dummes' 1€ Modul genommen. Da der Sender (arbeitet mit PT2272 
Codier Chip) vorgegeben war, habe ich dessen Protokoll verwendet.

min 4ms low, dann 170µS High/550µs low für die 0
und 520µS High/190µs low für die 1
die ersten 16 bit sind die Adresse des chips

Empfangs-Programm habe ich mal angehängt.
erst: ;--------- Wartet auf 4ms low ------------------

Status=0

dann: ;--------- INT1 Flanken Aenderung interrupt ------------
  Auswertung im Interrupt
Status ungerade = Status 1,3,5... -> steigende Flanke   wird bei jeder 
Flanke hochgezählt
Status gerade = fallende Flanke

Status= 49 Telegramm zu Ende.

4 Tasten -> alle Kombinationen haben Funktionen - manche auch als 
Sequenz

alles andere sind eigentlich die Servo Funktionen.

Der Sender und Empfänger soll ja nur als Beispiel dienen, wie man Daten 
übertragen kann. Eine eigene Senderoutine ist eigentlich kein Problem. 
(Kann man sogar mit Warteschleifen machen ;-) )

von Peter D. (peda)


Lesenswert?

Daniel B. schrieb:
> Mit Manchestercodierung habe
> ich es ebenfalls aufgegeben, dar das Senden sich relativ einfach
> gestalltet, das empfangen allerdings für mich eine unlösbare problematik
> darstellt...

Das ist keine Raketenwissenschaft. Dazu braucht man einen externen 
Interrupt zur Flankenerkennung und einen Timerinterrupt, um die 
Pseudoflanken auzusortieren. Du mußt Dich also mit Interrupts 
beschäftigen. Das gilt aber auch für andere Protokolle.

Allerdings schränkt die Versteifung auf AVR-Assembler das Finden von 
Beispielen sehr stark ein.

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.