.include "m8def.inc" .def temp1 = r16 .def CC1000_tx = r17 .def CC1000_rx = r18 .def USART_tx = r19 .def USART_rx = r20 .def CC1000_Address = r21 .def CC1000_Data = r22 .def i1 = r23 .def temp2 = r24 .equ CC1000_DDR = DDRB .equ CC1000_Port = PortB .equ CC1000_PIN = PINB .equ PDATA = 4 .equ PCLK = 3 .equ PALE = 5 .equ DIO = 1 .equ DCLK = 2 .equ CHP_Out = 6 .equ IO_DDR = DDRC .equ IO_Port = PortC .equ IO_PIN = PINC .equ IO_Wahl = 0 .equ IO_O = 1 .equ IO_I = 2 .equ MAIN = 0x00 .equ FREQ_2A = 0x01 .equ FREQ_1A = 0x02 .equ FREQ_0A = 0x03 .equ FREQ_2B = 0x04 .equ FREQ_1B = 0x05 .equ FREQ_0B = 0x06 .equ FSEP1 = 0x07 .equ FSEP0 = 0x08 .equ CURRENT = 0x09 .equ FRONT_END = 0x0A .equ PA_POW = 0x0B .equ PLL = 0x0C .equ LOCK = 0x0D .equ CAL = 0x0E .equ MODEM2 = 0x0F .equ MODEM1 = 0x10 .equ MODEM0 = 0x11 .equ MATCH = 0x12 .equ FSCTRL = 0x13 .equ FSHAPE7 = 0x14 .equ FSHAPE6 = 0x15 .equ FSHAPE5 = 0x16 .equ FSHAPE4 = 0x17 .equ FSHAPE3 = 0x18 .equ FSHAPE2 = 0x19 .equ FSHAPE1 = 0x1A .equ FSDELAY = 0x1B .equ PRESCALER = 0x1C .equ TEST6 = 0x40 .equ TEST5 = 0x41 .equ TEST4 = 0x42 .equ TEST3 = 0x43 .equ TEST2 = 0x44 .equ TEST1 = 0x45 .equ TEST0 = 0x46 .equ dMAIN = 0x3F .equ dFREQ_2A = 0x75 .equ dFREQ_1A = 0xA0 .equ dFREQ_0A = 0x00 .equ dFREQ_2B = 0x58 .equ dFREQ_1B = 0x33 .equ dFREQ_0B = 0x13 .equ dFSEP1 = 0x01 .equ dFSEP0 = 0xAB .equ dCURRENT = 0x8C .equ dFRONT_END = 0x32 .equ dPA_POW = 0x80 .equ dPLL = 0x40 .equ dLOCK = 0x10 .equ dCAL = 0x26 .equ dMODEM2 = 0x90 .equ dMODEM1 = 0x6F .equ dMODEM0 = 0x27 .equ dMATCH = 0x10 .equ dFSCTRL = 0x01 ;.equ dFSHAPE7 = 0x ;.equ dFSHAPE6 = 0x ;.equ dFSHAPE5 = 0x ;.equ dFSHAPE4 = 0x ;.equ dFSHAPE3 = 0x ;.equ dFSHAPE2 = 0x ;.equ dFSHAPE1 = 0x ;.equ dFSDELAY = 0x .equ dPRESCALER = 0x00 .equ dTEST6 = 0x10 .equ dTEST5 = 0x08 .equ dTEST4 = 0x25 .equ dTEST3 = 0x04 .equ dTEST2 = 0x00 .equ dTEST1 = 0x00 .equ dTEST0 = 0x00 .equ RX_CURRENT = 0xF3 .equ TX_CURRENT = 0x8C .cseg rjmp start ;reset handle reti ;INT0 External Interrupt Request 0 reti ;INT1 External Interrupt Request 1 reti ;TIMER2 COMP Timer/Counter2 Compare Match reti ;TIMER2 OVF Timer/Counter2 Overflow reti ;TIMER1 CAPT Timer/Counter1 Capture Event reti ;TIMER1 COMPA Timer/Counter1 Compare Match A reti ;TIMER1 COMPB Timer/Counter1 Compare Match B reti ;TIMER1 OVF Timer/Counter1 Overflow reti ;TIMER0 OVF Timer/Counter0 Overflow reti ;SPI, STC Serial Transfer Complete rjmp rx_complete ;USART, RXC USART, Rx Complete reti ;USART, UDRE USART Data Register Empty reti ;USART, TXC USART, Tx Complete reti ;ADC ADC Conversion Complete reti ;EE_RDY EEPROM Ready reti ;ANA_COMP Analog Comparator reti ;TWI Two-wire Serial Interface reti ;SPM_RDY Store Program Memory Ready start: ldi temp1,LOW(RAMEND) ;LOW-Byte der obersten RAM-Adresse out SPL,temp1 ldi temp1,HIGH(RAMEND) ;HIGH-Byte der obersten RAM-Adresse out SPH,temp1 ;USART einstellen ldi temp1,0b00000000 ;Baudrate ... out UBRRH, temp1 ldi temp1,8000000/(38400*16)-1 ;Baudrate einstellen out UBRRL, temp1 ;...einstellen (9600 @ 8MHz) sbi UCSRB,TXEN ;TX aktivieren sbi UCSRB,RXEN ;RX aktivieren sbi UCSRB,RXCIE ;RX-Complete aktivieren sei ;Interrups einschalten ;Port-Einstellungen sbi CC1000_DDR,PDATA sbi CC1000_DDR,PCLK sbi CC1000_DDR,PALE cbi CC1000_DDR,DCLK cbi CC1000_DDR,DIO sbi CC1000_Port,PCLK sbi CC1000_Port,PALE sbi CC1000_Port,DCLK sbi CC1000_Port,DIO cbi IO_DDR,IO_Wahl ;Wahl-Schalter, ob Input oder Output sbi IO_Port,IO_Wahl ;internen PullUp an sbi IO_DDR,IO_O ;LED für Output cbi IO_Port,IO_O sbi IO_DDR,IO_I ;LED für Input cbi IO_Port,IO_I rjmp MainLoop reti rx_complete: in temp1,UDR ;read value mov USART_tx,temp1 rcall serout ;Unterprogramm aufrufen reti serout: sbis UCSRA,UDRE ;Warten, bis UDR für das nächste Byte bereit ist rjmp serout out UDR, USART_tx ret ;zurück zum Hauptprogramm Wait_500ms: ; ============================= ; Warteschleifen-Generator ; 4000000 Zyklen: ; ----------------------------- ; warte 3999996 Zyklen: ldi R29, $24 WGLOOP0: ldi R30, $BC WGLOOP1: ldi R31, $C4 WGLOOP2: dec R31 brne WGLOOP2 dec R30 brne WGLOOP1 dec R29 brne WGLOOP0 ; ----------------------------- ; warte 3 Zyklen: ldi R29, $01 WGLOOP3: dec R29 brne WGLOOP3 ; ----------------------------- ; warte 1 Zyklus: nop ; ============================= ret Wait_150us: ; ============================= ; Warteschleifen-Generator ; 1200 Zyklen: ; ----------------------------- ; warte 1197 Zyklen: ldi R29, $03 WGLOOP10: ldi R30, $84 WGLOOP11: dec R30 brne WGLOOP11 dec R29 brne WGLOOP10 ; ----------------------------- ; warte 3 Zyklen: ldi R29, $01 WGLOOP12: dec R29 brne WGLOOP12 ; ============================= ret Wait_5ms: ; ============================= ; Warteschleifen-Generator ; 40000 Zyklen: ; ----------------------------- ; warte 39999 Zyklen: ldi R29, $43 WGLOOP20: ldi R30, $C6 WGLOOP21: dec R30 brne WGLOOP21 dec R29 brne WGLOOP20 ; ----------------------------- ; warte 1 Zyklus: nop ; ============================= ret WriteToCC1000_Register: cbi CC1000_Port,PALE ;Adress-Bits senden ldi i1,0 lsl CC1000_Address ;7. Bit fällt weg, nur 7 Bits übertragen! WTC_Address_Loop: lsl CC1000_Address cbi CC1000_Port,PDATA brcc WTC_R_Data_gleich_null sbi CC1000_Port,PDATA WTC_R_Data_gleich_null: cbi CC1000_Port,PCLK nop sbi CC1000_Port,PCLK inc i1 cpi i1,7 brne WTC_Address_Loop sbi CC1000_Port,PDATA cbi CC1000_Port,PCLK nop sbi CC1000_Port,PCLK nop sbi CC1000_Port,PALE ;Daten-Byte senden ldi i1,0 WTC_Data_Loop: lsl CC1000_Data cbi CC1000_Port,PDATA brcc WTC_D_Data_gleich_null sbi CC1000_Port,PDATA WTC_D_Data_gleich_null: cbi CC1000_Port,PCLK nop sbi CC1000_Port,PCLK inc i1 cpi i1,8 brne WTC_Data_Loop sbi CC1000_Port,PCLK ret ReadFromCC1000_Register: cbi CC1000_Port,PALE ;Adress-Bits senden ldi i1,0 lsl CC1000_Address ;7. Bit fällt weg, nur 7 Bits übertragen! RFC_Address_Loop: lsl CC1000_Address cbi CC1000_Port,PDATA brcc RFC_R_Data_gleich_null sbi CC1000_Port,PDATA RFC_R_Data_gleich_null: cbi CC1000_Port,PCLK nop sbi CC1000_Port,PCLK inc i1 cpi i1,7 brne RFC_Address_Loop cbi CC1000_Port,PDATA cbi CC1000_Port,PCLK nop sbi CC1000_Port,PCLK nop sbi CC1000_Port,PALE ;PDATA als Input ;sbi CC1000_Port,PDATA cbi CC1000_DDR,PDATA ;sbi CC1000_Port,PDATA ;Daten-Byte empfangen ldi i1,0 ldi temp2,0 ;ori temp2,PDATA ldi temp2,0b00010000 RFC_Data_Loop: cbi CC1000_Port,PCLK nop clc ;Carry-Flag clear in temp1,CC1000_PIN ; mov USART_tx,temp1 ; rcall serout and temp1,temp2 cpi temp1,0 breq RFC_D_Data_gleich_null sec ;Carry-Flag set RFC_D_Data_gleich_null: rol CC1000_Data ;Carry-Flag von re. nach li. einschieben sbi CC1000_Port,PCLK inc i1 cpi i1,8 brne RFC_Data_Loop ;PDATA wieder als Output sbi CC1000_DDR,PDATA ret SetupCC1000All: ldi CC1000_Address,MAIN ldi CC1000_Data,dMAIN rcall WriteToCC1000_Register ldi CC1000_Address,FREQ_2A ldi CC1000_Data,dFREQ_2A rcall WriteToCC1000_Register ldi CC1000_Address,FREQ_1A ldi CC1000_Data,dFREQ_1A rcall WriteToCC1000_Register ldi CC1000_Address,FREQ_0A ldi CC1000_Data,dFREQ_0A rcall WriteToCC1000_Register ldi CC1000_Address,FREQ_2B ldi CC1000_Data,dFREQ_2B rcall WriteToCC1000_Register ldi CC1000_Address,FREQ_1B ldi CC1000_Data,dFREQ_1B rcall WriteToCC1000_Register ldi CC1000_Address,FREQ_0B ldi CC1000_Data,dFREQ_0B rcall WriteToCC1000_Register ldi CC1000_Address,FSEP1 ldi CC1000_Data,dFSEP1 rcall WriteToCC1000_Register ldi CC1000_Address,FSEP0 ldi CC1000_Data,dFSEP0 rcall WriteToCC1000_Register ldi CC1000_Address,CURRENT ldi CC1000_Data,dCURRENT rcall WriteToCC1000_Register ldi CC1000_Address,FRONT_END ldi CC1000_Data,dFRONT_END rcall WriteToCC1000_Register ldi CC1000_Address,PA_POW ldi CC1000_Data,dPA_POW rcall WriteToCC1000_Register ldi CC1000_Address,PLL ldi CC1000_Data,dPLL rcall WriteToCC1000_Register ldi CC1000_Address,LOCK ldi CC1000_Data,dLOCK rcall WriteToCC1000_Register ldi CC1000_Address,CAL ldi CC1000_Data,dCAL rcall WriteToCC1000_Register ldi CC1000_Address,MODEM2 ldi CC1000_Data,dMODEM2 rcall WriteToCC1000_Register ldi CC1000_Address,MODEM1 ldi CC1000_Data,dMODEM1 rcall WriteToCC1000_Register ldi CC1000_Address,MODEM0 ldi CC1000_Data,dMODEM0 rcall WriteToCC1000_Register ldi CC1000_Address,MATCH ldi CC1000_Data,dMATCH rcall WriteToCC1000_Register ldi CC1000_Address,FSCTRL ldi CC1000_Data,dFSCTRL rcall WriteToCC1000_Register ;ldi CC1000_Address,FSHAPE7 ;ldi CC1000_Data,dFSHAPE7 ;rcall WriteToCC1000_Register ;ldi CC1000_Address,FSHAPE6 ;ldi CC1000_Data,dFSHAPE6 ;rcall WriteToCC1000_Register ;ldi CC1000_Address,FSHAPE5 ;ldi CC1000_Data,dFSHAPE5 ;rcall WriteToCC1000_Register ;ldi CC1000_Address,FSHAPE4 ;ldi CC1000_Data,dFSHAPE4 ;rcall WriteToCC1000_Register ;ldi CC1000_Address,FSHAPE3 ;ldi CC1000_Data,dFSHAPE3 ;rcall WriteToCC1000_Register ;ldi CC1000_Address,FSHAPE2 ;ldi CC1000_Data,dFSHAPE2 ;rcall WriteToCC1000_Register ;ldi CC1000_Address,FSHAPE1 ;ldi CC1000_Data,dFSHAPE1 ;rcall WriteToCC1000_Register ;ldi CC1000_Address,FSDELAY ;ldi CC1000_Data,dFSDELAY ;rcall WriteToCC1000_Register ldi CC1000_Address,PRESCALER ldi CC1000_Data,dPRESCALER rcall WriteToCC1000_Register ldi CC1000_Address,TEST6 ldi CC1000_Data,dTEST6 rcall WriteToCC1000_Register ldi CC1000_Address,TEST5 ldi CC1000_Data,dTEST5 rcall WriteToCC1000_Register ldi CC1000_Address,TEST4 ldi CC1000_Data,dTEST4 rcall WriteToCC1000_Register ldi CC1000_Address,TEST3 ldi CC1000_Data,dTEST3 rcall WriteToCC1000_Register ldi CC1000_Address,TEST2 ldi CC1000_Data,dTEST2 rcall WriteToCC1000_Register ldi CC1000_Address,TEST1 ldi CC1000_Data,dTEST1 rcall WriteToCC1000_Register ldi CC1000_Address,TEST0 ldi CC1000_Data,dTEST0 rcall WriteToCC1000_Register ret ResetCC1000: ldi CC1000_Address,MAIN rcall ReadFromCC1000_Register cbr CC1000_Data,0 ldi CC1000_Address,MAIN rcall WriteToCC1000_Register nop sbr CC1000_Data,0 ldi CC1000_Address,MAIN rcall WriteToCC1000_Register ret CalibrateCC1000: ldi CC1000_Address,PA_POW rcall ReadFromCC1000_Register mov temp1,CC1000_Data ldi CC1000_Address,PA_POW ldi CC1000_Data,0x00 rcall WriteToCC1000_Register ldi CC1000_Address,CAL ldi CC1000_Data,0xA5 rcall WriteToCC1000_Register Calibrate_CC1000_Wait: ldi CC1000_Address,CAL rcall ReadFromCC1000_Register andi CC1000_Data,0x08 cpi CC1000_Data,0 breq Calibrate_CC1000_Wait ldi CC1000_Address,CAL ldi CC1000_Data,0x25 rcall WriteToCC1000_Register ldi CC1000_Address,PA_POW mov CC1000_Data,temp1 rcall WriteToCC1000_Register ret SetupCC1000RX: ldi CC1000_Address,MAIN ldi CC1000_Data,0x31 rcall WriteToCC1000_Register ldi CC1000_Address,CURRENT ldi CC1000_Data,RX_CURRENT rcall WriteToCC1000_Register rcall Wait_150us ldi CC1000_Address,MAIN ldi CC1000_Data,0x11 rcall WriteToCC1000_Register ret SetupCC1000TX: ldi CC1000_Address,MAIN ldi CC1000_Data,0xF1 rcall WriteToCC1000_Register ldi CC1000_Address,CURRENT ldi CC1000_Data,TX_CURRENT rcall WriteToCC1000_Register rcall Wait_150us ldi CC1000_Address,MAIN ldi CC1000_Data,0xA1 rcall WriteToCC1000_Register ret SetupCC1000PD: ldi CC1000_Address,MAIN ldi CC1000_Data,0x3F rcall WriteToCC1000_Register ret WakeUpCC1000ToRX: ldi CC1000_Address,MAIN ldi CC1000_Data,0x3B rcall WriteToCC1000_Register ldi CC1000_Address,CURRENT ldi CC1000_Data,RX_CURRENT rcall WriteToCC1000_Register rcall Wait_5ms ldi CC1000_Address,MAIN ldi CC1000_Data,0x39 rcall WriteToCC1000_Register rcall Wait_150us rcall Wait_150us ldi CC1000_Address,MAIN ldi CC1000_Data,0x31 rcall WriteToCC1000_Register rcall Wait_150us rcall Wait_150us ret WakeUpCC1000ToTX: ldi CC1000_Address,MAIN ldi CC1000_Data,0xFB rcall WriteToCC1000_Register ldi CC1000_Address,CURRENT ldi CC1000_Data,TX_CURRENT rcall WriteToCC1000_Register rcall Wait_5ms ldi CC1000_Address,MAIN ldi CC1000_Data,0xF9 rcall WriteToCC1000_Register rcall Wait_150us rcall Wait_150us ldi CC1000_Address,MAIN ldi CC1000_Data,0xF1 rcall WriteToCC1000_Register rcall Wait_150us rcall Wait_150us ret Test_Routine: ;Test-Routine ldi CC1000_Address,$10 ldi CC1000_Data,87 rcall WriteToCC1000_Register ldi CC1000_Address,$10 ldi CC1000_Data,65 rcall ReadFromCC1000_Register mov USART_tx,CC1000_Data rcall serout ret Output_Mode: sbi IO_Port,IO_O cbi IO_Port,IO_I sbi CC1000_DDR,DIO cbi CC1000_Port,DIO rcall WakeUpCC1000ToTX rcall SetupCC1000TX ;stop: ; rjmp stop WaitToLow1: sbic CC1000_PIN,2 rjmp WaitToLow1 ;ldi USART_tx,48 ;rcall serout sbi CC1000_Port,DIO WaitToHigh1: sbis CC1000_PIN,2 rjmp WaitToHigh1 ;ldi USART_tx,49 ;rcall serout WaitToLow2: sbic CC1000_PIN,2 rjmp WaitToLow2 cbi CC1000_Port,DIO WaitToHigh2: sbis CC1000_PIN,2 rjmp WaitToHigh2 rjmp WaitToLow1 rjmp Output_Mode Input_Mode: cbi IO_Port,IO_O sbi IO_Port,IO_I cbi CC1000_DDR,DIO cbi CC1000_Port,DIO rcall WakeUpCC1000ToRX rcall SetupCC1000RX WaitToLow3: sbic CC1000_PIN,DCLK rjmp WaitToLow3 WaitToHigh3: sbis CC1000_PIN,DCLK rjmp WaitToHigh3 ldi USART_tx,48 sbic CC1000_PIN,DIO ldi USART_tx,49 rcall serout rjmp WaitToLow3 rjmp Input_Mode MainLoop: rcall SetupCC1000PD rcall ResetCC1000 rcall SetupCC1000All rcall WakeUpCC1000ToRX rcall SetupCC1000RX rcall CalibrateCC1000 rcall SetupCC1000TX rcall CalibrateCC1000 rcall SetupCC1000PD sbis IO_PIN,IO_Wahl rjmp Output_Mode rjmp Input_Mode rjmp MainLoop