;RFM02-V9.asm ;Stand: 10.01.2010 ;Senderoutine für RFM02 ;Hardware: ATTiny2313 und RFM02 ;Autor: Andreas Montnacher ;Fusebits: Takt 8 MHz intern, kein Taktvorteiler ;Assembler: GAVRASM, http://www.avr-asm-tutorial.net/avr_de/index.html .DEVICE ATTiny2313 ;PortB .equ SDI=5 ; PB5(MOSI) .equ nSEL=4 ; PB4 .equ SCK=7 ; PB7 .equ Tor2=0 ; Port PB0 .equ Tor3=1 ; Port PB1 ;PortD .equ irq=2 ; PD2 .equ led2=5 ; PD5 ;Konstanten für Torkontaktschalter .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 ;Register .def toggelled=R2 ; enthält Maske 0010|0000 für Led ein/aus zu schalten .def temp=R16 .def serial=R17 .def data=R18 .def daten=R19 .def Ledpuffer=R20 ; enthält Zustandsbit für Led (PortD Bit5) .def ZT3=R24 ; Doppelregisterzähler low .def ZT4=R25 ; Doppelregisterzähler high .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 AVRinit rcall LedPD5 ; Led2 ein rcall Z5Sek ; 5-Sekunden Zeitschleife rcall RFM_init rcall LedPD5 ; Led2 aus rcall Z5Sek ; 5-Sekunden Zeitschleife Main: sbis PinB,Tor2 ; Schaltkontakt Tor2 zu rjmp m1 ; nein rcall Z32ms ldi daten,TS2Z ; Schaltkontakt zu (2C) senden sbic PinB,Tor2 ; Schaltkontakt Tor2 immer noch zu rjmp m2 ; ja m1: ; Schaltkontakt offen rcall Z32ms ; entprellen, falls Schaltkontakt gerade geöffnet wurde ldi daten,TS2A ; Schaltkontakt auf (2A) senden sbic PinB,Tor2 ; Schaltkontakt Tor2 immer noch auf rjmp Main ; Schaltkontakt wieder testen m2: rcall RFM_send ; senden rcall LedPD5 rcall Z5Sek m3: sbis PinB,Tor3 ; Schaltkontakt Tor3 zu rjmp m4 ; nein rcall Z32ms ldi daten,TS3Z ; Schaltkontakt zu (3C) senden sbic PinB,Tor3 ; Schaltkontakt Tor3 immer noch zu rjmp m5 ; ja m4: ; Schaltkontakt offen rcall Z32ms ; entprellen, falls Schaltkontakt gerade geöffnet wurde ldi daten,TS3A ; Schaltkontakt auf (3A) senden sbic PinB,Tor3 ; Schaltkontakt Tor3 immer noch auf rjmp m3 ; Schaltkontakt wieder testen m5: rcall RFM_send ; senden rcall LedPD5 rcall Z5Sek rjmp Main ;------------------------------------------------------------------------- RFM_send: cbi PortB,nSEL ; Chip select auf 0 ldi data,0xC0 ; TX on, C0E1 (Power Management) rcall Befehlsenden ldi data,0xE1 rcall Befehlsenden ; C0=Befehl, a0=1, a1=1, ex=1, es=0, ea=0, eb=0, et=0, dc=1 sbi PortB,nSEL ; Chip select auf 1 nop nop nop cbi PortB,nSEL ; Chip select auf 0 ldi data,0xC6 ; Data Transmit Command rcall Befehlsenden ldi data,0xAA rcall tx ldi data,0xAA rcall tx ldi data,0xAA rcall tx ldi data,0x2D rcall tx ldi data,0xD4 rcall tx mov data,daten ; zu sendendes Byte kopieren rcall tx ; 5x gleiches Byte senden rcall tx rcall tx rcall tx rcall tx rcall tx ; 1 Dummy-Byte muss gesendet werden send1: sbis PinD,irq ; warte bis Pin NIRQ=1 rjmp send1 nop nop nop cbi PortB,nSEL ; Chip select auf 0 ldi data,0xC0 ; TX off rcall Befehlsenden ldi data,0x00 rcall Befehlsenden sbi PortB,nSEL ; Chip select auf 1 ret ;------------------------------------------------------------------------- tx: ; 1 Datenbyte senden ldi serial,0x80 ; R17 -> Bit 7 maskieren tx1: sbis PinD,irq ; warte bis Pin NIRQ=1 rjmp tx1 tx2: sbic PinD,irq ; warte bis Pin NIRQ=0 rjmp tx2 push serial ; R17 auf Stack and serial,data ; AND R17,R18 cbi PortB,SDI ; setzt PB5 (SDI) auf 0 -> 0-Bit senden breq tx3 ; wenn maskiertes Bit von data=0 dann bleibt es beim 0-Bit sbi PortB,SDI ; sonst 1-Bit senden tx3: pop serial lsr serial ; nächstes Bit maskieren brne tx1 ; nächstes zu sendendes Bit ret ;------------------------------------------------------------------------- AVRinit: ldi temp,(1< Bit 7 maskieren fd1: push serial ; R17 auf Stack and serial,data ; AND R17,R18 cbi PortB,SDI ; setzt PB5 (SDI) auf 0 breq fd2 ; wenn Bit7 von data=0 dann springe zu fd2 sbi PortB,SDI ; sonst Bit7 von data=1 fd2: sbi PortB,SCK ; Takt geht auf high -> SDI wird jetzt übernommen nop ; Zeitverzögerung bei 8 MHz = 12,5 ns nop ; Zeitverzögerung nop cbi PortB,SCK ; Takt geht wieder auf low pop serial ; R17 vom Stack holen lsr serial ; R17 ein Bit nach rechts schieben -> Bit 6 maskieren brne fd1 ; nächstes Bit senden ret ;------------------------------------------------------------------------- RFM_init: cbi PortB,nSEL ; Chip select auf 0 ldi data,0x88 ; Configuration Setting rcall Befehlsenden ldi data,0x82 rcall Befehlsenden ; 433MHz, 1MHz-Out, Mittelwert für Kondensator, ms=0, M=2 = 90KHz Freq-Shift ldi data,0xA6 ; Frequenz Setting rcall Befehlsenden ldi data,0x40 rcall Befehlsenden ; 433MHz Mittenfrequenz fo ldi data,0xC8 ; Data Rate Command rcall Befehlsenden ldi data,0x23 ; 9600 Baud rcall Befehlsenden ldi data,0xD2 ; PLL Setting Command rcall Befehlsenden ldi data,0x40 rcall Befehlsenden ldi data,0xB4 ; RF output power: -12dB relative to maximum rcall Befehlsenden ldi data,0xC2 ; Low-Bat, TX Bit Synchronisation rcall Befehlsenden ldi data,0xA0 ; Wake-Up Timer disabled und threshold-Voltage=0 rcall Befehlsenden sbi PortB,nSEL ; Chip select auf 1 ret ;------------------------------------------------------------------- Z32ms: ; ca 32 ms ldi ZT4,HIGH(c1) ; Lade MSB-Register mit Schleifenwert ldi ZT3,LOW(c1) ; Lade LSB-Register mit Schleifenwert Loop1: sbiw ZT3,1 ; Doppelregisterwert -1 brne Loop1 ret ;------------------------------------------------------------------- LedPD5: ; PortD wird für die Led an PD5 benutzt eor Ledpuffer,toggelled ; XOR-verknüpfen mit 0010|0000 und Ergebnis in Ledpuffer breq l1 ; Led ist eingeschaltet sbi PortD,Led2 ; Bit5 von PortD einschalten, Led an OR ledpuffer,toggelled ; Ledpuffer umschalten brne l2 ; fertig l1: cbi PortD,Led2 ; Bit5 von PortD ausschalten, Led aus ldi ledpuffer,0 ; Ledpuffer löschen l2: ret ;------------------------------------------------------------------- Z5Sek: ; 24-Bit-Zähler hochzählen ldi temp,0 ldi ZT3,0 ldi ZT4,50 ; alle 5 Sek (bei 8 Mhz) br1: inc temp ; 1 Takt brne br1 ; 2 Takte = 3*255 = 765 Takte inc ZT3 ; 1 Takt brne br1 ; 2 Takte = 765+3=768*255=195840 inc ZT4 ; 1 Takt brne br1 ; 2 Takte = 195843*(255-50)=40.147.815 Takte ret ;-------------------------------------------------------------------