LIST P=PIC12F683 INCLUDE P12F683.INC ; CONFIG ; __config 0x3FC4 __CONFIG _FOSC_INTOSCIO & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_OFF & _IESO_OFF & _FCMEN_OFF errorlevel -302 ;Eliminate bank warning ;#define IRQ GPIO,0; <- nRF2401 #define SCK GPIO,1; -> nRF2401 #define MOSI GPIO,2;schreiben -> nRF2401 #define MISO GPIO,3;lesen <- nRF2401 #define CE GPIO,4; -> nRF2401 #define CSN GPIO,5; -> nRF2401 ;***** VARIABLE DEFINITIONS w_temp EQU 0x7F ; variable used for context saving status_temp EQU 0x7E ; variable used for context saving Zaehlvar EQU 0x7D Wert EQU 0x7C Flag1 EQU 0x7B Pos EQU 0x7A ;Wert für Position Ruder 30.09.2018 ; SPI(nRF24L01) commands #define READ_REG 0x00 ;// Define read command to register #define WRITE_REG 0x20 ;// Define write command to register #define RD_RX_PLOAD 0x61 ;// Define RX payload register address #define WR_TX_PLOAD 0xA0 ;// Define TX payload register address #define FLUSH_TX 0xE1 ;// Define flush TX register command #define FLUSH_RX 0xE2 ;// Define flush RX register command #define REUSE_TX_PL 0xE3 ;// Define reuse TX payload register command ;#define NOP 0xFF ;// Define No Operation, might be used to read status register ;********************************************************************************************************************// ; SPI(nRF24L01) registers(addresses) #define CONFIG 0x00 ;// 'Config' register address #define EN_AA 0x01 ;// 'Enable Auto Acknowledgment' register address #define EN_RXADDR 0x02 ;// 'Enabled RX addresses' register address #define SETUP_AW 0x03 ;// 'Setup address width' register address #define SETUP_RETR 0x04 ;// 'Setup Auto. Retrans' register address #define RF_CH 0x05 ;// 'RF channel' register address #define RF_SETUP 0x06 ;// 'RF setup' register address #define nRF_STATUS 0x07 ;// 'Status' register address VERBOTEN #define OBSERVE_TX 0x08 ;// 'Observe TX' register address #define CD 0x09 ;// 'Carrier Detect' register address #define RX_ADDR_P0 0x0A ;// 'RX address pipe0' register address #define RX_ADDR_P1 0x0B ;// 'RX address pipe1' register address #define RX_ADDR_P2 0x0C ;// 'RX address pipe2' register address #define RX_ADDR_P3 0x0D ;// 'RX address pipe3' register address #define RX_ADDR_P4 0x0E ;// 'RX address pipe4' register address #define RX_ADDR_P5 0x0F ;// 'RX address pipe5' register address #define TX_ADDR 0x10 ;// 'TX address' register address #define RX_PW_P0 0x11 ;// 'RX payload width, pipe0' register address #define RX_PW_P1 0x12 ;// 'RX payload width, pipe1' register address #define RX_PW_P2 0x13 ;// 'RX payload width, pipe2' register address #define RX_PW_P3 0x14 ;// 'RX payload width, pipe3' register address #define RX_PW_P4 0x15 ;// 'RX payload width, pipe4' register address #define RX_PW_P5 0x16 ;// 'RX payload width, pipe5' register address #define FIFO_STATUS 0x17 ;// 'FIFO Status Register' register address ORG H'000' GOTO main ORG H'004' RETFIE main: ; This routine sets up the Microcontroller's Inputs and Output banksel OSCCON movlw 0x78 movwf OSCCON banksel ANSEL MOVLW 0x31 ;30.09.2018, A/D Clock <- FRC (500Khz) MOVWF ANSEL ;30.09.2018, GP0 analog banksel CMCON0 movlw B'00000111' movwf CMCON0 ;RA0...RA2 digital IO banksel GPIO movlw 0x20 movwf GPIO ;CSN off = 1 (GP5) 30.09.2018 banksel TRISIO movlw 0x01 movwf TRISIO ;GP0 Eingang 30.09.2018 MOVLW D'20' ;powerup nRF2401 abwarten MOVWF DELAY1 call RETARD0 ;powerup nRF2401 abwarten banksel GPIO bcf CSN ;SPI muss hier irgendeinen befehl vor"Init_RF" call Spi_W_R ;ausführen, sonst crash! bsf CSN call Init_RF_TX MOVLW D'2' ; MOVWF DELAY1 call RETARD0 loop: CALL MEASURE ;GND-> 2kOhm Wid.-> 5k Poti(Justierung)-> 10k Poti(Steuerung)-> VDD banksel GPIO movlw 0xa0 ;load TX-FIFO movwf Wert bcf CSN call Spi_W_R movf Pos,w ;Wert für Position Ruder 30.09.2018 ;movlw 0x44;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX movwf Wert call Spi_W_R bsf CSN bsf CE ; senden auslösen MOVLW D'6' ; c.a. 10 Mikrosek. MOVWF DELAY1 call us4 ; bcf CE MOVLW D'38' ;etwa 20msec. MOVWF DELAY1 call RETARD0 call Clear_Interr; goto loop Init_RF_TX: call Set_TX_Address call Set_Address call En_AA call En_RX_Addr call Set_Channel call Set_Payload_Length call Power_Freq call Config_TX ;16.10.2018 als Sender konfigurieren MOVLW D'1' ;config nRF2401 abwarten MOVWF DELAY1 call RETARD0 ;config nRF2401 abwarten return Set_TX_Address: ; Writes TX_Address to nRF24L01 movlw 0x30 ; WRITE_REG + RX_ADDR_P0 movwf Wert bcf CSN call Spi_W_R ;Die Device-Adresse bsteht aus 5Bytes: movlw 0x23 ;TX_ADDRESS(1.Adr-Byte) movwf Wert call Spi_W_R movlw 0x23 ;TX_ADDRESS(2.Adr-Byte) movwf Wert call Spi_W_R movlw 0x23 ;TX_ADDRESS(3.Adr-Byte) movwf Wert call Spi_W_R movlw 0x23 ;TX_ADDRESS(4.Adr-Byte) movwf Wert call Spi_W_R movlw 0x23 ;TX_ADDRESS(5.Adr-Byte) movwf Wert call Spi_W_R bsf CSN return Set_Address: ;Use the same address on the RX device as the TX device movlw 0x2a ; WRITE_REG + RX_ADDR_P0 movwf Wert bcf CSN call Spi_W_R ;Die Device-Adresse bsteht aus 5Bytes: movlw 0x23 ;TX_ADDRESS(1.Adr-Byte) movwf Wert call Spi_W_R movlw 0x23 ;TX_ADDRESS(2.Adr-Byte) movwf Wert call Spi_W_R movlw 0x23 ;TX_ADDRESS(3.Adr-Byte) movwf Wert call Spi_W_R movlw 0x23 ;TX_ADDRESS(4.Adr-Byte) movwf Wert call Spi_W_R movlw 0x23 ;TX_ADDRESS(5.Adr-Byte) movwf Wert call Spi_W_R bsf CSN return En_AA: ;Enable Auto.Ack:Pipe0 movlw 0x21 ;EN_AA movwf Wert bcf CSN call Spi_W_R movlw 0x01 ;Pipe0 movwf Wert call Spi_W_R bsf CSN return En_RX_Addr: ;Enable Pipe0 movlw 0x22 ;EN_RXADDR movwf Wert bcf CSN call Spi_W_R movlw 0x01 ;Pipe0 movwf Wert call Spi_W_R bsf CSN return Set_Channel: ;Select RF channel 60 movlw 0x25 ;RF_CH movwf Wert bcf CSN call Spi_W_R movlw 0x3C ;channel 60, 29.09.2018 movwf Wert call Spi_W_R bsf CSN return Set_Payload_Length: ;Select same RX payload width as TX Payload movlw 0x31;RX_PW_P0 movwf Wert bcf CSN call Spi_W_R movlw 0x01 ;1byte payload 29.09.2018 movwf Wert call Spi_W_R bsf CSN return Power_Freq: ; TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR movlw 0x26;RF_SETUP movwf Wert bcf CSN call Spi_W_R movlw 0x0f;TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR movwf Wert call Spi_W_R bsf CSN return Config_RX: ;Set PWR_UP bit, enable CRC(2 bytes) & Prim:RX. movlw 0x20; movwf Wert bcf CSN call Spi_W_R movlw 0x0f; Set PWR_UP bit, enable CRC(2 bytes) & Prim:RX. RX_DR enabled.. movwf Wert call Spi_W_R bsf CSN bsf CE return Config_TX: ;Set PWR_UP bit, enable CRC(2 bytes) & Prim:TX. bcf CE movlw 0x20; movwf Wert bcf CSN call Spi_W_R movlw 0x0e; Set PWR_UP bit, enable CRC(2 bytes) & Prim:TX. TX_DR enabled.. movwf Wert call Spi_W_R bsf CSN MOVLW D'2' ;config nRF2401 abwarten MOVWF DELAY1 call RETARD0 ;config nRF2401 abwarten return Clear_Interr: movlw 0x27;STATUS movwf Wert bcf CSN call Spi_W_R movlw 0x70;alle Interrupt-Flags löschen movwf Wert call Spi_W_R bsf CSN return ;Spi_W_R: beim beschreiben des nRF2401 wird das MSB von "Wert" auf den MOSI-Pin ;gesetzt, nach jedem einzelnen Bitschieben wird der MISO-Pin ins LSB von "Wert" ;gesetzt. Beim Nur-Schreiben kann der aus dem nRF2401 ausgelesene "Wert" ;ignoriert werden, allenfalls kann das nRF2401-status-Reg ausgewertet werden. ;Beim Nur-Lesen wird auch geschrieben (Inhalt von "Wert" egal), weil ja der ;Takt generiert werden muss. Spi_W_R: movlw D'8' movwf Zaehlvar Spi_W_R1: btfsc Wert,7 ;Wert, welcher von MCU nach nRF2401 geschrieben wird bsf MOSI bsf SCK rlf Wert bcf Wert,0 btfsc MISO ; bsf Wert,0 ;Wert, welcher von nRF2401 nach MCU geschrieben wird nop bcf SCK bcf MOSI decf Zaehlvar,f btfss STATUS,Z goto Spi_W_R1 return MEASURE ;28.08.2017 banksel ADCON0 MOVLW 0x01 MOVWF ADCON0 movlw D'30' movwf DELAY1 call us4 BSF ADCON0,1 BTFSC ADCON0,1 GOTO $-1 banksel ADRESH MOVF ADRESH,W MOVWF Pos RETURN #include "DELAYROUT.inc" ; initialize eeprom locations ORG 0x2100 DE 0x00, 0x01, 0x02, 0x03 END ; directive 'end of program'