;RFM01-V8.asm ;Stand: 10.01.2010 ;Empfangsroutine für RFM01 ;Hardware: ATTiny2313 und RFM01 ;Autor Andreas Montnacher ;Fusebits: Takt 8 MHz intern, kein Taktvorteiler ;Assembler: GAVRASM, http://www.avr-asm-tutorial.net/avr_de/index.html .DEVICE ATTiny2313 .def ctrl=R1 ; Puffer für empfangenes Byte .def LedXOR=R2 ; Maske FF für Led ein/aus .def temp=R16 ; Mädchen für alles .def serial=R17 ; für Schiebefunktion Senden/Empfangen .def data=R18 ; zu sendendes Befehlsbyte .def daten=R19 ; empfangenes Byte .def ledflags=R20 ; Zustandsbits der Leds .def ZT1=R21 ; Zeitschleife .def ZT2=R22 ; Zeitschleife .def z1=R23 ; Bytezähler .def ZT3=R24 ; Doppelregisterzähler low .def ZT4=R25 ; Doppelregisterzähler high ;PortB .equ nFFS=3 ; PB3 .equ nSEL=4 ; PB4 .equ SDI=5 ; PB5(MOSI) .equ SDO=6 ; PB6(MISO) .equ SCK=7 ; PB7 ;Konstanten für Torkontaktschalter (Empfangsbytes) .equ TS2A=0x2A ; Tor-2 auf .equ TS2Z=0x2C ; Tor-2 zu .equ TS3A=0x3A ; Tor-3 auf .equ TS3Z=0x3C ; Tor-3 zu .equ c1=65535 ; Anzahl Durchläufe der Schleife ;PortD .equ Tor2A=3 ; PD3 .equ Tor2Z=4 ; PD4 .equ Tor3A=5 ; PD5 .equ Tor3Z=6 ; PD6 .CSEG .ORG 0000 rjmp Reset reti; INT0 reti; INT1 reti; Timer1-Capt reti; Timer1-Comp reti; Timer1-ovf reti; Timer0-ovf reti; USART0,RX reti; USART0,UDRE reti; USART0,TX reti; AnalogCOMP reti; PCINT (PinChange) reti; Timer1-CompB reti; Timer0-CompA reti; Timer0-CompB reti; USI-Start reti; USI-ovf reti; EE-Ready reti; WD-ovf ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Reset: ldi temp,LOW(RAMEND) out SPL,temp rcall AVR_Init rcall Zeitschleife ; 0,3 Sek rcall RFM_Init rcall Zeitschleife ; 0,3 Sek sbi PortB,nFFS ; nFFS auf 1 Main: clr z1 rcall RFM_Receive_Init ; RX-on rcall RFM_Receive ; 1. Byte empfangen inc z1 mov ctrl,daten ; übernahme nach ctrl rcall RFM_Receive ; 2. Byte empfangen cp daten,ctrl ; 1. Vergleich brne main1 inc z1 mov ctrl,daten rcall RFM_Receive cp daten,ctrl ; 2. Vergleich brne main1 inc z1 mov ctrl,daten rcall RFM_Receive cp daten,ctrl ; 3. Vergleich brne main1 inc z1 mov ctrl,daten rcall RFM_Receive cp daten,ctrl ; 4. Vergleich brne main1 inc z1 main1: cbi PortB,nSEL ; Chip select auf 0 ldi data,0xC0 rcall Befehl_send ldi data,0xE8 ; Bit0=0 -> RX-off rcall Befehl_send cbi PortB,nSEL ; Chip select auf 1 cpi z1,5 ; 5x korrekt empfangen? brcs Main ; nein rcall Leds rcall zeitschleife rjmp Main ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RFM_Receive_Init: cbi PortB,nSEL ; Chip select auf 0 ldi data,0xC0 ; Reciever Setting Command -> 0xC0E9 rcall Befehl_send ; C0=Befehl, VDI-Output=Always, LAN-Gain=-6, RSSI=-79, en=1 ldi data,0xE9 rcall Befehl_send ; RX on ldi data,0xCE ; Output and FIFO Mode Command -> 0xCE89 rcall Befehl_send ; CE=Befehl, FIFO-IT Level=8, 16Bit-FIFO Mode ldi data,0x89 rcall Befehl_send ldi data,0xCE ; Output and FIFO Mode Command -> 0xCE8B rcall Befehl_send ; CE=Befehl, FIFO nach dem Empf von Sync füllen ldi data,0x8B ; Bit1 löscht den FIFO rcall Befehl_send ; fe-Bit=1 aktiviert SPI-kompatibel-Mode sbi PortB,nSEL ; Chip select auf 1 ret ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RFM_Receive: cbi PortB,SDI ; SDI=0 cbi PortB,nSEL ; nSEL=0 -> CS enable clr temp nop nop nop wait1: sbis PinB,SDO ; springe wenn SDO=1 rjmp wait1 ; warten bis SDO=1 rr1: sbi PortB,SCK ; Takt high ausgeben nop ; Status-Read Reg. lesen nop nop cbi PortB,SCK ; Takt low ausgeben inc temp cpi temp,16 ; 16 Bits gelesen? brne rr1 rcall FIFO ; Daten aus FIFO holen sbi PortB,nSEL ; nSEL=1 -> CS disable sbi PortB,SDI ; SDI=1 ret ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ FIFO: ; 1 Datenbyte aus FIFO holen clr daten ldi serial,0x80 FIFO1: lsl daten ; 0-Bit einschieben sbi PortB,SCK ; Takt high ausgeben ldi temp,1 ; 1-Bit als Datendummy sbic PinB,SDO ; springe wenn Datenbit(SDO)=0 or daten,temp ; 1-Datenbit in R19 speichern cbi PortB,SCK ; Takt low lsr serial ; 1x rechts schieben (8x insgesamt) brne FIFO1 ret ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Befehl_send: ldi serial,0x80 Befehl_send1: push serial and serial,data cbi PortB,SDI breq Befehl_send2 sbi PortB,SDI Befehl_send2: sbi PortB,SCK nop nop nop cbi PortB,SCK pop serial lsr serial brne Befehl_send1 ret ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RFM_Init: cbi PortB,nSEL ldi data,0x89 ; Configuration Setting Command -> 8988 rcall Befehl_send ldi data,0x88 ; 433 MHZ, ex=1, Quarz-Kondensator ca 12pF rcall Befehl_send ; Basisbandbr 200 KHz, Takt-Ausg disable ldi data,0xA6 ; Frequency Setting Command -> 0xA640 rcall Befehl_send ; A=Befehl, Trägerfrequenz 433,xx MHz setzen ldi data,0x40 rcall Befehl_send ldi data,0xC8 ; Data Rate Command (Baudrate) -> 0xC823 rcall Befehl_send ; 23=9578,54 -> 9600 ldi data,0x23 rcall Befehl_send ldi data,0xC6 ; AFC Command -> 0xC6F7 rcall Befehl_send ; C6=Befehl, AFC aktiviert ldi data,0xF7 rcall Befehl_send ldi data,0xC4 ; Data Filter Command -> 0xC42B rcall Befehl_send ; C4=Befehl, Digital-Filter, DQD=4 ldi data,0x2B rcall Befehl_send ldi data,0xC2 ; Low Battery Detector / Clock-Teiler -> 0xC200 rcall Befehl_send ; C2=Befehl, Takt 1 MHz ldi data,0x00 rcall Befehl_send ldi data,0xE0 ; Wake-Up Timer -> 0xE000 rcall Befehl_send ; deaktiviert ldi data,0x00 rcall Befehl_send ldi data,0xCC ; Low Duty Cycle -> 0xCC00 rcall Befehl_send ; CC=Befehl, deaktiviert ldi data,0x00 rcall Befehl_send ldi data,0xCE ; Output and FIFO Mode Command -> 0xCE88 rcall Befehl_send ; CE=Befehl, FIFO-IT Level=8, 16Bit-FIFO Mode ldi data,0x88 ; Erstinititalisierung rcall Befehl_send sbi PortB,nSEL ret ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ AVR_Init: ldi temp,(1<