Funktion: Der Sender sendet die Präambel (2byte) die Nutzdaten (1byte) und ein Dummybyte [alles AA(hex)] Der Empfänger gibt die Daten an Port C aus. Es wird ohne Sync.Pattern gearbeitet. xxxxxxxxxxxxxxxxxxxxxxxxxxx S E N D E R xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx .include "m32def.inc" .org 0x0000 .def temp1 = r16 .def temp2 = r17 .def preload1 = r18 .def preload2 = r19 .def dataTx = r20 .def preload0 = r21 .def temp3 = r22 .equ XTAL = 1000000 ; 1MHz ; Stackpointer initialisieren (SP wird bei jedem Push / Call Befehl erniedrigt) ldi temp1, $5F ;LOW-Byte der obersten RAM-Adresse out SPL, temp1 ldi temp1, $08 ; HIGH-Byte der obersten RAM-Adresse out SPH, temp1 ; --------------Beginn Hauptprogramm------------------ main: nop rcall Pconfig ;Port-config rcall Setmaster ;SPI-config sbi portb,4 ;disable SPI von RFM12 rcall dl100ms ;Warte bis RFM12 empfangsbereit rcall cfRF12 ;RFM12-config als Sender ldi temp1,0x82 ldi temp2,0b00011001 ;disable Transmitter --> Tx-Register = AA AA rcall Send loop0: ldi temp1,0x00 ldi temp1,0x00 ;Lies Statusregister rcall Send out PortC, temp1 ldi temp1,0xB8 ;Sende AA AA Präambel an Modul ldi temp2,0xAA rcall Send ldi temp1,0xB8 ldi temp2,0xAA rcall Send ldi temp1,0x82 ldi temp2,0b00111001 ;enable Transmitter --> Präambel, Teil 1 wird gesendet rcall Send ldi temp1,0xB8 ;Warte bis Register1 gesendet wurde ldi temp2,0xAA ;und sende Nutzdaten (gleichzeitig wird Präambel Teil2 gesendet) wtSDO: in temp3,PinB sbrs temp3,6 jmp wtSDO rcall Send wtnIRQ2:in temp3,PinB ;Warte bis nIRQ von 1 auf 0 wechselt sbrs temp3,3 jmp wtnIRQ2 wtnIRQ3:in temp3,PinB sbrc temp3,3 jmp wtnIRQ3 ldi temp1,0xB8 ldi temp2,0xAA rcall Send ;Sende Dummy wtnIRQ4:in temp3,PinB ;Warte bis nIRQ von 1 auf 0 wechselt sbrs temp3,3 jmp wtnIRQ4 wtnIRQ5:in temp3,PinB sbrc temp3,3 jmp wtnIRQ5 ldi temp1,0x82 ldi temp2,0b00011001 ;...und disable Transmitter rcall Send rcall dl1s ;Warte bis Empfänger bereit ist neues Sync.Wort zu erkennen rcall dl1s jmp loop0 ;-------------Hauptprogramm Ende------------------------- ;____________Senden der Nutzdaten______________________ TxData: nop wtnIRQ: in temp1,Pinb ;Warte bis Modul bereit ist Daten vom uC zu empfangen sbrc temp1,3 ; jmp wtnIRQ ; ldi temp1,0xB8 ;Sendekommando, d.h das nächste Byte wird in das mov temp2,dataTx ;Senderegister geschrieben rcall Send ret ;___________Senden__________________________________________________ Send: cbi portb,4 ;Slave Enable nop nop out spdr,temp1 ;Sende High-Byte busy1: sbis spsr,7 ; jmp busy1 ; in temp1,spdr ;..und empfange evtl. Status-High-Byte out spdr,temp2 ;Sende Low-Byte busy2: sbis spsr,7 ; jmp busy2 ; in temp2,spdr ;..und empfange evtl. Status-Low-Byte nop nop sbi portb,4 ;Daten werden durch nop ; cbi portb,4 ;..Hihgimpuls übernommen ret ;-----------Unterprogramme zur Konfiguration-------------- ; Einstellungen: Ständiges Füllen des FIFO ;___________Konfiguration des RFM12-Moduls________________ cfRF12: ; [Name] [Header] ;1 Configuration Setting (80h) ldi temp1,0x80 ldi temp2,0b11010111 ;b0-b3(X): Kapazitäten am Quartz: rcall Send ; C[pF] = 8,5 + X x 0,5 ; ;b4-b5(b): Frequenzband (MHz): ; 00-->315; 01-->433; 10-->868; 11-->915 ;b6(ef): enable FIFO-Mode ;b7(el): enable internes Datenregister (Tx-Mode) ; ;2 Power Management (82h) ldi temp1,0x82 ldi temp2,0b00011001 ;b0(dc): disable Clockoutput rcall Send ;b1(ew): enable Wake-up Timer ;b2(eb): enable Low-Battery Detector ;b3(ex): Fährt den Oszillator hoch ;b4(es): Fährt den Synthesizer hoch ;b5(et): Schaltet den PLL + Ausgangsverstärker ein und beginnt ; mit dem Senden, falls das TX-Register aktiviert ist. ; et=1 --> alle anderen Bits sind für die Sendefunktion ; nicht mehr von Bedeutung (s. DB) ;b6(ebb): Enable Basisbandschaltkreis ;b7(er): Schaltet alle, die für den Empfang notwendigen Baugruppen ; ein ; er=1 --> alle anderen Bits sind für die Empfangsfunktion ; nicht mehr von Bedeutung (s. DB) ;3 Frequency-Setting (Ah) ldi temp1,0xA0 ;b0-b11(F): Tatsächliche Basissendefrequenz(. Errechnet sich aus den ; Parametern, die dem zuvor festgelegten Frequenzband ; entsprechen und aus dem durch F festgelegten Offset. ; Band(MHz) : 315 433 868 915 ; ; C1 : 1 1 2 3 ; ; C2 : 31 43 43 30 ; ; f[MHz]=10 x C1 x (C2 +F/4000) ldi temp2,0x80 ; (aktuell: f=430,32MHz) rcall Send ;4 Data Rate Command (C6) ldi temp1,0xC6 ldi temp2,0x47 ;b0-b6(R): Baudratenteiler (128 Möglichkeiten) rcall Send ; BR[kbps] = 10000 / (29 x [R + 1]) ; R = 10000 / (29 x BR) -1 ;b7(cs): Baudratenteiler (cs=1 --> BR=BR/8) ; ;5 Receiver Control Command (10010b) ldi temp1,0b10010101 ;b0-b2(R): Der Empfänger Setzt ein Bit im Statusregister (RSSI) wenn ldi temp2,0b01100000 ; eine bestimmte Empfangsleistung am Ausgang des Bandpasses rcall Send ; erreicht oder überschritten wurde. ; Mit R wird eingestellt welcher rel. Pegel(RSSIsetth) am ; Eingang des Verstärkers liegen muss: ; RSSIsetth[dbm] = -103 + 6 x R ; ;b3-b4(g): Verstärkungsmaß (aLNA) des Eingangssignalverstärkers ; G:00-->0dB; G:01-->-1dB; G:10-->-14dB; G:11-->-20dB ; (Dient dazu, neben dem Nutzsignal, auch Störsignale mit ; hohem Pegel zu dämpfen) ; ;b5-b7(i): Bandbreite Bandpasses des Empfängers [kHz] ; 001-->400; 010-->340; 011-->270; 100-->200; 101-->134; ; 110-->67; ; (muss an den Frequenzhub des Senders angepasst werden) ; ;b8-b9(d): Geschwindikeit der Erkennung valider, empfangener Daten. ; Je weniger Kriterien gelten müssen, desto schneller wird ; das VDI-Bit gesetzt: ; 00-->Fast; 01-->Medium; 10-->Slow; 11-->VDI immer 1 ; ;b10: Funktion des Pins nINT/VDI: 0--> Interrupteingang ; 1--> I.Ausgang ;6 Data Filter Command (C2h) ??? ldi temp1,0xC2 ldi temp2,0b10101100 ;b0-b2(f): Data Quality Detection. Der eingestellte Wert bestimmt rcall Send ; die Schwelle, ab der ein Signal als Gut empfunden wird. ;b3: 1 ;b4(s): Art der Datenfilterung: ; 0=digitaler Realisierung eines RC-Filters ; 1=analoger RC Filter, es wird ein Kondensator am CFIL-Pin ; benötigt (gegen Masse) ;b5: 1 ;b6(ml): Clockgewinnungsmodus: ; 0=langsam --> - hohe Anforderung an Quartzgenauigkeit ; - häufiger Wechsel des log. Zustandes vorteilhaft ; - 12 bis 16 Bit Präambel ; 1=schnell --> - Quartzgenauigkeit weniger von Bedeutung ; - längere gleichbleibende log. Zustände möglich ; - 6 bis 8 Bit Präambel ; ; Die Erkenntnisse liegen u.a. folgender Formel zu Grunde (s. Data: ; Rate Command): ; slow mode: deltaBR / BR < 1 / (29 x Nbit) ; fast mode: deltaBR / BR < 3 / (29 x Nbit) ; ; Nbit = Max. Anzahl aufeinanderfolgender Nullen oder Einsen ; deltaBR = Differenz zwischen Bitrate Receiver und Transmitter ; ;b7(al): Automatische Wahl des Clockgewinnungsmodus (Sobald Der Baudraten- ; generator einen Takt erkannt hat schaltet er in den langsamen ; Modus) ;7. FIFO and Reset Mode Command (CAh) ldi temp1,0xCA ldi temp2,0b10000001 ;b0(dr): Disable hochempfindlichen Reset Modus. ; dr=0 --> Modul wird rückgesetzt falls die Versorgungs- ; spannung kurzzeitig um min. 200mV einbricht. ; ;b1(ff): Ermöglicht die Füllung des FIFO. Das Bit muss gesetzt werden ; damit Daten in den Puffer gelangen. Nachdem das Paket empfangen ; wurde muss es kurz rückgesetzt werden um die Erkennung des ; Synchronisationswortes neu zu starten. ; ;b2(al): Bedingtes / Unbedingtes Füllen des FIFO: ; al=0 --> FIFO wird erst dann gefüllt wenn das Synchronisations- ; wort "2DD4" empfangen wurde ; al=1 --> FIFO wird ständig gefüllt ; ;b3: 0 ; ;b4-b7(F): F = Bei dieser Anzahl von empfangenen Bits im FIFO wird ; das FFIT-Bit im Statusregister gesetzt und damit der ; nIRQ-Pin auf low gesetzt. ;9 Automatic Frequency Control, AFC (C4) ldi temp1,0xC4 ;b0: Enable Berechnung der Offsetfrequenz durch die AFC-Schaltung ldi temp2,0b10000011 ;b1: Enable Frequenzoffsetregister. Ermöglicht die Addition des rcall Send ; Registers zum Frequenzkontrollwort des PLL ;b2: Enable hochgenaue Berechnung durch AFC-Schaltung ; Reduzierung der Unsicherheit auf die Hälfte aber längere ; Berechnugszeit. ;b3: (lesen) 0->1: Die aktuell berechnete Frequenzabweichung wurde ; im Offsetregister des AFC-Blocks gespeichert ;b4-b5: ??? ;b6-b7: Festlegung ob und wann die Berechnung durch AFC erfolgen soll ;10 Tx Configuration Control Command (1001100b) ldi temp1,0b10011000 ;b0-b2(P): Relative Sendeleistung, bezogen auf Maximalleistung ldi temp2,0b01110000 ; P[dBm] = Pmax[dBm] - 3 x P rcall Send ; (--> max. Leistung wenn P=000) ;b3: 0 ;b4-b7(M): Betrag der Abweichung |deltaf| der Trägerfrequenz ; von der Trägerbasisfrequenz bei 0- bzw. 1-Signal am ; Eingang des Modulators ; |deltaf| = (M+1) x 15kHz ;b8(mp): Modulationspolarität ; mp=1 & Datenbit=1 --> Trägerf = Trägerbasisf - |deltaf| ; mp=0 & Datenbit=1 --> Trägerf = Trägerbasisf + |deltaf| ; ;12 Wake-up Timer Command (111b) ldi temp1,0xE0 ;b0-b7(M) b8-b12(R): Periodendauer des Wake-up-Timers ldi temp2,0x00 ; T = (M*2^R)ms rcall Send ;13 Low Duty-Cycle (Einschaltdauer) Command (C8) ldi temp1,0xC8 ldi temp2,0x00 ;b0: enable Low-Duty-Cycle-Mode rcall Send ;b1-b7(D): D.C = (D*2+1)/(M*100%) ;14 Low Battery Detector and Clockoutput ldi temp1,0xC0 ldi temp2,0b11111111 ;b0-b4(B): U=(2,2 + 0,1 x B)V --> löst Interrupt aus falls diese rcall Send ;..Schwelle unterschritten wird (muss im Power-Management aktiviert ;..sein [Brownoutdetection]) ret ;b5-b7: fout (1MHz-10MHz, muss im Power-Management aktiviert sein) ;________SPI Control Register - SPCR - konfigurieren______________ ; Bit gesetzt / Bit nicht gesetzt Setmaster: ldi r16,0b01010001 out spcr,r16 ret ; cbi spcr,7 ;Interrupt / Kein Interrupt bei Ende der Übertragung ; sbi spcr,6 ;enable / disable SPI ; cbi spcr,5 ;Send LSB / MSB at first ; sbi spcr,4 ;Set as Master / Slave (wird rückgesetzt wenn //SS als Eingang und Low) ; cbi spcr,3 ;Clock High / Low when idle (Muss bei Master und ; cbi spcr,2 ;s. Datenblatt S. 168 Slave gleich sein) ; sbi spcr,1 ;Clockteiler : 00->4(2) 01->16(8) 10->64(32) 11->128(64) ; sbi spcr,0 ; Achtung: - Clockteiler gilt für SPSR.0 = Low ;ret ; Der Wert in Klammern gilt für SPSR.0 = High ; - Im Slavemode muss Der Takt min. um 4 geteilt werden ! ;____________Port konfigurieren__________________________________ Pconfig:ldi r16,0xb0 out ddrb,r16 ldi r16,0xff out ddrc,r16 ret ;sbi ddrb,7 ;Set Pin as Clock output ;sbi ddrb,5 ;Set Pin as Master output ;sbi ddrb,4 ;SS als Slave-Select-Output ;cbi ddrb,3 ;Eingang zur Erkennung, dass Slave bereit ist zu senden ;ret ;_______________1s-delay_________________________ dl1s: ldi preload0,10 ; tdelay = [preload0] x [100ms-delay] dl1s_: rcall dl100ms ; (tdelay ist tats. etwas größer wegen Aufruf dec preload0 ; .. des 100ms-delay) brne dl1s_ ret ;_______________100ms-delay_______________________ dl100ms: ldi preload1,200 ; tdelay = [preload1] x [500us-delay] {preloadwert min 1 !!!} dl100ms_: rcall dl500us ; (tdelay ist tats. etwas größer wegen Aufruf dec preload1 ; .. des 500us-delay) brne dl100ms_ ret ;_______________500us-delay________________________ dl500us: ldi preload2, (XTAL*500/3)/1000000 ;[Taktfrequenz] x [delay in us] / 3x10^6 dl500us_: dec preload2 brne dl500us_ ret xxxxxxxxxxxxxxxxxxxxxxxxxxxxE M P F Ä N G E Rxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx .include "m32def.inc" .org 0x0000 .def temp1 = r16 .def temp2 = r17 .def preload1 = r18 .def preload2 = r19 .def dataTx = r20 .def temp3 = r21 .equ XTAL = 1000000 ; Zu Beachten: - Beim Wechsel zwischen Senden und Empfangen 450us warten ; - Empfangen und Senden 350us warten ; Stackpointer initialisieren (SP wird bei jedem Push / Call Befehl erniedrigt) ldi temp1, $5F ;LOW-Byte der obersten RAM-Adresse out SPL, temp1 ldi temp1, $08 ; HIGH-Byte der obersten RAM-Adresse out SPH, temp1 ; --------------Beginn Hauptprogramm------------------ main: nop rcall Pconfig ;Port-config rcall Setmaster ;SPI-config sbi portb,4 ;disable SPI von RFM12 rcall dl100ms ;Warte bis RFM12 empfangsbereit rcall cfRF12 ;RFM12-config als Empfänger loop0: ldi temp1,0xCA ;Enable FIFO-Fill without sync.Pattern ldi temp2,0b10000001 ; rcall Send ldi temp1,0xCA ;Enable FIFO-Fill without sync.Pattern ldi temp2,0b10000111 ; rcall Send ldi temp1,0xB0 ldi temp2,0x00 wtnIRQ: in temp3,PinB sbrc temp3,3 jmp wtnIRQ cbi portb,4 ;Slave Enable nop nop out spdr,temp1 ;Sende High-Byte busy01: sbis spsr,7 ; jmp busy01 ; in temp1,spdr ; out spdr,temp2 ;Sende Low-Byte busy02: sbis spsr,7 ; jmp busy02 ; in temp3,spdr ;..und empfange Daten sbi portb,4 ldi temp1,0xCA ;Disable FIFO-Fill without sync.Pattern ldi temp2,0b10000101 ;--> FIFO Reset rcall Send out PortC,temp3 jmp loop0 ;-------------Hauptprogramm Ende------------------------- ;___________Senden__________________________________________________ Send: cbi portb,4 ;Slave Enable nop nop out spdr,temp1 ;Sende High-Byte busy1: sbis spsr,7 ; jmp busy1 ; in temp1,spdr ;..und empfange evtl. Status-High-Byte out spdr,temp2 ;Sende Low-Byte busy2: sbis spsr,7 ; jmp busy2 ; in temp2,spdr ;..und empfange evtl. Status-Low-Byte nop nop sbi portb,4 ;Daten werden durch nop ; nop ; cbi portb,4 ;..Hihgimpuls übernommen ret ;-----------Unterprogramme zur Konfiguration-------------- ;___________Konfiguration des RFM12-Moduls________________ cfRF12: ; [Name] [Header] ;1 Configuration Setting (80h) ldi temp1,0x80 ldi temp2,0b11010111 ;b0-b3(X): Kapazitäten am Quartz: rcall Send ; C[pF] = 8,5 + X x 0,5 ; ;b4-b5(b): Frequenzband (MHz): ; 00-->315; 01-->433; 10-->868; 11-->915 ;b6(ef): enable FIFO-Mode ;b7(el): enable internes Datenregister (Tx-Mode) ; ;2 Power Management (82h) ldi temp1,0x82 ldi temp2,0b11011001 ;b0(dc): disable Clockoutput rcall Send ;b1(ew): enable Wake-up Timer ;b2(eb): enable Low-Battery Detector ;b3(ex): Fährt den Oszillator hoch ;b4(es): Fährt den Synthesizer hoch ;b5(et): Schaltet den PLL + Ausgangsverstärker ein und beginnt ; mit dem Senden, falls das TX-Register aktiviert ist. ; et=1 --> alle anderen Bits sind für die Sendefunktion ; nicht mehr von Bedeutung (s. DB) ;b6(ebb): Enable Basisbandschaltkreis ;b7(er): Schaltet alle, die für den Empfang notwendigen Baugruppen ; ein ; er=1 --> alle anderen Bits sind für die Empfangsfunktion ; nicht mehr von Bedeutung (s. DB) ;3 Frequency-Setting (Ah) ldi temp1,0xA0 ;b0-b11(F): Tatsächliche Basissendefrequenz(. Errechnet sich aus den ; Parametern, die dem zuvor festgelegten Frequenzband ; entsprechen und aus dem durch F festgelegten Offset. ; Band(MHz) : 315 433 868 915 ; ; C1 : 1 1 2 3 ; ; C2 : 31 43 43 30 ; ; f[MHz]=10 x C1 x (C2 +F/4000) ldi temp2,0x80 ; (aktuell: f=430,32MHz) rcall Send ;4 Data Rate Command (C6) ldi temp1,0xC6 ldi temp2,0x47 ;b0-b6(R): Baudratenteiler (128 Möglichkeiten) rcall Send ; BR[kbps] = 10000 / (29 x [R + 1]) ; R = 10000 / (29 x BR) -1 ;b7(cs): Baudratenteiler (cs=1 --> BR=BR/8) ; ;5 Receiver Control Command (10010b) ldi temp1,0b10010101 ;b0-b2(R): Der Empfänger Setzt ein Bit im Statusregister (RSSI) wenn ldi temp2,0b01110011 ; eine bestimmte Empfangsleistung am Ausgang des Bandpasses rcall Send ; erreicht oder überschritten wurde. ; Mit R wird eingestellt welcher rel. Pegel(RSSIsetth) am ; Eingang des Verstärkers liegen muss: ; RSSIsetth[dbm] = -103 + 6 x R ; ;b3-b4(g): Verstärkungsmaß (aLNA) des Eingangssignalverstärkers ; G:00-->0dB; G:01-->-1dB; G:10-->-14dB; G:11-->-20dB ; (Dient dazu, neben dem Nutzsignal, auch Störsignale mit ; hohem Pegel zu dämpfen) ; ;b5-b7(i): Bandbreite Bandpasses des Empfängers [kHz] ; 001-->400; 010-->340; 011-->270; 100-->200; 101-->134; ; 110-->67; ; (muss an den Frequenzhub des Senders angepasst werden) ; ;b8-b9(d): Geschwindikeit der Erkennung valider, empfangener Daten. ; Je weniger Kriterien gelten müssen, desto schneller wird ; das VDI-Bit gesetzt: ; 00-->Fast; 01-->Medium; 10-->Slow; 11-->VDI immer 1 ; ;b10: Funktion des Pins nINT/VDI: 0--> Interrupteingang ; 1--> I.Ausgang ;6 Data Filter Command (C2h) ??? ldi temp1,0xC2 ldi temp2,0b10101100 ;b0-b2(f): Data Quality Detection. Der eingestellte Wert bestimmt rcall Send ; die Schwelle, ab der ein Signal als Gut empfunden wird. ;b3: 1 ;b4(s): Art der Datenfilterung: ; 0=digitaler Realisierung eines RC-Filters ; 1=analoger RC Filter, es wird ein Kondensator am CFIL-Pin ; benötigt (gegen Masse) ;b5: 1 ;b6(ml): Clockgewinnungsmodus: ; 0=langsam --> - hohe Anforderung an Quartzgenauigkeit ; - häufiger Wechsel des log. Zustandes vorteilhaft ; - 12 bis 16 Bit Präambel ; 1=schnell --> - Quartzgenauigkeit weniger von Bedeutung ; - längere gleichbleibende log. Zustände möglich ; - 6 bis 8 Bit Präambel ; ; Die Erkenntnisse liegen u.a. folgender Formel zu Grunde (s. Data: ; Rate Command): ; slow mode: deltaBR / BR < 1 / (29 x Nbit) ; fast mode: deltaBR / BR < 3 / (29 x Nbit) ; ; Nbit = Max. Anzahl aufeinanderfolgender Nullen oder Einsen ; deltaBR = Differenz zwischen Bitrate Receiver und Transmitter ; ;b7(al): Automatische Wahl des Clockgewinnungsmodus (Sobald Der Baudraten- ; generator einen Takt erkannt hat schaltet er in den langsamen ; Modus) ;7. FIFO and Reset Mode Command (CAh) ldi temp1,0xCA ldi temp2,0b10000101 ;b0(dr): Disable hochempfindlichen Reset Modus. ; dr=0 --> Modul wird rückgesetzt falls die Versorgungs- ; spannung kurzzeitig um min. 200mV einbricht. ; ;b1(ff): Ermöglicht die Füllung des FIFO. Das Bit muss gesetzt werden ; damit Daten in den Puffer gelangen. Nachdem das Paket empfangen ; wurde muss es kurz rückgesetzt werden um die Erkennung des ; Synchronisationswortes neu zu starten. ; ;b2(al): Bedingtes / Unbedingtes Füllen des FIFO: ; al=0 --> FIFO wird erst dann gefüllt wenn das Synchronisations- ; wort "2DD4" empfangen wurde ; al=1 --> FIFO wird ständig gefüllt ; ;b3: 0 ; ;b4-b7(F): F = Bei dieser Anzahl von empfangenen Bits im FIFO wird ; das FFIT-Bit im Statusregister gesetzt und damit der ; nIRQ-Pin auf low gesetzt. ;9 Automatic Frequency Control, AFC (C4) ldi temp1,0xC4 ;b0: Enable Berechnung der Offsetfrequenz durch die AFC-Schaltung ldi temp2,0b10000011 ;b1: Enable Frequenzoffsetregister. Ermöglicht die Addition des rcall Send ; Registers zum Frequenzkontrollwort des PLL ;b2: Enable hochgenaue Berechnung durch AFC-Schaltung ; Reduzierung der Unsicherheit auf die Hälfte aber längere ; Berechnugszeit. ;b3: (lesen) 0->1: Die aktuell berechnete Frequenzabweichung wurde ; im Offsetregister des AFC-Blocks gespeichert ;b4-b5: ??? ;b6-b7: Festlegung ob und wann die Berechnung durch AFC erfolgen soll ;10 Tx Configuration Control Command (1001100b) ldi temp1,0b10011000 ;b0-b2(P): Relative Sendeleistung, bezogen auf Maximalleistung ldi temp2,0b01110000 ; P[dBm] = Pmax[dBm] - 3 x P rcall Send ; (--> max. Leistung wenn P=000) ;b3: 0 ;b4-b7(M): Betrag der Abweichung |deltaf| der Trägerfrequenz ; von der Trägerbasisfrequenz bei 0- bzw. 1-Signal am ; Eingang des Modulators ; |deltaf| = (M+1) x 15kHz ;b8(mp): Modulationspolarität ; mp=1 & Datenbit=1 --> Trägerf = Trägerbasisf - |deltaf| ; mp=0 & Datenbit=1 --> Trägerf = Trägerbasisf + |deltaf| ; ;12 Wake-up Timer Command (111b) ldi temp1,0xE0 ;b0-b7(M) b8-b12(R): Periodendauer des Wake-up-Timers ldi temp2,0x00 ; T = (M*2^R)ms rcall Send ;13 Low Duty-Cycle (Einschaltdauer) Command (C8) ldi temp1,0xC8 ldi temp2,0x00 ;b0: enable Low-Duty-Cycle-Mode rcall Send ;b1-b7(D): D.C = (D*2+1)/(M*100%) ;14 Low Battery Detector and Clockoutput ldi temp1,0xC0 ldi temp2,0b11111111 ;b0-b4(B): U=(2,2 + 0,1 x B)V --> löst Interrupt aus falls diese rcall Send ;..Schwelle unterschritten wird (muss im Power-Management aktiviert ;..sein [Brownoutdetection]) ret ;b5-b7: fout (1MHz-10MHz, muss im Power-Management aktiviert sein) ;________SPI Control Register - SPCR - konfigurieren______________ ; Bit gesetzt / Bit nicht gesetzt Setmaster: ldi r16,0b01010001 out spcr,r16 ret ; cbi spcr,7 ;Interrupt / Kein Interrupt bei Ende der Übertragung ; sbi spcr,6 ;enable / disable SPI ; cbi spcr,5 ;Send LSB / MSB at first ; sbi spcr,4 ;Set as Master / Slave (wird rückgesetzt wenn //SS als Eingang und Low) ; cbi spcr,3 ;Clock High / Low when idle (Muss bei Master und ; cbi spcr,2 ;s. Datenblatt S. 168 Slave gleich sein) ; sbi spcr,1 ;Clockteiler : 00->4(2) 01->16(8) 10->64(32) 11->128(64) ; sbi spcr,0 ; Achtung: - Clockteiler gilt für SPSR.0 = Low ;ret ; Der Wert in Klammern gilt für SPSR.0 = High ; - Im Slavemode muss Der Takt min. um 4 geteilt werden ! ;____________Port konfigurieren__________________________________ Pconfig:ldi r16,0xb0 out ddrb,r16 ;Port für Kommunikation mit RFM12 konfigurieren ldi r16,0xff out ddrc,r16 ;Ports für Ausgabe des Daten out ddra,r16 ;..bzw Statuswortes konfigurieren ret ;sbi ddrb,7 ;Set Pin as Clock output ;sbi ddrb,5 ;Set Pin as Master output ;sbi ddrb,4 ;SS als Slave-Select-Output ;cbi ddrb,3 ;Eingang zur Erkennung, dass Slave bereit ist zu senden ;ret ;_______________100ms-delay_______________________ dl100ms: ldi preload1,200 ; tdelay = [preload1] x 500us preloadwert min 1 !!! dl100ms_: rcall dl500us ; (Tatsächliche Zeit um ca 1,5% länger wegen Aufruf dec preload1 ; .. des 500us-delay) brne dl100ms_ ret ;_______________500us-delay________________________ dl500us: ldi preload2, (XTAL*500/3)/1000000 ;[Taktfrequenz] x [delay in us] / 3x10^6 dl500us_: dec preload2 brne dl500us_ ret