Verfügbare Informationen zu "Protkoll für die Vernetzung von RFM12,01,02 Modulen"
Qualität des Beitrags: Beteiligte Poster: avrnix - Wigbert - Eisbaeeer - Kurzschluss - stevensen - Thilo - Knickohr Forum: www.comwebnet.de Forenbeschreibung: AVR Mikrocontroller und Elektronik - Forum - www.comwebnet.de aus dem Unterforum: RF12 Transceiver Modul Antworten: 107 Forum gestartet am: Mittwoch 25.10.2006 Sprache: deutsch Link zum Originaltopic: Protkoll für die Vernetzung von RFM12,01,02 Modulen Letzte Antwort: vor 16 Jahren, 5 Monaten, 7 Tagen, 8 Stunden, 32 Minuten
Alle Beiträge und Antworten zu "Protkoll für die Vernetzung von RFM12,01,02 Modulen"
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
avrnix - 19.08.2007, 10:55Protkoll für die Vernetzung von RFM12,01,02 Modulen
Hier sollen eure Wünsche erörtert werden wie die Kommunikation zwichen den Modulen erfolgen soll.
Das Protokoll soll so Aufgebaut sein das es Flexibel ist und auch wie das Internet Protokoll mit Adressen arbeitet.
Jedes Modul soll eine statische oder dynamische Adresse (2 Byte ) bekommen.
Die Adresse 0000 soll eine Broadcast anfrage an alle Module sein und Fragen welche Adresse hast du und wer bist du ( Tranceiver , Empfänger, Sender, mit der Adresse ( 2 Byte ).
Es sollen neben Messwerte, Steuerinfos, auch Texte übermittelt werden.
Beispiel : 11111111 | Absenderadresse | Zieladresse |Messeinheit|Messwert|Info-Text|Steuerung|Längeder Daten|Checksum|00000000
Jetzt stellt sich mir die Frage wie soll das Protokoll aufgebaut sein?
Wer hat Vorschläge ?
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
avrnix - 19.08.2007, 11:44
Als Beispiel sollte man annehmen:
1 Master verwaltet einen Empfänger , ein Sender und einen Transceiver
- Die Behandlung ist Unterschiedlich
Empfänger: Die Adresse muss handisch im Master angegeben werden
Das heißt er kann nur zur Steuerung verwendet werden.
Sender: Kann nicht gesteuert werden, kann allerdings dem Master Werte
übermitteln und sagen ich kann nicht Empfangen.
Transceiver: Möglichkeit zur Steuerung und Messung -> Dialog möglich!
Bekanntgabe und Zuweisung von Adressen Möglich!
Dadurch ergibt sich auch eine Art Priorität der Übermittlung Sender müssen eine Höhere Priorität haben als Transceiver, weil dem den Tranceiver abfragen kann.
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 22.08.2007, 17:35Datenpaket Slaveadresse
Hallo,
es ist vorgesehen RFM12- Splitter in diesem Forum zu stellen,
Einerseits um jeden User Code-Bausteine zu Verfügung zu stellen,
andererseits, um nicht so viel in eine "Sackgasse "zu investieren.
Vielmehr sollen diese Beispiele zu eigenem Handeln anregen
Rufzeichen:
Um jeden Slave eines RFM12 Netwerkes anzusprechen
wird jedem Slave eine Adresse gegeben.
In meinen Fall wird generell jeder Slave vom Master gerufen.
Jeder Slave kann ja mehrehre Sensordaten liefern.
Anbei mal eine "Rufzeichen"- Aufbereitung.
Es wird folgendes Paket gesendet:
Paketlänge-Text-Checksum.
Die Paketlänge wird für dem Slave zum Interrupt-gesteuerten-
Datenpaketempfang benötigt. Checksum zum Test
Code: '###################################################################################
'
' RFM12-Splitter
'
' Dies ist die Datenpaketeinstellung am Beispiel Rufzeichen
'
' Einfach "mein Rufzeichen" eintragen
'
'Protokoll:
'Stringlänge-Text-Checksum (Stringlänge = Text + 2, Checksum von Stringlänge + Text)
'
'
'von Wigbert Picht
'
'###################################################################################
Dim Coll(15) As Byte
Dim Ruf_sende As String * 10 At Coll Overlay
Dim Laenge As Byte
Dim Lean As Byte
Dim L as Byte
Dim Count As Byte
Dim Rufzeichen As String * 10
Dim C As Byte
Dim Ruf As String * 10
'###################################################################################
Rufzeichen = "Wigbert" 'mein Rufzeichen
'###################################################################################
Do
'in der Routiene einbauen
Laenge = Len(rufzeichen)
Laenge = Laenge + 2
Lean = Laenge +52 'Empfänger -50
L = Asc(Lean)
Ruf = Chr(L) + Rufzeichen
C = Checksum(ruf)
Ruf_sende = Ruf + Chr(c)
'Datenpaket wird aufgerufen und gesendet
For Count = 1 To Laenge
Print Coll(count) ; "-";
Next Count
'Testausgabe
Print " "
Print Chr(coll(1))
Waitms 100
Loop
das ganze kann natürlich mit mehrehren Rufzeichen erweitert werden.
Ein Sammelruf würde ich nicht empfehlen,
da sowieso nur ein Gerät senden sollte
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
avrnix - 22.08.2007, 22:13
:D Ist ja nicht schlecht für den Anfang -
Das Rufzeichen muß vorher im Slave sein oder nicht und dient als Adresse, sehe ich das richtig?
Mit dem Sammelruf kann man eine Zufallzahl nehmen wann es Sendet und dann gibt es eine Wiederholung, das sollte allerdings dann kein Proble, mehr darstellen.
Deine Methode hat was , was ich noch nicht bedacht habe Netze!
Jedes Rufzeichen kann ein Netz mit eigener Adresse darstellen
Rufzeichen+Adresse. So kann man mehre Adressen haben in verschiede Netze die Autonom Arbeiten! Gute Idee, Wigbert :-)
ich würde sagen das man Byte versendet und sagt was das ist ( Daten,String etc. ) spart Rechenkapazität und vereinfacht die Übertragung.
Stelle dir vor ein RFM12 könnte sich beim Master anmeldten und eine Adresse beziehen wäre doch super oder nicht?
Durch den Sammelruf kann er feststellen ob er alle Slaves hat.
Im diesen Zusammenhang würde ich gern wissen was du unter Master und Slave verstehst. Was muss der MAster haben und können und was der Slave?
Soll der Master Datenanzeigen können und der Slave nicht, oder gilt das nur wohin die Daten hinkommen ?
Oder wir nennen es Aktive Netzelemente und Passives Netzelemet.
Wobei Aktive - Datenverarbeitet und Darstellen kann ( Monitoring ) und Einfluss nimmt auf die Passivelemente.
Die Passivelemente - können nur Daten aufnehmen oder Verarbeiten oder zum Master schicken. Werden gesteuert vom Master bzw. Geben Daten zum Master ( bei nur Sender z.B. )
Was denkst du ?
:)
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 22.08.2007, 23:01
Hallo,
erstmal war die Idee entstanden jeden Slave eine Adresse zu verpassen
mit einfachen Handling. Deshalb ein String für die Adresseneingebung.
Jeder Slave hat dann sein Rufzeichen. Die werden auch dort hinterlegt.
Aus dem Zwischenspeicher werden dann sowieso Byte's ausgelesen uund per Funk übertragen.
Bei Messwerten werde ich wahrscheinlich kein String sondern Byte
zwischenspeichern.
Der Master (RFM12+Computer+Datenlogger) steuert alles. Er empfägt Daten und sendet Befehle.
Dadurch ist eine Funkdisziplin hergestellt.
Also Master fragt Messwerte vom Slave ab
Slave sendet Messwerte an Master
Master sendet Schaltbefehle, Ausgabe usw...
ich denke das ich demnächst den Interruptgesteuerten Empfang
vorstellen kann.
Übrigens:
----Besser machen ist einfacher als neu erfinden----
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
avrnix - 23.08.2007, 08:36
Ok, Verstanden, du arbeitest nur mit RFM12 und jeder bekommt ein anders Rufzeichen( besser 2 Byte nehmen ).
Der Datenlogger läuft mit einen EEPROM oder im Speicher vom Master.
Jetzt müssten wir wissen wie man in mit BASCOM auf einer SDCARD speichert (AVR DOS ).
Gibts bei dir in BASCOM zu AVR DOS Beispiele wie man auf einer SDCARD zugreifen kann ?
Dann wäre das eine Protable Lösung der Daten :-)
Man sollte um es besser zu machen die Rahmenbedingungen abstecken:
-- was will man wie erreichen und warum?
-- und dann wie soll es erreicht werden ?
Wie soll der Kommunikationsablauf sein und wie sieht das Protokoll aus:
|Rufzeichen|Daten| das war es , oder ?
soll noch was hinzukommen?
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 23.08.2007, 09:42
-- was will man wie erreichen und warum?
-- und dann wie soll es erreicht werden ?
Meine RFM12-Geräte wird sich in Grenzen Halten und es werden bstimmt
keine 100 Stück oder so kommunizieren müssen.
Im Hintergrund denke ich immer an "Hausbus"
Heizung ,Jalousie usw.
Und das Protokoll sollte realistisch funktionieren.
Ich befürchte eine Art Funknetz Router- und Slavefunktion
könnte auf Grund ihrer Komplexität schwierig werden.
Aber:
----nichts ist unmöglich----
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
avrnix - 23.08.2007, 10:17
Dann reicht ja ein einfaches Protokoll aus. Vergebe einfach eine als Rufzeichen eine Nummer ist dann einfacher in der Verwaltung, reicht dann ja auch ein Byte aus.
Wenn es Module gibt die mit Batterie arbeiten könnte man ein Byte zur Zustandserkennung einbauen.
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 24.08.2007, 19:49
Hallo,
Für meine zukünftige Master-Slave Kommunikation wurden für die Erstellung und Übertragung von Datenpaketen 2 Testcode entworfen.
Ziel wird es sein eine Master gesteuerte Kommunikation aufzubauen.
Prinzip:
Master ruft Slave
Slave sendet Daten an Master
Master sendet Befehle an Slave
Master:
eingegebenen String (Adresse oder Datenpaket)
Code:
' Rufzeichen
Rufzeichen = "Forum01" 'mein Rufzeichen oder sonst ein String
' #########################################################################
Sendetext 'Sub Stringverarbeitung zum Datenpaket
'später in Schleife
' #########################################################################
mit Stringlänge und Check vervollständigen. So das folgendes Paket
gesendet wird: Code: Sub Sendetext 'Aufbereitung des Text="Teststring"
Sendedata = Rufzeichen 'welcher String gebraucht wird
Laenge = Len(sendedata)
Lean = Laenge + 2
La = Laenge + 52 '50 Bei Empfänger subtrahieren
Ruf = Chr(la) + Sendedata
C = Checksum(ruf)
Text = Ruf + Chr(c)
'Print Text 'Testprint
'Print L ; sendedata ; C;
End Sub
Längenbyte- Stringbyte-Stringbyte-…………-Checkbyte
Das Längenbyte bestimmt die Sendedatenlänge.
Code: For Count = 1 To Lean 'Veriable Länge duch Stringberechnung
'For Count = 1 To Maxchar
Rf12_ready 'hier kann das gesendete Datenpaket eingesehen werden
'Print Rfdata(count) ; "-";
Temp = &HB800 + Rfdata(count)
Temp = Rf12_trans(temp)
Next Count
Slave:
interruptgesteuertes Auslesen des Datenpaketes und zwischenspeichern.
Dabei wird wiederum aus dem ersten Byte die Empfangsdatenlänge errechnet.
Code: Ffit_handler:
Temp = Rf12_trans(&Hb000) 'Empfangsbyte lesen
Rfdata(count) = Temp
Empfangslen = Rfdata(1) - 50 'Stringlänge aus erstes Datembyte errechnen
If Count > Empfangslen Then
'If Count >= Maxchar Then
Rxt = 1 'Flag für Ausgabe
Temp = Rf12_trans(&Hca81) 'FIFO + SYNC Erkennung wieder scharf machen
Temp = Rf12_trans(&Hca83)
' Rücksetzen auf 1 in Sub Ausgabe
Else
Incr Count 'ansonsten nur zähler erhöhen
End If
Return
In einer Sub wird der Check durchgeführt und der gewonnene Textstring ausgegeben
Code: Sub Ausgabe
If Rxt = 1 Then 'If Count >= Länge String Then
Disable Interrupts
Arraychar = ""
For Count = 1 To Empfangslen 'byte aus Zwischenspeicher auslesen
Arraychar = Arraychar + Chr(rfdata(count))
Next Count
Laenge = Len(arraychar) 'Stringlänge ermitteln
Laenge = Laenge - 1
Empfangstext = Left(arraychar , Laenge) 'Stringausgabe ohne Checksumme
Cc = Checksum(empfangstext) 'Checksumme von empfangenen String berechnen
F = Rfdata(empfangslen) 'Checksumme vom Datenpaket
If F = Cc Then
Kennung = 1 'wenn empfangene Checksumme mit errechnete gleich, dann K.= 1
End If
Ll = Laenge - 1
Ausgabetext = Mid(arraychar , 2 , Ll)
Print Ausgabetext 'Ausgabetext ohne Laenge und check
Print F 'Testprint
Print Cc
Count = 1
Rxt = 0
End If
Enable Interrupts
End Sub
Eine weitere Sub dient zur Erkennung der hinterlegten Adresse.
Code: '#########################################################################
'###### Slaveadresse
'#########################################################################
Rufzeichen = "Forum01" 'mein Rufzeichen
Code:
Sub Erkennung
If Kennung = 1 Then 'Bin ich gemeint?
If Ausgabetext = Rufzeichen Then
Portd.5 = 1 'Ich bin gemeint
Kennung = 0
Else
Portd.5 = 0 'später goto wohin auch immer
End If
End If
End Sub
Der Textstring wird ordnungsgemäss verarbeitet. Kommt immer richtig an.
Seltsamerweise werden aber verschiedene Werte der Checksumme empfangen.
Nicht falsche sondern unterschiedliche (letzte Ziffer),find ich aber noch heraus
Die Software wurde auf Pollinboard getestet(10 Mhz von RFM12)
Softwarelink: von Avrnix eintragen
demnächst werde ich mich mit "Funkprotokoll" beschäftigen
Hinweis:
------für Erweiterung der Testcode wird die Bascom Demoversion nicht mehr reichen-------
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
avrnix - 25.08.2007, 08:53Netzwerk MAster-Slave Kommunikation
Hier der versproche LINK zu den beiden BASCOM Programmen
MASTER und SLAVE für den RFM12 Tranceiver.
http://www.comwebnet.de/seite48.html
Anregungen und Fehlermeldung Lösungen sind gerne gesehen!
:D
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 25.08.2007, 17:57
Hallo Leute,
hab das Problem mit der Checksumme gelöst.
Beim Master einfach ein Leerstring in den "Raum" hinterhersenden
und die Lean um 1 erhöhen
Code: '##########################
Sub Sendetext 'Aufbereitung des Text="Teststring"
Sendedata = Rufzeichen 'welcher String gebraucht wird
Laenge = Len(sendedata)
Lean = Laenge + 3 '+1
La = Laenge + 52 '50 Bei Empfänger subtrahieren
Ruf = Chr(la) + Sendedata
C = Checksum(ruf)
Text = Ruf + Chr(c)
Text = Text + " " 'Folgestring ,wird beim Empfänger nicht verarbeitet
'Print Text 'Testprint
'Print L ; Sendedata ; C;
End Sub
Bitte:
Text = Text + " "
einfügen
Lean = Laenge + 3
ändern
Wigbert
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 26.08.2007, 10:22
Hi,
im Slave wurden noch ein paar Einstellungen geändert
Code: $hwstack = 40 ' default use 32 for the hardware stack
$swstack = 40 'default use 10 for the SW stack
$framesize = 40
un die im Interrupt die Zeile geändert
Code: If Empfangslen < Count Then
kennt wohl nur kleiner als...
nun sollte der Code durchlaufen
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 26.08.2007, 16:43
Hi,
ich habe die Master-Slave Code durch überarbeitete Varianten ersetzt.
Im Rufzeichen steht jetzt:
Code:
Rufzeichen = "Forum02" 'mein Rufzeichen oder sonst ein String
und sollte unter:
http://www.comwebnet.de/seite48.html
zu finden sein.
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 27.08.2007, 19:42
Hi,
hab im Master-Code einen Timer integriert und in den o.g. Link durch
den alten ersetzt
Der Timer wird benötigt für die Sendezyklen.
Im Rufzeichen sollte dann stehen:
Code:
' Rufzeichen
Rufzeichen = "Forum02" 'mein Rufzeichen oder sonst ein String
'mit Timer
als Timerkontrolle wird durch
Code: Toggle Portb.0
durchgeführt
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
avrnix - 27.08.2007, 20:39
Hallo Wigbert,
warum ist jetzt ein Timer drinne ?
:roll:
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 27.08.2007, 20:52
weil der Timer im Hintergrund alle Zyklen steuern wird,
und keine Zeit mit Wait vertrödelt werden soll.
Ich brauch einfach ein Grundtakt.
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 06.09.2007, 12:03
Hallo
Kapier ich auch nicht. Der Timer zählt nur bis 5 und setzt sich dann wieder auf 0 ?
Für was ist der Timer angedacht?
------- edit ----------------------------------
Tja so ist es, wenn man während dem Posten noch was anderes machen muss.
Dann ist es auch möglich, einen vorhandenen Timer mit 25ms zu nutzen.
Grüße Eisbaeeer
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 06.09.2007, 15:12
Ok,
war ein bischen verfrüht den Timer reinzustellen.
Der Timer wiederholt alle 5 Sek. den Sendemodus.
Oder ruft nach 1 Sek den nächsten Slave auf.
Also:
Sende Slave 01
Empfang(5 Sek) kein Slave?
Sende Slave 01
.....
es wird 3 x ein Slave gerufen
oder
der Timer
springt nach dem Empfang 1 Sek später zum nächsten Slave.
mir gefällt bis jetzt nur mein Einsprung nicht.
das wait sollte sowieso raus.
Die jetzige Einstellung Toggelt im 5 Sek takt, läuft auch auf mein rfm 12
Der Timer zählt 1 Sek und wird auf 5 Sek erhöht
@Eisbeer
>Tja so ist es, wenn man während dem Posten noch was anderes machen muss
verstehe ich nicht
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
avrnix - 06.09.2007, 19:28
Ich schätze mal mit dem TIMER könnte man auch ein Zähler mit einbauen und dann nach einen gewissen Zählerstand den nächsten Slave anrufen.
Vielleicht für ein Slave nicht sinnvoll, aber bei mehren schon.
In der Hauproutine könne man dann noch was anderes bewerkstelligen als nur das Warten. Ist ja alles noch am Anfang.
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 06.09.2007, 19:46
Vielleicht noch ein weiterer Hintergedanke:
Master und Slavecode werden ja irgendwann ähnlich aussehen,teilweise
zumindest.
Und beim Slave sollen zwischendurch ja Messungen durchgeführt werden.
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 11.09.2007, 16:50
Also, ich habe gestern angefangen, den Code auszuprobieren.
Als erstes ist mir aufgefallen, dass der IRQ nur beim Empfänger benutzt wird. Ich hatte bis jetzt mit anderen Funktionen zu tun und mich noch nicht allzuviel mit dem RFM12 beschäftigt.
Nachdem ich das Pollin Board benutzt habe und es einige Probleme mit dem RFM12 Modul gab, hab ich es vom Board runtergerupft und auf einer externen Lochraster aufgesteckt. Verbunden wird das ganze jetzt über die 40-Pol Leiste vom Pollin Board. Ausserdem hat es Ports vom Atmega belegt, die ich für was anders gebraucht habe.
Gestern hat es dann nicht mehr geklappt. Ich muss jetzt systematisch nach dem Problem suchen. Ich werd beim Sender anfangen und erstmal kontrollieren, ob das Senden funktioniert.
Die Ansätze hier gefallen mir gut. Ich werd mal versuchen, was beizusteuern. Vor allem das mit dem Timer und dem Takt. Der Controller soll auch bei mir noch mehr tun.
Grüße Eisbaeeer
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
avrnix - 12.09.2007, 08:50
Hallo Eisbaeer,
Also mit den Pollinboard gibt anscheined Probs wenn der Optokoppler eingebaut wurde.
Hast du die Master und Client Version genommen die Wigbert geschrieben hat ?
Laut seinen Aussagen soll es klappen, ich habe es leider noch nicht ausprobiert, muss noch ein weiteres Testboard bauen. :oops:
Jo wäre Klasse wenn man doch die Erfahrungen austauschen könnte und so was wie ein Allgemein benutzbares Protokoll erschaffen zu können.
:D
Zu Thema Sendet der Sender gibts hier auch noch Tips im Forum!
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 12.09.2007, 16:19
avrnix hat folgendes geschrieben:
Zu Thema Sendet der Sender gibts hier auch noch Tips im Forum!
Kein Problem, bin Funkamateur 8)
Zum Austausch. Auf jeden Fall werd ich mich da einbringen. Leider hab ich nicht jeden Tag die Zeit dazu, auch wenn ich gerne würde.
Aber wird schon.
Grüße Eisbaeeer
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
avrnix - 12.09.2007, 19:39
Eisbaeeer hat folgendes geschrieben:
Kein Problem, bin Funkamateur 8)
Zum Austausch. Auf jeden Fall werd ich mich da einbringen. Leider hab ich nicht jeden Tag die Zeit dazu, auch wenn ich gerne würde.
Aber wird schon.
Grüße Eisbaeeer
Es erwartet ja keiner das es ein Fulltimejob wird 8)
Wigbert ist auch Funkeramateur :shock:
Also es wird schon, wenn alle was machen und helfen, kommen schöne Projekte zustande. [b] Step by Step [\b]
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 13.09.2007, 06:30
avrnix hat folgendes geschrieben:
Also es wird schon, wenn alle was machen und helfen, kommen schöne Projekte zustande. [b] Step by Step [\b]
Ja denk ich auch, dass da schöne Sachen zusammenkommen.
Ich werde meine Steuerung für die Wärmepumpe ersetzen. Da gibt es auf dem Markt nix gescheites. In den Räumen (Wohnen (Kachelofen), Bad, Kinderzimmer, usw.) wird ein GLCD 128x64 die ganzen Infos anzeigen und die Zentrale bedienen, natürlich mit einem RFM12 angebunden :?
Das Projekt will ich dann Open-Source machen.
Was jetzt schon geht:
- DCF Uhr
- Temperatursensoren 1-wire (DS18S20)
- GLCD 128x64
- Uhrenbaustein PF8583
So, dass das nicht Offtopic wird, werd ich das Projekt in die andere Rubrik schreiben.
Grüße Eisbaeeer
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 14.09.2007, 09:03
Hallo Leute,
da ich jetzt Auswärts tätig bin, wird sich diesen Monat noch hinziehen, kann das Projekt zeitlich nicht wie gewollt fortgefürt werden.
Über Zuarbeiten wäre ich dankbar.
Aber immer den Grundgedanken
Mastersteuerung
beachten.
Sonst macht bitte ein neuen Tread auf.
@ Eisbeer
Code: 'interrupt niRQ 'warten auf nIRQ ,später mal
wenn Du das meinst, soweit war ich noch nicht.
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 14.09.2007, 21:24
Zitat:
@ Eisbeer
Code: 'interrupt niRQ 'warten auf nIRQ ,später mal
wenn Du das meinst, soweit war ich noch nicht.
Ich meinte diese Zeilen:
Code:
Config Int1 = Rising
On Int1 Ffit_handler
Enable Int1
Enable Interrupts
Ist das jetzt der nInt oder der nIRQ Anschluss?
Ich versuch mal selbst zu beantworten, der nIRQ?
Ich habe jetzt mal ein "altes" Programm genommen und nachgesehen, was über die RS232 kommt:
Code: <n>;-F-o-r-u-m-0-2-¦- -v-<31>-â-<16>-ÿ-®-Ï-¿-[--ú-¨--<15>-Z-ì-ð-ú-"-<b>-ø--<r>
Das kam dabei raus.
Mal sehen, wie weit ich heute Abend noch komme :-)
Grüße Eisbaeeer
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 14.09.2007, 22:01
Hi Eisbeer,
bevor ich was durcheinander bringe, also meine Master und Slave
Code sollten schon laufen. Wobei der Master im regelmässiger
Periode sendet. Der Master wird später die niRQ Überwachung bekommen.
Code: 'interrupt niRQ 'warten auf nIRQ ,später mal
(ist jetzt noch nicht in Master Code enthalten,
Ist bei periodischen senden ja noch nicht notwendig)
Der Slave empfängt interruptgesteuert.
Code: Enable Int1
Config Int1 = Rising
On Int1 Ffit_handler
Enable Interrupts.
Empfangsinterrupt
Der Master sendet ein Byte zuviel(wird beim Slave nicht erkannt
da das 1. Byte die Empfangslänge begrenzt).Dieses "sinnlose" Byte
soll einfach das letzte Datenbyte beim Master aus den Buffer schieben.
Wenn Du jetzt den Empfänger mit 32 Byte eingestellt hast(alter Code?)
kann es passieren, das er nach den Nutzbyte noch "Müll" empfängst.
Irgendwann sollten bis auf einige Abweichungen der Maste und Slave
Code zu einen Code verschmelzen.
Ich hab das schrittweise aufgebaut und so werde ich das fortführen
da 1. die Demoversion an ihre Grenzen stösst und 2. sollte das
eigentlich den "Start" erleichtern.
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 14.09.2007, 22:11
Wigbert hat folgendes geschrieben:
Code: 'interrupt niRQ 'warten auf nIRQ ,später mal
(ist jetzt noch nicht in Master Code enthalten,
Ist bei periodischen senden ja noch nicht notwendig)
Der Slave empfängt interruptgesteuert.
Code: Enable Int1
Config Int1 = Rising
On Int1 Ffit_handler
Enable Interrupts.
Empfangsinterrupt
Ja das ist klar, im Master ist ja kein Interrupt aktiviert, ergo kein Interrupt in Benutzung.
Beim Empfänger also nIRQ vom RFM12 an INT1 vom Atmega.
Ich hab mit dem Oszi gemessen und bekomme keine Interruptauslösung vom RFM12. Ich empfange aber mit dem "alten" Programm die Daten.
Dann sollte der RFM12 den nIRQ Ausgang auf High setzen, wenn ein Gültiges Signal empfangen wird, oder nicht?
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 14.09.2007, 22:38
Musste erst mal überlegen sorry.
Der Empfänger nutzt den Interrupt des FFIT.
FFIT an int 1 wie im Pollinboard.Geh mal mit dem Oszi daran.
Der nIRQ Pin sollte schalteten wenn der Empfangsbuffer leer ist, damit nicht zu früh gesendet wird.
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 14.09.2007, 22:53
Ich noch mal,
am nIRQ Pin tut sich bei mir anscheinend auch nichts.
Muss mal die Einstellungen prüfen,
aber am FFIT sind schön die Interrupts zu sehen.
hab noch mal im Forum nachgelesen
>dann sollte and der nIRQ (=SDO) Leitung kurze Impulse im
Baudratentakt zu sehen sein.
das wär der SDO pin am rfm 12
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 16.09.2007, 09:46
Ok, dann stimmt was noch nicht. Muss ich mal auf die Suche gehen. Ich bekomme am FFIT ein dauerndes +5V Signal. Nach dem Reset geht das kurz auf 0V. Dann wieder auf 5V.
Heute Nachmittag gehe ich mal auf Suche.
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 16.09.2007, 10:20
seh mal nach ob in den Code
Code: Sub Rf12_ready
Reset Spi_cs
While Spi_sdo = 0 'In der Sim. auf 1 stellen
Wend
End Sub
eine 0 bei While Spi_sdo steht.
Hatte ich auch schon mal vergessen nach der Sim umzustellen
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 17.09.2007, 17:05
Wigbert hat folgendes geschrieben: seh mal nach ob in den Code
Code: Sub Rf12_ready
Reset Spi_cs
While Spi_sdo = 0 'In der Sim. auf 1 stellen
Wend
End Sub
eine 0 bei While Spi_sdo steht.
Hatte ich auch schon mal vergessen nach der Sim umzustellen
Hab ich nachgesehen. Die Einstellung stimmt. Irgend wo ist noch der Hund drin. Der Interrupt an INT1 liegt jetzt bei mir wie beim Pollin Board auf DCLK/CFIL/FFIT.
So hab ich den RFM12 angeschlossen:
SDO --> MISO
FSK --> mit 10k an 5V
DCLK --> INT1
SCK --> SCK
SDI --> MOSI
GND --> GND
VDD --> VDD
ANT --> Antenne
Der "alte" Empfangscode tut, der Sendecode auch.
Am CLK kommt sauber das 10 MHz Rechtecksignal.
Hat noch jemand eine Idee?
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 17.09.2007, 17:27
Hi Eisbeer,
kannst Du mir mal eine Mail schicken,
ich hätte Dir gerne ein einfacheren Code geschickt
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 21.09.2007, 21:54
Ok, ich bin ein Stück weiter.
Nachdem ich die beiden Controller etwa 20cm auseinander betrieben habe, funktioniert der INT1.
Ich bekomme jetzt in regelmäßigen Abständen eine Übertragung.
-------------------EDIT----------------------------------
Ich vermute dass es noch ein Problem in der Sub gibt.
wenn ich das Waitms 10 rausnehme, bekomme ich kein Empfang in regelmäßigen Abständen.
Code: Ffit_handler:
Toggle Portd.6
Waitms 10
Temp = Rf12_trans(&Hb000) 'Empfangsbyte lesen
Rfdata(count) = Temp
Empfangslen = Rfdata(1) - 50 'Stringlänge aus erstes Datembyte errechnen/ -50 wegen Steuerzeichen bei Print
If Empfangslen < Count Then
'If Count >= Maxchar Then
Rxt = 1 'Flag für Ausgabe
Temp = Rf12_trans(&Hca81) 'FIFO + SYNC Erkennung wieder scharf machen
Temp = Rf12_trans(&Hca83)
' Rücksetzen auf 1 in Sub Ausgabe
Else
Incr Count 'ansonsten nur zähler erhöhen
End If
Return
Das Toggle ist meine Schleifenkontrolle
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 21.09.2007, 22:40
Hi Eisbeer,
Deine Gedankengänge sind meiner Meinung nicht richtig.
Wenn an Int 1 ein Interrupt ausgelöst wird, beginnt der Datenempfang.
Bei Einsatz von Wait verpasst der Empfänger was.
Es muss einfach bei jeden Byte ein Interrupt bei Fft_handler zu erkennen sein.
Ich hab auf den Oszi an den o.g. Pins richtig ein Datenpaket ähnlich
"Morsezeichen" als Abbild.
Ich hab meine Code vielfach auf 2 Schaltungsvarianten geladen.
Lief immer.
Wir müssen das Problem wohl nächste Woche per Mail intensiv angehen.
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 04.10.2007, 11:18
So
Nun bin ich ein Stück weiter.
Mein Empfänger bekommt einen Interrupt.
Wenn ich das Modul aber längere Zeit laufen lasse (>24h) funktioniert der Empfänger nicht mehr. Ich vermute einen Stack Überlauf. Denn nach einem Reset funktioniert alles wieder wunderbar. Ich werde mir einen Zähler einbauen, um dem Problem auf die Schliche zu kommen.
Mir sind die Abläufe im Modul noch nicht ganz klar. Da muss ich mal ins Datenblatt abtauchen.
Bei den Tests hatte ich Probleme mit der Deklaration "String"
Diese macht es schwieriger, mit den Bytes weiterzuarbeiten.
Meint ihr, dass es sinnvoll ist, das ganze als String zu deklarieren oder soll nur für die Kennung String verwendet werden und dann für die Nutzdaten Byte?
Grüße Eisbaeeer
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
avrnix - 04.10.2007, 11:37
Ich persönlich stehe auf einen Datentype - alles String oder alles Byte -
Man könnte die Kennung auch als Byte versenden ( ASCII ) und die daten dann als Byte.
Zu den aussetzer , wäre vielleicht ein Watchdog ( gibts im AVR ) interessant.
den muss man alle paar Sec ( max 2s ) zurücksetzen, das würde bedeuten , wenn der AVR hängt , das in nach einer Zeit von 2 Sec der Controller resettet wird.
Hier mal ein Beispiel aus der Bascom Hilfe ( Config Watchdog )
$regfile = "m48def.dat" ' specify the used micro
$crystal = 4000000 ' used crystal frequency
$baud = 19200 ' use baud rate
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space
Config Watchdog = 2048 'reset after 2048 mSec
Start Watchdog 'start the watchdog timer
Dim I As Word
For I = 1 To 1000
Print I 'print value
'Reset Watchdog
'you will notice that the for next doesnt finish because of the reset
'when you unmark the RESET WATCHDOG statement it will finish because the
'wd-timer is reset before it reaches 2048 msec
Next
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 04.10.2007, 16:00
Hi Eisbeer,
nun hast Du mich auf den linken Fuss erwischt.
Ich bin mir mit den Stack auch nicht sicher, wobei mein Code länger
wie 24 Stunden lief.
Kann man den Stack nicht in der Sim anzeigen lassen?
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
avrnix - 04.10.2007, 18:44
Hallo Wigbert,
Was meinst du mit Stack ?
Der Stack müsste doch auch abgebaut werden, oder sehe ich jetzt was Falsch ?
P.S: Morgen werde ich mal meine RF12 ausprobieren
1x mit eine M32 und M8
dann stelle ich mal doofe Fragen - lol :wink:
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 04.10.2007, 19:33
Ich les mich mal durch das RN-Wissen:
http://www.roboternetz.de/wissen/index.php/Bascom_Inside
Wird interessant:
* Bei jedem Interrupt werden schon mal 32 Byte HW-Stack sicher verbraten, nur, um alle Register zu sichern.
* Jedes "LOCAL" Data verbraucht Frame-Space in seiner Größe + 2 byte auf dem Soft-Stack
* Jeder Parameter einer "SUB" braucht 2 Byte SoftStack + die Datengröße, wenn zusätzlich "byval" angegeben ist.
* datenkonversionen Zahl --> string brauchen die Stringlänge ( PRINT !)
Mal sehen, was dabei raus kommt.
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 04.10.2007, 19:57
Hi,
doofe Fragen gibt es wohl kaum.
Der Stack wird auch ordentlich abgebaut, wenn der Befehl ordentlich
beendet wird, oftmals werden aber Testcode schnell mal umgeschrieben.
Deshalb sollte man z.B. Sprünge auf ein Minimum begrenzen,
und lieber ein Flag setzen.
Welche Funktion welchen Stack "verbraucht" ist mir schon aus
Wicki bekannt.
Ist meine Frage aber immer noch nicht beantwortet,
ob ich in der Sim der Stacküberlauf sehen kann.
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 04.10.2007, 21:17
Kann ich dir nicht beantworten, ob man das in der Simulation sieht.
Ich hätte aber noch eine Frage zum letzten Byte im String.
Ich habe jetzt eine feste Länge definiert.
Code: Dim text(8) as Byte
Ich habe für jedes Byte einen festen Wert vergeben (durchnummeriert).
Beim Empfangen stimmen alle Bytes, bis auf das letzte.
Das zeigt ständig einen anderen Wert.
Ist das bei Euch auch so oder liegt das an meinen Timern?
Sollte ich während der Senderoutine die Interrupts und Timer beenden und danach wieder starten?
Eisbaeeer
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 04.10.2007, 21:22
Hatten wir schon mal,
schieb beim Senden ein sinnloses Byte hinterher,
und ignorier das beim Empfang.
Ich nehme mal an beim Senden muss ein Byte nachgeschoben werden,
um das vorletzte Byte ordentlich aus dem Buffer auszulesen und zu
senden.
Läuft dein Mega 32 ( L-Type ?)mit 8MHz ? was für ein Wert hast den den RFM12 Modul eingestellt 10 ( C0E0 )oder 5 MHz (C0C0) , welchen Hex Wert im Programm ? Und Mega läuft über den RFM12 Quarz ?
Datenblatt : S. 22 Punkt 14 -> http://comwebnet.co.funpic.de/seite48.php
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 04.10.2007, 21:31
Ok, jetzt wo du es erwähnst, habe ich das schon einmal gelesen und erinnere mich daran.
Ein Byte verschenken :-)
Ich habe das gerade auch noch getestet, um sicherzugehen, dass es nicht an den Timern liegt.
Im Moment stoße ich den Empfang in der Schleife Do an. Nur wenn ich ein
Code: Call Rf12_rxdata(maxchar)
mache, wird mein Interrupt ausgelöst.
Wie stellt man es an, dass der RFM eigenständig ein Interrupt auslöst?
Sozusagen ständiger Empfang und nur auslesen, wenn ein Interrupt ansteht?
Komisch ist, dass die Laufzeiten unterschiedlich sind, bis sich mein Programm aufhängt. Ein Watchdog ist nicht die Lösung, da dreht man an den Folgen, nicht an der Ursache.
Eisbaeeer
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 04.10.2007, 21:55
Also nach meinem Code "lauert" der RFM 12 auf Daten, und der Interrupt
leitet die Leseprozedur ein.
Du willst sicher den Empfang initialisieren der Controller soll dann
was auderes machen und im Hintergrund QRV sein.
Hab ich noch nicht ausprobiert, sollte aber gehen.
Init vorher einleiten.
Drück mal nach Compile STRG+W und vergleich mal die Stack.
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 04.10.2007, 22:09
Ich hab ein bischen mehr im AVR, aber hier mal die komplette Ausgabe:
Code: Report : EMPFAENGER_RFM12
Date : 10-04-2007
Time : 22:02:27
Compiler : BASCOM-AVR LIBRARY V 1.11.8.3
Processor : M32
SRAM : 800 hex
EEPROM : 400 hex
ROMSIZE : 8000 hex
ROMIMAGE : 28BE hex -> Will fit into ROM
ROMIMAGE : 10430 dec
FLASH USED : 31 %
BAUD : 19200 Baud
XTAL : 8000000 Hz
BAUD error : 0.16%
Stack start : 85F hex
Stack size : C8 hex
S-Stacksize : C8 hex
S-Stackstart : 798 hex
Framesize : C8 hex
Framestart : 6CF hex
Space left : 1324 dec
LCD DB7 : PORTB.7
LCD DB6 : PORTB.6
LCD DB5 : PORTB.5
LCD DB4 : PORTB.4
LCD E : PORTB.3
LCD RS : PORTB.2
LCD mode : 4 bit
--------------------------------------------------------------------------------
Variable Type Address(hex) Address(dec)
--------------------------------------------------------------------------------
HWSTACK Word 005D 93
SWSTACK Word 001C 28
FRAME Word 0004 4
COMPARE0 Byte 005C 92
PWM Byte 005C 92
COUNTER0 Byte 0052 82
TIMER0 Byte 0052 82
COUNTER2 Byte 0044 68
TIMER2 Byte 0044 68
COMPARE2 Byte 0043 67
ADCD Word 0024 36
COUNTER1 Word 004C 76
TIMER1 Word 004C 76
CAPTURE1 Word 0046 70
COMPARE1A Word 004A 74
PWM1A Word 004A 74
PWM1B Word 0048 72
COMPARE1B Word 0048 72
PWM0 Byte 005C 92
ERR Bit 0006 6
HOUR Byte 0060 96
MINUTE Byte 0061 97
SECOND Byte 0062 98
DAY Byte 0063 99
MONTH Byte 0064 100
YEAR Byte 0065 101
WEEKDAY Byte 0066 102
WEEKDAY_S String 0067 103
MONAT String 006A 106
TFWW Single 006E 110
TFHW Byte (8) 0072 114
TFAU Single 007A 122
TFMK Single 007E 126
TFSV Single 0082 130
TFSR Single 0086 134
TFHV Single 008A 138
TFLR Single 008E 142
TFRS1 Single 0092 146
TFRS2 Single 0096 150
TFID1 Byte (8) 009A 154
TFID2 Byte (8) 00A2 162
WPE Bit 00AA 170
PMK Bit 00AA 170
PKK Bit 00AA 170
MIA Bit 00AA 170
MIZ Bit 00AA 170
PZI Bit 00AA 170
SPZ Bit 00AA 170
WPBSZ Byte 00AB 171
PMKBSZ Byte 00AC 172
PKKBSZ Byte 00AD 173
SAST Bit 00AA 170
PZIBSZ Byte 00AE 174
RST1 Byte 00AF 175
RST2 Byte 00B0 176
I Byte 00B1 177
J Byte 00B2 178
COUNT Byte 00B3 179
TEMP Word 00B4 180
RFDATA Byte (8) 00B6 182
TEXT Byte (8) 00B6 182
S String 00BE 190
T4 String 00C9 201
T6 Single 00D4 212
--------------------------------------------------------------------------------
Constant Value
--------------------------------------------------------------------------------
SREG &H3F
SPH &H3E
SPL &H3D
OCR0 &H3C
GIMSK &H3B
GICR &H3B
GIFR &H3A
TIMSK &H39
TIFR &H38
SPMCR &H37
SPMCSR &H37
TWCR &H36
MCUCR &H35
MCUSR &H34
MCUCSR &H34
TCCR0 &H33
TCNT0 &H32
OSCCAL &H31
SFIOR &H30
TCCR1A &H2F
TCCR1B &H2E
TCNT1H &H2D
TCNT1L &H2C
OCR1AH &H2B
OCR1AL &H2A
OCR1BH &H29
OCR1BL &H28
ICR1H &H27
ICR1L &H26
TCCR2 &H25
TCNT2 &H24
OCR2 &H23
ASSR &H22
WDTCR &H21
UBRRHI &H20
UCSRC &H20
EEARH &H1F
EEARL &H1E
EEDR &H1D
EECR &H1C
PORTA &H1B
DDRA &H1A
PINA &H19
PORTB &H18
DDRB &H17
PINB &H16
PORTC &H15
DDRC &H14
PINC &H13
PORTD &H12
DDRD &H11
PIND &H10
SPDR &H0F
SPSR &H0E
SPCR &H0D
UDR &H0C
USR &H0B
UCSRA &H0B
UCR &H0A
UCSRB &H0A
UBRR &H09
UBRRL &H09
ACSR &H08
ADMUX &H07
ADCSR &H06
ADCH &H05
ADCL &H04
TWDR &H03
TWAR &H02
TWSR &H01
TWBR &H00
INT1 7
INT0 6
INT2 5
IVSEL 1
IVCE 0
INTF1 7
INTF0 6
INTF2 5
TOIE0 0
OCIE0 1
TOIE1 2
OCIE1B 3
OCIE1A 4
TICIE1 5
TOIE2 6
OCIE2 7
TOV0 0
OCF0 1
TOV1 2
OCF1B 3
OCF1A 4
ICF1 5
TOV2 6
OCF2 7
SPMIE 7
ASB 6
ASRE 4
BLBSET 3
PGWRT 2
PGERS 1
SPMEN 0
SELFPRGEN 0
SE 7
SM2 6
SM1 5
SM0 4
ISC11 3
ISC10 2
ISC01 1
ISC00 0
JTD 7
ISC2 6
EIH 5
JTRF 4
WDRF 3
BORF 2
EXTRF 1
PORF 0
FOC0 7
WGM00 6
COM01 5
COM00 4
WGM01 3
CS02 2
CS01 1
CS00 0
WGM01 7
COM1A1 7
COM1A0 6
COM1B1 5
COM1B0 4
FOC1A 3
FOC1B 2
PWM11 1
PWM10 0
ICNC1 7
ICES1 6
CTC11 4
CTC10 3
CTC1 3
CS12 2
CS11 1
CS10 0
FOC2 7
PWM2 6
COM21 5
COM20 4
CTC2 3
CS22 2
CS21 1
CS20 0
RPDD 7
RPDC 6
RPDB 5
RPDA 4
ACME 3
PUD 2
PSR2 1
PSR10 0
WDTOE 4
WDE 3
WDP2 2
WDP1 1
WDP0 0
EERIE 3
EEMWE 2
EEWE 1
EERE 0
EEPE 1
PA7 7
PA6 6
PA5 5
PA4 4
PA3 3
PA2 2
PA1 1
PA0 0
DDA7 7
DDA6 6
DDA5 5
DDA4 4
DDA3 3
DDA2 2
DDA1 1
DDA0 0
PINA7 7
PINA6 6
PINA5 5
PINA4 4
PINA3 3
PINA2 2
PINA1 1
PINA0 0
PB7 7
PB6 6
PB5 5
PB4 4
PB3 3
PB2 2
PB1 1
PB0 0
DDB7 7
DDB6 6
DDB5 5
DDB4 4
DDB3 3
DDB2 2
DDB1 1
DDB0 0
PINB7 7
PINB6 6
PINB5 5
PINB4 4
PINB3 3
PINB2 2
PINB1 1
PINB0 0
PC7 7
PC6 6
PC5 5
PC4 4
PC3 3
PC2 2
PC1 1
PC0 0
DDC7 7
DDC6 6
DDC5 5
DDC4 4
DDC3 3
DDC2 2
DDC1 1
DDC0 0
PINC7 7
PINC6 6
PINC5 5
PINC4 4
PINC3 3
PINC2 2
PINC1 1
PINC0 0
PD7 7
PD6 6
PD5 5
PD4 4
PD3 3
PD2 2
PD1 1PD0 =0
DDD7 7
DDD6 6
DDD5 5
DDD4 4
DDD3 3
DDD2 2
DDD1 1
DDD0 0
PIND7 7
PIND6 6
PIND5 5
PIND4 4
PIND3 3
PIND2 2
PIND1 1
PIND0 0
RXC 7
TXC 6
UDRE 5
FE 4
OR 3
DOR 3
PE 2
U2X 1
MPCM 0
RXCIE 7
TXCIE 6
UDRIE 5
RXEN 4
TXEN 3
CHR9 2
UCSZ2 2
RXB8 1
TXB8 0
URSEL 7
UMSEL 6
UPM1 5
UPM0 4
USBS 3
UCSZ1 2
UCSZ0 1
UCPOL 0
SPIE 7
SPE 6
DORD 5
MSTR 4
CPOL 3
CPHA 2
SPR1 1
SPR0 0
SPIF 7
WCOL 6
SPI2X 0
ACD 7
ACBG 6
ACO 5
ACI 4
ACIE 3
ACIC 2
ACIS1 1
ACIS0 0
REFS1 7
REFS0 6
ADLAR 5
MUX4 4
MUX3 3
MUX2 2
MUX1 1
MUX0 0
ADEN 7
ADSC 6
ADFR 5
ADIF 4
ADIE 3
ADPS2 2
ADPS1 1
ADPS0 0
TWINT 7
TWEA 6
TWSTA 5
TWSTO 4
TWWC 3
TWEN 2
TWI_TST 1
TWIE 0
TWGCE 0
AS2 3
TCN2UB 2
OCR2UB 1
TCR2UB 0
_DATE_FORMAT 0
_DATE_SEPARATOR 92
_RTSCTS 0
_RTSCTS1 0
_CHIP 23
_RAMSIZE 2048
_ERAMSIZE 1024
_SIM 0
_XTAL 8000000
_BUILD 11182
_COMPILER 90
_HWMUL 1
_ROMSIZE 32768
_DOSFILEWRITE 0
_DOSDIRWRITE 0
RF12FREQ 433.92
RF12BAUD 19200
MAXCHAR 8
_GLCD_PORT &H15
_GLCD_PORT_DDR &H14
_GLCD_PORT_IN &H13
_GLCD_PORTM &H1B
--------------------------------------------------------------------------------
Warnings:
--------------------------------------------------------------------------------
HWSTACK not used
SWSTACK not used
FRAME not used
COMPARE0 not used
PWM not used
COUNTER2 not used
COMPARE2 not used
ADCD not used
PWM0 not used
TFID1 not used
TFID2 not used
WPE not used
PMK not used
PKK not used
MIA not used
MIZ not used
PZI not used
SPZ not used
WPBSZ not used
PMKBSZ not used
PKKBSZ not used
SAST not used
PZIBSZ not used
RST2 not used
TEXT not used
T4 not used
T6 not used
Ich komm warscheinlich nur weiter, wenn ich mich ins Datenblatt einlese. Die INIT ist beim Beispiel Programm anders. Ich werd das mal zerpflücken. Hier mal ein Auszug aus dem Programmbeispiel.
Ich werd mir das Datenblatt mal unter das Kopfkissen legen :-)
Eisbaeeer
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 04.10.2007, 22:28
Hier mal meine Stackwerte des Tranceivercodes
Report : RF12TRANCEIVER
Date : 10-04-2007
Time : 22:14:23
Compiler : BASCOM-AVR LIBRARY V 1.11.8.3,
Processor : M8
SRAM : 400 hex
EEPROM : 200 hex
ROMSIZE : 2000 hex
ROMIMAGE : F2E hex -> Will fit into ROM
ROMIMAGE : 3886 dec
FLASH USED : 47 %
BAUD : 19200 Baud
XTAL : 9216000 Hz
BAUD error : 0.%
Stack start : 45F hex
Stack size : 80 hex
S-Stacksize : 28 hex
S-Stackstart : 3E0 hex
Framesize : 14 hex
Framestart : 3CB hex
Space left : 791 dec
>Ich werd mir das Datenblatt mal unter das Kopfkissen legen
schöne Träume
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 05.10.2007, 07:54
Hallo
heute morgen beim Frühstück:
Entweder bin ich noch nicht wach, oder ich verstehe Basic nicht mehr.
Code:
Sub Rf12_init:
Waitms 150
Temp = Rf12_trans(&Hc0e0)
Temp = Rf12_trans(&H80d7)
Temp = Rf12_trans(&Hc2ab)
Temp = Rf12_trans(&Hca81)
Temp = Rf12_trans(&He000)
Temp = Rf12_trans(&Hc800)
Temp = Rf12_trans(&Hc4f7)
End Sub
Hier wird die Variable "Temp" mit den Kommandos gefüllt, jedoch jedes mal überschrieben. Sollte das nicht eher so aussehen:
Code:
Sub Rf12_init:
Waitms 150
Rf12_readys
Temp = Rf12_trans(&Hc0e0)
Rf12_readys
Temp = Rf12_trans(&H80d7)
Rf12_readys
Temp = Rf12_trans(&Hc2ab)
Rf12_readys
Temp = Rf12_trans(&Hca81)
Rf12_readys
Temp = Rf12_trans(&He000)
Rf12_readys
Temp = Rf12_trans(&Hc800)
Rf12_readys
Temp = Rf12_trans(&Hc4f7)
End Sub
Wo werden die Register denn an das RFM12 übergeben?
Bitte berichtigt mich, wenn das nicht so sein sollte.
Ich les mal weiter im Datenblatt.
Eisbaeeer
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
avrnix - 05.10.2007, 10:24
Morgen Eisbeer,
also das ist ne Funktion, die Werte für den RFM12 werden mit SPImove übertragen. Und die Adresse zurückgeliefert die bei INIT des RF12 anscheinend nicht gebraucht werden.
Eine Funktion erwartet einen Rückgabe wert der tmp zugeordnet ist.
Function Rf12_trans(byval Wert As Word) As Word
Local Lowbyte As Byte
Local Highbyte As Byte
Lowbyte = Wert And 255
Shift Wert , Right , 8
Reset Spi_cs
Highbyte = Spimove(wert)
Lowbyte = Spimove(lowbyte)
Set Spi_cs
Temp = Highbyte * 256
Temp = Temp + Lowbyte
Rf12_trans = Temp
End Function
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 05.10.2007, 12:03
avrnix hat folgendes geschrieben: Morgen Eisbeer,
also das ist ne Funktion, die Werte für den RFM12 werden mit SPImove übertragen. Und die Adresse zurückgeliefert die bei INIT des RF12 anscheinend nicht gebraucht werden.
Eine Funktion erwartet einen Rückgabe wert der tmp zugeordnet ist.
Ah, ok, mit Funktionen hatte ich noch nichts zu tun.
Die Function wird also mit
Temp = RF12_trans(...)
aufgerufen.
Ich hab beim durchlesen des Datenblattes ein paar Unterschiede in der Initialisierung der RFM12 Bausteine festgestellt.
Ich weiss jetzt natürlich auch noch nicht, was die Feinheiten bewirken.
Ich werd mir mal die Mühe machen, die Flussdiagramme von Hope und dem Beispielprogramm in Bascom nach dem Beispiel abzubilden.
Der Hinweis mit der Funktion war wichtig. Ich hab mich schon gefragt, wie das vor sich geht.
Hier steht noch:
After RF12 initialization, open FIFO receive mode and wait nIRQ low, only then MCU can read received and stored in FIFO data. For next package receive, please reset FIFO.
Kann es sein, dass im Script das "Disable FIFO fill (0xCA81) fehlt?
Code:
Sub Rf12_rxdata(byval Maxchar As Byte)
Temp = Rf12_trans(&H82c8)
Temp = Rf12_trans(&Hca81)
Temp = Rf12_trans(&Hca83)
For Count = 1 To Maxchar
Rf12_ready
Temp = Rf12_trans(&Hb000)
Rfdata(count) = Temp
Next Count
Temp = Rf12_trans(&H8208)
End Sub
Hier wird:
&Hca81 'disable FIFO
&Hca83 'enable FIFO
durchgeführt, aber das disable nach dem auslesen fehlt. Das kann der Grund sein, warum sich der Empfänger "aufhängt".
Werd ich heute Abend gleich mal testen.
Eisbaeeer
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 05.10.2007, 21:08
Ich wieder.
Programm läuft jetzt seit über einer Stunde durch. Kein Hänger mehr. Das vorherige wäre bei mir schon mehrfach stehen geblieben.
Komisch, dass das bis jetzt bei niemanden aufgetaucht ist.
In der Empfangsroutinge muss es also heißen:
-------------------------------------------------------------------------------------
Sub Rf12_rxdata(byval Maxchar As Byte)
Temp = Rf12_trans(&H82c8)
Temp = Rf12_trans(&Hca81)
Temp = Rf12_trans(&Hca83)
For Count = 1 To Maxchar
Rf12_ready
Temp = Rf12_trans(&Hb000)
Rfdata(count) = Temp
Next Count
Temp = Rf12_trans(&Hca81)
Temp = Rf12_trans(&H8208)
End Sub
-------------------------------------------------------------------------------------
Laut Datenblatt ergänzte Zeile ist in Fett und Kursiv.
Ich lasse das Modul jetzt mal die Nacht durchlaufen.
Eisbaeeer
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 05.10.2007, 21:36
Eigentlich machst Du jetzt noch mal ein reset
warum nicht Code: === FIFO und RESET-Mode ===
'Hex = ca & xx
'Bit-Syntax: 11001010 | f3 | f2 | f1 | f0 | -unknow- (0) | al | ff | dr
'f... = (FIFO interrupt Level)
'-unknow- (0) = ??? (Standard = 0) (Auch im Datenblatt von IA4420 so beschrieben)
'al = (FIFO Fill Condition) Legt den Wert fest, ab dem das Füllen des FIFOs beginnt. (0=Syncron / 1=Ständig). Bei nutzung des Syncronen Modus, werden erst dann Daten in den FIFO geschrieben, wenn eine definierte 16Bit Datenfolge empfangen wurde (Standard ist Hex: 2dd4).
'ff = (FIFO Fill) Startet das einlesen der Empfangenen Daten in den FIFO Puffer. Wenn al (FIFO Fill Condition) auf Syncron steht, dann startet das Setzen dieses Bits die Syncronisation Bit Erkennung.
'dr = (Sens Reset Mode) Wenn dieses Bit auf 1 steht, wir bei einer schwankung von 200mV auf der VCC (Spannungsversorgung des Chips) Leitung, ein System-Reset ausgelöst.
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 06.10.2007, 19:36
Wigbert hat folgendes geschrieben: Eigentlich machst Du jetzt noch mal ein reset
warum nicht Code: === FIFO und RESET-Mode ===
'Hex = ca & xx
'Bit-Syntax: 11001010 | f3 | f2 | f1 | f0 | -unknow- (0) | al | ff | dr
'f... = (FIFO interrupt Level)
'-unknow- (0) = ??? (Standard = 0) (Auch im Datenblatt von IA4420 so beschrieben)
'al = (FIFO Fill Condition) Legt den Wert fest, ab dem das Füllen des FIFOs beginnt. (0=Syncron / 1=Ständig). Bei nutzung des Syncronen Modus, werden erst dann Daten in den FIFO geschrieben, wenn eine definierte 16Bit Datenfolge empfangen wurde (Standard ist Hex: 2dd4).
'ff = (FIFO Fill) Startet das einlesen der Empfangenen Daten in den FIFO Puffer. Wenn al (FIFO Fill Condition) auf Syncron steht, dann startet das Setzen dieses Bits die Syncronisation Bit Erkennung.
'dr = (Sens Reset Mode) Wenn dieses Bit auf 1 steht, wir bei einer schwankung von 200mV auf der VCC (Spannungsversorgung des Chips) Leitung, ein System-Reset ausgelöst.
Auf jeden Fall läuft der Code jetzt seit über 24 Stunden durch.
Da ist noch was nicht sauber.
Im Datenblatt steht noch:
Note:
For next package receive, please reset FIFO.
Eisbaeeer
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 06.10.2007, 19:43
Prima,
ich nehme mal an niemand hat ein Langzeittest gemacht,
hab in mein Code mit Interruptempfang mal nachgeschaut,
da ist wohl glücklicherweise auch &Hca81 angehangen.
Wäre wirklich noch Reset zu klären
Wigbert
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 08.10.2007, 06:28
Hallo zusammen
Ich hätte heute Abend wieder Zeit, mich mit der Materie zu beschäftigen.
Der Empfänger läuft jetzt soweit durch, wenn der Sender sendet.
Nur wenn der Sender nicht sendet (also ausgeschaltet ist) läuft der Code auf dem Empfänger nicht weiter.
Das ist ganz schlecht.
Die Nacht war nicht toll (Das Datenblatt hat durchs Kopfkissen durchgedrckt :shock: )
Spaß beiseite, Ich kenne das Datenblatt (programming guide) so langsam auswendig, aber die beiden Flussdiagramme sind echt der Hohn. Selten so schlechte Dokumentation gesehen.
Wie stellt man es an, dass der Empfänger einen Interrupt ausgibt, sobald ein Datenpaket empfangen wurde. Sodass man dieses dann per FIFO auslesen kann.
Erst wenn das Datenpacket da ist, soll sich der Controller darum kümmern.
Was mir noch aufgefallen ist, im Beipspielscript sendet Hope 3 Dummy Byte hinterher. Bisher habe ich nur eines hinterhergesendet.
RF12_SEND(0xAA);//DUMMY BYTE
RF12_SEND(0xAA);//DUMMY BYTE
RF12_SEND(0xAA);//DUMMY BYTE
Grüße Eisbaeeer
------ Edit ---------------
Ich hab noch die Doku von microcontroller.net gefunden. Werde mich da noch einlesen. Mal sehen, ob die Infos detaillierter sind.
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 08.10.2007, 17:58
Hi,
Als ich bin der Meinung das vor dem Senden von Datenpaketen zu Anfang "sinnlose Byte" gesendet werden sollten. Damit das Ding
in "Schwung" kommt. Hinterher komme ich mit ein zusätzliche Byte aus.
Der Controller sollte den Empfänger initalisieren(QRV) und mit interrupts
empfangen.Das zieht wohl mit sich , das irgendwelche anderen Aufgaben
auch durch Interrupts realisiert werden müssen. Oder gleich nach
Datenempfang. Das wiederum setzt ein Timing vorraus.
Übrigens: ein Code von AVRNIX lief nicht, der gleiche Code(aber von meinen Rechner) funktionierte. Seltsam?
Versuch doch mal Empfänger ausschalten und gleich wieder an?
Temp = Rf12_trans(&Hca81)
Temp = Rf12_trans(&Hca83) noch anhängen?
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 08.10.2007, 20:46
Hallo
Bisher hat also noch keiner ein Script laufen, das den Empfänger sozusagen "Einschaltet" und erst bei einem interrupt (voller String im FIFO) den FIFO ausließt?
Das Ding muss das doch können oder bin ich da falsch?
Mit der erweiterten bzw. übersetzten Doku von microcontroller.net komme ich im Moment auch nicht weiter.
Warscheinlich sehe ich vor lauter Bäumen den Wald nicht. Ich bekomme es hin, dass mein Programm sauber durchläuft, wenn der Sender auch sendet. Tut er das aber nicht, bleibe ich im Programm bei:
Call Rf12_rxdata(maxchar)
hängen. Meine Timer laufen schön weiter, nur die Hauptschleife steht.
@Wigbert:
Hattest du mit dem Ffit_handler schon Erfolge?
Im Moment Toggle ich damit nur ne LED, diese sollte aber doch irgend wann den FIFO auslesen, oder?
Eisbaeeer
----------------- Edit --------------------------
Irgend wie muss man doch jetzt den:
Code:
For Count = 1 To Maxchar
Rf12_ready
Temp = Rf12_trans(&Hb000)
Rfdata(count) = Temp
Next Count
in den Ffit_handler bekommen.
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 08.10.2007, 22:00
Hallo Eisbeer,
hab Dir per Mail eine Rar Datei geschickt.
Also, ich hab mit dem Interruptepfang keine Probleme.
Ich schalte den Empfänger sofort auf Empfang.
Ér könnte dann in der Schleife was anderes machen.
Die Aussage war vorhin nicht richtig.
Also nochmal:
Am Anfang der Schleife Empfang Initialisieren.
Schleife abarbeiten
Bei Interrupt String lesen + speichern.
Wenn der gesamte String angekommen, auswerten.
Das macht doch mein Slave die ganze Zeit.
Lass doch einfach in der Schleife eine LED Toggeln,
dann macht die Schleife schon was zusätzlich.
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 10.10.2007, 12:41
Also, neuen Anlauf:
Zitat Datenblatt:
Note: After RF12 initialization, open FIFO receive mode and wait nIRQ low,only than MCU can read received and store FIFO data. For next Package receive, please reset FIFO.
Hier im Script steht folgendes:
Code:
'Einlesen der String durch Interrupt
On Int1 Ffit_handler
Enable Int1
Config Int1 = Rising
Enable Interrupts
und
Code:
'Interrupt RFM12
Ffit_handler:
Toggle Portd.6
' Byte lesen
Temp = Rf12_trans(&Hb000)
Rfdata(count) = Temp
If Count >= Maxchar Then
' Wenn maxchar Bytes gelesen wurden, Text ausgeben
' FIFO SYNC Erkennung wieder scharf machen
Temp = Rf12_trans(&Hca81)
Temp = Rf12_trans(&Hca83)
' und von vorne zählen
Count = 1
Else
' ansonsten nur zähler erhöhen
Incr Count
End If
Return
Grüße Eisbaeeer
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 14.10.2007, 20:38
Also
Ich kann machen, was ich will.
Das ganze funktioniert bei mir nur, wenn der Sender auch sendet. Ziehe ich beim Sender den Stecker, bleibt meine Do Schleife stehen.
Ist das bei Euch auch so?
Läuft bei Euch die Do Schleife weiter, auch wenn der Sender keine Spannung hat?
Bei mir soll die Do-Scheife auch weiterlaufen, wenn der Sender nichts sendet.
Grüße Eisbaeeer
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 15.10.2007, 08:13
Ok, ich bleibe hartnäckig.
Ich habe hier: http://www.mikrocontroller.net/topic/73658 noch Hinweise gefunden, warum sich der RFM12 beim Empfang "aufhängen" könnte. Auch in der Interrupt-Schleife. Vor allem dann, wenn kein Signal oder schlechtes Signal anliegt.
Zwischen dem:
Code:
Sub Rf12_rxdata(byval Maxchar As Byte)
Temp = Rf12_trans(&H82c8)
und
Code:
Temp = Rf12_trans(&Hca81)
Temp = Rf12_trans(&Hca83)
For Count = 1 To Maxchar
Rf12_ready
Temp = Rf12_trans(&Hb000)
Rfdata(count) = Temp
Next Count
Temp = Rf12_trans(&Hca81)
Temp = Rf12_trans(&Hca83)
Temp = Rf12_trans(&H8208)
End Sub
sollte wohl noch das Statusregister abgefragt werden. Siehe hier:
Code:
RF_CMD(0x82C8); //Receiver Chain einschalten, Synth aus.
---> RF_GetStatus(); // !!! Status holen, sonst klappt es nicht !!! <---
EXT_INT_EDGE(1,H_TO_L); // INT1 fallende Flanke
clear_interrupt(INT_EXT1); // Flag löschen
RF_FIFO_State = 0;
f_RX_FirstByte = 1;
RF_CMD(0xCA81); // Fifo Reset
RF_CMD(0xCA83);
Christian benutzt den nIRQ als Interrupt und hat in der Interrupt Routine noch ein Time-Out eingebaut.
Laut ihm läuft der Empfänger so durch.
Mal sehen, bis wann ich den Code angepasst habe und wieder berichten kann.
Grüße Eisbaeeer
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
avrnix - 18.10.2007, 21:39
GIbts was neues ? Wenn das Stimmt müssen ja zwei INT0+1 gequält werden oder nicht ? Hast du schon eine Lösung gefunden ?
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 19.10.2007, 06:29
avrnix hat folgendes geschrieben: GIbts was neues ? Wenn das Stimmt müssen ja zwei INT0+1 gequält werden oder nicht ? Hast du schon eine Lösung gefunden ?
Nein, in dem Beispiel wurde der nIRQ Ausgang des Moduls verwendet, um das FIFO auszulesen. Also entweder FFit oder nIRQ verwenden. Ich werde das auch mit nIRQ machen, da das FFit bei mir nicht wirklich gut funktioniert.
Ich hatte bis jetzt keine Zeit mehr, weiter an dem Code zu arbeiten.
Ich habe aber Kontakt mit jemanden, der für einen PIC die Interrupt Routine am laufen hat.
Den Code hab ich bekommen, den muss ich jetzt von C in Bascom übernehmen.
Und es ist tatsächlich so, dass man in der Interrupt Routine einen Timeout programmieren muss, sonst bleibt der Code stehen, wenn es Empfangsprobleme oder Unterbrechnungen gibt oder wenn gar kein Sender da ist.
Eine wichtige Rolle spielen auch die Status Bits. Schade ist nur, dass das nirgends in den Datenblättern oder Programmierbeispielen vom Hersteller steht. Echt schlechte Datenblätter, böse.
Wenn der Empfänger dann läuft, werde ich das eigentliche Thema hier angehen. Protokoll. Aber erst muss das ja mal laufen.
Grüße Eisbaeeer
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 19.10.2007, 16:18
Hallo,
werde jetzt mal Wochenende mein Interrupt auf Schleifendurchlauf
testen.
@Eisbeer
würdest Du den Code mir überlassen?
Oder Herkunft?
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 19.10.2007, 18:23
Hallo Leute,
ich weiss nicht was ich falsch gemacht habe,
also mein Code läuft bei mir nach abschalten des Senders munter weiter.
Ich hab mal in der Hauptschleife
Do
.
.
incr A
if A = 5000 then
Toggle Portd.6
A = 0
End if
.
.
Loop
eingefügt.
Das einzige was ich bemerkt habe: die Schleife ist vor dem 1. Interrupt
schneller.Wird wohl durch die Kennung nach dem 1.Interrupt kommen
Sorry wo kein Fehler da ist, ist der auch schwer zu finden.
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
avrnix - 19.10.2007, 19:29
Hallo Wigbert,
Was passiert den wenn der Empfänger nicht da ist ? Läuft der Sender auch noch ?
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 19.10.2007, 19:49
ja,
ich lass ja ein Sender in Interwallen senden.
Übrigens: nach einer Weile nach Senderabschaltung wird die
Schleife des Empfangsteils wieder schneller und die Kennung
ist gelöscht.Die Sub Kennung muss ich mir noch mal genauer ansehen.
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 26.10.2007, 23:21
Hallo zusammen
Na dann haben wir ja schon mal einen Ansatz.
Bei Wigbert läuft der Code durch, auch wenn gar kein Sender da ist.
Inzwischen habe ich noch 2 weitere RFM12 rumliegen. Die zeigen genau die gleichen Macken.
Ich habe noch eine Vermutung. Wigbert, hast du einen Mega32? Wenn ja, könntest du den Code auf dem Mega32 laufen lassen?
Die ganzen Beispiele waren bis jetzt von Mega8 Prozessoren. Vieleicht liegt da der Hund begraben.
Grüße Eisbaeeer
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
avrnix - 27.10.2007, 11:26
Hallo Eisbeer,
kannst mal dein Programm und Schaltung posten.
Ich glaube nicht das es zwichen der Ansteuerung vom M8 und M32 unterschiede gibt. Vielleicht hast in der Interruptroutine vollgepackt ?
Oder hast du nur den M8 Code auf den M32 Compiliert?
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 27.10.2007, 22:01
avrnix hat folgendes geschrieben: Hallo Eisbeer,
Oder hast du nur den M8 Code auf den M32 Compiliert?
Oje, ich hab schon jeden Bascomcode im Internet auf dem M32 laufen gehabt.
Code:
'#######################################################################
' generated. Take care that the chip supports all fuse bytes.
' ### RF12-Test in Bascom
' ### Basiert auf Code von Benedikt K.
' ### Joachim Fossie Bär Reiter 04/2007
' ### Wigbert Picht
' ### Version 03.06.07
' ########################################################################
$regfile = "m32def.dat" 'ATmega 32
$crystal = 8000000 'Quarz: 8 MHz
$baud = 19200
$hwstack = 100 'hardware stack
$swstack = 100 'software stack
$framesize = 100 'frame space
Baud = 19200
'$PROG &HFF,&HFF,&HD9,&H00' generated. Take care that the chip supports all fuse bytes.
Config Portd.5 = Output 'LED 2
Config Portd.6 = Output 'LED 1
Declare Sub Rf12_init
Declare Function Rf12_trans(byval Wert As Word) As Word
Declare Sub Rf12_setfreq(byval Freq As Single)
Declare Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
Declare Sub Rf12_setbaud(byval Rfbaud As Long)
Declare Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
Declare Sub Rf12_ready
Declare Sub Rf12_txdata(byval Maxchar As Byte)
Declare Sub Rf12_rxdata(byval Maxchar As Byte)
Declare Sub Empfangen
Declare Sub Ausgabe
Const Rf12freq = 433.92
Const Rf12baud = 19200
Const Maxchar = 10
'config the SPI in master mode.The clock must be a quarter of the slave cpu
' Hier ggf. den SoftSPI reinmachen
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 1
' werden benötigt für rf12_ready
' werden benötigt für rf12_ready
Spi_cs Alias Portb.4 ' SS-Pin
Config Spi_cs = Output
Spi_sdo Alias Pinb.6 ' MISO-PIN
Set Spi_cs
'init the spi pins
Spiinit
' was so gebraucht wird
Dim Count As Byte
Dim Temp As Word
Dim Rfdata(32) As Byte
Dim Text As String * Maxchar At Rfdata Overlay
Print "Init"
Call Rf12_init ' ein paar Register setzen (z.B. CLK auf 10MHz)
Print "Set Frequenz"
Call Rf12_setfreq(rf12freq) ' Sende/Empfangsfrequenz auf 433,92MHz einstellen
Print "Set Bandwith"
Call Rf12_setbandwith(4 , 1 , 4) ' 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
Print "Set Baudrate"
Call Rf12_setbaud(rf12baud) ' 19200 baud
Print "Set Power"
Call Rf12_setpower(0 , 6)
' 1mW Ausgangangsleistung, 120kHz Frequenzshift
Enable Int1
Config Int1 = Rising
On Int1 Ffit_handler
Enable Interrupts
' ########################################################################
' ###### Hauptproggi
' ########################################################################
'Text ="Dies ist ein 433MHz Test !!!!!{013}{010}"
' Je nachdem ob Sender oder Empfänger die entsprechenden Zeilen aktivieren
Empfangen
Do
Toggle Portd.5
Waitms 100
nop
Loop
End
'Ewigschleife
Sub Empfangen
' Print "Empfange"
Call Rf12_rxdata(maxchar)
'For Count = 1 To Maxchar
'Print Chr(rfdata(count)) ; "-";
'Next Count
'Print
' Print "Empfangsbereit"
End Sub
' ########################################################################
' ###### Unterroutinen
' ########################################################################
Sub Rf12_init:
Waitms 150
Temp = Rf12_trans(&Hc0e0)
Temp = Rf12_trans(&H80d7)
Temp = Rf12_trans(&Hc2ab)
Temp = Rf12_trans(&Hca81)
Temp = Rf12_trans(&He000)
Temp = Rf12_trans(&Hc800)
Temp = Rf12_trans(&Hc4f7)
End Sub
Sub Rf12_setfreq(byval Freq As Single)
Freq = Freq - 430.00
Temp = Freq / 0.0025
If Temp <96> 3903 Then
Temp = 3903
End If
Temp = Temp + &HA000
Temp = Rf12_trans(temp)
End Sub
Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
Drssi = Drssi And 7
Gain = Gain And 3
Temp = Bandwith And 7
Shift Temp , Left , 2
Temp = Temp + Gain
Shift Temp , Left , 3
Temp = Temp + Drssi
Temp = Temp + &H9400
Temp = Rf12_trans(temp)
End Sub
Sub Rf12_setbaud(byval Rfbaud As Long )
Local Ltemp As Long
If Rfbaud < 663 Then Exit Sub
If Rfbaud < 5400 Then
Temp = 43104 / Rfbaud
Temp = Temp + &HC680
Else
Ltemp = 344828 / Rfbaud
Temp = Ltemp
Temp = Temp + &HC600
End If
Decr Temp
Temp = Rf12_trans(temp)
End Sub
Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
Outpower = Outpower And 7
Temp = Fskmod And 15
Shift Temp , Left , 4
Temp = Temp + Outpower
Temp = Temp + &H9800
Temp = Rf12_trans(temp)
End Sub
Sub Rf12_rxdata(byval Maxchar As Byte)
Temp = Rf12_trans(&H82c8)
Temp = Rf12_trans(&Hca81)
Temp = Rf12_trans(&Hca83)
'For Count = 1 To Maxchar
Rf12_ready
'Temp = Rf12_trans(&Hb000)
'Rfdata(count) = Temp
'Next Count
Temp = Rf12_trans(&H8208)
End Sub
Function Rf12_trans(byval Wert As Word) As Word
Local Lowbyte As Byte
Local Highbyte As Byte
Lowbyte = Wert And 255
Shift Wert , Right , 8
Reset Spi_cs
Highbyte = Spimove(wert)
Lowbyte = Spimove(lowbyte)
Set Spi_cs
Temp = Highbyte * 256
Temp = Temp + Lowbyte
Rf12_trans = Temp
End Function
Sub Rf12_ready
Reset Spi_cs
nop
While Spi_sdo = 0
Wend
End Sub
Ffit_handler:
Toggle Portd.6
' Byte lesen
Temp = Rf12_trans(&Hb000)
Rfdata(count) = Temp
'Momentan Einfach Feste Länge Lesen , Stx Etx Oder Sowas Ist Aber
' Hier Auch Kein Problem...
If Count >= Maxchar Then
' Wenn 32 Bytes gelesen wurden, Text ausgeben
For Count = 1 To Maxchar
Print Chr(rfdata(count)) ; "-";
Next Count
' FIFO SYNC Erkennung wieder scharf machen
Temp = Rf12_trans(&Hca81)
Temp = Rf12_trans(&Hca83)
' und von vorne zählen
Count = 1
Else
' ansonsten nur zähler erhöhen
Incr Count
End If
Return
Der hier läuft z.B. auch nicht. Einzig 4 Ports sind angepasst. 2 davon sind für den RFM12 (spi_cs und spi_sdo) und 2 sind meine Schleifenkontrolle LED1 und LED2 :
Code:
Spi_cs Alias Portb.4 ' SS-Pin
Config Spi_cs = Output
Spi_sdo Alias Pinb.6 ' MISO-PIN
Set Spi_cs
Das Statusregister sollte auch tunlichst ausgelesen werden. Ich habe festgestellt, dass der Code noch schneller läuft, wenn das Statusregister mit &H0000 abgefragt wird.
Die Ursache, warum der Code bei mir stehen bleibt, ist glaube ich die RF12_ready Routine. Für was genau ist der spi_sdo ?
Wenn ich da eine Timeout Routine integriere, läuft der Code weiter, aber sehr sehr langsam.
Grüße Eisbaeeer
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 27.10.2007, 22:11
avrnix hat folgendes geschrieben: Hallo Eisbeer,
kannst mal dein Programm und Schaltung posten.
Oh, hab ich vergessen zu sagen. Ich benutze das Eval Board von Pollin. FSK mit 10k an +5V und Optokoppler ausgebaut und mit Jumper gebrückt.
Ich komme hier wirklich nicht weiter. Ich habe keine Idee mehr.
Ich kann einem von euch auch mal die ganze Hardware zuschicken. Ist eben das modifizierte Eval Board, ein Display 128x64 und Lochrasterplatine. Die Quellcodes kann ich auch dazulegen, was das Display und RFM angeht.
Porto würde ich natürlich übernehmen.
Wahrscheinlich seh ich einfach den Fehler nicht mehr. Hab schon zu lange davor gesessen. Den Code kann ich schon bald auswendig. Also wenn jemand Lust hat, sich das ganze mal anzuschauen, einfach melden.
Grüße Eisbaeeer
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 28.10.2007, 12:42
Hallo Eisbeer,
also irgendwann erfolgt bei mir auch keine Ausgabe mehr.
Der Code des Controllers lauft aber munter weiter. Leider hab ich
versäumt ob nach 3 Tage der Interuupt noch vom RFM12 ordnungsgemäss
durchgeführt wird. Also alles noch mal.
Ich denke aber ich hab ein Stackproblem.
Um das nun definitiv festzustellen, muss ich mir was zum
Debuggen zusammenschrauben, oder Logikanalyser ansetzen oder beides.
Wir drehen uns sonst beide im Kreis, richtige Aussagen kann man sonst
wohl kaum noch treffen.
Also auch bei mir:Bücher unter den Kopfkissen legen,
mein Messgerätepark erweitern.......
den Code auf den m32 nicht richtig zum Laufen zu bringen,
der Fehler wäre wohl für uns beide zu einfach.
Ich komm da sicher noch hinter, was faul ist.
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 28.10.2007, 12:45
Ich noch mal,
im Interrupt das Toggeln, könnte das zu Zeitproblemen führen?
nicht das da was verschlafen wird
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Kurzschluss - 06.11.2007, 22:05
Hallo zusammen
bin neu hier und hab mir vor zwei Wochen das Pollinboard geholt
und einige RFM12 dazu
Ich will meine Hausautomtion damit umrüsten
Habe die Routinen für den RFM12 in ein include gepackt, damit man
das als Treiber in beliebige Projekte einlinken kann...
In die RF12_ready Routine habe ich ein timeout reingebaut damit das System
nicht hängenbleibt...
Für den Empfang nutze ich Interrupt am FFIT-Pin
Als Protokollstack habe ich begonnen das SNAP-Protokoll umzusetzen
aktuell mit Datenbytelänge 0..32 und crc8 mit je 1Byte Adressen für Sender und Empfänger
werde die Quellen hier reinstellen...
gibts ne Möglichkeit direkt die *.bas Files hochzuladen? :?: :?:
Hier das Treiberinculde:
Code:
'#######################################
'inculde file for RF12-device
'info about RF12 Transceiver: www.hoprf.com or www.integration.com
'info about using RF12 with Bascom: www.comwebnet.de
'Version: v0.01
'Author: Kurzschluss
'#######################################
'------[Inculde-Datei: Treiber für RF12 Chip]-----------------------------
$nocompile
Declare Sub Rf12_init()
Declare Sub Rf12_setfreq(byval Freq As Single)
Declare Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
Declare Sub Rf12_setbaud(byval Rfbaud As Long)
Declare Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
Declare Sub Rf12_ready
Declare Sub Rf12_txdata(byval TXlen As Byte)
Declare Sub Rf12_rxdata(byval Maxchar As Byte)
Declare Function Rf12_trans(byval Wert As Word) As Word
Dim RF12_timeout as Word
Dim rf12_err as Byte
'------[Sende Daten]-------------------
Sub Rf12_txdata(byval TXlen As Byte)
Temp = Rf12_trans(&H8238) : Rf12_ready 'Power CMD: synt.& PLL on
Temp = Rf12_trans(&Hb8aa) : Rf12_ready 'Preamble
Temp = Rf12_trans(&Hb8aa) : Rf12_ready 'Preamble
Temp = Rf12_trans(&Hb8aa) : Rf12_ready 'Preamble in FIFO schieben
Temp = Rf12_trans(&Hb82d) : Rf12_ready 'Startzeichen: 2D für den Empfänger
Temp = Rf12_trans(&Hb8d4) : Rf12_ready 'Startzeichen: D4 für den Empfänger
For lv = 1 To TXlen
Rf12_ready
Temp = &HB800 + RF12_data(lv) 'Sende Nutzdaten
Temp = Rf12_trans(temp)
Next lv
Temp = Rf12_trans(&Hb8aa) : Rf12_ready 'Dummybyte nachschieben
Temp = Rf12_trans(&H8208) 'Power CMD: synt.& PLL off, Quarz-clk läuft weiter
End Sub
'INFO: === FIFO und RESET-Mode ===
'Hex = ca & xx
'Bit-Syntax: 11001010 | f3 | f2 | f1 | f0 | -unknow- (0) | al | ff | dr
'f... = (FIFO interrupt Level)
'-unknow- (0) = ??? (Standard = 0) (Auch im Datenblatt von IA4420 so beschrieben)
'al = (FIFO Fill Condition) Legt den Wert fest, ab dem das Füllen des FIFOs beginnt. (0=Syncron / 1=Ständig). Bei nutzung des Syncronen Modus, werden erst dann Daten in den FIFO geschrieben, wenn eine definierte 16Bit Datenfolge empfangen wurde (Standard ist Hex: 2dd4).
'ff = (FIFO Fill) Startet das einlesen der Empfangenen Daten in den FIFO Puffer. Wenn al (FIFO Fill Condition) auf Syncron steht, dann startet das Setzen dieses Bits die Syncronisation Bit Erkennung.
'dr = (Sens Reset Mode) Wenn dieses Bit auf 1 steht, wir bei einer schwankung von 200mV auf der VCC (Spannungsversorgung des Chips) Leitung, ein System-Reset ausgelöst.
'------[Empfange Daten]---------------
Sub Rf12_rxdata(byval Maxchar As Byte)
Temp = Rf12_trans(&H82c8) 'Power CMD: Empfänger an, Quarz-clk läuft weiter
Temp = Rf12_trans(&Hca81) 'FIFO&Reset CMD: sensitiver Reset aus (Brownout)
Temp = Rf12_trans(&Hca83) 'FIFO&Reset CMD: Synchroner Zeichenemfang (warte auf Startzeichen: 2DD4)
For lv = 1 To Maxchar
Rf12_ready :
Temp = Rf12_trans(&Hb000) 'lese 1Byte vom FIFO
RF12_data(lv) = Temp 'Nutzdaten einlesen
Next lv
'Temp = Rf12_trans(&H8208) 'Power CMD: Empfänger aus, Quarz-clk läuft weiter
End Sub
'------[SPI Busroutinen]----------------
Function Rf12_trans(byval Wert As Word) As Word
Local Lowbyte As Byte
Local Highbyte As Byte
Lowbyte = low (Wert) : Highbyte = high(wert)
Reset Spi_cs
Highbyte = Spimove(Highbyte) : Lowbyte = Spimove(lowbyte)
Set Spi_cs
Temp = MAKEINT(Lowbyte , Highbyte)
'print "SPI receive: ";hex(temp) 'debug
Rf12_trans = Temp
End Function
'------[Busy check]-----------------------
Sub Rf12_ready
RF12_timeout=50000
Reset Spi_cs 'SS-Pin--> select RF12
While Spi_sdo = 0 'MISO muss von RF12 auf high gehen 'In der Sim. auf 1 stellen
if RF12_timeout>0 then 'Timeout Loop
decr RF12_timeout
else
rf12_err=1 'Flag setzen
exit WHILE 'Timeout --> Abbruch kein ready vom RF12
end IF
waitus 20
Wend 'Warten bis senden bzw. empfangen fertig
End Sub
'------[INIT]-------------------------------------
Sub Rf12_init()
Waitms 150
Temp = Rf12_trans(&Hc0e0) ': print Temp 'C0E0 -Clock Output 10MHz
Temp = Rf12_trans(&H80d7) ': print Temp '80D7 -Datareg used,FIFO enabled,433MHz,CL=15pF
Temp = Rf12_trans(&Hc2ab) ': print Temp 'C2AB -Datafilter:Autolock-slow mode-Digital Filter,f1=1;f0=1
Temp = Rf12_trans(&Hca81) ': print Temp 'CA81 -FIFO/ResetMode (Brownoutdektion ausgeschaltet)
Temp = Rf12_trans(&He000) ': print Temp 'E000 -WakeUP Timer
Temp = Rf12_trans(&Hc800) ': print Temp 'C800 -LowDuty Cycle
Temp = Rf12_trans(&Hc4f7) ': print Temp 'C4F7 -AFC-command -eingeschaltet
End Sub
'------[Setze TrägerFrequenz]---------------------
Sub Rf12_setfreq(byval Freq As Single)
Freq = Freq - 430.00
Temp = Freq / 0.0025
If Temp <96> 3903 Then
Temp = 3903
End If
Temp = Temp + &HA000
Temp = Rf12_trans(temp) 'Axxx - Frequenzsetting (Kanal Einstellung)
End Sub
'------[Setze Bandweite]---------------------------
Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
Drssi = Drssi And 7
Gain = Gain And 3
Temp = Bandwith And 7
Shift Temp , Left , 2
Temp = Temp + Gain
Shift Temp , Left , 3
Temp = Temp + Drssi
Temp = Temp + &H9400
Temp = Rf12_trans(temp) 'Revicer Control Command (Pin20 VDI output)
End Sub
'------[Einstellung der Baudrate]--------------------
Sub Rf12_setbaud(byval Rfbaud As Long )
Local Ltemp As Long
If Rfbaud < 663 Then Exit Sub
If Rfbaud < 5400 Then
Temp = 43104 / Rfbaud
Temp = Temp + &HC680
Else
Ltemp = 344828 / Rfbaud
Temp = Ltemp
Temp = Temp + &HC600
End If
Decr Temp
Temp = Rf12_trans(temp)
End Sub
'------[Sendeleistung einstelllen]-----------------
Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
Outpower = Outpower And 7
Temp = Fskmod And 15
Shift Temp , Left , 4
Temp = Temp + Outpower
Temp = Temp + &H9800
Temp = Rf12_trans(temp)
End Sub
damit laufen meine mainloops immer durch ---> kein hängenbleiben
Hat jemand Interesse an den Snap-Protokoll mitzumachen?
Bin für Hinweise und Tips dankbar...
Grüsse
Kurzschluss
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Kurzschluss - 06.11.2007, 22:14
Hi
hier noch ein testsender:
Code:
'#######################################
'Testsender SNAP-Protokoll über RF12
'info about SNAP-Protokoll: www.hth.com/snap
'info about RF12 Transceiver: www.hoprf.com or www.integration.com
'info about using RF12 with Bascom: www.comwebnet.de
'Version: v1.00
'Author: Kurzschluss
'#######################################
' The packet structure is defined in the received packets first two
' bytes (HDB2 and HDB1). The following packet structure is used.
'
' DD=01 - 1 Byte destination address
' SS=01 - 1 Byte source address
' PP=00 - No protocol specific flags
' AA=01 - Acknowledge is required
' D=0 - No Command Mode
' EEE=100 - 16-bit CRC-CCITT
' NNNN=0010 - 2 Byte data
'
' Overview of header definition bytes (HDB2 and HDB1)
'
' HDB2 HDB1
' +-----------------+-----------------+
' | D D S S P P A A | D E E E N N N N |
' +-----------------+-----------------+
'
'only TX-Test!!!!!!!!!!!!!!!!!!
$regfile = "m8def.dat"
'$regfile = "m32def.dat"
$hwstack = 128
$swstack = 128
$framesize = 64
'$PROG &HFF,&HFF,&H99,&H00 ' für Mega32
$PROG &HFF,&HE4,&HD9,&H00 ' Mega8 mit internen 8MHz
$crystal = 8000000
'$crystal = 10000000 '
$baud = 19200
Const Rf12freq = 433.92 'Kanal-Einstellung
Const Rf12baud = 19200 'Baudrate
Const MyAdress = 10 'NodeAdress
Const SNAP_SYNC= &H54 'Synczeichen SNAP-Protokoll
'RF-Variablen
Dim lv As Byte
Dim Temp As Word
Dim RF12_data(40) As Byte , RF12_S As String * 40 At RF12_data Overlay
Dim ByteAnzahl As Byte , Framelength as Byte ,crclength as Byte 'Anzahl Sendebytes
'Uart-Variablen
Dim RX_Data as Byte, N as Byte, Rxd_ready as Bit
Dim Buffer(40) as Byte,s_buffer as String * 40 At buffer overlay
'--------------[Hardwaresetup für Pollin Funkboard]-----------------------------------
'PortD.3-->INT1 an FFIT --Interrupt(High) wenn FiFO-Buffer voll (ef-Bit set)
LED1 Alias Portd.5
LED2 Alias Portd.6
Config Portd.5 = Output
Config Portd.6 = Output
'config the SPI in master mode.The clock must be a quarter of the slave cpu
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 1
' werden benötigt für rf12_ready
' Achtung je nach µC Port/Pins anpassen !!!
' M8:
Spi_cs Alias Portb.2 : DDRB.2=1
Spi_sdo Alias Pinb.4 ' SS-Pin
'M32:
'Spi_cs Alias Portb.4 : DDRB.4=1
'Spi_sdo Alias Pinb.6
Set Spi_cs
Spiinit 'init the spi pins
goto Startup
$include "inc_RF12-Treiber.bas" 'Treiber einbinden
Startup:
On Urxc RXD_ISR 'Interrupt Empfange String von RXD
'Enable Urxc 'Einschalten
'Enable Interrupts 'Zulassen
set LED2
Print "Init"
Call Rf12_init ' ein paar Register setzen (z.B. CLK auf 10MHz)
Call Rf12_setfreq(rf12freq) ' Sende/Empfangsfrequenz auf 433,92MHz einstellen
Call Rf12_setbandwith(4 , 1 , 4) ' 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
Call Rf12_setbaud(rf12baud) ' 19200 baud
Call Rf12_setpower(0 , 6) ' 1mW Ausgangangsleistung, 120kHz Frequenzshift
reset LED2
for lv=1 to 40
RF12_data(lv)=8 'lv+20 'Testdaten füllen
next
'TXS =""
'--------[mainloop]------------------------------------------------------
Do
'if Rxd_ready=1 then..... 'evtl....Daten von Uart(PC) in RFTX schieben
ByteAnzahl= rnd(10) 'zum Test zufällige Nutzdatenlänge 0...32Byte
rf12_err=0 'Error Flag löschen
gosub SendSnapFrame
if rf12_err=1 then
print "Timeout beim Senden aufgetreten" 'DebugInfo: Problem beim senden
end IF
wait 5
Loop
End 'end program
'------[Send Frame over RF12]---------------------------------
SendSnapFrame:
'Header aufbereiten (SNAP)
RF12_data(1) = SNAP_SYNC
RF12_data(2) = &H50 'HDB2 1Byte-Adressen
RF12_data(3) = ByteAnzahl 'HDB1 0..32DatenByteInfo
RF12_data(4) = 20 'Zieladresse
RF12_data(5) = MyAdress 'Senderadresse
'ab 6.Stelle <0>10 Then Rxd_ready = 1 ' } -- Wenn Endekennung eingetroffen --> CMD-Frameende eingetroffen
Buffer(n) = Rx_data 'Byte in Buffer
Return
mfg
Kurzschluss
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Kurzschluss - 06.11.2007, 22:34
Noch mal ich,
da ich keine Ahnung hab wie ich hier ein file direkt zu Download reinstellen kann...
hier noch der Emffänger mit Mega32 auf Pollinboard, Interrupt gesteuert
Code:
'#######################################
'Testsender SNAP-Protokoll über RF12
'info about SNAP-Protokoll: www.hth.com/snap
'info about RF12 Transceiver: www.hoprf.com or www.integration.com
'info about using RF12 with Bascom: www.comwebnet.de
'Version: v1.01
'Author: Kurzschluss
'#######################################
' The packet structure is defined in the received packets first two
' bytes (HDB2 and HDB1). The following packet structure is used.
'
' DD=01 - 1 Byte destination address
' SS=01 - 1 Byte source address
' PP=00 - No protocol specific flags
' AA=01 - Acknowledge is required
' D=0 - No Command Mode
' EEE=100 - 16-bit CRC-CCITT
' NNNN=0010 - 2 Byte data
'
' Overview of header definition bytes (HDB2 and HDB1)
'
' HDB2 HDB1
' +-----------------+-----------------+
' | D D S S P P A A | D E E E N N N N |
' +-----------------+-----------------+
'$regfile = "m8def.dat"
$regfile = "m32def.dat"
$hwstack = 128
$swstack = 128
$framesize = 128
$PROG &HFF,&HFF,&H99,&H00 ' für Mega32
$crystal = 8000000
'$crystal = 10000000 '
$baud = 19200
Baud = 19200
Const Rf12freq = 433.92 'Kanal-Einstellung
Const Rf12baud = 19200 'Baudrate
Const MyAdress = 20 'Nodeadresse vom Teilnehmer
Const SNAP_SYNC= &H54 'Synczeichen SNAP-Protokoll
Const Maxchar = 32
Dim lv As Byte
Dim Temp As Word
Dim RF12_data (40) As Byte ,RF12_S As String * Maxchar At RF12_data Overlay
Dim RF_RXD as Bit, RF_SYNC as Bit
Dim NDB as Byte , Framelength as Byte ,crc as Byte
Dim ByteAnzahl as Byte 'Anzahl Sendebytes
Dim S As String * 10
SYNC Alias RF12_data(1)
HDB1 Alias RF12_data(2)
HDB2 Alias RF12_data(3)
DAB1 Alias RF12_data(4)
SAB1 Alias RF12_data(5)
'----------[Hardwaresetup für Pollin Funkboard]---------------------------------------------
'PortD.3-->INT1 an FFIT --Interrupt(High) wenn FiFO-Buffer voll (ef-Bit set)
LED1 Alias Portd.6 : Config Portd.6 = Output
LED2 Alias Portd.5 : Config Portd.5 = Output
'config the SPI in master mode.The clock must be a quarter of the slave cpu
'Hier ggf. den SoftSPI reinmachen
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 1
' werden benötigt für rf12_ready
' Achtung je nach µC anpassen !!!
' für M8: Spi_cs Alias Portb.2 : Spi_sdo Alias Pinb.4 ' SS-Pin
'M32:
Spi_cs Alias Portb.4 : DDRB.4=1 'Config Spi_cs = Output chipselect
Spi_sdo Alias Pinb.6 ' MISO-PIN
Set Spi_cs
Spiinit 'init the spi pins
goto Startup
$include "inc_RF12-Treiber.bas" 'RF12 Treiber einbinden
'--------[Initialisierung]------------------------------------------------
Startup:
Config Int1 = Rising
On Int1 FFIT_ISR:
On Urxc RXD_ISR: 'Interrupt Empfange String von RXD
Enable Urxc 'Einschalten
Enable Interrupts 'Zulassen
set LED2
Print "Init RF12 ..."
Call Rf12_init ' ein paar Register setzen (z.B. CLK auf 10MHz)
Call Rf12_setfreq(rf12freq) ' Sende/Empfangsfrequenz auf 433,92MHz einstellen
Call Rf12_setbandwith(4 , 1 , 4) ' 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
Call Rf12_setbaud(rf12baud) ' 19200 baud
Call Rf12_setpower(0 , 6) ' 1mW Ausgangangsleistung, 120kHz Frequenzshift
Print "Init RF12 Done"
reset LED2
'----------[Mainloop]------------------------------------------------------
RF12_S =""
gosub RF12_RXD_ON
Do
if RF_RXD=1 then
print "RX ready, Framelength: "; Framelength
gosub Framehandler
gosub RF12_RXD_ON
end IF
'do anything....
print "neuer Mainloop"
wait 1
Loop
End
'----------[Frameverarbeitung SNAP-Protokoll]------------------------------------
Framehandler:
set LED1
Print "Frame: "; 'Debugausgabe
For lv = 1 To Framelength
Print hex(RF12_data(lv)) ;" ";
Next lv
print
if SYNC= SNAP_SYNC then 'sync.Zeichen IO?
if HDB2= &H50 then '1Byte Adressierung?
'if HDB2= NDB then '0..32 Datenbyte
if DAB1= MyAdress then 'Adresse prüfen
print "Das war für mich!...von Nr.:";RF12_data(5) 'Datenverarbeitung
swap DAB1,SAB1 'Adressen umdrehen für Rücksenden
crc=Framelength-2 'nur temporär Länge für crc-Check
crc=crc8(RF12_data(2),crc)
if crc=RF12_data(Framelength) then 'CRC OK?
print "CRC OK! => ";crc
' Send ACK (i.e tell master that packet was OK)
' Set ACKs bit in HDB2 (xxxxxx10)
Hdb2 = Hdb2 Or &B00000010
Hdb2 = Hdb2 And &B11111110
'do ...
gosub SENDEN 'Anwortframe senden--> nur als Slave
gosub CMD_HANDLER
'RF12_data(2 <ackno>an 1 Stelle
RF_SYNC=1
lv=1
end IF
RF12_data(lv) = Temp 'Empfangsbyte in Buffer legen
if lv=3 then 'ermitteln der Anzahl Datenbytes (SNAP)
NDB = Temp and &H0F 'unteres Nipple von HDB1 enthält Datenlänge
select case NDB '6Byte<=sync+HDB2+HDB1+DAB+SAB+CRC
case 0 to 8: Framelength=6+NDB '6-14 (0--8 Datebyte)
case 9 : Framelength=6+16 '22 (16 Datenbyte)
case 10 : Framelength=6+32 '38 (32 Datenbyte)
end SELECT
end IF
If lv>=Framelength Then 'alles eingetroffen
RF_RXD=1 'Flag setzen und Empfänger abschalten
Temp = Rf12_trans(&H8208) 'Power_CMD: Empfänger aus, Quarz-clk läuft weiter
disable INT1
End If
incr lv 'Zeiger incr
Return
bitte um Hinweise und Ideen......
die Umsetzung vom SNAP-Stack ist noch in Arbeit
unteranderem habe ich ne keine komplette ACK / NACK Verarbeitung drin
... wenn der Slave nack zurücksendet müsste der Master die Übertragung wiederholen evtl. mit variablen Wartezeiten usw....
mfg
Kurzschluss
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
avrnix - 07.11.2007, 00:24
Hallo Kurzschluss,
danke für das Programm, leider kannst du nicht direkt keine BAS als Datei einstellen. Wie du es gemacht hast ist es OK.
Was ist ein SNAP Protokoll und welche Vorteile hat das ( bzw. Eigenschaften) , außer einer CRC8 ?
Wenn du willst kannst das als Projekt auf meiner HP veröffentlichen. Gilt auch für Eisbeer.
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 07.11.2007, 08:52
Hi Kurzschluss
Na da hast du dir ja richtig Arbeit gemacht. Respekt.
Das werde ich natürlich gleich ausprobieren, sobald ich mal dazukomme.
@arvnix
Danke für das Angebot.
Grüße Eisbaeeer
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
stevensen - 07.11.2007, 10:48
Hi,
viel Sammelung und Schreibarbeit, aber die wirklich wichtigen und kritischen Sachen fehlen. Z.b. die Sache mit den FFit Interrupt Handling hätte mich sehr interessiert.
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 07.11.2007, 12:20
Kurzschluss hat folgendes geschrieben:
werde die Quellen hier reinstellen...
gibts ne Möglichkeit direkt die *.bas Files hochzuladen? :?: :?:
Grüsse
Kurzschluss
Kannst mir die Datei zumailen, dann veröffentliche ich hier einen Link, wo man das ganze dann runterladen kann.
Oder arvnix macht auf seiner Seite gleich ne neue Rubrik.
Die INT Routine würde mich auch interessieren. Wieviel Code hast du in der Routine abgelegt? Denn laut dem "include" wird das nicht als Interrupt abgehandelt, sondern im Sub.
Grüße Eisbaeeer
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 07.11.2007, 12:35
Hi Kurzschluss,
Respekt !!
Steckt viel Arbeit drin.
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Kurzschluss - 07.11.2007, 23:31
Hallo zusammen
hab bemerkt das der Quellcode vom Empfänger nur teilweise übernohmen wurde..hab aber keine Ahnung warum???
d.h. da fehlen ganze Abschnitte u.a. die Interruptroutine
Ich werd die files nochmal per mail senden.
@ avrnix: brauche nur ne mail Adresse vom dir bzw. Eisbär
...und klar du kannst das auf deiner Homepage veröffentlichen
Zu Frage was das SNAP -Protokoll ist:
Scaleable Node Address Protocol
Bitte auf www.hth.com/snap --> snap.pdf angucken
Das Protokoll hat der Hersteller orginal für sein Powerlinemodem entwickelt.
Es ist aber frei verfügbar und ich denke man kann damit eine Netzstruktur zwischen mehreren Transceiver aufbaun.
Vorteil: man muss nicht alles noch mal neu erfinden
(Adressierung,ACK/NAK,Datenlänge usw.)
Habe leider nur begrenzt Zeit an der Sache zu arbeiten
aber wen erzähl ich das.....der notwendige Broterwerb :?
mfg
Kurzschluss
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Kurzschluss - 08.11.2007, 00:04
Hi
hier nochmal als reiner Text:
'#######################################
'Testempfänger SNAP-Protokoll über RF12
'info about SNAP-Protokoll: www.hth.com/snap
'info about RF12 Transceiver: www.hoprf.com or www.integration.com
'info about using RF12 with Bascom: www.comwebnet.de
'Version: v1.01
'Author: Kurzschluss
'#######################################
' The packet structure is defined in the received packets first two
' bytes (HDB2 and HDB1). The following packet structure is used.
'
' DD=01 - 1 Byte destination address
' SS=01 - 1 Byte source address
' PP=00 - No protocol specific flags
' AA=01 - Acknowledge is required
' D=0 - No Command Mode
' EEE=100 - 16-bit CRC-CCITT
' NNNN=0010 - 2 Byte data
'
' Overview of header definition bytes (HDB2 and HDB1)
'
' HDB2 HDB1
' +-----------------+-----------------+
' | D D S S P P A A | D E E E N N N N |
' +-----------------+-----------------+
'$regfile = "m8def.dat"
$regfile = "m32def.dat"
$hwstack = 128
$swstack = 128
$framesize = 128
$PROG &HFF,&HFF,&H99,&H00 ' für Mega32
$crystal = 8000000
'$crystal = 10000000 '
$baud = 19200
Baud = 19200
Const Rf12freq = 433.92 'Kanal-Einstellung
Const Rf12baud = 19200 'Baudrate
Const MyAdress = 20 'Nodeadresse vom Teilnehmer
Const SNAP_SYNC= &H54 'Synczeichen SNAP-Protokoll
Const Maxchar = 32
Dim lv As Byte
Dim Temp As Word
Dim RF12_data (40) As Byte ,RF12_S As String * Maxchar At RF12_data Overlay
Dim RF_RXD as Bit, RF_SYNC as Bit
Dim NDB as Byte , Framelength as Byte ,crc as Byte
Dim ByteAnzahl as Byte 'Anzahl Sendebytes
Dim S As String * 10
SYNC Alias RF12_data(1)
HDB1 Alias RF12_data(2)
HDB2 Alias RF12_data(3)
DAB1 Alias RF12_data(4)
SAB1 Alias RF12_data(5)
'----------[Hardwaresetup für Pollin Funkboard]---------------------------------------------
'PortD.3-->INT1 an FFIT --Interrupt(High) wenn FiFO-Buffer voll (ef-Bit set)
LED1 Alias Portd.6 : Config Portd.6 = Output
LED2 Alias Portd.5 : Config Portd.5 = Output
'config the SPI in master mode.The clock must be a quarter of the slave cpu
'Hier ggf. den SoftSPI reinmachen
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 1
' werden benötigt für rf12_ready
' Achtung je nach µC anpassen !!!
' für M8: Spi_cs Alias Portb.2 : Spi_sdo Alias Pinb.4 ' SS-Pin
'M32:
Spi_cs Alias Portb.4 : DDRB.4=1 'Config Spi_cs = Output chipselect
Spi_sdo Alias Pinb.6 ' MISO-PIN
Set Spi_cs
Spiinit 'init the spi pins
goto Startup
$include "inc_RF12-Treiber.bas" 'RF12 Treiber einbinden
'--------[Initialisierung]------------------------------------------------
Startup:
Config Int1 = Rising
On Int1 FFIT_ISR:
On Urxc RXD_ISR: 'Interrupt Empfange String von RXD
Enable Urxc 'Einschalten
Enable Interrupts 'Zulassen
set LED2
Print "Init RF12 ..."
Call Rf12_init ' ein paar Register setzen (z.B. CLK auf 10MHz)
Call Rf12_setfreq(rf12freq) ' Sende/Empfangsfrequenz auf 433,92MHz einstellen
Call Rf12_setbandwith(4 , 1 , 4) ' 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
Call Rf12_setbaud(rf12baud) ' 19200 baud
Call Rf12_setpower(0 , 6) ' 1mW Ausgangangsleistung, 120kHz Frequenzshift
Print "Init RF12 Done"
reset LED2
'----------[Mainloop]------------------------------------------------------
RF12_S =""
gosub RF12_RXD_ON
Do
if RF_RXD=1 then
print "RX ready, Framelength: "; Framelength
gosub Framehandler
gosub RF12_RXD_ON
end IF
'do anything....
print "neuer Mainloop"
wait 1
Loop
End
'----------[Frameverarbeitung SNAP-Protokoll]------------------------------------
Framehandler:
set LED1
Print "Frame: "; 'Debugausgabe
For lv = 1 To Framelength
Print hex(RF12_data(lv)) ;" ";
Next lv
print
if SYNC= SNAP_SYNC then 'sync.Zeichen IO?
if HDB2= &H50 then '1Byte Adressierung?
'if HDB2= NDB then '0..32 Datenbyte
if DAB1= MyAdress then 'Adresse prüfen
print "Das war für mich!...von Nr.:";RF12_data(5) 'Datenverarbeitung
swap DAB1,SAB1 'Adressen umdrehen für Rücksenden
crc=Framelength-2 'nur temporär Länge für crc-Check
crc=crc8(RF12_data(2),crc)
if crc=RF12_data(Framelength) then 'CRC OK?
print "CRC OK! => ";crc
' Send ACK (i.e tell master that packet was OK)
' Set ACKs bit in HDB2 (xxxxxx10)
Hdb2 = Hdb2 Or &B00000010
Hdb2 = Hdb2 And &B11111110
'do ...
gosub SENDEN 'Anwortframe senden--> nur als Slave
gosub CMD_HANDLER
'RF12_data(2 <--- ackno machen
else
print "CRC Bad => ";crc
' Send NAK (i.e tell master that packet was bad)
' Set ACK bits in HDB2 (xxxxxx11)
Hdb2 = Hdb2 Or &B00000011
gosub SENDEN 'Anwortframe senden--> nur als Slave
end IF
else
print "geht mich nix an!...von Nr.:";RF12_data(5)
end IF
'else
'print "Framelength NIO!!!"
'end IF
else
print "no 1Byte Adress!!!"
end IF
else
print "no Syncbyte!!!"
end IF
waitms 10
reset LED1
return
'------[CMD-Interpreter]-------------------------------------
CMD_handler: 'Auswertung der Nutzdaten.... nur als Denkhilfe :)
'(
select case RF12_data(7)
case 0 :
case 1 : gosub Rolloaufmachen
case 2 : gosub Rollozumachen
case 10 : gosub HoleTemperatur
end SELECT
')
for lv=1 to 20
Toggle LED2 'mache was...
waitms 100
next lv
return
'----------[RF12 Empfänger einschalten]---------------------------
RF12_RXD_ON:
lv=1
RF_SYNC=0 'sync-Flag
RF_RXD=0
RF12_S=""
Framelength=6 'erst mit 3.Byte kann die Framelänge berechnet werden
Temp = Rf12_trans(&H82c8) 'Power CMD: Empfänger an, Quarz-clk läuft weiter
Temp = Rf12_trans(&Hca81) 'FIFO&Reset CMD: sensitiver Reset aus (Brownout)
Temp = Rf12_trans(&Hca83) 'FIFO&Reset CMD: Synchroner Zeichenemfang (warte auf Startzeichen: 2DD4)
Enable Int1
return
'----------[RF12 Daten Senden]-------------------------------------
Senden:
set LED2
' Waitms 1
Print "Sende: "
For lv = 1 To Framelength
Print hex(RF12_data(lv)) ;" ";
Next lv
Call Rf12_txdata(Framelength)
Waitms 10
reset LED2
return
'----------[Uart ISR(Daten vom PC)]--------------------------------
RXD_ISR:
S = S + Chr(udr)
Return
'----------[INT1 ISR(Daten vom RF12)]--------------------------------
FFIT_ISR:
Temp = Rf12_trans(&Hb000)
Temp = Temp and &H00FF
if temp = &H54 and RF_SYNC=0 then 'Synchronzeichen empfangen-->an 1 Stelle
RF_SYNC=1
lv=1
end IF
RF12_data(lv) = Temp 'Empfangsbyte in Buffer legen
if lv=3 then 'ermitteln der Anzahl Datenbytes (SNAP)
NDB = Temp and &H0F 'unteres Nipple von HDB1 enthält Datenlänge
select case NDB '6Byte<=sync+HDB2+HDB1+DAB+SAB+CRC
case 0 to 8: Framelength=6+NDB '6-14 (0--8 Datebyte)
case 9 : Framelength=6+16 '22 (16 Datenbyte)
case 10 : Framelength=6+32 '38 (32 Datenbyte)
end SELECT
end IF
If lv>=Framelength Then 'alles eingetroffen
RF_RXD=1 'Flag setzen und Empfänger abschalten
Temp = Rf12_trans(&H8208) 'Power_CMD: Empfänger aus, Quarz-clk läuft weiter
disable INT1
End If
incr lv 'Zeiger incr
Return
-------------------------------------
Habe bei Optionen HTML und BBCode im Beitrag deaktiviert
..so bleibt der Code komplett
aber leider geht die Formatierung so verloren...
Vielleicht klapps ja irgendwann per mail-Anhang ;)
mfg
Kurzschluss
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 08.11.2007, 21:26
Kurzschluss hat folgendes geschrieben: Hier das Treiberinculde:
Code:
'------[Setze TrägerFrequenz]---------------------
Sub Rf12_setfreq(byval Freq As Single)
Freq = Freq - 430.00
Temp = Freq / 0.0025
If Temp <96> 3903 Then
Temp = 3903
End If
Temp = Temp + &HA000
Temp = Rf12_trans(temp) 'Axxx - Frequenzsetting (Kanal Einstellung)
End Sub
Grüsse
Kurzschluss
Hallo Kurzschluss
Ich habe beim Compilieren ein Fehler:
Code:
If Temp <96> 3903 Then
Temp = 3903
End If
Fehler:
- 3 Parameter expected
und
- If then expected
Ich warte mal auf deine *.bas Datei. Vieleicht hab ich bei "Copy and Paste" ein Fehler drin.
Grüße Eisbaeeer
---------------- Edit --------------------------------------------------------
Ok, liegt wohl an der Compilerversion. Ich hab das jetzt mal auf folgendes geändert, Compiler läuft mal durch. Mehr dann später.
Der Code wird hier im Forum automatisch verändert, wenn das Tag Code verwendet wird. Ist das schon mal jemand aufgefallen?
Code:
If Temp <96> 3903 Then
Temp = 3903
End If
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 08.11.2007, 22:04
So, Empfänger ist compiliert.
Leider fehlt mir jetzt noch der Sender.
Grüße Eisbaeeer
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 09.11.2007, 20:39
Hallo Kurzschluss
Das wars. Bei mir läuft der Empfänger jetzt durch, auch wenn kein Sender sendet.
Oh mann mach ich schon lange dran rum. Tolle Arbeit.
Ich habe gerade gesehen, dass du Befehle für Rollos und Temperaturen übertragen möchtest.
Im Grunde bei mir ganz ähnliche Infos. Ich werde mir jetzt mal das SNAP Protokoll anschauen. Meine Rohdaten kann ich beim Empfänger auch schon lesen. Sehr schön.
Jetzt werde ich mal noch meine Temperaturmessung in das Empfängerscript mit einbauen, damit ich sehe, ob ich Timingprobleme bekomme, wenn kein Sender sendet. Aber so wie ich das sehe, müsste das hinhauen.
Ich bin begeistert.
Grüße Eisbaeeer
------------- EDIT -----------------------------------------
Das SNAP Protokoll sieht ja vernünftig aus. Variable Nutzdaten, soll heissen, von 1 Byte bis 512 Byte in einem Paket.
Willst du dann mit fester Anzahl von Byte fahren?
Grüße Eisbaeeer
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
avrnix - 09.11.2007, 22:12
: brauche nur ne mail Adresse vom dir bzw. Eisbär
...und klar du kannst das auf deiner Homepage veröffentlichen
Gucke mal
www.comwebnet.de unten unter Kontakt.
Wenn paar Bilder gibt auch mit in ein Zip File und zumir schicken
Werde dann unter deinen Namen und ich erstelle extra eine Rubrik für die Diskussion , wo du deine Kommentare reinschreiben kannst.
Klasse - ist wohl auf Bascom zugeschnitten worden :D
Vielleicht noch ein Text zum Programm etc.
Gute Arbeit 8)
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Kurzschluss - 10.11.2007, 02:51
[quote="Eisbaeeer"] Kurzschluss hat folgendes geschrieben:
werde die Quellen hier reinstellen...
gibts ne Möglichkeit direkt die *.bas Files hochzuladen? :?: :?:
Grüsse
Kurzschluss
Kannst mir die Datei zumailen, dann veröffentliche ich hier einen Link, wo man das ganze dann runterladen kann.
Oder arvnix macht auf seiner Seite gleich ne neue Rubrik.
Die INT Routine würde mich auch interessieren. Wieviel Code hast du in der Routine abgelegt? Denn laut dem "include" wird das nicht als Interrupt abgehandelt, sondern im Sub.
---> zum Interruptemfang:
in der inculde ist der Empfang per Polling drin, aber ist bei dem
Interrupt gesteuerten Empfang nicht verwendet.
Da hole ich die Daten per:
Temp = Rf12_trans(&Hb000)
Temp = Temp and &H00FF
direkt ab...
Vorteil: nur wenn was eingetroffen ist wird der AVR mit "RF12-Arbeit" belastet
guck mal in dein mail, du müsstest alles bekommen haben...
mfg kurzschluss
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Kurzschluss - 10.11.2007, 12:45Testempfänger SNAP
Hallo @all
alle die den Empfängercode ausprobieren....
mir sind zwei kleine Fehler in den Beispielcode unterlaufen :
1.
Code:
SYNC Alias RF12_data(1)
HDB2 Alias RF12_data(2) 'Achtung HDB2 liegt in unterem Byte
HDB1 Alias RF12_data(3)
DAB1 Alias RF12_data(4)
SAB1 Alias RF12_data(5)
--> das HDB2 und HDB1 drehen!!!!
2.
Code:
if DAB1= MyAdress then 'Adresse prüfen
print "Das war für mich!...von Nr.:";RF12_data(5) 'Datenverarbeitung
crc=Framelength-2 'nur temporär Länge für crc-Check
crc=crc8(RF12_data(2),crc)
'Achtung!!! erst nach crc Adressen swapen!!! sonst ist die crc falsch
swap DAB1,SAB1 'Adressen umdrehen für Rücksenden
Erst muss mit dem orginal Frame die crc berechnet werden!!!
Danach wird per swap die Sender- und Empfängeradresse für das Rücksenden umgedreht.
Das müsst ihr in eueren Bas-file berichtigen,
sonst gibt's die Ausgabe:
"no 1Byte Adress!!!"
bzw. :
"CRC Bad => xx"
(Debugausgaben auf dem Uart)
mfg
Kurzschluss
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 10.11.2007, 16:23
Hi Kurzschluss
Also ich habe jetzt den Testsender und den SNAP_RF12_RX... am laufen. Der Sender hängt sich zwar ab und zu auf, wird aber nicht die Zeit wert sein, da weiterzusuchen, denn der Sender war noch nie das Problem.
Soweit funktioniert das ganze, nachdem ich hdb1 und hdb2 und den crc-Check Bereich angepasst habe.
Jetzt will ich versuchen, einen Master aufzusetzen, der 2 verschiedenen Werte versendet. Um das Protokoll zu nutzen, braucht es ja jetzt "nur" 3 Variablen:
1. Myadress (hast du fest vergeben)
2. Destination (gibt es noch keine Variable, oder?)
3. Nutzdaten (die hab ich noch nicht gefunden)
--> Rf12_data(7) ist das Nutzsignal?
- Du bedienst im Moment den Rollo am Node? Mit den Tasten 0 und 1. Was überträgst du dann im Moment? Der Node ist doch eigentlich der Slave? Nur die Temperaturen?
- Mir ist klar, dass der "Slave" keine Destination braucht, weil die ja der Master schickt und im Slave nur HDB1 und HDB2 getauscht werden.
- Ich messe meine Temperaturen über 1-wire. Benutze die DS18S20
- Hast du vor, ein "multi-master" zu machen, oder willst du alles von einem Master aus steuern?
---------------
Ich bin mir noch nicht sicher, wie ich das handhaben will. Auf jeden Fall sollen 2 Raumstationen an eine zentrale Steuerung angebunden werden. Von diesen aus sollen aber auch Befehle bzw. Variablen in der zentralen Steuerung beeinflusst werden.
Ein haufen Fragen. Bin mal auf die Antworten gespannt.
Grüße Eisbaeeer
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Kurzschluss - 10.11.2007, 17:03
Eisbaeeer hat folgendes geschrieben: Hi Kurzschluss
Also ich habe jetzt den Testsender und den SNAP_RF12_RX... am laufen. Der Sender hängt sich zwar ab und zu auf, wird aber nicht die Zeit wert sein, da weiterzusuchen, denn der Sender war noch nie das Problem.
Soweit funktioniert das ganze, nachdem ich hdb1 und hdb2 und den crc-Check Bereich angepasst habe.
Jetzt will ich versuchen, einen Master aufzusetzen, der 2 verschiedenen Werte versendet. Um das Protokoll zu nutzen, braucht es ja jetzt "nur" 3 Variablen:
1. Myadress (hast du fest vergeben)
2. Destination (gibt es noch keine Variable, oder?)
3. Nutzdaten (die hab ich noch nicht gefunden)
--> Rf12_data(7) ist das Nutzsignal?
- Du bedienst im Moment den Rollo am Node? Mit den Tasten 0 und 1. Was überträgst du dann im Moment? Der Node ist doch eigentlich der Slave? Nur die Temperaturen?
- Mir ist klar, dass der "Slave" keine Destination braucht, weil die ja der Master schickt und im Slave nur HDB1 und HDB2 getauscht werden.
- Ich messe meine Temperaturen über 1-wire. Benutze die DS18S20
- Hast du vor, ein "multi-master" zu machen, oder willst du alles von einem Master aus steuern?
---------------
Ich bin mir noch nicht sicher, wie ich das handhaben will. Auf jeden Fall sollen 2 Raumstationen an eine zentrale Steuerung angebunden werden. Von diesen aus sollen aber auch Befehle bzw. Variablen in der zentralen Steuerung beeinflusst werden.
Ein haufen Fragen. Bin mal auf die Antworten gespannt.
Grüße Eisbaeeer
Meine Netzstruktur ist aktuell so angedacht, das es einen Master
gibt.
Der ist die Zentrale von der Haussteuerung
(M128 mit RTC und USB-Anbindung).
Der soll dann mal Zeit und evtl. Taglicht gesteuert die Slaves ansteuern.
In jeden Fenster ein Slave-Node mit eigner Adresse.
Momentan ist Myadress ja eine Const, aber man könnte ja das als
EEPROM-Var machen und mit einen Sonderbefehl bei der
Inbetriebnahme die jeweilige Adresse vergeben
ansonsten muss man halt jeden Slave einzeln compilieren mit fester Adresse...
zu den Nutzdaten: was wir senden ist ja ein Array mit variabler Länge
Der Empfänger kann aktuell 0..32Byte Nutzdaten einlesen
--ich hab das erstmal so flexibel angedacht...
Aber bei meinen Rollo-Nodes werde ich mit fest 4 Datenbyte arbeiten.
das 1. -- ist der CMD, wie so in dem Commandhandler angedeutet
Byte 2..4 sollen für die Statusrückgabe und Messwerte verwendet werden
--> bei der Rücksendung vom Slave an den Master
also z.B. Master fragt Slave Nr.6 nach der Temperatur....
dann holt Nr.6 den akt. Wert vom Sensor und packt das in die entsprechenden Datenbytes und sende eine Anwort zurück...
Solange es nur einen Master gibt reicht ja da das swapen von Ziel und Quelladresse.
Wen du Multimaster brauchst musst irgendwie noch ne synchro zwischen den Mastern erfolgen, dass die nicht Zeitgleich senden usw...
wie ich dir schon in der mail schrieb, sind meine jetzigen Nodes noch mit RS485.
Zur Zeit bin ich gerade am Aufbau einer neuen Platine eines Nodes mit RF12 und Mega8.
Ich kann dir ja mal Schaltplan&Layout senden
Kannst du evtl Targetdatein verarbeiten?
mfg Kurzschluss
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 10.11.2007, 18:25
Kurzschluss hat folgendes geschrieben:
Ich kann dir ja mal Schaltplan&Layout senden
Kannst du evtl Targetdatein verarbeiten?
mfg Kurzschluss
Ja, arbeite auch mit Target. Ist also kein Problem.
Mal sehen, ob ich Multi-Master mache oder ob ich das mit einem Master hinbekomme. Werde jetzt erst mal testen, ob ich Master und Slave hinbekomme.
Grüße
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
avrnix - 10.11.2007, 18:29
Kannst du die Target Schaltung und Layout als JPG oder BMP Konvertieren?
Ich kann dann ein PDF erstellen und es auch Online bringen, mache ich bei allen Projekten so.
Kurzschluss ich habe dir hier http://www.iphpbb.com/board/f-10138836nx63949-25.html
für dein Projekt eine neue Rubrik erstellt. Email habe ich dir schon geschrieben.
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 10.11.2007, 20:01
Ok, ich habe mir folgendes ausgedacht und wollte mal wissen, was ihr davon haltet:
Bitte korregiert mich, wenn ich etwas falsch interpretiere.
Die Nutzdaten lassen sich in Schritten von 0-8, dann 16 und als nächste Stufe 32 Byte definieren. Wenn man jetzt hergeht und das 1. Nutzbyte als Information nimmt, welchen Inhalt die Nutzdaten enthalten, können z.B. verschiedene Temperaturen übertragen werden oder andere Werte wie Uhrzeit etc.
Ein Byte reicht dann, um 255 Werte eindeutig zuzuordnen.
Grüße Eisbaeeer
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Eisbaeeer - 11.11.2007, 00:07
Bevor ich ins Bett gehe ein kurzer Bericht.
@Kurzschluss
In deinem Script "Node" ist noch irgend was faul. Die Adresserkennung funktioniert, aber der CRC Check geht immer auf Bad. Ich habe jetzt das SNAP_RF12_RX-M32... mit deinen Änderungen hier im Forum verwendet und noch meine 1-wire Messung, Timer und das GLCD eingefügt. Jetzt bekomme ich ein OK und die Temperaturmessung geht auch. Das GLCD zeigt mir jetzt einige Debug Infos an.
Ich bekomme das mit dem Master noch nicht hin. Der Testsender sendet ja nicht nach, wenn der CRC nicht stimmt. Hast du die Routine schon fertig ?
Eine Gute Nacht wünscht der Eisbaeeer
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
avrnix - 11.11.2007, 11:04
Bitte verwendet SNAP-Protokoll für RFM12 folgenden Thread:
:arrow: http://www.iphpbb.com/board/f-10138836nx63949-25.html
:!:
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Thilo - 19.11.2007, 19:49
Hi an all die fleißigen Programierer hier.
Ich habe Eure Entwicklungen ständig verfolgt und sie frech für mich genutzt. Vielen Dank deshalb an Euch. Leider bin ich ein ziemlicher Anfänger auf diesem Gebiet und taste mich langsam an diese Sachen heran.
Meine aktuelle Frage nun: Denkt Ihr, dass Euer RFM12 Code auch problemlos auf dem RFM12 Modulen mit 868 MHz läuft?
Beste Grüße
Thilo
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 19.11.2007, 20:19
Hi Thilo,
ich habe mit 868 Mhz Module noch nie was gemacht.
Aber warum eigentlich nicht
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
avrnix - 19.11.2007, 21:55
denke ich auch das es klappen wird . ist ja auch außer die MHz auch das nur 1% von 1min gesendet werden darf.
Bitte alle die SNAP - Protokoll - nehmen ins entsprechende Brett Posten sonst kommen wir durcheinander :!:
:arrow: http://www.iphpbb.com/board/f-10138836nx63949-25.html <--
Mache bitte wenns nur um den RFM12 geht einen New Topic mit deinen Frage auf.
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
avrnix - 30.11.2007, 15:59Datasheet von Pollin RFM12
Datenblatt von Pollin
http://www.mikrocontroller.net/attachment/28786/kluz.pdf
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Knickohr - 06.12.2007, 17:09
Hallo Leute,
ich treibe ja auch schon in einigen anderen Paralleluniversen mein Unwesen. Jetzt bin ich auch bei Euch gelandet ;) Habe die letzten Wochen mein RFM12-Projekt ein wenig auf Eis gelegt. Doch jetzt geht es weiter.
Ich versuche mit diesen Modulen einen Funk-Universal-Timer für diverse Kameras zum Laufen zu bekommen. Bedingung ist allerdings ein "sicheres" Protokoll mit Rückmeldung, also so wie Sven es schon gezeigt hat.
Werde mich dann langsam wieder dran machen, mein Projekt weiter zu entwickeln.
Frage nebenbei : Wie weit seid ihr schon mit den Funkdingern gekommen ? Wie viele Meter habt ihr damit überbrückt ? Ist nicht sooo arg wichtig, interessiert mich halt.
Thomas
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 06.12.2007, 19:34
Hi Knickohr,
irgendwie scheinen auch die Paralleluniversen den RFM12
rauszukramen.
Also 100m(bebauter Grund) war für mich kein Problem.
Dann verfolge mal das Forum Snap-Protokoll.
Ich werde meine Variante sicher vollenden, aber eigentlich
habe ich ein "Stein ins rollen gebracht" und das ist gut so.
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Knickohr - 07.12.2007, 11:13
Hallo Wigbert,
ja der Stein rollt und das ist auch gut so ;) Hätte nicht gedacht, das die RFM12-Dinger so Anklang finden. Ich habe mir auch jede Menge von den 868MHz-Modulen geholt. Mein Gedanke ist, damit die Fernauslöser für Kameras aus der warmen Bude aus zu steuern. Sollte sicher funktionieren, also mit Rückmeldung und darf nicht von jeder "dahergelaufenen" Wetterstation aus dem Tritt gebracht werden. Da bei Aufnahmen für die Astrofotografie die Kamera nur alle paar Minuten mal auslöst, ist auch die Sendebeschränkung im 868MHz-Band überhaupt kein Problem, eher noch erwünscht. So tummelt sich nicht so viel "Müll" im Äther rum.
Hab das über ein halbes Jahr liegen lassen, muß aber jetzt wieder ran an die Sache. Es sind ja lange und wetterbedingt meißt schlechte Winterabende.
Thomas
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Wigbert - 07.12.2007, 13:48
Hi Knickohr,
also welches Protokoll ist wohl egal,
ich musste zum Beispiel ein Dummybyte beim Senden hinterherschieben
um die Checksumme sauber zu empfangen. Ich nehme mal an ,
es muss ein Byte nachgeschoben werden um das vorletzte ordentlich
zu senden. Beim Empfang wird dieses Dummybyte einfach nicht
ausgegeben. Ich würde auch vor dem Erstsenden meiner Daten
mehrere Byte senden damit der Empfänger "warm läuft".
Eigentlich braucht bei Befehlen Master zu Slave auch nur der Empfang bestätigt zu werden,
wenn nach 3xSenden keine Bestätigung kommt , ist der Empfänger geklaut........
anders sieht es natürlich aus wenn der Slave auch Daten bereitstellen
muss........
Re: Protkoll für die Vernetzung von RFM12,01,02 Modulen
Knickohr - 07.12.2007, 15:42
Hallo Wigbert,
doch der Empfänger sollte was zurück geben. Neben der Bestätigung und zur Sicherheit noch den empfangenen Befehl, sollte er so etwas wie die Empfangsfeldstärke und den Zustand der Batterie zurück liefern, vielleicht noch die Temperatur. Ich möchte den Empfänger so klein und vor allem energiesparend wie möglich halten, also ohne Display, Tasten und sonstiges Gefummel ;) Nur ein Einschalter (wobei der auch nicht unbedingt nötig ist) und ein paar LEDs zur Kontrolle, mehr nicht. Über 2 Ausgänge wird dann die Kamera gesteuert. Schön wäre es, wenn ich das alles in nur einen Atmega8L rein bekomme, mal sehen. Der Sender ist dafür umso luxuriöser ausgestattet. Display, sämtliche Funktionen können programmiert werden, handliches Gehäuse ...
Thomas
Mit folgendem Code, können Sie den Beitrag ganz bequem auf ihrer Homepage verlinken
Weitere Beiträge aus dem Forum www.comwebnet.de
AK-Modul-bus.de Elektronikbauteile - gepostet von avrnix am Mittwoch 02.05.2007
Hard SPI mit ATMEGA möglich ? - gepostet von avrnix am Donnerstag 26.10.2006
Displayansteuerung S65 - gepostet von Wigbert am Dienstag 20.03.2007
COM2TCP für Windows - gepostet von avrnix am Samstag 03.03.2007
Hardware um den RF12 , 01, 02 - gepostet von avrnix am Sonntag 27.05.2007
Tonertransferverfahren mit Negativ - gepostet von avrnix am Mittwoch 08.08.2007
Ähnliche Beiträge wie "Protkoll für die Vernetzung von RFM12,01,02 Modulen"
Vernetzung bei Keratokonus - Anonymous (Donnerstag 22.11.2007)
Protkoll, des Senates der aAdG (RPG) - Harachte (Sonntag 10.06.2007)
Vernetzung sinnvoll? - Anonymous (Freitag 25.08.2006)
Projekte mit diesen Modulen - avrnix (Sonntag 27.05.2007)
VPN Vernetzung und ISDN Backup - ThomasG (Donnerstag 10.03.2005)
Fragen zu Vernetzung bei Keratokonus - Mikel (Mittwoch 21.02.2007)