Verfügbare Informationen zu "Wetterstation"
Qualität des Beitrags: Beteiligte Poster: Trexis5 - Eisbaeeer - avrnix - Wigbert - Kurzschluss Forum: www.comwebnet.de Forenbeschreibung: AVR Mikrocontroller und Elektronik - Forum - www.comwebnet.de aus dem Unterforum: RF12 Transceiver Modul Antworten: 58 Forum gestartet am: Mittwoch 25.10.2006 Sprache: deutsch Link zum Originaltopic: Wetterstation Letzte Antwort: vor 15 Jahren, 3 Monaten, 16 Tagen, 4 Stunden, 13 Minuten
Alle Beiträge und Antworten zu "Wetterstation"
Re: Wetterstation
Trexis5 - 18.11.2007, 00:53Wetterstation
Hi,
ich baue gerade eine Wetterstation.
Nun möchte ich die Messdaten von Außen nach innen übertragen.
Welche Module benötige ich?
Brauche ich zweimal den RFM12 oder einmal den RFM01 und einmal den RFM02?
Welchen Code soll ich nehmen?
Ich möchte nur einige Messwerte (As Single) Übertragen, mehr nicht.
Was wäre zum Empfehlen? Ich muß zugeben, je mehr ich hier lese desto weniger kenne ich mich aus.
Irgendwie sitze ich auf dem Kabel.
Re: Wetterstation
Trexis5 - 18.11.2007, 21:29
Kann mir keiner helfen?
Re: Wetterstation
Eisbaeeer - 20.11.2007, 07:12
Trexis5 hat folgendes geschrieben: Kann mir keiner helfen?
Doch, doch. Dein Vorhaben ist "relativ" einfach zu lösen. Du musst dich nur entscheiden, ob du eine Bestätigung der Übertragung haben möchtest oder eben nicht.
RF12 --> Senden und Empfangen in einem Modul
So als Anregung. Willst du noch mehr Sensoren? Die Station erweitern? Dann nimm die RF12 und das SNAP Protokoll. Damit kannst du dann von der Wetterstation jede "Ausseneinheit" gezielt ansprechen. Der CRC-Check und wiederholte Sendung im Fehlerfall inklusive.
In Bascom auch schon fast fertig.
P.S: Sieht echt gut aus, was du da aufs Display gebracht hast.
Grüße Eisbaeeer
Re: Wetterstation
Trexis5 - 20.11.2007, 07:26
Hi,
nein ich brauche keine Bestätigung. Obwohl das schon schön wäre.
Also max 8 Werte die als (As Single) über den Analogwandler in den Atmel kommen, die will ich senden.
Ich habe aber nur noch die Module 01 und 02 bekommen. Die 12er gibt es nicht mehr.
Könntest du mit solch einen Code mal schicken oder posten mit dem ich solche Daten senden und an anderer stelle empfangen kann?
Denn irgendwie steige ich nicht durch.
Danke.
Re: Wetterstation
avrnix - 20.11.2007, 09:26
Hast du den Code mal von dieser Seite ausprobiert?
Müsste gehen, wenn du ensprechend die den Empfang- und Sendeteil nimmst.
Schönes Projekt , wie bekommst du die Unterschiedlichen Schriftgrössen hin?
Willst du dein Projekt auch Veröfftlichen ?
Re: Wetterstation
Eisbaeeer - 20.11.2007, 10:14
Trexis5 hat folgendes geschrieben: Hi,
nein ich brauche keine Bestätigung. Obwohl das schon schön wäre.
Also max 8 Werte die als (As Single) über den Analogwandler in den Atmel kommen, die will ich senden.
Ich habe aber nur noch die Module 01 und 02 bekommen. Die 12er gibt es nicht mehr.
Könntest du mit solch einen Code mal schicken oder posten mit dem ich solche Daten senden und an anderer stelle empfangen kann?
Denn irgendwie steige ich nicht durch.
Danke.
Der Code von den Rf12 wird "out of the box" nicht funktionieren. Die Module 01 und 02 müssen anders initialisiert werden. Passende Bascom Codes gibt es aber. Such mal bei Google. Ich hab glaube ich was gelesen, dass die Module z.B. keinen FIFO haben. Aber bitte nicht festnageln. Such mal bei Roboternetz. Da wirst du was finden.
Grüße Eisbaeeer
Re: Wetterstation
Trexis5 - 20.11.2007, 13:47
Könntest du mir dabei helfen?
Re: Wetterstation
Eisbaeeer - 20.11.2007, 14:20
Trexis5 hat folgendes geschrieben: Könntest du mir dabei helfen?
Nur in soweit, dass ich dir bei den Quellen helfen kann. Ich habe selbst nur die RF12 Module. Kann also in der Richtung nichts testen.
Beim Googeln ist mir aufgefallen, dass du in diesem Forum schon angefragt hast.
Hier sind übrigens die gleichen Leute unterwegs, wie in diesem Forum:
http://bascom-forum.de/index.php?PHPSESSID=7f37e3b327dfc6516f8bf4fe91816004&topic=25.15
Les die Datenblätter der Module, passe die Init-Routinen an und dann sollte es auch damit gehen. Du kannst ja als Hilfestellung die C-Quellen von http://www.mikrocontroller.net/topic/73494 benutzen, um die Initialisierung anzupassen. Eventuell ist da gar nicht so viel zu machen.
Ich bin im Moment noch dabei, die RF12 Module mit dem SNAP Protokoll zu verfeinern.
Grüße Eisbaeeer
Re: Wetterstation
Trexis5 - 20.11.2007, 15:26
Hi,
aber leider habe ich davon keine Ahnung. :idea:
Schon gar nicht von C.
Re: Wetterstation
avrnix - 20.11.2007, 16:23
Gucke dort mal bei INIT nach den Hex WERT der ist ja der gleiche den du in BASCOM einsetzen kannst. Ich benutze leider auch nur die RF12 Module :roll:
Re: Wetterstation
Eisbaeeer - 20.11.2007, 17:06
Trexis5 hat folgendes geschrieben: Hi,
aber leider habe ich davon keine Ahnung. :idea:
Schon gar nicht von C.
Kann ja nicht ganz sein. Immerhin hast du das Display zum laufen gebracht. Oder war das ein fertiges Script?
Jeder hilft hier gerne. Geben und nehmen. Aber ein bischen was musst du auch selber erarbeiten. Bei Fragen stehen wir gerne zur Verfügung. Du musst aber schon konkret fragen.
Versuch doch erst mal den INIT Teil anzupassen. Hier Posten, dann können wir was damit anfangen.
Grüße Eisbaeeer
Re: Wetterstation
Trexis5 - 20.11.2007, 17:38
Nein, die Wetterstation habe ich selber gemacht, aber nur durch abkucken.
Wo gibt es denn noch solche 12er Module?
Re: Wetterstation
avrnix - 20.11.2007, 18:33
Durch gucken ist ja ein schönes Ergebnis geworden
Frage doch mal hier nach ob welche dir den RF12 verkaufen
http://www.mikrocontroller.net/forum/markt
der ob noch eine Sammelbestellung bzw. ob Module gibt:
http://www.mikrocontroller.net/topic/80796#701754
sonst versuche mal die INIT die in C sein soll hier Posten, vielleicht kann man was machen.
:!:
Re: Wetterstation
Eisbaeeer - 21.11.2007, 00:07
Trexis5 hat folgendes geschrieben: Nein, die Wetterstation habe ich selber gemacht, aber nur durch abkucken.
Wo gibt es denn noch solche 12er Module?
Pollin hat hin und wieder Lieferschwierigkeiten und auf Pollin waren keine zu finden. Jeden Tag zu Pollin schauen und wenn sie verfügbar sind (dann sind sie auch auf der Internetseite von Pollin) bestellen.
Sind zwar teurer, als mit der Sammelbestellung, aber dauert halt nicht so lange. Wie arvnix schon schrieb, hab ich auch schon gelesen, dass mancher wieder welche verkauft.
Abgucken ist ja nicht verboten. Aber interessiert dich nicht, wie das ganze funktioniert? Da lernt man doch eine Menge.
Wie gesagt, Hilfe bekommst du, aber bestimmt kein fertiges Programm.
Bring Fragen mit Script, dann wird dir geholfen.
Grüße Eisbaeeer
Re: Wetterstation
Trexis5 - 21.11.2007, 08:07
Hi,
das ist mir klar.
Ich habe diesen Code:
Code:
Fehlerbereinigte Verion von Bastelbär
' 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
' ########################################################################
$regfile = "m32def.dat"
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 'default use 10 for the SW stack
$framesize = 40
'$PROG &HFF,&HFF,&HD9,&H00' generated. Take care that the chip supports all fuse bytes.
$crystal = 8000000
$baud = 19200
Baud = 19200
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)
Const Rf12freq = 433.92
Const Rf12baud = 19200
Const Maxchar = 32
'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
Spi_cs Alias Portb.4 ' SS-Pin
Config Spi_cs = Output
Spi_sdo Alias Pinb.6 ' MOSI-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
' ########################################################################
' ###### Hauptproggi
' ########################################################################
Text = "Dies ist ein 433MHz Test !!!!!{013}{010}"
' Je nachdem ob Sender oder Empfänger die entsprechenden Zeilen aktivieren
Do 'Ewigschleife
' Hier ist die Senderoutine
' Print "Sende"
' Call Rf12_txdata(maxchar)
Wait 1
' Hier ist die Empfangsroutine
Print "Empfange"
Call Rf12_rxdata(maxchar)
For Count = 1 To Maxchar
Print Chr(rfdata(count)) ; "-";
Next Count
Print
Loop
End 'end program
' ########################################################################
' ###### 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
Und meine Frage war wie ich nun einige Werte Senden bzw. Empfangen kann.
Code:
Do 'Ewigschleife
' Hier ist die Senderoutine
' Print "Sende"
' Call Rf12_txdata(maxchar)
Wait 1
' Hier ist die Empfangsroutine
Print "Empfange"
Call Rf12_rxdata(maxchar)
For Count = 1 To Maxchar
Print Chr(rfdata(count)) ; "-";
Next Count
Print
Loop
Irgendwo muß ich doch eine Messwert in die Sendevariable schieben. Das kapier ich nicht. Es muß doch irgendwie so heißen:
Sendewert = Messwert
call Senden
oder nicht?
Re: Wetterstation
avrnix - 21.11.2007, 08:30
Da es mit String arbeitet
text=str(messwert)
call senden
dann wird das was in Text ist gesendet!
Die Speicherung erfolgt im Speicher siehe Dim Text as ....
Re: Wetterstation
Eisbaeeer - 21.11.2007, 09:45
Hi
Du machst es dir um einiges einfacher (weil auch Übersichtlicher), wenn du das include von Kurzschluss benutzt.
Das wird dann z.B. einfach in deinen code mit der Zeile:
$include "inc_RF12-Treiber.bas" 'RF12 Treiber einbinden
eingefügt.
Die Datei inc_RF12-Treiber.bas wird dann sozusagen in deinen Code mit eingebettet.
In der include sind alle Hex Befehle für die Initialisierung enthalten. Die Befehle sind als Sub aufzurufen.
Hier noch die inc_RF12-Treiber.bas :
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
'Edit: Eisbaeeer
'Date: 20071120
'Subject: Get status from RF12
'#######################################
'------[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(&H0000) : Rf12_ready 'Status holen
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(&H0000) 'Status auslesen
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(&H0000) ': print Temp '0000 -Status
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>= 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
So, jetzt zu deiner eigentlichen Frage.
Wie lade ich die Variablen, die ich übertragen möchte:
Code:
Rf12_data(1) = Snap_sync
Rf12_data(2) = &H50 'HDB2 1Byte-Adressen
Rf12_data(3) = Byteanzahl 'HDB1 0..32DatenByteInfo
Rf12_data(4) = Destadress 'Zieladresse
Rf12_data(5) = Myadress 'Senderadresse
Das ganzen Codeteile sind jetzt schon speziell auf das SNAP Protokoll angepasst. Jetzt wäre der Schritt nicht mehr weit, das SNAP auch zu benutzen, denn da hast du gleich eine Fehlerbehandlung und Checksummenprüfung dabei.
Wir (ich) sind gerade noch dabei den Master bei einer fehlerhaften Sendung, nochmals nachsenden zu lassen. Der Slave sendet schon an den Master, wenn irgend etwas schief gelaufen ist (also Daten falsch sind).
Ich hoffe, ich konnte dir ein wenig helfen. Ansonsten nochmal fragen.
Grüße Eisbaeeer
Re: Wetterstation
Trexis5 - 21.11.2007, 13:29
Code:
Rf12_data(1) = Snap_sync
Rf12_data(2) = &H50 'HDB2 1Byte-Adressen
Rf12_data(3) = Byteanzahl 'HDB1 0..32DatenByteInfo
Rf12_data(4) = Destadress 'Zieladresse
Rf12_data(5) = Myadress 'Senderadresse
Also ich kapier das echt nicht.
Das hier unten schon, zumindest für eine Variable. Will ich mehrere übermitteln muß ich öfters, bzw. immer erneut senden oder?
text=str(messwert)
call senden
Re: Wetterstation
avrnix - 21.11.2007, 14:03
Trexis5 hat folgendes geschrieben: [code]
Das hier unten schon, zumindest für eine Variable. Will ich mehrere übermitteln muß ich öfters, bzw. immer erneut senden oder?
text=str(messwert)
call senden
Bitte schmeisse die beiden Codes nicht durcheinander!
Das Snap beruht auf ein Protokoll, was von Eisbeer angeführt wurde
du kannst auch um bei der den Programm zu bleiben was du gepostet hast.
mehre Werte in ein Array sammeln und in einen String von Länge Maxchar ( hier 32 ) zusammenfassen.
Bspl:
for x=1 to 4
messwert=GETADC(x)
text = text + str(messwert)
text =text + " "
next x
call senden
Damit sendest du 5 Messwerte mit einen Leerzeichen getrennt zum Empfänger.
Bei Empfänger musst du den String beim Leerzechen cutten.
siehe LEN,RIGHT, LEFT Befehle in Bascom -> Hilfe.
Oder du sendest einen Messwert nach den anderen und Wertest die einzeln aus.
Re: Wetterstation
Eisbaeeer - 21.11.2007, 14:41
Zeig mal, wie die Variablen deiner Messwerte aussehen:
Dim Messwert As ?
Ich bin aber immer noch der Meinung, dass du mit dem include besser dran bist.
Mein Beispiel war vieleicht etwas verwirrend.
Hier ist die Variable so definiert:
Dim Rf12_data(20) As Byte
Wenn deine Messwerte als Byte vorliegen, kannst du sie wie folgt zuweisen.
Rf12_data(1) = Messwert(1)
Rf12_data(2) = Messwert(2)
Rf12_data(3) = Messwert(3)
.....usw
Wenn deine Messwerte als String definiert sind, kannst du das Beispiel von Arvnix nehmen. In dem Fall wäre:
Dim Rf12_data As String * 20
Rf12_data = Messwert
Hier ist Rf12_data die Variable, die gesendet wird. In deinem Auszug wird statt Rf12_Data eben text als Variable benutzt.
Grüße Eisbaeeer
Re: Wetterstation
avrnix - 21.11.2007, 14:51
Dim Text As String * Maxchar At Rfdata Overlay
der Empfänger speichert dort deine Messwerte ab bzw senden diese oder beim Empfang wird es dort gespeichert.
Jetzt verstanden ?
Re: Wetterstation
Trexis5 - 21.11.2007, 21:35
Hi,
also werde ich das so machen mit dem include.
Finde ich auch sinnvoll das so zu machen um alles übersichtlicher zu machen.
$include "inc_RF12-Treiber.bas
Dim Rf12_data As String * 20
Meine Messwerte sind:
Dim Calc As Single 'Temperatur
Dim Rhlintemp As Single 'Feuchte
Dim Druck As Single 'Druck
Adval_adc2 As Word 'Licht
Adval_adc3 As Word 'res.
Adval_adc4 As Word 'res.
Wenn ich diesen include einbaue dann bekomme ich 1000 Fehlermeldungen.
Re: Wetterstation
Trexis5 - 21.11.2007, 23:30
Jetzt bekomme ich haufenweiße Fehlermeldungen. Das gibts doch nicht. Ich dehe noch durch.
Code:
'**********************************************************************************************************
'* M 8 *
'* ------|------- *
'* _____ | | *
'* Programmstecker 1 (Reset) PC6 --| 1 28 |-- PC5 (ADC5/SCL) Lichtsensor *
'* | | *
'* RS232 PC (RXD) PD0 --| 2 27 |-- PC4 (ADC4/SDA) *
'* | | *
'* RS232 PC (TXD) PD1 --| 3 26 |-- PC3 (ADC3) *
'* | | *
'* Eingang Res. (INT0) PD2 --| 4 25 |-- PC2 (ADC2) *
'* | | *
'* SHT11 Sck (INT1) PD3 --| 5 24 |-- PC1 (ADC1) *
'* | | *
'* SHT11 Data (XCK/TO) PD4 --| 6 23 |-- PC0 (ADC0) *
'* | | *
'* +5V VDC VCC --| 7 22 |-- GND *
'* | | *
'* -5V VDC GND --| 8 21 |-- AREF *
'* | | *
'* (XTAL1/TOSC1) PB6 --| 9 20 |-- AVCC *
'* | | *
'* (XTAL2/TOSC2) PB7 --| 10 19 |-- PB5 (SCK) Progs. 3 *
'* | | *
'* 1 Wire (T1) PD5 --| 11 18 |-- PB4 (MISO) Progs. 4 *
'* | | *
'* ----- (AIN0) PD6 --| 12 17 |-- PB3 (MOSI/OC2) Progs. 5 FUNK [Spi_sdo] *
'* | | *
'* ----- (AIN1) PD7 --| 13 16 |-- PB2 (SS/OC1B) FUNK [Spi_cs] *
'* | | *
'* (ICP1) PB0 --| 14 15 |-- PB1 (OC1A) *
'* -------------- *
'* *
'**********************************************************************************************************
$regfile = "m8def.dat"
$crystal = 4000000 'Quarzfrequenz festlegen
Baud = 19200 ' use baud rate
$hwstack = 128 ' default use 32 for the hardware stack
$swstack = 128 ' default use 10 for the SW stack
$framesize = 128
$include "inc_RF12-Treiber.bas" 'RF12 Treiber einbinden
Dim Rf12_data As String * 20
Ddrd.2 = 0
Ddrd.3 = 1
Ddrd.4 = 1
Portd = &B00000100 'PB: (Pull UP) PB2
Config Timer1 = Timer , Prescale = 64 'Takt: Quarz 4MHz/(64 * 2^16) (1 = ~ 1sec)
On Timer1 Ontimer1
Enable Timer1
Start Timer1
Config Adc = Single , Prescaler = Auto
Start Adc
Enable Interrupts
'*********************************** 1 - W I R E C o m m a n d *********************************
Config 1wire = Portb.5 'use this pin
Dim Dummy As Byte , I As Byte , Highbyte(4) As Byte , Lowbyte(4) As Byte
Dim Crcread As Byte , Adval_adc1 As Word , Adval_adc2 As Word , Adval_adc3 As Word , Adval_adc4 As Word
Dim Avg1_ges_temp As Long , Avg_1 As Long
Dim Avg2_ges_temp As Long , Avg_2 As Long
Dim Avgschleife1 As Byte
Dim Avgschleife2 As Byte
Const 16_bit = 65535
Declare Sub Crc_get() 'this sub makes two reads for the CRC16 bytes from the 1-wire bus
Const 1w_readmem = &HAA
Const 1w_writemem = &H55
Const 1w_convertch = &H3C
Const 1w_readrom = &H33
Const 1w_matchrom = &H55
Const 1w_skiprom = &HCC
Const 1w_searchrom = &HF0
Const 1w_conditsrc = &HEC
Const 1w_ovdrvskprom = &H3C
Const 1w_ovdrvmtchrom = &H69
Const 1w_vccoperation = &H40
1wreset 'reset the device
1wwrite 1w_skiprom 'Skip ROM
1wwrite 1w_writemem 'Write Memory
1wwrite &H1C 'Write to 001C
1wwrite &H00
1wwrite 1w_vccoperation 'VCC Operation keeps device active!!
Crc_get 'Read in 2 bytes 16bits
Dummy = 1wread(1) 'read dummy byte
1wreset 'reset the device
1wwrite 1w_skiprom 'Skip ROM
1wwrite 1w_writemem 'Write Memory
1wwrite &H08 'Write to 00 08
1wwrite &H00
1wwrite &H00 '16 bit resoultion
Crc_get 'Read in 2 bytes 16bits
Dummy = 1wread(1) 'read dummy byte
1wwrite &H01 '5.12 Volt Range
Crc_get 'Read in 2 bytes 16bits
Dummy = 1wread(1) 'read dummy byte
1wwrite &H00 '16 bit resoultion
Crc_get 'Read in 2 bytes 16bits
Dummy = 1wread(1) 'read dummy byte
1wwrite &H01 '5.12 Volt Range
Crc_get 'Read in 2 bytes 16bits
Dummy = 1wread(1) 'read dummy byte
1wwrite &H00 'Output Open/Output OFF C0 is OFF 80 is ON
Crc_get 'Read in 2 bytes 16bits
Dummy = 1wread(1) 'read dummy byte
1wwrite &H01 'Doesn't matter space keeper
Crc_get 'Read in 2 bytes 16bits
Dummy = 1wread(1) 'read dummy byte
1wwrite &H00 'Output Open/Output OFF
Crc_get 'Read in 2 bytes 16bits
Dummy = 1wread(1) 'read dummy byte
1wwrite &H01 'Doesn't matter space keeper
Crc_get 'Read in 2 bytes 16bits
Dummy = 1wread(1) 'read dummy byte
'************************************END DS2450 Setup**************************************
'************************************ R H T 1 1 **************************************
Dim Ctr As Byte
Dim Dataword As Word
Dim Command As Byte
Dim Disc As String * 20
Dim Disf As String * 20
Dim Calc As Single
Dim Calc2 As Single
Dim Rhlinear As Single
Dim Rhlintemp As Single
Dim Tempc As Single
'Dim Tempf As Single
Const C1 = -4
Const C2 = 0.0405
Const C3 = -0.0000028
Const T1c = .01
Const T2 = .00008
'Const T1f = .018
Sck Alias Portb.3
Dataout Alias Portb.4
Datain Alias Pinb.4
'Redled Alias Portb.2
Declare Sub Getit()
'Ddrb.3 = 1
'Ddrb.4 = 1
'Ddrb = &B11111111 'all port b are output
Config Pinb.3 = Output 'sck
Config Pinb.4 = Output 'datain
'reset the serial communications first, it is easily confused!
Set Dataout
For Ctr = 1 To 12
Set Sck
Waitus 2
Reset Sck
Waitus 2
Next Ctr
'************************************END RHT11 Setup**************************************
'**************** M P X 4 1 1 4 A *******************
'Poffset=1013hPa * (1-(1- 0.0065 * h/288)^5.255)
'h=height above sea level.
Const Meereshoehe = 1013 'hPa
Dim Lokale_hoehe As Word
Dim Poffset As Single
Dim Temp1 As Single
Dim Temp2 As Single
Dim Druck As Single
'Lokale_hoehe = 340 'Hier euren lokalen Wert von der Höhe eingeben.
Lokale_hoehe = 159
Dim Luftdruckzeit As Word
Luftdruckzeit = 7200
Dim Luftdruckzeit_2 As Word
Luftdruckzeit_2 = 1800
'*****************************************************
Dim Helligkeit As Word
Dim Timer1_secunde As Byte
Dim Senden As Byte
'###############################################################
'###############################################################
Code:
Do
'##############################################
If Senden = 1 Then
' Hier ist die Senderoutine
' Print "Sende"
Call Rf12_txdata(maxchar)
' Hier ist die Empfangsroutine
'Print "Empfange"
'Call Rf12_rxdata(maxchar)
'For Count = 1 To Maxchar
'Print Chr(rxdata(count)) ; "-";
'Next Count
Senden = 0
End If
'############################################
If Timer1_secunde = 0 Then
If Senden = 0 Then
Helligkeit = Getadc(5)
'****************************** D S 2 4 5 0 **********************************
1wreset 'reset the device
1wwrite 1w_skiprom 'Skip ROM
1wwrite 1w_convertch 'Begin Conversion
1wwrite &H0F 'Convert Mask 0000|DCBA ie 0F=0000|1111
1wwrite &H00 'Preset Mask Set=D Clear=d DdCcBbAa ie 55=0101|0101
Crc_get 'Read in 2 bytes 16bits
Waitms 6 'use formula to calculate exact duration for channels
1wreset 'reset the device
1wwrite 1w_skiprom 'Skip ROM
1wwrite 1w_readmem 'Read Memory
1wwrite &H00 'Read Channel A
1wwrite &H00 'Address 0000 and 0001
For I = 1 To 4
Lowbyte(i) = 1wread(1)
Highbyte(i) = 1wread(1)
Adval_adc1 = Makeint(lowbyte(1) , Highbyte(1)) 'Druck
Adval_adc2 = Makeint(lowbyte(2) , Highbyte(2)) 'Temperatur
Adval_adc3 = Makeint(lowbyte(3) , Highbyte(3))
Adval_adc4 = Makeint(lowbyte(4) , Highbyte(4))
Next
Avg1_ges_temp = Avg1_ges_temp + Adval_adc1
Incr Avgschleife1
If Avgschleife1 < 30 Then Goto Sprung_adc1
Avg_1 = Avg1_ges_temp / 30
Avgschleife1 = 0
Avg1_ges_temp = 0
Sprung_adc1:
Avg2_ges_temp = Avg2_ges_temp + Adval_adc2
Incr Avgschleife2
If Avgschleife2 <30> Hier den Faktor reinschreiben die rechnung gibts im Kleinen avr einmaleins
'*****************************************************
Timer1_secunde = 1
End If 'Senden 0
End If 'Timersecunde
Loop
'########################################################################
'########################################################################
Code:
'################################################################################
'################################################################################
'-------------------- Timer 1-------------------------------
Ontimer1: 'Timer0-Routine, wird ein mal pro Sekunde ausgeführt
'Der Timer zählt jetzt also immer von 3036 bis 65536
'und das Unterprogramm wird damit alle 1 Sekunden angesprungen,
'also mit 1 Hz
Timer1 = 3036 'Timerstart verändern um genau 1 sec. zu erhalten
If Timer1_secunde > 0 Then Decr Timer1_secunde ' timer1_secunde
Return
'################################################################################
'################################################################################
'************ 1 - W I R E ***************
Sub Crc_get() 'this sub ensures that all crc operations are handled the same
Crcread = 1wread(2)
End Sub
'*****************************************
'************************** R H T 1 1 ***************************************
Sub Getit()
Local Datavalue As Word
Local Databyte As Byte
'start with "transmission start"
Set Sck
Reset Dataout
Reset Sck
Set Sck
Set Dataout
Reset Sck
'now send the command
Shiftout Dataout , Sck , Command , 1
Ddrb.3 = 1
Ddrb.4 = 0
'Ddrb = &B11111101 'datain is now input
Config Pinb.4 = Input 'datain
Set Sck 'click one more off
Reset Sck
Waitus 10 'no idea why, but it doesn't work without it!
Bitwait Pinb.4 , Reset 'wait for the chip to have data ready
Shiftin Datain , Sck , Databyte , 1 'get the MSB
Datavalue = Databyte
Ddrb.3 = 1
Ddrb.4 = 1
'Ddrb = &B11111111
Config Pinb.4 = Output
Reset Dataout 'this is the tricky part- Lot's of hair pulling- have to tick the ack!
Set Sck
Reset Sck
Ddrb.3 = 1
Ddrb.4 = 0
'Ddrb = &B11111101 'datain is now input
Config Pinb.4 = Input
Shiftin Datain , Sck , Databyte , 1 'get the LSB
Shift Datavalue , Left , 8
Datavalue = Datavalue Or Databyte
'don't tick the clock or ack since we don't need the CRC value, leave it hanging!
Dataword = Datavalue
Ddrb.3 = 1
Ddrb.4 = 1
'Ddrb = &B11111111
Config Pinb.4 = Output
Reset Dataout
Set Sck
Reset Sck
Ddrb.3 = 1
Ddrb.4 = 0
'Ddrb = &B11111101 'datain is now input
Config Pinb.4 = Input
Shiftin Datain , Sck , Databyte , 1 'not using the CRC value for now- can't figure it out! Anybody know how to impliment?
'Print "CRC value was - " ; Databyte
Ddrb.3 = 1
Ddrb.4 = 1
'Ddrb = &B11111111
Config Pinb.4 = Output
Set Dataout
Set Sck
Reset Sck
End Sub
'**********************************************************
Re: Wetterstation
Eisbaeeer - 21.11.2007, 23:50
Hi
Ich verspreche dir, dass ich mir das gleich morgen anschaue. Das bekommen wir schon hin. Ich muss jetzt nur ins Bett, sonst komme ich morgen ganz früh, nicht raus.
Grüße Eisbaeeer
Re: Wetterstation
Trexis5 - 21.11.2007, 23:58
Super.
Da freue ich mich.
Der obige Code kommt in die Außeneinheit.
Dort ist die 1-Wire Schnittstelle angeschlossen und der Feuchte-Temperaturfühler.
Die Messwerte die ich senden will sind:
Dim Calc As Single 'Temperatur
Dim Rhlintemp As Single 'Feuchte
Dim Druck As Single 'Druck
Adval_adc2 As Word 'Licht
Adval_adc3 As Word 'res.
Adval_adc4 As Word 'res.
Der M644 empfängt dann alles.
Re: Wetterstation
Eisbaeeer - 22.11.2007, 11:06
Trexis5 hat folgendes geschrieben: Super.
Da freue ich mich.
Der obige Code kommt in die Außeneinheit.
Hi
Ich gehe mal davon aus, dass das nicht der vollständige Code ist. Ansonsten fehlen da noch ein paar Sachen, das die RF12 Module betrifft.
Die Include Datei stellt dir die Routinen für die Ansteuerung der RF12 Module zur Verfügung. Die Einstellungen für die Module musst du dem Include schon noch mitteilen. Bedeutet, Routine mit Parametern aufrufen (Die Parameter sind z.B. Frequenz, Baudrate, etc.)
Code:
'------[ RF12 ]-----------------------------------------------------------------
Const Rf12freq = 433.92 'Kanal-Einstellung
Const Rf12baud = 19200 'Baudrate
Const Maxchar = 32 'Maximale Byte Anzahl
Const framelength = 32 'Framelänge
'------[ RF12 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
'------[ Senden ]------------------------------------------------------------------
Rf12_data = 'Hier kommen deine Daten rein'
Call Rf12_txdata(framelength)
Ich finde es persönlich einfacher, mit Byte Päckchen zu arbeiten. Dazu müsstest du deine Werte (z.B. Single oder Word) zerhackstückeln.
Das hört sich jetzt schlimmer an, als es ist. Dazu gibt es den Befehl MID.
Dann würden deine Daten so in die Variable eingelesen:
For i = 1 to framelength
Rf12_data(i) = Adval_adc2(i)
next i
oder ausgeschrieben:
Rf12_data(1) = Adval_adc2(1)
Rf12_data(2) = Adval_adc2(2)
Rf12_data(3) = Adval_adc2(3)
Rf12_data(4) = Adval_adc2(4)
.. usw. bis Framelength erreicht ist
Framelength ist dabei wieder die Anzahl von Bytes, die dein Wert hat.
Grüße Eisbaeeer
P.S.: Hab gerade noch gesehen, dass dein Helligkeitswert ja schon als Byte vorliegt.
Helligkeit = Getadc(5)
Dann fang damit an. Sende erst nur diesen einen Wert und teste mit dem.
Rf12_data(1) = Getadc(5) 'auf der Sendeseite
und
Helligkeit = Rf12_data(1) 'auf der Empfangsseite
Viel Erfolg!
Re: Wetterstation
Trexis5 - 22.11.2007, 13:31
Hi,
das war schon der gesammte Code.
Also fehlt das noch was du geschrieben hast.
Ok das füge ich noch ein.
Das mit dem Befehl MID schaue ich mir noch genauer an.
Jetzt kommt der aha Effekt.
Rf12_data(1)
Ich dachte die zahl z.B. (1) ist ein wert. Aber das ist die "Position".
Aber Helligkeit = Getadc(5) ist doch wein Word. Also müßte ich ja erst das Word in Byte zerlegen und dann symbolisch:
Rf12_data(1) = helligkeit High
Rf12_data(2) = helligkeit low
schicken oder nicht?
Nun bin ich aber schon schlauer.
Cih werde das alles mit den 01er und 02er testen. Die 12er Module gibts irgendwann wieder. Dann werde ich es umbauen, falls es überhaupt geht :D .
Re: Wetterstation
Eisbaeeer - 22.11.2007, 14:17
Trexis5 hat folgendes geschrieben: Hi,
Jetzt kommt der aha Effekt.
Rf12_data(1)
Ich dachte die zahl z.B. (1) ist ein wert. Aber das ist die "Position".
Aber Helligkeit = Getadc(5) ist doch wein Word.
Du kannst einer Variablen sagen, aus wieviel Bytes sie bestehen soll.
Mit:
Dim Rf12_data(9) as Byte
legt man fest, dass die Variable Rf12_data aus 9 Byte besteht.
Wenn du also das 2. Byte der Variablen Rf12_data füllen oder auslesen möchtest, wählst du das mit Rf12_data(2) an.
Was für ein Display benutzt du bei der Wetterstation?
Grüße Eisbaeeer
Re: Wetterstation
Trexis5 - 22.11.2007, 15:03
Aber "Rf12_data" ist doch schon als:
Dim Rf12_data As String * 20
deklariert.
Dann kann ich ja kein Word laden.
Das Display ist von Neuhold.
-------------------------------------------------
Compile geht immer noch nicht.
Re: Wetterstation
Eisbaeeer - 23.11.2007, 07:15
Hi
Sieh dir mal den Teil "Senden" im include an. Das Programm ist im Moment so ausgelegt, dass Rf12_data als Byte Variable behandelt wird. Du müsstest als erstes den Teil
Code:
For Lv = 1 To Txlen
Rf12_ready
Temp = &HB800 + Rf12_data(lv) 'Sende Nutzdaten
Temp = Rf12_trans(temp)
Next Lv
anpassen.
Wenn beim Compilieren Fehler auftreten, kannst du anhand der Fehlermeldung weitersuchen. In deinem Bild sagt er ja schon, dass von Zeile 32- ein Assignment Error vorliegt. Deshalb compiliert er ja nicht. Quelle ist das include File.
Also stimmt entweder mit Temp oder mit Rf12_trans was nicht. Hast du denn die Variable "Temp" deklariert? Füge mal "Dim Temp as Word" ein. Vor das include.
Learning by doing
Grüße Eisbaeeer
Re: Wetterstation
Trexis5 - 04.12.2007, 00:54
Was für einen Code brauche ich jetzt. Der Code was oben gepostet wurde bringt lauter fehlermeldungen.
Zu was braucht man den pin 4 vom funkmodul?
Re: Wetterstation
avrnix - 04.12.2007, 09:33
SCK ? oder welchen PIN meist du ?
Und welche Fehlermeldungen bekommst du ?
Und was hast du gemacht ?
Re: Wetterstation
Trexis5 - 04.12.2007, 10:14
http://comwebnet.co.funpic.de/snap/SnapNode_roolo_gross.JPG
Ich habe auch einen M8 als Sender und einen M32 als Empfänger.
1. Also nehme ich diesen Schaltplan. Ohne Quarz für den 8er oder?
2.Dort geht es von Pin 4 (DCLK/CFIL/FFIT) an Portd.3. Den Port finde ich aber im Programm nicht. Für was soll der sein? Kann man den weglassen?
3.Dann der Empfänger ist ein M32 mit 16Mhz Quarz. Wie klemme ich dort dieses Funkmodul dann an?
Wenn ich den Code von http://comwebnet.co.funpic.de/snap/RF12-samples.zip nehme dann bekomme ich die Fehlermeldung:
Unknown Statment [$nocompile]
Re: Wetterstation
Eisbaeeer - 04.12.2007, 10:31
Trexis5 hat folgendes geschrieben:
Wenn ich den Code von http://comwebnet.co.funpic.de/snap/RF12-samples.zip nehme dann bekomme ich die Fehlermeldung:
Unknown Statment [$nocompile]
Dann kommentiere die Zeile aus. Bedeutet nur, dass du das inc nicht als eigenes Script compilieren sollst. Denn das include wird ja mit dem Haupt-Script mit compiliert.
Mach einfach ein ' vor die Zeile.
Grüße Eisbaeeer
P.S.: Die Anschlussbelegung an den M32 erkennst du aus dem Programm. Ist meines Erachtens ganz klar beschrieben:
'----------[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
Re: Wetterstation
Trexis5 - 04.12.2007, 12:37
'config the SPI in master mode.The clock must be a quarter of the slave cpu
Was heiß das genau für mein 16er Quarz am M32?
'Hier ggf. den SoftSPI reinmachen
Was bedeutet das?
Re: Wetterstation
avrnix - 04.12.2007, 13:15
Trexis5 hat folgendes geschrieben: http://comwebnet.co.funpic.de/snap/SnapNode_roolo_gross.JPG
Wenn du Probleme mit den SnapNode_Rollo Programm hast
Frage Kurzschluss:
http://www.iphpbb.com/board/viewforum.php?nxu=10138836nx63949&f=25&sid=d61c990af9cfa225951f46585c6ded03
:idea: :arrow: Software nach , oder bei der Hardware
- hier gehts doch um deine Wetterstation.
Re: Wetterstation
Trexis5 - 04.12.2007, 13:27
Hi,
ich nehme einfach mal die beiden Programme und passe die an und flahe und schaue ob auf dem Display was angezeigt wird.
Das ist der einzige Code den ich gefunden habe der fast keine Fehlermeldung beim Compilieren gebracht hat. Alle haben viele Fehler, wie auch andere schon geschrieben haben.
Wenn das dann mal geht baue ich die Wetterstation dort rein.
Das geht doch oder?
Nur wie klemme ich das Kabel Pin 4 (DCLK/CFIL/FFIT) an? Direkt an den Quarz vom M32?
Re: Wetterstation
Eisbaeeer - 04.12.2007, 14:55
Trexis5 hat folgendes geschrieben: Hi,
Wenn das dann mal geht baue ich die Wetterstation dort rein.
Das geht doch oder?
Nur wie klemme ich das Kabel Pin 4 (DCLK/CFIL/FFIT) an? Direkt an den Quarz vom M32?
Also der Code, bzw. das inc-File funktioniert ja auch. Es geht ja nur darum, wie du deinen Controller mit dem RF12 verbindest.
Da muss ich schon langsam die Frage stellen, ob das Projekt für dich zu groß ist. In dem Bereich geht halt zusammenstecken und Teile von verschiedenen Scripten zusammenbauen nicht mehr. Du bräuchtest schon grundlegendere Kenntnisse.
Du hast 2 Möglichkeiten. 1. Du benutzt einen extra Quarz für den M8 bzw. M32 oder du nutzt den Taktausgang vom RF12 (der macht 10MHz) als externen Takt. ABER dazu musst du die Fuses des Mega anpassen und das ist absolut nix für Beginner. Ein falscher Klick und dein Mega reagiert nicht mehr.
Lies mal diese Seite durch. Dort sind die Grundlegenden Dinge für den RF12 beschrieben.
http://comwebnet.co.funpic.de/seite48.php
Schau mal unter "Schaltplan und Layout.."
Wenn du jetzt das Datenblatt vom M32 anschaust, findest du auch dort die Pins vom M8 wieder.
Und FFit gehört absolut nicht an den Quarz, sondern an einen Eingangspin und zwar an einen Interrupt Pin. Dieser Heisst beim M32 INT0 und INT1.
INT0 = PD.2
INT1 = PD.3
Wenn du dich für einen entschieden hast, musst du noch das Einsprungsziel anpassen. Dort steht dann z.B.:
On Int0 Ffit_isr:
Du siehst also, dass hier der PD.2 verwendet wurde. Der INT0.
Ich würde dir vorschlagen, das Script zu verstehen und nicht einfach zu kopieren und einzufügen und hoffen, dass etwas auf das Display kommt. Dort wirst du gar nichts vom RF12 sehen, ausser du gibst den Befehl dazu.
Ich will dich ja nicht entmutigen und ich bin verwundert, wie du das bis jetzt alles hinbekommen hast, aber wo fangen wir an?
Grüße Eisbaeeer
Re: Wetterstation
Trexis5 - 04.12.2007, 18:00
Hi,
ich würde ja mit dem M8 anfangen, aber dort sehe ich nix. Da gibts kein Display.
Also muß ich mit dem M32 anfangen. Dort habe ich ein Diplay dran.
Also lasse ich clk vom Funkmodul weg und Takte meinen M32 selber.
Das einstellen ist kein Problem.
Das mit dem Int habe ich gesehen. Das ist mir auch jetzt klar.
Also der Code läuft anscheinend.
Locate 3 , 1 : Lcd "a: " ; Rf12_data(1)
Locate 4 , 1 : Lcd "b: " ; Rf12_data(2)
Das sind die einzelnen Bytes die ankommen oder?
Re: Wetterstation
Eisbaeeer - 04.12.2007, 18:04
Ja genau. Du schaust dir gerade die ersten 2 Byte an.
Freut mich, dass es klappt. Jetzt kann es ja weiter gehen.
Ich empfehle dir, einen Testsender laufen zu lassen und den über eine längere Zeit. Übertrage einfach irgend welche Daten, z.B. die Temperatur und lasse das ganze mal eine Zeit laufen.
Grüße Eisbaeeer
Re: Wetterstation
Trexis5 - 04.12.2007, 18:36
Hallo,
ich schicke ja einen String.
Wie lese ich diesen String?
Ich möchte ja nicht nur die einzelnen Bytes lesen.
Das zerhacken kann ich schon. Das habe ich über länger Zeit per 2-Draht Seriell gemacht.
Re: Wetterstation
Trexis5 - 05.12.2007, 00:32
Hi,
also einmal ein Erfolg. Das sende ich.
Code:
'Byteanzahl = Rnd(10) 'zum Test zufällige Nutzdatenlänge 0...32Byte
Byteanzahl = 24
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
Und auf dem Display kommt auch die 24 an im Rf12_data(3).
Das freucht mich schonmal.
Das was mir jetzt erstmal nicht gefällt. Ich habe einen Zähler der die Schleifen Zählen soll auf dem Display und der Springt von Plus nach minus und das oft mit irren Änderungen. Das passiert meistens, aber nicht immer, wenn Daten gelesen werden.
Irgendwann kommt kein Signal mehr an und dann zählt der Zähler auch wieder richtig.
Warum schreibt das Programm irgendwelche Variablen um?
Ich habe auch bei keinen Modulen den Reset angeklemmt.
Warum ist das so?
Re: Wetterstation
Trexis5 - 05.12.2007, 18:07
Hallo Jungs,
könnte mir bitte einer sagen wie ich daten Senden kann?
So habe ich die Variablen Dimensioniert
Code:
Goto Startup
$include "inc_RF12-Treiber.bas" 'Treiber einbinden
Startup:
Dim Text As String * 40 At Rf12_data Overlay
Dim Messwert As Word
Und so ist der Code.
Code:
Do
Messwert = 12
Text = Text + "Z1"
Text = Text + Str(messwert)
Text = Text + "Z2"
Gosub Sendsnapframe
Wait 2
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
Aber irgendwie stimmt da was nicht.
Re: Wetterstation
Eisbaeeer - 06.12.2007, 11:13
Hi
also bevor du das Sub Sendsnapframe aufrufst, musst du erst mal anschauen, was da gemacht wird. Die Variable für die zu sendenden Daten heisst: RF12_data()
Bedeutet, dass du erst rf12_data() füllen solltest. Wenn du zwischendrin Text als Variable nutzt, macht das nix, aber Text muss dann in Rf12_data() rein.
Wenn du dir das Sub Sendsnapframe anschaust, werden die ersten 5 Byte für das SNAP verwendet. Wenn du kein SNAP verwenden willst, kannst du:
Code:
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
diese auch schon füllen. Die ersten 5 werden eben für das SNAP Protokoll verwendet.
Jetzt zerhackst du dein Text z.B. mit dem Befehl MID (siehe Hilfe) und füllst RF12_data(1), Rf12_data(2), Rf12_data(3), ... usw.
Aber hier ist das Sub Sendsnapframe nur eine Hilfe für das SNAP. Im Grunde brauchst du das nicht, wenn du SNAP nicht verwenden willst. Es reicht also, die Variable RF12_data() zu füllen und ein:
Call Rf12_txdata(framelength) 'Senden
auszuführen. Framelength ist dabei deine Byteanzahl. Jetzt sendet er den kompletten Inhalt Rf12_data() raus.
Schau dir mal das Sub "Rf12_txdata" in der inc_RF12-Treiber.bas an.
Dieses Sub ist für das Senden zuständig. Wenn du das verstanden hast, bekommst du das mit dem Senden hin. Bestimmt.
Grüße Eisbaeeer
Re: Wetterstation
Trexis5 - 06.12.2007, 11:54
Mein Problem ist ja das ich keinen blassen Schimmer habe wie ich rf12_data() füllen kann. Ich grüble schon seit zwei Tagen und komme nicht drauf.
Ich verstehe wie ich einen String zerhacken kann, aber nicht wie ich diesen in die einzelen Variablen bringe. String nach Byte geht ja nicht so einfach. Auch kann ich ja nicht in jedes Byte nur zwei Zahlen schieben, gewscheige dann Buchstaben.
Mein String aus den Messwerten die ich schicken will ist so aufgebaut:
Z15345Z331675Z3860Z4 usw.
Das heißt Z1 -> dann kommt der erste Messert Z2 -> dann kommt der zweite Messert usw.! Insgesammt sind es 8 Messwerte im String. Auf der anderen Seite kann ich dann zerhacken durch suche nach Z1 oder Z2 oder Z3 usw.!
Über die Serielle Schnittstelle (zwei Atmel verbunden über TX un RX) habe ich dann auf der anderen Seite bei jedem Lesen nach allen Z1-Z8 gesucht und wenn alles da war in einem String, dann war der String erfolgreich übertragen worden.
Somit ist es auch egal wie lange die Messerte sind, die können ja auch unterschiedlich lange sein. Dur die Funktin Z1-Z8 finde ich alles wieder.
Re: Wetterstation
Trexis5 - 06.12.2007, 21:36
So, wieder eins weiter:
Senden:
Code:
Incr Messwert
Zufaelligezahl = Zufaelligezahl + 1
Rf12_data(1) = Messwert
Rf12_data(2) = Zufaelligezahl
Rf12_data(3) = 233
Rf12_data(4) = 0
Rf12_data(5) = 0
Rf12_data(6) = 0
Rf12_data(7) = 0
Rf12_data(8) = 0
Call Rf12_txdata(17)
Empfangen:
Code:
Locate 1 , 1 : Lcd "a: " ; Rf12_data(1)
Locate 2 , 1 : Lcd "b: " ; Rf12_data(2)
Locate 3 , 1 : Lcd "c: " ; Rf12_data(3)
Locate 4 , 1 : Lcd "d: " ; Rf12_data(4)
Locate 5 , 1 : Lcd "e: " ; Rf12_data(5)
Locate 6 , 1 : Lcd "f: " ; Rf12_data(6)
Locate 7 , 1 : Lcd "g: " ; Rf12_data(7)
Locate 8 , 1 : Lcd "h: " ; Rf12_data(8)
Locate 9 , 1 : Lcd "i: " ; Rf12_data(9)
Locate 10 , 1 : Lcd "j: " ; Rf12_data(10)
Locate 11 , 1 : Lcd "k: " ; Rf12_data(11)
Locate 12 , 1 : Lcd "l: " ; Rf12_data(12)
Locate 13 , 1 : Lcd "m: " ; Rf12_data(13)
Locate 8 , 9 : Lcd "h1: " ; Rf12_data(14)
Locate 9 , 9 : Lcd "i1: " ; Rf12_data(15)
Locate 10 , 9 : Lcd "j1: " ; Rf12_data(16)
Locate 11 , 9 : Lcd "k1: " ; Rf12_data(17)
Locate 12 , 9 : Lcd "l1: " ; Rf12_data(18)
Locate 13 , 9 : Lcd "m1: " ; Rf12_data(19)
Ankommen tut alles perfekt.
Nur habe ich halt das Problem wie oben geschrieben. Den String in die Sende-bytes zu legen. Ich komme nicht drauf.
Zitat:
Mein Problem ist ja das ich keinen blassen Schimmer habe wie ich rf12_data() füllen kann. Ich grüble schon seit zwei Tagen und komme nicht drauf.
Ich verstehe wie ich einen String zerhacken kann, aber nicht wie ich diesen in die einzelen Variablen bringe. String nach Byte geht ja nicht so einfach. Auch kann ich ja nicht in jedes Byte nur zwei Zahlen schieben, gewscheige dann Buchstaben.
Mein String aus den Messwerten die ich schicken will ist so aufgebaut:
Z15345Z331675Z3860Z4 usw.
Das heißt Z1 -> dann kommt der erste Messert Z2 -> dann kommt der zweite Messert usw.! Insgesammt sind es 8 Messwerte im String. Auf der anderen Seite kann ich dann zerhacken durch suche nach Z1 oder Z2 oder Z3 usw.!
Über die Serielle Schnittstelle (zwei Atmel verbunden über TX un RX) habe ich dann auf der anderen Seite bei jedem Lesen nach allen Z1-Z8 gesucht und wenn alles da war in einem String, dann war der String erfolgreich übertragen worden.
Somit ist es auch egal wie lange die Messerte sind, die können ja auch unterschiedlich lange sein. Dur die Funktin Z1-Z8 finde ich alles wieder.
Re: Wetterstation
Wigbert - 06.12.2007, 21:55
Hi Terexis5,
stell mal den ganzen Code rein
Re: Wetterstation
Trexis5 - 06.12.2007, 22:16
Code:
$regfile = "m8def.dat"
$hwstack = 128
$swstack = 128
$framesize = 64
'$prog &HFF , &HE4 , &HD9 , &H00 ' Mega8 mit internen 8MHz
$crystal = 8000000 '
$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
Dim Text As String * 40 At Rf12_data 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 =""
Dim Zufaelligezahl As Byte
Zufaelligezahl = 0
Dim Messwert As Byte
Messwert = 0
'--------[mainloop]------------------------------------------------------
Code:
Do
Incr Messwert
Zufaelligezahl = Zufaelligezahl + 1
'Messwert = 124
'Text = Text + "Z1"
'Text = Text + Str(messwert)
'Text = Text + "Z2"
Rf12_data(1) = Messwert
Rf12_data(2) = Zufaelligezahl
Rf12_data(3) = 233
Rf12_data(4) = 0
Rf12_data(5) = 0
Rf12_data(6) = 0
Rf12_data(7) = 0
Rf12_data(8) = 0
Call Rf12_txdata(17)
'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 2
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
Re: Wetterstation
Kurzschluss - 06.12.2007, 23:01
Hi Trexis5,
versuchs mal so:
Code:
Dim RF12_data(46) As Byte , RF12_S As String * 40 At RF12_data+5 Overlay
'wichtig ist die +5 !!!
die ersten 5 Byte bleiben für das SNAP-Protokoll
ab dem 6.Byte wird der String reingestetzt
einfach per:
RF12_S="" 'clear String
RF12_S="Das ist mein Messwert: "+str(Messwert)
beim senden musst du nur noch die Länge berechnen oder
immer alle Bytes senden (der rest sind dann leerzeichen)
vor einer neuen Stingzuweisung solltest du immer
per RF12_S="" den alten Inhalt löschen
Beschreib mir nochmal genauer wie dein String + Messwerte
aussehen soll.
willst du 'ne Art csv-Datei Daten senden?
Vieleicht kann ich dir da helfen
mfg
Kurzschluss
Re: Wetterstation
Trexis5 - 06.12.2007, 23:28
Code:
Dim Befehl As String * 90
Dim Position As Byte , Lang As Byte , Mess As Single
Const Z1 = "Z1"
Const Z2 = "Z2"
Const Z3 = "Z3"
Const Z4 = "Z4"
Const Z5 = "Z5"
Const Z6 = "Z6"
Const Z7 = "Z7"
Code:
Mess = Druck 'Luftdruck
Mess_string = Str(mess) 'Messwert in String umwandeln
Mess_string = Mid(mess_string , 1 , 6)
Zeichenspeicher = Z1 + Mess_string
Mess = Rhlintemp 'Feuchte RHT 11
Mess_string = Str(mess) 'Messwert in String umwandeln
Mess_string = Mid(mess_string , 1 , 6)
Zeichenspeicher = Zeichenspeicher + Z2
Zeichenspeicher = Zeichenspeicher + Mess_string
Mess = Tempc 'Temperatur RHT 11
Mess_string = Str(mess) 'Messwert in String umwandeln
Mess_string = Mid(mess_string , 1 , 6)
Zeichenspeicher = Zeichenspeicher + Z3
Zeichenspeicher = Zeichenspeicher + Mess_string
Mess = Avg_2 'temp einfach
Mess_string = Str(mess) 'Messwert in String umwandeln
Mess_string = Mid(mess_string , 1 , 6)
Zeichenspeicher = Zeichenspeicher + Z4
Zeichenspeicher = Zeichenspeicher + Mess_string
Mess = Avg_3 'Licht
Mess_string = Str(mess) 'Messwert in String umwandeln
Mess_string = Mid(mess_string , 1 , 6)
Zeichenspeicher = Zeichenspeicher + Z5
Zeichenspeicher = Zeichenspeicher + Mess_string
'Mess = Adval_adc4
Mess = 1234567890
Mess_string = Str(mess) 'Messwert in String umwandeln
Mess_string = Mid(mess_string , 1 , 6)
Zeichenspeicher = Zeichenspeicher + Z6
Zeichenspeicher = Zeichenspeicher + Mess_string
Zeichenspeicher = Zeichenspeicher + Z7
If Senden = 1 Then
Print Zeichenspeicher
Senden = 0
End If
So habe ich es beim Testen von Atmel zu Atmel geschickt per Seriall.
Re: Wetterstation
Trexis5 - 07.12.2007, 22:41
@Kurzschluss
D A N K E !!!
Du hast mir die Richtigen Infos gegeben.
Zitat:
versuchs mal so:
Code:
Dim RF12_data(46) As Byte , RF12_S As String * 40 At RF12_data+5 Overlay
'wichtig ist die +5 !!!
die ersten 5 Byte bleiben für das SNAP-Protokoll
ab dem 6.Byte wird der String reingestetzt
einfach per:
RF12_S="" 'clear String
RF12_S="Das ist mein Messwert: "+str(Messwert)
Jetzt kann ich einen String mit 90Zeichen schicken.
Hoffe ich habe das alles richtig gemacht.
Hier der Sende-Code:
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"
$hwstack = 128
$swstack = 128
$framesize = 128
'$prog &HFF , &HE4 , &HD9 , &H00 ' Mega8 mit internen 8MHz
$crystal = 4000000 '
'$baud = 19200
$baud = 9600
Const Rf12freq = 433.92 'Kanal-Einstellung
'Const Rf12baud = 19200 'Baudrate
Const Rf12baud = 9600
Const Myadress = 10 'NodeAdress
Const Snap_sync = &H54 'Synczeichen SNAP-Protokoll
'RF-Variablen
Dim Lv As Byte
Dim Temp As Word
Dim Rf12_data(96) As Byte , Rf12_s As String * 90 At Rf12_data + 7 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(90) As Byte , S_buffer As String * 90 At Buffer Overlay
Dim Text As String * 90 At Rf12_data Overlay
'--------------[Hardwaresetup für Pollin Funkboard]-----------------------------------
'PortD.3-->INT1 an FFIT --Interrupt(High) wenn FiFO-Buffer voll (ef-Bit set)
'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
Dim Zufaelligezahl As Byte
Dim Messwert As Word
Dim Position As Byte , Lang As Byte , Mess As Single
Dim Zeichenspeicher As String * 90 , Vergleichsspeicher As String * 20 , Sort As String * 20 , Mess_string As String * 20
Const Z1 = "Z1"
Const Z2 = "Z2"
Const Z3 = "Z3"
Const Z4 = "Z4"
Const Z5 = "Z5"
Const Z6 = "Z6"
Const Z7 = "Z7"
'--------[mainloop]------------------------------------------------------
Do
Rf12_s = ""
Zeichenspeicher = ""
Incr Mess
'Mess = 1234567890
Mess_string = Str(mess) 'Messwert in String umwandeln
Mess_string = Mid(mess_string , 1 , 6)
Zeichenspeicher = Zeichenspeicher + "0000"
Zeichenspeicher = Zeichenspeicher + Z6
Zeichenspeicher = Zeichenspeicher + Mess_string
Zeichenspeicher = Zeichenspeicher + Z7
'Rf12_s = "1234Z11234567890Z21234567890Z3123456789Z4123456789Z51234567890Z61234567890Z7123456789Z8" 'clear String
Rf12_s = Zeichenspeicher
Byteanzahl = 11
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 2
Loop
End 'end program
'------[Send Frame over RF12]---------------------------------
Sendsnapframe:
'Header aufbereiten (SNAP)
Rf12_data(1) = Snap_sync
Rf12_data(2) = &H50 6 '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
Und dann das Empfangen:
Code:
'#######################################
'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 = "m32def.dat"
$hwstack = 128
$swstack = 128
$framesize = 128
'$prog &HFF , &HFF , &H99 , &H00 ' für Mega32
$crystal = 16000000
'$crystal = 10000000 '
'$baud = 19200
'Baud = 19200
$baud = 9600
Baud = 9600
Ddrb.0 = 1
Portb.0 = 1
Ddrd.7 = 1 'Ausgang PWM
Portd.2 = 1 'PD: (Pull UP) PD2 aktivieren INT0
Portd.6 = 1 'PD: (Pull UP) PD6 aktivieren Taste Prog
Portb.2 = 1 'PB: (Pull UP) PB2 aktivieren INT2
Config Scl = Portd.5 ' I2C-Clock festlegen
Config Sda = Portd.4 ' I2C-Data festlegen
' LCD-Typ festlegen
Config Graphlcd = 240 * 128 , Dataport = Porta , Controlport = Portc , Ce = 2 , Cd = 3 , Wr = 0 , Rd = 1 , Reset = 4 , Fs = 5 , Mode = 8
Cls
Cursor Off
Locate 1 , 1 : Lcd "test1"
Const Rf12freq = 433.92 'Kanal-Einstellung
'Const Rf12baud = 19200 'Baudrate
Const Rf12baud = 9600
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(96) As Byte , Rf12_s As String * 90 At Rf12_data + 6 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)
'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.1 : Ddrb.1 = 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
Dim Zaehler_schleife As Integer
Dim Zaehler_schleife2 As Integer
Dim Zaehler_schleife3 As Integer
Dim Count As Byte
Dim Speicherstring As String * 40
Cls
Code:
Do
Cls
Incr Zaehler_schleife2
If Rf_rxd = 1 Then
Rf12_s = ""
Gosub Framehandler
Gosub Rf12_rxd_on
For Lv = 6 To 96
Rf12_s = Rf12_s + Chr(rf12_data(lv))
Next Lv
End If
Incr Zaehler_schleife3
Locate 1 , 1 : Lcd "a: " ; Rf12_data(1)
Locate 2 , 1 : Lcd "b: " ; Rf12_data(2)
Locate 3 , 1 : Lcd "c: " ; Rf12_data(3)
Locate 4 , 1 : Lcd "d: " ; Rf12_data(4)
Locate 5 , 1 : Lcd "e: " ; Rf12_data(5)
Locate 7 , 1 : Lcd "Datenlaenge: " ; Rf12_data(10)
Locate 10 , 1 : Lcd "Daten: " ; Rf12_s
Locate 16 , 1 : Lcd Zaehler_schleife ; " " ; Zaehler_schleife2 ; " " ; Zaehler_schleife3
Incr Zaehler_schleife
Wait 1
Loop
End
'----------[Frameverarbeitung SNAP-Protokoll]------------------------------------
Framehandler:
If Sync = Snap_sync Then 'sync.Zeichen IO?
If Hdb2 = &H50 Then '1Byte Adressierung?
'if HDB2= NDB then '0..32 Datenbyte
Locate 1 , 9 : Lcd "1: "
If Dab1 = Myadress Then 'Adresse prüfen
'Print "Das war für mich!...von Nr.:" ; Rf12_data(5) 'Datenverarbeitung
Locate 2 , 9 : Lcd "2: "
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
'Locate 2 , 9 : Lcd "2: " ; 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>= 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
Re: Wetterstation
Trexis5 - 08.12.2007, 03:49
Ihr werdet es nicht glauben.
Die Wetterstation Funktioniert und Funkt. !!!!!
So, aber nur mit dem M32, nicht mit dem M644.
Das ist natürlich blöde wegen dem Speicherproblem.
Erst kam die Fehlermeldung wie auf der Grafik zu sehen ist.
Das liegt anscheinend an einer älteren m644def.dat wie ich im Internet gelesen habe
Jetzt habe ich mal die neueste genommen, und dort scheint es zu gehen.
Nur hängt nun das Programm an den Call's fest.
Code:
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"
Und jetzt?
:roll:
Re: Wetterstation
Kurzschluss - 10.12.2007, 11:38
Hi Trexis5
schön das ich helfen konnte....
du hast ja ein Interessantes Projekt
Gibt es an deinen Wettermodulen auch einen Windsensor und Dämmerungsmessung(Lichtsensor) die Daten an eine Haussteuerung
weitergeben könnten?
Damit könnte man Wetterabhänig die Fensterrollos steuern
Hast du irgendwo deine Hardware (Schaltung) veröffentlich???
für evtl. Nachbau...
mfg
Kurzschluss
Re: Wetterstation
Trexis5 - 11.12.2007, 02:06
Hallo,
also Helligkeit erfasse ich schon, mit 4 Symbolen, von Mond bis Sonne.
Wind und Windrichtung ist die nächste Option. Nur leider finde ich keine Günstigen Sensoren dafür. Habt ihr vielleicht eine Quelle?
Das dann noch zu integrieren ist dann auch nicht so schwierig, weil ja die ganze Verbindung schon besteht.
Ich habe heute noch den Programmiermodus verschönert und für die Verbindung noch die Cecksumme integriert.
Nur leider habe ich zu meinem 644er Atmel-Problem noch keine Lösung. Desswegen habe ich kurzerhand für 3€ noch einen M32 mit eingebaut. Somit Funkt der M32 mit der Aussenstation und sendet dann die Daten per RXD an dem M644.
Ich habe auch vor den M32 mit als Datenspeicher zu verwenden, also ist das auch garnicht so ohne.
Die Wetterprognose muß man halt noch optimieren, aber für den Anfang ist das so schon nicht schlecht.
Dann kommt die Tage noch ein DCF77 Empfänger rein um die Uhr genau zu steuern.
Damit entfällt dann meine eigen Programmierte Sommer-Winterzeitumstellung auch weg. Das heißt es ist wieder Platz für was anderes. :-)
Diese Woche werde ich es wenn ich Zeit finde vorstellen. Auch mit Quelcode, nur einen Schaltplan habe ich noch nicht. Den habe ich immer noch im Kopf, aber viel ist das ja nicht.
Gehäuse habe ich auch schönes schwarzes gefunden und auch gleich Ausfräßen lassen.
Re: Wetterstation
Kurzschluss - 11.12.2007, 14:51
Trexis5 hat folgendes geschrieben: Hallo,
also Helligkeit erfasse ich schon, mit 4 Symbolen, von Mond bis Sonne.
Wind und Windrichtung ist die nächste Option. Nur leider finde ich keine Günstigen Sensoren dafür. Habt ihr vielleicht eine Quelle?
Das dann noch zu integrieren ist dann auch nicht so schwierig, weil ja die ganze Verbindung schon besteht.
Ich habe heute noch den Programmiermodus verschönert und für die Verbindung noch die Cecksumme integriert.
Nur leider habe ich zu meinem 644er Atmel-Problem noch keine Lösung. Desswegen habe ich kurzerhand für 3€ noch einen M32 mit eingebaut. Somit Funkt der M32 mit der Aussenstation und sendet dann die Daten per RXD an dem M644.
Ich habe auch vor den M32 mit als Datenspeicher zu verwenden, also ist das auch garnicht so ohne.
Die Wetterprognose muß man halt noch optimieren, aber für den Anfang ist das so schon nicht schlecht.
Dann kommt die Tage noch ein DCF77 Empfänger rein um die Uhr genau zu steuern.
Damit entfällt dann meine eigen Programmierte Sommer-Winterzeitumstellung auch weg. Das heißt es ist wieder Platz für was anderes. :-)
Diese Woche werde ich es wenn ich Zeit finde vorstellen. Auch mit Quelcode, nur einen Schaltplan habe ich noch nicht. Den habe ich immer noch im Kopf, aber viel ist das ja nicht.
Gehäuse habe ich auch schönes schwarzes gefunden und auch gleich Ausfräßen lassen.
Wettermessmodule evtl. bei ELV
die haben recht viele, hab aber keine Ahnung was die Teile im einzelnen für Schnittstellen haben
Schaltplan könnte ich zeichnen, arbeite allerdings mit Target.
Übrigens arbeite ich auch mit dem Mega644, was ist da im regfile fehlerhaft??? bitte mal genauer....
wegen Programmcode für Stringübertragung: guck mal in deine Post
Kurzschluss
Re: Wetterstation
Trexis5 - 12.12.2007, 22:22
Hi,
also ich habe es hier gepostet, dort kann man Daten anhängen.
http://bascom-forum.de/index.php/topic,1001.0.html
Schaltplan fehlt halt noch. @Kurzschluß :?: :D
Re: Wetterstation
Eisbaeeer - 12.12.2007, 22:40
Trexis5 hat folgendes geschrieben: Hi,
also ich habe es hier gepostet, dort kann man Daten anhängen.
http://bascom-forum.de/index.php/topic,1001.0.html
Schaltplan fehlt halt noch. @Kurzschluß :?: :D
Schade eigentlich. Wir haben gerade ein neues Forum eröffnet, wo man noch mehr kann. Wie sieht es mit dem Bascom Code aus? Würde mich brennend interessieren, da ich auch ein Grafisches Display habe.
Grüße Eisbaeeer
Re: Wetterstation
Trexis5 - 12.12.2007, 23:05
Gibts alles in der Zip-Datei. :D
Mit folgendem Code, können Sie den Beitrag ganz bequem auf ihrer Homepage verlinken
Weitere Beiträge aus dem Forum www.comwebnet.de
Excel als Messgerät von Spanungswerten - gepostet von avrnix am Donnerstag 04.10.2007
New Project will born - Steuerung mit dem Browser und AVR - gepostet von avrnix am Samstag 09.06.2007
Grundschaltung zu Schaltnetzteilen - gepostet von avrnix am Dienstag 13.02.2007
Projekte mit diesen Modulen - gepostet von avrnix am Sonntag 27.05.2007
Ähnliche Beiträge wie "Wetterstation"
