#include #include #include //SENDE-Empfangsabläufe von Pollin #pragma config OSC = HS //zwischen 4 und 20 MHz #pragma config MCLRE = ON //MCLR Enable #pragma config WDT = OFF //Watchdog Timer #pragma config IESO = OFF #pragma config DEBUG = OFF #pragma config PWRT = OFF //Power-up Timer #pragma config LVP = OFF //Low Voltage ICSP void RF_Init(void); void RF_Init_SPI(void); void RF_GetStatus(void); void RF_SendByte(unsigned char data); void RF_SetTX(); void RFTX_Send(unsigned char data); unsigned char SPIRF(unsigned char data); void RF_CMD(unsigned char wort1,unsigned char wort2); void RF_GetStatus(); void senden(unsigned char); void RF_SetRX(); unsigned char empfangen(void); void spiel(void); //Interruptroutinen void intinit(void); void enable_interrupts(void); void disable_interrupts(void); unsigned char RF_INT_ReadFIFO(void); void RF_INT_RSFIFO(void); void service (void); #pragma code einsprung=0x08 void sprung(void) { _asm GOTO service _endasm } #pragma code #pragma interrupt service void service (void) { RF_Init_SPI(); if (RF_INT_ReadFIFO()==0b11100111) { RF_INT_RSFIFO(); INTCONbits.INT0IF=0; //INT0 Anzeigeflag löschen spiel(); goto endirq; } else { RF_INT_RSFIFO(); INTCONbits.INT0IF=0; //INT0 Anzeigeflag löschen goto endirq; } endirq: _asm nop _endasm } void intinit(void) { RCONbits.IPEN = 0; INTCON2bits.RBPU = 0; TRISBbits.TRISB0 = 1; //INT0 == RB0 INTCON2bits.INTEDG0 = 1; INTCONbits.INT0IF = 0; } void enable_interrupts(void) { INTCONbits.INT0IE = 1; INTCONbits.GIE = 1; } void disable_interrupts(void) { INTCONbits.INT0IE = 0; INTCONbits.GIE = 0; } // ============================ INTERRUPT ========================================== // ----- IRQ Routinen Nicht aus Hauptprogramm aufufen !!! // Liest 1 Bytes aus dem FIFO aus unsigned char RF_INT_ReadFIFO() { unsigned char data; do{ PORTBbits.RB6=1; PORTCbits.RC2=0; SPIRF(0xB0); data = SPIRF(0x00); PORTCbits.RC2=1; } while (!(data == 0b11100111)); PORTBbits.RB6=0; return(data); } // IRQ: Fifo resetten void RF_INT_RSFIFO() { RF_CMD(0xCA,0x81); // Fifo Reset RF_CMD(0xCA,0x83); } //======================================================================================== // Konfiguriere die SPI als Master void RF_Init_SPI() { TRISC = TRISC & 0b11010011; // SDO,SCK, nSel auf Ausgang TRISC = TRISC | 0b00010000; // SDI Eingang TRISB = TRISB & 0b00000001; TRISB = TRISB | 0b00000001; // nIRQ Eingang // SPI einrichten SSPCON1 = 0b00000001; // Master Mode, fosc/16 SSPSTATbits.SMP = 0; SSPCON1bits.CKP = 0; // Daten bei fallender Flanke SSPSTATbits.CKE = 1; SSPCON1bits.SSPEN = 1; // SPI bleibt dauerhaft an PORTCbits.RC2=1; } unsigned char SPIRF(unsigned char data) { unsigned char rec; // Solange SPI beschäftigt ist hämmere ihr die Daten ein bis frei wird PORTBbits.RB7 = 1; do { SSPCON1bits.WCOL = 0; SSPBUF = data; // Sende Register beschreiben } while (SSPCON1bits.WCOL); // Datentransfer läuft, jetzt warten bis Byte vom Slave reingekommen while (!SSPSTATbits.BF); rec = SSPBUF; PORTBbits.RB7 = 0; return(rec); } void RF_CMD(unsigned char wort1,unsigned char wort2) { unsigned char wort3; unsigned char wort4; PORTCbits.RC2=0; wort3= SPIRF(wort1); wort4= SPIRF(wort2); PORTCbits.RC2=1; } void RF_Init() { disable_interrupts(); RF_Init_SPI(); RF_CMD(0x80,0xD7); // EL,EF,12.0pF RF_CMD(0x82,0x08); // !er,!ebb,!ET,ES,EX,!eb,!ew,DC (in Bereitschaft gehen) RF_CMD(0xC4,0xE7); // @PWR,autotune: -10kHz...+7,5kHz,!st,!fi,OE,EN RF_CMD(0xA6,0x40); // A140=434MHz RF_CMD(0xC6,0x47); // 4,8kbps RF_CMD(0xC2,0xAC); // Data Filter RF_CMD(0x94,0xA0); // VDI,FAST,134kHz,0dBm,-103dBm RF_CMD(0xCA,0x81); // FIFO8,SYNC,!ff,DR RF_CMD(0x98,0x50); // !mp,9810=30kHz,MAX OUT RF_CMD(0xE0,0x00); // NOT USE RF_CMD(0xC8,0x00); // NOT USE RF_CMD(0xC0,0x00); // kein WDT, kein Batteriewächter enable_interrupts(); } // >>>>> RXTX: Hole Statusbits in struct hinein void RF_GetStatus() { unsigned char wert1; unsigned char wert2; disable_interrupts(); RF_Init_SPI(); PORTCbits.RC2=0; wert1 = SPIRF(0x00); wert2 = SPIRF(0x00); PORTCbits.RC2=1; enable_interrupts(); } // Umschalten auf Sender void RF_SetTX() { disable_interrupts(); INTCONbits.INT0IF=0; //INT0 Anzeigeflag löschen RF_CMD(0x82,0x08); Delay1KTCYx(500); } // TX: Senden einer Bytefolge void RFTX_Send(unsigned char data) { RF_Init_SPI(); disable_interrupts(); INTCONbits.INT0IF=0; //INT0 Anzeigeflag löschen RF_CMD(0x82,0x08); Delay1KTCYx(1); RF_GetStatus(); // Notwendig, sonst klappt Senden nicht (seltsam!) RF_CMD(0x82,0x38); // Transmitter EIN RF_SendByte(0xAA); // Präambel ins Latch, lockt die PLL RF_SendByte(0xAA); // Präambel ins Latch, lockt die PLL RF_SendByte(0xAA); // Präambel ins Latch, lockt die PLL RF_SendByte(0x2D); // FIFO Schlüssel 2DD4 (öffnet das Tor) RF_SendByte(0xD4); RF_SendByte(data); RF_SendByte(0xAA); // Dummy, nachschieben als Pipelineputzer RF_SendByte(0xAA); // Dummy, nachschieben als Pipelineputzer RF_CMD(0x82,0x09); // TX off enable_interrupts(); } // TX: Datenbyte raussenden (1=warten, 0=sofort senden (nur erstes Byte)) void RF_SendByte(unsigned char data) { PORTCbits.RC2=0; SPIRF(0xB8); SPIRF(data); PORTCbits.RC2=1; } // >>>>> RX: Umschalten auf Empfang void RF_SetRX() { disable_interrupts(); RF_Init_SPI(); RF_CMD(0x82,0xC8); //Receiver Chain einschalten, Synth aus. RF_GetStatus(); // !!! Status holen, sonst klappt es nicht !!! INTCONbits.INT0IF=0; //INT0 Anzeigeflag löschen RF_CMD(0xCA,0x81); // Fifo Reset RF_CMD(0xCA,0x83); enable_interrupts(); } /* unsigned char empfangen(void) { unsigned char data; RF_GetStatus(); while(!(PORTBbits.RB0 == 1)) //Warten auf nIRQ PORTCbits.RC2=0; SPIRF(0x0B); //Datenbyte in Bit 0-7 data = SPIRF(0x00); PORTCbits.RC2=1; RF_CMD(0xCA,0x81); //FIFO deaktivieren return(data); } */ void spiel() { /*disable_interrupts(); PORTB = 0b00000010; Delay10KTCYx(100); PORTB = 0b00000100; Delay10KTCYx(100); PORTB = 0b00001000; Delay10KTCYx(100); PORTB = 0b00010000; Delay10KTCYx(100); PORTB = 0b00100000; Delay10KTCYx(100); PORTB = 0b01000000; Delay10KTCYx(100); PORTB = 0b10000000; Delay10KTCYx(100); enable_interrupts(); */ unsigned char x; x=rand()%4; while (x==1) { PORTB=0b10000000; while(!(PORTAbits.RA0 == 1)) {}; PORTB = 0b00000000; enable_interrupts(); break; } while (x==0) { PORTB=0B01000000; while((!PORTAbits.RA1 == 1)) {}; PORTB = 0b00000000; enable_interrupts(); break; } while (x==2) { PORTB=0B00100000; while((!PORTAbits.RA2 == 1)) {}; PORTB = 0b00000000; enable_interrupts(); break; } while (x==3) { PORTB=0B00010000; while((!PORTAbits.RA3 == 1)) {}; PORTB = 0b00000000; break; } } void main(void) { unsigned char data; unsigned char adress; unsigned char i; data=0b11100111; TRISA = TRISA & 0b11111111; TRISB = 0; PORTB=0b00000000; intinit(); RF_Init(); RF_SetRX(); spiel(); }