Verfügbare Informationen zu "Software zum SNAP-Protokoll"
Qualität des Beitrags: Beteiligte Poster: Kurzschluss - avrnix - radebeul Forum: www.comwebnet.de Forenbeschreibung: AVR Mikrocontroller und Elektronik - Forum - www.comwebnet.de aus dem Unterforum: SNAP-Protokoll für RFM12 - Sven Härtig Antworten: 6 Forum gestartet am: Mittwoch 25.10.2006 Sprache: deutsch Link zum Originaltopic: Software zum SNAP-Protokoll Letzte Antwort: vor 15 Jahren, 1 Monat, 27 Tagen, 10 Stunden, 19 Minuten
Alle Beiträge und Antworten zu "Software zum SNAP-Protokoll"
Re: Software zum SNAP-Protokoll
Kurzschluss - 11.11.2007, 00:35Software zum SNAP-Protokoll
Hallo....
Hier werde ich die Quelldateien zum SNAP-RFM12 Projekt reinstellen
@AVRNIX: Danke für das neue Brett...
Zu Hintergrundwissen zum Thema SNAP:
siehe hier: www.hth.com/snap
Noch als HINWEIS: weil da schon Fragen dazu kamen
Da das Protokoll frei skalierbar ist, kann man auch mit festen
Datenlängen arbeiten oder ne andere CRC-Methode nehmen ...usw.
Hier der Testslave mit M32 auf dem Pollinboard
Im mainloop könnte der AVR noch andere Aufgaben bekommen...
Nur wenn Daten im FIFO vom RF12 liegen,
werde diese per ISR eingelesen.
In der Interruptroutine wird dann auf das Startzeichen (SYNC-Byte)
synchronisiert und nach Auswertung der Nutzbyteanzahl das gesamte
Datenpaket reingeholt. Danach wird der RF12 abgeschaltet und der Interrupt gesperrt.
per RF_RXD Flag wird im Mainloop die Auswertung des SNAP-Frames
ausgelöst. Hier wird dann der Frame mit ACK/NACK-Info den Master zurückgesendet.
Wenn die Verarbeitung Abgeschlossen ist wird per:
gosub RF12_RXD_ON der Empfänger wird scharf gemacht
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.02
'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
' 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)
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)
'----------[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"
waitms 250
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
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
if crc=RF12_data(Framelength) then 'CRC OK?
print "CRC OK! => ";hex(crc)
' Send ACK (i.e tell master that packet was OK)
Hdb2 = Hdb2 Or &B00000010 ' Set ACKs bit in HDB2 (xxxxxx10)
Hdb2 = Hdb2 And &B11111110
'do ...
gosub SENDEN 'Anwortframe senden--> nur als Slave
gosub CMD_HANDLER
'RF12_data(2 <--- ackno machen
else
print "CRC Bad => ";hex(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!!! : ";hex(HDB2)
end IF
else
print "no Syncbyte!!! : ";hex(SYNC)
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
print
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
Bitte Hinweise und Tipps hier reinstellen....
Achtung!!!!: das hier ist alles noch Alpha-Stadium...
wer Fehler findet Bitte im Forum mitteilen
Viel Spass und Erfolge beim Testen
Kurzschluss
PS.: hab bemerkt, wenn man unter Optionen:
HTML in diesem Beitrag deaktivieren setzt
wird der Codeabschnitt nicht verstümmelt, was neulich pasiert ist....
Re: Software zum SNAP-Protokoll
avrnix - 11.11.2007, 11:01
hallo Kurzschluss,
Danke erstmal für dein Projekt, bitte erstelle noch paar Topics
für Hardware und Fehlermeldunge, damit man schnell was finden kann.
Und nicht alles durcheinander in der Rubrick ist.
Natürlich kannst du auch mehr Unterverzeichnisse erstellen, z.B Diskussion über Hardware etc.
So noch viel erfolg und rege Teinahme :P
Re: Software zum SNAP-Protokoll
Kurzschluss - 22.11.2007, 23:32
Hi @ all
hier nochmal komplett mein Testsender
der läuft auf der dem dem hier vorgestellten Test-Board:
http://www.comwebnet,de Projekt RMF12 Modul Tranceiver 433 MHz
von Wigbert Picht und Dirk Milewski
Code:
'#######################################
'Testsender SNAP-Protokoll über RF12 Ansteuerung Rollo zumachen, aufmachen, Temperatur abfragen....
'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: v2.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...32 Datenbyte rein
select case ByteAnzahl '6Byte<=sync+HDB2+HDB1+DAB+SAB+CRC
case 0 to 8: '6-14 (0--8 Datebyte)
case 9 : ByteAnzahl=16 '22 (16 Datenbyte)
case 10 : ByteAnzahl=32 '38 (32 Datenbyte)
end SELECT
Framelength = ByteAnzahl +6
crclength = Framelength-2
RF12_data(10) = ByteAnzahl 'Datenlänge in DB mitsenden
RF12_data(Framelength)= crc8(RF12_data(2),crclength) 'CRC Anhängen und raus senden
Print "Sende Frame"
Call Rf12_txdata(Framelength) 'Senden
Waitms 10
return
'------[Uart ISR]----------------------------------------------
Rxd_isr: '
Rx_data = Udr 'Zeichen aus Uart holen
Incr N 'Pointer hochzählen
If Rx_data = 123 Then N = 1 ' { -- synchronisation Vorzeichen in der ersten Stelle
If Rx_data = 125 or n>10 Then Rxd_ready = 1 ' } -- Wenn Endekennung eingetroffen --> CMD-Frameende eingetroffen
Buffer(n) = Rx_data 'Byte in Buffer
Return
Die Sendehäufigkeit ist hier nur durch die Wait-Anweisung im mainloop begrenzt.
Ansonsten erfolgt eine endlos Wiederholung mit ständig anderer Datenbyteanzahl,
wodurch die Framelänge und die CRC bei jedem Sende-Paket variiert.
Grüsse
Kurzschluss
Re: Software zum SNAP-Protokoll
Kurzschluss - 02.12.2007, 16:01
Hallo
für alle die die Rollosteuerung bauen wollen (siehe Hardware)...
mein aktueller Softwarestand
Code:
' #######################################################################
' # SlaveNode RolloModul
' # zur Ansteuerung eines Rollomotors
' # Taste1 & Taste2 zur Handsteuerung, per RF12 Zentralansteuerung
' # Zentrale kann die jeweilige Raumtemperatur auslesen (LM75)
' # 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.03
' # Author: Kurzschluss
' ########################################################################
' 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=011 - 8-bit CRC-CCITT
' NNNN=0100 - 4 Byte data (Steuerbyte, Reservebyte, Messdaten-LSB, Messdaten-MSB
' 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"
$PROG &HFF,&HC4,&HD9,&H00 ' Mega mit intern 8MHz
$hwstack = 96
$swstack = 96
$framesize = 96
$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 T2reload = 178
Const Lm75slavewrite = &H9D
Const Lm75slaveread = &H9F
Dim lv As Byte
Dim Timeout As Word , Ticks As Byte, Sec_flag as Bit
Dim Temp As Word
Dim RF12_data (40) As Byte
Dim RF12_S As String * 40 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 Rx_data as Byte, N as Byte , Rxd_ready as Bit
Dim Buffer (20) As Byte
Dim Auf_Flag as Bit, Zu_Flag as Bit
Dim Lm75high As Byte, Lm75low As Byte
Dim Temperatur As Integer , X As Word
Dim Nachkommastelle(10) As Byte
Dim Mess_flag as Bit 'Task-Flag Temperaturmessen
Dim W As Word , Channel As Byte, S As Byte , I As Byte
SYNC Alias RF12_data(1)
HDB2 Alias RF12_data(2) ' HDB2 liegt in unterem Byte
HDB1 Alias RF12_data(3)
DAB1 Alias RF12_data(4)
SAB1 Alias RF12_data(5)
CMD Alias RF12_data(6)
'------[Hardwaresetup]---------------------------------------------
'PortD.3-->INT1 an FFIT --Interrupt(High) wenn FiFO-Buffer voll (ef-Bit set)
LED1 Alias Portd.2
LED2 Alias Portd.4
LED3 Alias Portd.5
Relais1 Alias Portd.6
Relais2 Alias Portd.7
DDRD=&b1111_0111 'PD3-INT1
Taste0 Alias Pinc.0 'Rolloschalter Taste1
Taste1 Alias Pinc.1 'Rolloschalter Taste2
'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
' ############ Achtung je nach µC anpassen !!!' werden benötigt für rf12_ready #############
' für M8:
Spi_cs Alias Portb.2 : DDRB.2=1
Spi_sdo Alias Pinb.4
'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
Config Scl = Portb.4
Config Sda = Portb.5
config Timer2 =Timer,Prescale=1024
Config Int1 = Rising
On Timer2 Timer2_isr 'systemticks
On Int1 FFIT_ISR
On Urxc RXD_ISR 'Interrupt Empfange String von RXD
goto Startup
$include "inc_RF12-Treiber.bas" 'RF12 Treiber einbinden
'------[Initialisierung]------------------------------------------------
Startup:
Enable Timer2
Enable Urxc 'Einschalten
Enable Interrupts 'Zulassen
set LED1
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 LED1
Start Timer2
'------[Mainloop]------------------------------------------------------
gosub RF12_RXD_ON 'Empfänger einschalten
Do
'Wippentaster checken(Handbedienung des Fensterrollos)
If Taste0 = 0 And Taste1 = 1 then Auf_Flag=1
If Taste0 = 1 And Taste1 = 0 then Zu_Flag=1
'Datenempfang checken
if RF_RXD=1 then
'set LED2
'print "RX ready, Framelength: "; Framelength
gosub Framehandler
gosub RF12_RXD_ON
'reset LED2
end IF
If Auf_Flag =1 Then Gosub Rolloaufmachen 'Task aufmachen
If Zu_Flag =1 Then Gosub Rollozumachen 'Task zumachen
If Mess_flag=1 Then Gosub HoleTemperatur 'Task Temperatur messen
waitms 50
toggle LED3 'Loop-LED Debughilfe
Loop
End
'------[Rollo senken]------------------------------------------------------
Rollozumachen: '20sec Motor an runterfahren
Zu_Flag=0
print"close roller blind"
Timeout = 2000 '20sec
Relais1 = 1 : Relais2 = 0
Bitwait Taste0 , Set : Waitms 300
Do 'Warte Zeit oder Abbruch durch User
Loop Until Timeout = 0 Or Taste0 = 0 Or Taste1 = 0
Relais1 = 0 : Relais2 = 0
Bitwait Taste0 , Set
Bitwait Taste1 , Set
print"Ready"
Waitms 200
Return
'------[Rollo heben]------------------------------------------------------
Rolloaufmachen: '20sec Motor an hochfahren
Auf_Flag=0
print"open roller blind"
Timeout = 2000 '20sec
Relais1 = 0 : Relais2 = 1
Bitwait Taste1 , Set : Waitms 300
Do 'Warte Zeit oder Abbruch durch User
Loop Until Timeout = 0 Or Taste0 = 0 Or Taste1 = 0
Relais1 = 0 : Relais2 = 0
Bitwait Taste0 , Set
Bitwait Taste1 , Set
print"Ready"
Waitms 200
Return
'------[aktuelle Temperatur holen]------------------------------------------
HoleTemperatur:
Mess_flag=0
I2cstart
I2cwbyte Lm75slaveread
I2crbyte Lm75high , Ack
I2crbyte Lm75low , Nack
I2cstop
If Lm75high > 127 Then
Temperatur = Lm75high And 127
Temperatur = Not Temperatur
Incr Temperatur
Else
Temperatur = Lm75high
End If
Lm75low = Lm75low And 128
If Lm75low > 0 Then
Nachkommastelle(s) = 5
Else
Nachkommastelle(s) = 0
End If
'GMW über 10 Stützstellen
Incr S : If S > 10 Then S = 1
X = 0
For I = 1 To 10
X = X + Nachkommastelle(i)
Next I
X = X / 10
return
'------[Frameverarbeitung SNAP-Protokoll]------------------------------------
Framehandler:
'set LED1
Print "Frame: ";
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 "Adresse IO...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
if crc=RF12_data(Framelength) then 'CRC OK?
print "CRC OK! => ";hex(crc)
' Send ACK ( OK)
' Set ACKs bit in HDB2 (xxxxxx10)
Hdb2 = Hdb2 Or &B00000010
Hdb2 = Hdb2 And &B11111110
gosub CMD_HANDLER 'Kommandausführung
gosub SENDEN 'Anwortframe senden
else 'bei CRC --> NIO keine Verarbeitung
print "CRC Bad => ";hex(crc) 'nur Antwort mit NAK zum Master
' Send NAK (NIO)
' Set ACK bits in HDB2 (xxxxxx11)
Hdb2 = Hdb2 Or &B00000011
gosub SENDEN
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!!! : ";hex(HDB2)
end IF
else
print "no Syncbyte!!! : ";hex(SYNC)
end IF
waitms 10
'reset LED1
return
'------[CMD-Interpreter]-------------------------------------
CMD_handler:
select case CMD
case 0 : Print "NodeTest over RFM12"
case 1 : Auf_Flag=1
case 2 : Zu_Flag =1
case 10 : 'Temperaturwert in Datenbytes packen....
RF12_data(8)=low(X)
RF12_data(9)=high(x)
case else: print "unkown instruction"
end SELECT
return
'------[RF12 Empfänger einschalten]---------------------------
RF12_RXD_ON:
lv=1
RF_SYNC=0 'Flags rücksetzen und alten Datenframe löschen
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:
crc=Framelength-2 'nur temporär Länge für crc-Check
RF12_data(Framelength)= crc8(RF12_data(2),crc) 'CRC berechnen und ans FrameEnde anhängen
'Print "Sende Frame" ;RF12_S
Call Rf12_txdata(Framelength) 'Snapframe senden
Waitms 10
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
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
RF12_data(lv) = Temp 'Empfangsbyte in Buffer holen
incr lv 'Zeiger incr
toggle LED3
Return
'------[Timer2 ISR]------------------------------------------
Timer2_isr:
Timer2 = T2reload 'reloadvalue for 10msec @ 8MHz clock
If Timeout > 0 Then Decr Timeout 'Timeout alle 10ms runterzählen
If Ticks > 0 Then
Decr Ticks
Else
Ticks = 100
Sec_flag = 1 'setze Sec-flag
Mess_flag=1
toggle LED1
End If
If Ticks = 90 Then Sec_flag = 0 'nach 100ms secflag löschen
Return
'------[Uart ISR(Daten vom PC z.Z. nicht verwendet!!)]-------
Rxd_isr:
Rx_data = Udr 'Zeichen aus Uart holen
Incr N 'Pointer hochzählen
If Rx_data = 123 Then N = 1 ' { -- synchronisation Vorzeichen in der ersten Stelle
If Rx_data = 125 or n>10 Then Rxd_ready = 1 ' } -- Wenn Endekennung eingetroffen --> CMD-Frameende eingetroffen
Buffer(n) = Rx_data 'Byte in Buffer
Return
Der Rollo ist weiterhin über die vorhandenen Wippenschalter handbedienbar und kann per Funk ferngesteuert werden.
z.Z. ist mein Master nur das Pollinboard mit Laptop dran...
Also falls schon jemand eine Mastersteuerung mit RF12
für die Hausautomation hat oder plant...hier rein und mitmachen :wink:
mfg
Kurzschluss
Re: Software zum SNAP-Protokoll
radebeul - 30.01.2008, 12:50
Hallo
Ich teste das SNAP-Programm mit 2 x Pollin-Board (RFM12). Der Master M32 sendet im Takt von 1 Sekunde einen Frame von 10 Byte (4 Nutzbyte) an den Slave M16. Der Slave schickt den kompletten Frame an den Master zurück. Fehlerrate 20 - 50%. RF12-Statusabfrage brachte keine Verbesserung.
Jetzt will ich ein weiteres Pollin-Board nur mithören lassen, um festzustellen, ob Master falsch sendet oder Slave falsch empfängt. Wer kann mir helfen?
radebeul
Re: Software zum SNAP-Protokoll
avrnix - 30.01.2008, 13:08
Das Forum ist alt es gibt ein neues und ist aktueller.
-> http://www.comwebnet.de -> Forum
->:!: Bitte nur das neue Forum benutzen :!: <-
Dort kannst du dich anmelden und zum Thema ein Beitrag schreiben.
ohne Werbung !
thx :!:
Mit folgendem Code, können Sie den Beitrag ganz bequem auf ihrer Homepage verlinken
Weitere Beiträge aus dem Forum www.comwebnet.de
Messtechnik - gepostet von avrnix am Sonntag 04.11.2007
Grundschaltung zu Schaltnetzteilen - gepostet von avrnix am Dienstag 13.02.2007
Linux - TCP over ttyS0 Thema - gepostet von avrnix am Samstag 03.03.2007
Protkoll für die Vernetzung von RFM12,01,02 Modulen - gepostet von avrnix am Sonntag 19.08.2007
Tochpanel für S65 Display ? - gepostet von Kay am Mittwoch 02.05.2007
Ähnliche Beiträge wie "Software zum SNAP-Protokoll"
protokoll 6.6 - GenosseFloyd (Donnerstag 07.06.2007)
Protokoll: 1. Ausgabe - Lissi (Samstag 25.11.2006)
Software de jeda braucht - Jule (Donnerstag 01.03.2007)
Spiel gegen Oesterweg - hillary (Montag 11.10.2010)
VT-Software - müller (Donnerstag 29.07.2004)
Anleitung für PC-Adapter und Software gesucht - Logo1965 (Dienstag 01.05.2007)
Überblick über Standards - jtelieps (Mittwoch 15.02.2012)
Protokoll des 1. Treffens der East London-Gruppe, 30.01.05 - Mäggie (Samstag 05.02.2005)
übelstes PROtokoll von gestern, also thorids geburtstag - bommel (Donnerstag 26.04.2007)
Linux und wie man Software installiert - sledge (Donnerstag 28.07.2005)
