#include <16F873A.h> // Einbinden aller Definitions Dateien #include #include #fuses hs,nowdt,noprotect,noput,nocpd,nolvp, nobrownout // Setzen der Prozesseigenschaften #use delay(clock=3686400) // Quarz Einstellung const int baud9600 = 23; // Konstante zum Bestimmen der Baudrate const int baud38400 = 5; char PIDempfangen[11] = {'!','1','0','0','0','0','0','C','8',0x0D,0x00}; char PIDsenden[10] = {'!','1','0','0','0','0','0','6',0x0D,0x00}; // Definierte Arrays die den PID's entsprechen int index, empfangszaehler, fehler; // index: Durchlaufszähler For-Schlaufe /* Damit gewechselt werden kann, zwischen den verschiedenen Modis (Sende / Empfang), muss das Funkmodul in den "Standby" Modus wechseln, in diesem soll 1 ms gewartet werden, um danach die Konfiguration zu laden. Ist dieser Wechsel vollzogen, so kann das Funkmodul wieder geweckt werden. */ void Funkmodul_Empfangen(void) { PORTB = 0x04; // Funkmodul in "Standby" versetzen Delay_ms(3); PORTB = 0x00; // Modus wird gewählt Delay_ms(3); } void Funkmodul_Senden(void) { PORTB = 0x05; // Funkmodul in "Standby" versetzen Delay_ms(3); PORTB = 0x01; // Modus wird gewählt Delay_ms(3); } void TX(void) // Sende Funktion { Funkmodul_Senden(); for(index=0;index<=8;index++) // Um 9 Zeichen zu senden { TXREG = PIDsenden[index]; // Array ausgeben while((TXSTA&0x02)!=0x02); // Warten bis Tx Buffer leer ist } // (Alles gesendet wurde) } #INT_RDA // Rx empfangs Interrupt void RX(void) { Funkmodul_Empfangen(); if(RCREG == PIDempfangen[empfangszaehler]) // Rx Buffer vergleichen mit PID { if(empfangszaehler >= 9) // Sofern die gesamte PID übereinstimmt { TX(); // Senden empfangszaehler = 0; // Routine neustarten } else { empfangszaehler++; // Ansonsten hoch zählen } } else { // Sofern Rx nicht mit PID übereinstimmt empfangszaehler = 0; // Routine neustarten } if((RCSTA&0x02)==0x02) // Sofern der Rx Buffer voll ist { RCSTA = 0x80; // Neu initialisieren des Buffers RCSTA = 0x90; } } void Initialisieren(void) { DDRA=0x00; // Port A als Ausgang DDRB=0x00; // Port B als Ausgang DDRC=0x80; // Port C als Ausgang abgesehen vom Rx (PinC7) PORTB=0x00; // PORT B auf 0 schalten TXSTA = 0x24; // Highspeed und TX senden Einrichten RCSTA = 0x90; // Zum Empfangen einrichten RX SPBRG = baud38400; // Baudrate auf 34800 setzen Funkmodul_Empfangen(); enable_interrupts(GLOBAL); enable_interrupts(INT_RDA); empfangszaehler = 0; } void main(void) // Hauptfunktion { Initialisieren(); while(1 == 1); // Endlos-Schlaufe }