;************************ RFM01 Sende-Routinen ***************************** ;**************************** RFM01 Read Status **************************** ; Sub: Liest Status ein ; Parameter: - ; Return: Z Status ; Scratch-Reg: Z, TEMP_0, TEMP_1 ;*************************************************************************** rfm01_read_status: clr ZH clr ZL cbi RFM01_PORT,RFM01_CS ; RFM01 aktiv cbi RFM01_PORT,RFM01_SDI ; Daten auf L Read Command nop sbi RFM01_PORT,RFM01_SCK ; Clcok auf H nop clc sbic RFM01_PIN,RFM01_SDO ; Bit lesen sec lsl ZL rol ZH nop cbi RFM01_PORT,RFM01_SCK ; Clock wieder L ldi TEMP_1,15 ; Anzahl Bits rfm01_read_status_loop: nop nop sbi RFM01_PORT,RFM01_SCK ; Clcok auf H nop clc sbic RFM01_PIN,RFM01_SDO ; Bit lesen sec rol ZL rol ZH nop cbi RFM01_PORT,RFM01_SCK ; Clock wieder L dec TEMP_1 brne rfm01_read_status_loop sbi RFM01_PORT,RFM01_CS ; CS wieder H ret ;***************************** RFM01 Send CMD ****************************** ; Sub: Sendet 16Bit Kommando aus Z ; Parameter: Z Kommando ; Return: - ; Scratch-Reg: Z, TEMP_0, TEMP_1 ;*************************************************************************** // nFFS: 1-10k Pullup an Vcc !!! rfm01_send_cmd: cbi RFM01_PORT,RFM01_CS ; RFM01 aktiv ldi TEMP_1,16 ; Anzahl Bits rfm01_send_cmd_loop: lsl ZL ; oberstes Bit in Carry schieben rol ZH cbi RFM01_PORT,RFM01_SDI ; Daten auf L brcc rfm01_send_cmd_loop_ok ; ist L sbi RFM01_PORT,RFM01_SDI ; nein, also auf H rfm01_send_cmd_loop_ok: nop sbi RFM01_PORT,RFM01_SCK ; Clcok auf H nop nop nop cbi RFM01_PORT,RFM01_SCK ; Clock wieder L dec TEMP_1 brne rfm01_send_cmd_loop sbi RFM01_PORT,RFM01_CS ; CS wieder H ret ;***************************** RFM01 Init ********************************** ; Sub: Initialisiert den RFM02 ; Parameter: - ; Return: - ; Scratch-Reg: Z, TEMP_0, TEMP_1 ;*************************************************************************** rfm01_init: load_p Z,0x0000 ; Read Config rcall rfm01_send_cmd load_p Z,0x898A ; Config 433MHz, Batterie-Detektor aus, WakeUp-Timer aus, Oszi in Sleep aus rcall rfm01_send_cmd ; 10pF Last Quarz, Clock Output aus load_p Z,0xA4D8 ; Frequenz: (f0 - 430) * 400 -> 433,1MHz -> 3,1 * 400 = 1240 -> 0x4D8 rcall rfm01_send_cmd load_p Z,0xC847 ; Baudrate 4800 Baud: 10000000/29 = 344728 / Baudrate = 72 -1 = 71 -> 0x47 rcall rfm01_send_cmd load_p Z,0xC69B ; AFC: +15kHz/-16kHz, Store in Output-Register, Output-Register ein, AFC ein rcall rfm01_send_cmd load_p Z,0xC42A ; Data Filter (digital, Thresold 2) rcall rfm01_send_cmd load_p Z,0xC080 rcall rfm01_send_cmd load_p Z,0xCE88 ; 0xCE FIFO mode: 8 Bit, VDI und SyncWord rcall rfm01_send_cmd load_p Z,0xCE8B ; 0xCE FIFO mode: 8 Bit, VDI und SyncWord rcall rfm01_send_cmd load_p Z,0xC081 rcall rfm01_send_cmd ret ;************************** RFM01 Empfang Daten **************************** ; Sub: Liest Daten vom RFM01 ; Parameter: - ; Return: - ; Scratch-Reg: Z, TEMP_0, TEMP_1 ;*************************************************************************** rfm01_read_daten: load_p Y,DATA_BUF ldi TEMP_2,PAKET_LEN ; Anzahl merken load_p Z,0xCE8B ; enable FIFO rcall rfm01_send_cmd cbi RFM01_PORT,RFM01_SDI ; Daten auf L rfm01_read_daten_loop: ; warten auf Daten im FIFO cbi RFM01_PORT,RFM01_CS ; RFM01 aktiv rfm01_read_daten_loop_wait: sbis RFM01_PIN,RFM01_SDO rjmp rfm01_read_daten_loop_wait sbi RFM01_PORT,RFM01_SCK ; Takt als Quittung nop cbi RFM01_PORT,RFM01_SCK ldi TEMP_1,8 ; Anzahl Bits rfm01_read_daten_loop_byte: clc sbic RFM01_PORT,RFM01_SDO sec rol TEMP_0 ; Bit reinschieben sbi RFM01_PORT,RFM01_SCK ; Takt als Quittung nop cbi RFM01_PORT,RFM01_SCK dec TEMP_1 brne rfm01_read_daten_loop_byte sbi RFM01_PORT,RFM01_CS ; RFM inaktiv dec TEMP_2 brne rfm01_read_daten_loop load_p Z,0xCE88 ; 0xCE FIFO mode: 8 Bit, VDI und SyncWord, FIFO aktiv rcall rfm01_send_cmd load_p Z,0xCE8B ; 0xCE FIFO mode: 8 Bit, VDI und SyncWord, FIFO clear rcall rfm01_send_cmd ret