;**************************************************************** ;* * ;* TNC2 Q * ;* * ;* PIC16C54-HS zur Steuerung des FSK-Teils * ;* * ;* Taktfrequenz: 9.8304 MHz / 4.9152 MHz * ;* Befehlszyklus: 406.901 ns / 813.802 ns * ;* Baudrate: 19200 Baud / 9600 Baud * ;* * ;**************************************************************** TITLE "TNC2 Q ----- FSK-Modem" PROCESSOR 16C54 __IDLOCS 0x3F03 ;**************************************************************** ;* I/O-Signale: * ;* * ;* RA0: DCD (Ausgang OC) * ;* RA1: Daten vom Empf„nger (Eingang) * ;* RA2: FSK-Daten und PTT gemultiplext (Eingang/Ausgang OC) * ;* RA3: FSK-Takt (Ausgang) * ;* * ;* RB0: Daten zum D/A-Wandler, Bit 0 (Ausgang) * ;* Gleichzeitig Auswahl-Eingang fr Filterkurve * ;* Ohne Widerstand: Kurve 1 (glatt), mit Widerstand nach * ;* Masse (10k): Verzerrte Kurve fr PLL-Ger„t * ;* RB1: Daten zum D/A-Wandler, Bit 1 (Ausgang) * ;* RB2: Daten zum D/A-Wandler, Bit 2 (Ausgang) * ;* RB3: Daten zum D/A-Wandler, Bit 3 (Ausgang) * ;* RB4: Daten zum D/A-Wandler, Bit 4 (Ausgang) * ;* RB5: Daten zum D/A-Wandler, Bit 5 (Ausgang) * ;* RB6: Daten zum D/A-Wandler, Bit 6 (Ausgang) * ;* RB7: Daten zum D/A-Wandler, Bit 7 (Ausgang) * ;**************************************************************** ;**************************************************************** ;* Filterkonstanten fr FIR-Filter im Sender * ;* Aufbau der Tabellen siehe Beschreibung * ;**************************************************************** ;Filterkurve 1. Keine Korrektur. Val1FC0 equ 1 Val1FC1 equ 3 Val1FC2 equ 4 Val1FC3 equ 6 Val1FC4 equ 7 Val1FC5 equ 8 Val1FC6 equ 9 Val1FC7 equ 35 Val1FC8 equ 39 Val1FC9 equ -1 Val1FC10 equ -2 Val1FC11 equ -3 Val1FC12 equ -8 Val1FC13 equ -11 Val1FC14a equ -4 Val1FC14b equ -12 Val1FC14c equ -23 Val1FC14d equ -16 Val1FC15a equ 84 Val1FC15b equ 64 Val1FC15c equ 70 Val1FC15d equ 87 ;Filterkurve 2. Korrektur fr PLL-Ger„te. Val2FC0 equ 2 Val2FC1 equ 5 Val2FC2 equ 7 Val2FC3 equ 9 Val2FC4 equ 12 Val2FC5 equ 15 Val2FC6 equ 34 Val2FC7 equ -1 Val2FC8 equ -2 Val2FC9 equ -3 Val2FC10 equ -7 Val2FC11 equ -16 Val2FC12 equ -22 Val2FC13 equ -32 Val2FC14a equ -8 Val2FC14b equ -24 Val2FC14c equ -5 Val2FC14d equ -26 Val2FC15a equ 70 Val2FC15b equ 53 Val2FC15c equ 82 Val2FC15d equ 89 ;**************************************************************** ;* Sonstige Konstanten * ;**************************************************************** ;Nullpegel am D/A-Wandler DA_NULL1 equ 0x84 ;Kurve 1 DA_NULL2 equ 0x97 ;Kurve 2 ;Nullpegel-Offset bei TX DAOTX1 equ -40 ;Kurve 1 DAOTX2 equ -40 ;Kurve 2 ;Register Status equ 3 ;Statusregister PortA equ 5 ;Adresse Port A PortB equ 6 ;Adresse Port B ;Bits im Statusregister Stat_C equ 0 ;C-Flag Stat_DC equ 1 ;DC-Flag Stat_Z equ 2 ;Z-Flag ;Datenrichtung an den Ports PortA_Dir equ 0x06 ;I/O-Maske Port A PortB_Dir equ 0x00 ;I/O-Maske Port B ;Ein-/Ausgangs-Pins O_DCD equ 0 ;Ausgangsbit fr DCD I_RX equ 1 ;Eingangsdaten vom Empf„nger IO_DATA equ 2 ;Ein-/Ausgangsbit fr Daten O_CLK equ 3 ;Ausgangsbit fr RX-/TX-Takt I_KURVE equ 0 ;Eingang fr Auswahl Filterkurve ;an Port B ;DCD-Schaltschwellen MinDCD equ 20 OffDCD equ MinDCD+5 OnDCD equ MinDCD+25 MaxDCD equ OnDCD+15 DCDDelayVal equ 5 ;Verhindert ein Flattern der DCD, das ;sonst auch bei rauschfreiem Signal ;je nach Bitfolge auftreten kann ;Allgemeine Register fr RX & TX Flags equ 0x07 ;Steuerbits. ;0: PTT. 0=TX, 1=RX ;1: DCD. 0=DCD aktiv, 1=DCD inaktiv ;2: TXD. ScrambLow equ 0x08 ;Scrambler, Lowbyte ScrambMid equ 0x09 ;Scrambler, mittleres Byte ScrambHigh equ 0x0A ;Scrambler, Highbyte LastPA equ 0x0B ;Letzter Zustand Port A Temp equ 0x0F ;Als Zwischenspeicher ;Register fr TX Filter equ 0x0C ;Aktuell zum Senden verwendeter Zustand ;des FIR-Filters. TX_Bit equ 0x0D ;Sendebit (in Bit 0) ;Register fr RX DCD_Cnt equ 0x0C ;DCD-Z„hler LastRX equ 0x0D ;Zuletzt dekodiertes RX-Bit. Wird ben”tigt ;fr die NRZI->NRZ-Wandlung RX_Bit equ 0x0E ;RX-Bit (in Bit 0) RX_Bit_Temp equ 0x10 ;Zwischenspeicher fr RX_Bit RX_Bit_Last equ 0x11 ;Vorheriges RX-Bit DCD_Delay equ 0x12 ;Verz”gerung bis zum Ansprechen der DCD ;Register fr Filterkonstanten FC0 equ 0x10 FC1 equ 0x11 FC2 equ 0x12 FC3 equ 0x13 FC4 equ 0x14 FC5 equ 0x15 FC6 equ 0x16 FC7 equ 0x17 FC8 equ 0x18 FC9 equ 0x19 FC10 equ 0x1A FC11 equ 0x1B FC12 equ 0x1C FC13 equ 0x1D FC14 equ 0x1E FC15 equ 0x1F ;**************************************************************** ;* Initialisierung nach RESET * ;**************************************************************** Reset: ;Defaultwerte auf Ausgangsregister movlw B'00001000' ;Clock=1, DCD=0 (wird per TRIS aktiviert) movwf PortA movlw DA_NULL1 movwf PortB ;Port-Pins als Ein- und Ausgang definieren movlw PortA_Dir | (1 << O_DCD) ;DCD inaktiv! tris PortA movlw PortB_Dir tris PortB ;OPTION-Register einstellen movlw B'00000000' ;(RTCC und WDT unbenutzt) option ;RAM initialisieren movlw B'00000011' ;PTT und DCD inaktiv movwf Flags ;**************************************************************** ;* Verzweiger zu Beginn der Hauptschleife * ;**************************************************************** mn_loop ;Unterscheiden zwischen Sendung und Empfang btfss Flags, 0 goto TInit ;**************************************************************** ;* FSK-Empf„nger * ;* Jede Phase muá exakt 32 Befehlstakte dauern * ;**************************************************************** ;---------------------------------------------------------------- ; RInit ; Initialisierung des FSK-Empf„ngers. ;---------------------------------------------------------------- RInit: ;Ausgangsregister Port A vorbesetzen movlw 1 << O_CLK movwf PortA ;Datenrichtung Port A vorbesetzen. IO_DATA zun„chst Eingang, DCD inaktiv movlw PortA_Dir | (1 << IO_DATA) | (1 << O_DCD) tris PortA ;DCD ist inaktiv bsf Flags, 1 ;DCD-Z„hler auf Initwert movlw MinDCD movwf DCD_Cnt movlw DCDDelayVal movwf DCD_Delay ;Scrambler l”schen clrf ScrambLow clrf ScrambMid clrf ScrambHigh ;Korrekte Nullage auf D/A-Wandler ;Dazu zun„chst Eingang fr Kurven-Auswahl schalten movlw PortB_Dir | (1 << I_KURVE) tris PortB nop ;Auswahl abfragen und Nullage ausgeben movlw DA_NULL1 btfss PortB, I_KURVE movlw DA_NULL2 movwf PortB ;Wieder Ausgang movlw PortB_Dir tris PortB ;Sonstige Initialisierungen movf PortA,w movwf LastPA ;---------------------------------------------------------------- ; Phase 1 ;---------------------------------------------------------------- RPhase1: ;Inaktive Flanke an FSK-Takt ausgeben. Vorher PTT-Zustand ;auf der Datenleitung einlesen movf PortA,w movwf Temp movlw 1 << O_CLK movwf PortA bcf Flags, 0 btfsc Temp, IO_DATA bsf Flags, 0 ;Flanke in der vorherigen Phase aufgetreten? movf Temp,w xorwf LastPA,f btfss LastPA, I_RX goto RP1a ;Flanke war da. Kein Ausgleich des Abtastzeitpunktes ;n”tig, da die Flanke in Phase 4 auftrat. ;DCD-Z„hler erh”hen movlw 3 addwf DCD_Cnt,f ;Delay fr's runterz„hlen starten movlw DCDDelayVal movwf DCD_Delay goto RP1b RP1a: ;Keine Flanke. DCD-Z„hler vermindern, aber nur, wenn ;die Verz”gerungszeit abgelaufen ist. movf DCD_Delay,f btfsc Status, Stat_Z decf DCD_Cnt,f goto $+1 ;Laufzeitausgleich RP1b: ;Portzustand fr Flankenauswertung merken movf Temp,w movwf LastPA ;Status der DCD bestimmen btfss Flags, 1 goto RP1d ;DCD ist inaktiv. Einschalten wenn obere Schaltschwelle ;erreicht wurde. movlw -OnDCD addwf DCD_Cnt,w btfsc Status, Stat_C bcf Flags, 1 goto RP1e RP1d: ;DCD ist aktiv. Abschalten wenn untere Schaltschwelle ;unterschritten wurde movlw OffDCD+1 subwf DCD_Cnt,w btfss Status, Stat_C bsf Flags, 1 nop ;Laufzeitausgleich RP1e: ;Delayz„hler-- movf DCD_Delay,f btfss Status, Stat_Z decf DCD_Delay,f ;Laufzeitausgleich goto $+1 ;---------------------------------------------------------------- ; Phase 2 ;---------------------------------------------------------------- movf PortA,w movwf Temp ;Dekodierte Daten an FSK-Daten ausgeben movlw PortA_Dir & (0xFF - (1 << IO_DATA) - (1 << O_DCD)) btfsc RX_Bit,0 iorlw 1 << IO_DATA btfsc Flags, 1 iorlw 1 << O_DCD tris PortA ;Flanke in der vorherigen Phase aufgetreten? ;Bis RP2FlankeMit: 9 Takte movf Temp,w xorwf LastPA,f btfss LastPA, I_RX goto RP2KeineFlanke ;Flanke war da. DCD-Z„hler vermindern ;DCD aktiv: Z„hler -= 1, DCD inaktiv: Z„hler -=2 decf DCD_Cnt,f btfsc Flags,1 decf DCD_Cnt,f ;Verz”gerung des Abtastzeitpunktes abh„ngig vom Zustand der DCD ;DCD aktiv: +1 Takt, DCD inaktiv: +4 Takte btfss Flags, 1 goto RP2FlankeMit goto RP2FlankeOhne RP2KeineFlanke: goto $+1 RP2FlankeOhne: goto $+1 RP2FlankeMit: ;Portzustand fr Flankenauswertung merken movf Temp,w movwf LastPA ;Signal vom Empf„nger abtasten und durch Descrambler schieben rrf Temp,f rrf Temp,w rlf ScrambLow,f rlf ScrambMid,f rlf ScrambHigh,f swapf ScrambMid,w xorwf ScrambLow,w btfsc ScrambHigh,1 xorlw 1 movwf RX_Bit_Temp ;Laufzeitausgleich goto $+1 nop ;---------------------------------------------------------------- ; Phase 3 ;---------------------------------------------------------------- ;Aktive Flanke an FSK-Takt ausgeben movf PortA,w movwf Temp nop ;Als Laufzeitausgleich, damit der Takt ;an FSK_CLK v”llig symmetrisch ist. clrf PortA ;Flanke in der vorherigen Phase aufgetreten? ;Bis RP3FlankeMit: 7 Takte xorwf LastPA,f btfss LastPA, I_RX goto RP3KeineFlanke ;Flanke war da. DCD-Z„hler vermindern decf DCD_Cnt,f btfsc Flags,1 decf DCD_Cnt,f ;Verz”gerung des Abtastzeitpunktes abh„ngig vom Zustand der DCD ;DCD aktiv: +1 Takt, DCD inaktiv: +4 Takte btfss Flags, 1 goto RP3FlankeMit goto RP3FlankeOhne RP3KeineFlanke: goto $+1 RP3FlankeOhne: goto $+1 RP3FlankeMit: ;Portzustand fr Flankenauswertung merken movf Temp,w movwf LastPA ;Zustand der DCD nach auáen melden movlw PortA_Dir & (0xFF - (1 << IO_DATA) - (1 << O_DCD)) btfsc RX_Bit,0 iorlw 1 << IO_DATA btfsc Flags, 1 iorlw 1 << O_DCD tris PortA ;Z„hlerstand des DCD-Z„hlers nach oben begrenzen movlw MaxDCD subwf DCD_Cnt,w btfsc Status, Stat_C subwf DCD_Cnt,f ;Z„hlerstand des DCD-Z„hlers nach unten begrenzen movlw MinDCD subwf DCD_Cnt,w btfss Status, Stat_C subwf DCD_Cnt,f ;Watchdog nachtriggern clrwdt ;Laufzeitausgleich goto $+1 nop ;---------------------------------------------------------------- ; Phase 4 ; Abbruch der Empfangsroutine, wenn PTT aktiv geworden ist. ;---------------------------------------------------------------- movf PortA,w movwf Temp ;Datenleitung hochohmig schalten movlw PortA_Dir | (1 << IO_DATA) | (1 << O_DCD) btfss Flags, 1 andlw 0xFF - (1 << O_DCD) tris PortA ;Flanke in der vorherigen Phase aufgetreten? ;Bis RP4FlankeOhne: 15 Takte movf Temp,w xorwf LastPA,f btfss LastPA, I_RX goto RP4KeineFlanke ;Flanke war da. DCD-Z„hler vermindern ;DCD aktiv: Z„hler -= 1, DCD inaktiv: Z„hler -=2 decf DCD_Cnt,f btfsc Flags,1 decf DCD_Cnt,f ;Verz”gerung des Abtastzeitpunktes abh„ngig vom Zustand der DCD ;DCD aktiv: -1 Takt, DCD inaktiv: -4 Takte btfss Flags, 1 goto RP4FlankeMit goto RP4FlankeOhne RP4KeineFlanke: goto $+1 goto $+1 goto $+1 RP4FlankeMit: goto $+1 goto $+1 RP4FlankeOhne: ;Portzustand fr Flankenauswertung merken movf Temp,w movwf LastPA ;RX_Bit umkopieren und NRZI->NRZ-Wandlung durchfhren movf RX_Bit_Temp,w xorwf RX_Bit_Last,w xorlw 1 movwf RX_Bit movf RX_Bit_Temp,w movwf RX_Bit_Last ;Laufzeitausgleich ; ;Abbruch wenn PTT-Signal aktiv geworden ist btfsc Flags, 0 goto RPhase1 goto mn_loop ;**************************************************************** ;* FSK-Sender * ;* Jede Phase muá exakt 32 Befehlstakte dauern * ;**************************************************************** ;---------------------------------------------------------------- ; TInit ; Initialisierung des FSK-Senders. ;---------------------------------------------------------------- TInit: ;IO_DATA ist jetzt st„ndig Eingang. Auch DCD als Eingang ;schalten, damit DCD inaktiv ist. movlw PortA_Dir | (1 << IO_DATA) | (1 << O_DCD) tris PortA ;Scrambler l”schen clrf ScrambLow clrf ScrambMid clrf ScrambHigh ;Filter l”schen clrf Filter ;Sonstige Initialisierungen clrf TX_Bit ;Unterscheiden, welche Filterkurve aktiv ist. movlw PortB_Dir | (1 << I_KURVE) tris PortB nop ;Kleine Wartezeit movf PortB,w movwf Temp movlw PortB_Dir tris PortB btfss Temp, I_KURVE goto T2Init ;---------------------------------------------------------------- ; T1Init ; Initialisierung des FSK-Senders, nur Kurve 1 ;---------------------------------------------------------------- T1Init: ;Filterkonstanten laden movlw Val1FC0 movwf FC0 movlw Val1FC1 movwf FC1 movlw Val1FC2 movwf FC2 movlw Val1FC3 movwf FC3 movlw Val1FC4 movwf FC4 movlw Val1FC5 movwf FC5 movlw Val1FC6 movwf FC6 movlw Val1FC7 movwf FC7 movlw Val1FC8 movwf FC8 movlw Val1FC9 movwf FC9 movlw Val1FC10 movwf FC10 movlw Val1FC11 movwf FC11 movlw Val1FC12 movwf FC12 movlw Val1FC13 movwf FC13 movlw Val1FC14a movwf FC14 movlw Val1FC15a movwf FC15 ;---------------------------------------------------------------- ; Kurve 1, Phase 1 ; Sendefilter 1 abarbeiten. ; Negative Flanke an TX-Takt ausgeben. ; (= Positive Taktflanke an SIO) ; Sendebit einlesen. ; NRZ->NRZI-Wandlung des eingelesenen Bits. ;---------------------------------------------------------------- T1Phase1: ;Laufzeit-Ausgleich (vorneweg, da die Filterberchnung in ;dieser Phase 4 Takte krzer ist als in den brigen Phasen) goto $+1 goto $+1 ;Filter berechnen und Wert an D/A-Wandler ausgeben (14 Takte) movlw DA_NULL1 + DAOTX1 btfsc Filter,1 addwf FC0,w ; +1 btfsc Filter,2 addwf FC14,w ; -4 btfsc Filter,3 addwf FC4,w ; +7 btfsc Filter,4 addwf FC15,w ; +84 btfsc Filter,5 addwf FC12,w ; -8 btfsc Filter,6 addwf FC1,w ; +3 movwf PortB ;Sendebit einlesen und NRZ->NRZI-Wandlung movf TX_Bit,w btfss PortA, IO_DATA xorlw 1 movwf TX_Bit ;Negative Flanke TX-Takt bcf PortA, O_CLK ;Neue Filterkonstanten 14 und 15 fr Phase 2 movlw Val1FC14b movwf FC14 movlw Val1FC15b movwf FC15 ;Laufzeitausgleich goto $+1 goto $+1 nop ;---------------------------------------------------------------- ; Kurve 1, Phase 2 ; Sendefilter 2 abarbeiten. ; Sendebit durch Scrambler schieben. ;---------------------------------------------------------------- T1Phase2: ;Filter berechnen und Wert an D/A-Wandler ausgeben (18 Takte) movlw DA_NULL1 + DAOTX1 btfsc Filter,0 addwf FC10,w ; -2 btfsc Filter,1 addwf FC4,w ; +7 btfsc Filter,2 addwf FC13,w ; -11 btfsc Filter,3 addwf FC8,w ; +39 btfsc Filter,4 addwf FC15,w ; +64 btfsc Filter,5 addwf FC14,w ; -12 btfsc Filter,6 addwf FC2,w ; +4 btfsc Filter,7 addwf FC9,w ; -1 movwf PortB ;Scrambler. Generatorpolynom x^17 + x^12 + 1 rrf TX_Bit,w rlf ScrambLow,f rlf ScrambMid,f rlf ScrambHigh,f swapf ScrambMid,w btfsc ScrambHigh,1 xorlw 1 andlw 1 xorwf ScrambLow,f ;Neue Filterkonstanten 14 und 15 fr Phase 3 movlw Val1FC14c movwf FC14 movlw Val1FC15c movwf FC15 ;Laufzeit-Ausgleich nop ;---------------------------------------------------------------- ; Kurve 1, Phase 3 ; Sendefilter 3 abarbeiten. ; PTT-Information einlesen. ; Positive Flanke an TX-Takt ausgeben. ; (= negative Taktflanke an SIO) ;---------------------------------------------------------------- T1Phase3: ;Filter berechnen und Wert an D/A-Wandler ausgeben (18 Takte) movlw DA_NULL1 + DAOTX1 btfsc Filter,0 addwf FC11,w ; -3 btfsc Filter,1 addwf FC6,w ; +9 btfsc Filter,2 addwf FC14,w ; -23 btfsc Filter,3 addwf FC15,w ; +70 btfsc Filter,4 addwf FC7,w ; +35 btfsc Filter,5 addwf FC12,w ; -8 btfsc Filter,6 addwf FC1,w ; +3 btfsc Filter,7 addwf FC0,w ; +1 movwf PortB ;PTT-Information merken bcf Flags, 0 btfsc PortA, IO_DATA bsf Flags, 0 ;Positive Flanke TX-Takt bsf PortA, O_CLK ;Neue Filterkonstanten 14 und 15 fr Phase 4 movlw Val1FC14d movwf FC14 movlw Val1FC15d movwf FC15 ;Watchdog nachtriggern clrwdt ;Laufzeit-Ausgleich goto $+1 goto $+1 nop ;---------------------------------------------------------------- ; Kurve 1, Phase 4 ; Sendefilter 4 abarbeiten. ; Eingangswort fr Filter im n„chsten Durchlauf bereit stellen. ; Abbruch der Senderoutine, wenn PTT inaktiv geworden ist. ;---------------------------------------------------------------- T1Phase4: ;Filter berechnen und Wert an D/A-Wandler ausgeben (18 Takte) movlw DA_NULL1 + DAOTX1 btfsc Filter,0 addwf FC11,w ; -3 btfsc Filter,1 addwf FC3,w ; +6 btfsc Filter,2 addwf FC14,w ; -16 btfsc Filter,3 addwf FC15,w ; +87 btfsc Filter,4 addwf FC5,w ; +8 btfsc Filter,5 addwf FC10,w ; -2 btfsc Filter,6 addwf FC0,w ; +1 btfsc Filter,7 addwf FC9,w ; -1 movwf PortB ;Neuer Wert im FIR-Filter fr den n„chsten Durchgang movf ScrambLow,w movwf Filter ;Neue Filterkonstanten 14 und 15 fr Phase 1 movlw Val1FC14a movwf FC14 movlw Val1FC15a movwf FC15 ;Laufzeit-Ausgleich goto $+1 goto $+1 nop ;Abbruch wenn PTT-Signal inaktiv geworden ist btfss Flags, 0 goto T1Phase1 goto mn_loop ;---------------------------------------------------------------- ; T2Init ; Initialisierung des FSK-Senders, nur Kurve 2 ;---------------------------------------------------------------- T2Init: ;Filterkonstanten laden movlw Val2FC0 movwf FC0 movlw Val2FC1 movwf FC1 movlw Val2FC2 movwf FC2 movlw Val2FC3 movwf FC3 movlw Val2FC4 movwf FC4 movlw Val2FC5 movwf FC5 movlw Val2FC6 movwf FC6 movlw Val2FC7 movwf FC7 movlw Val2FC8 movwf FC8 movlw Val2FC9 movwf FC9 movlw Val2FC10 movwf FC10 movlw Val2FC11 movwf FC11 movlw Val2FC12 movwf FC12 movlw Val2FC13 movwf FC13 movlw Val2FC14a movwf FC14 movlw Val2FC15a movwf FC15 ;---------------------------------------------------------------- ; Kurve 2, Phase 1 ; Sendefilter 1 abarbeiten. ; Negative Flanke an TX-Takt ausgeben. ; (= Positive Taktflanke an SIO) ; Sendebit einlesen. ; NRZ->NRZI-Wandlung des eingelesenen Bits. ;---------------------------------------------------------------- T2Phase1: ;Laufzeit-Ausgleich (vorneweg, da die Filterberchnung in ;dieser Phase 4 Takte krzer ist als in den brigen Phasen) goto $+1 goto $+1 ;Filter berechnen und Wert an D/A-Wandler ausgeben (14 Takte) movlw DA_NULL2 + DAOTX2 btfsc Filter,1 addwf FC0,w ; +2 btfsc Filter,2 addwf FC14,w ; -8 btfsc Filter,3 addwf FC5,w ; +15 btfsc Filter,4 addwf FC15,w ; +70 btfsc Filter,5 addwf FC13,w ; -32 btfsc Filter,6 addwf FC3,w ; +9 btfsc Filter,7 addwf FC8,w ; -2 movwf PortB ;Sendebit einlesen und NRZ->NRZI-Wandlung movf TX_Bit,w btfss PortA, IO_DATA xorlw 1 movwf TX_Bit ;Negative Flanke TX-Takt bcf PortA, O_CLK ;Neue Filterkonstanten 14 und 15 fr Phase 2 movlw Val2FC14b movwf FC14 movlw Val2FC15b movwf FC15 ;Laufzeitausgleich goto $+1 goto $+1 nop ;---------------------------------------------------------------- ; Kurve 2, Phase 2 ; Sendefilter 2 abarbeiten. ; Sendebit durch Scrambler schieben. ;---------------------------------------------------------------- T2Phase2: ;Filter berechnen und Wert an D/A-Wandler ausgeben (18 Takte) movlw DA_NULL2 + DAOTX2 btfsc Filter,0 addwf FC8,w ; -2 btfsc Filter,1 addwf FC3,w ; +9 btfsc Filter,2 addwf FC14,w ; -24 btfsc Filter,3 addwf FC15,w ; +53 btfsc Filter,4 addwf FC6,w ; +34 btfsc Filter,5 addwf FC12,w ; -22 btfsc Filter,6 addwf FC2,w ; +7 btfsc Filter,7 addwf FC8,w ; -2 movwf PortB ;Scrambler. Generatorpolynom x^17 + x^12 + 1 rrf TX_Bit,w rlf ScrambLow,f rlf ScrambMid,f rlf ScrambHigh,f swapf ScrambMid,w btfsc ScrambHigh,1 xorlw 1 andlw 1 xorwf ScrambLow,f ;Neue Filterkonstanten 14 und 15 fr Phase 3 movlw Val2FC14c movwf FC14 movlw Val2FC15c movwf FC15 ;Laufzeit-Ausgleich nop ;---------------------------------------------------------------- ; Kurve 2, Phase 3 ; Sendefilter 3 abarbeiten. ; PTT-Information einlesen. ; Positive Flanke an TX-Takt ausgeben. ; (= negative Taktflanke an SIO) ;---------------------------------------------------------------- T2Phase3: ;Filter berechnen und Wert an D/A-Wandler ausgeben (18 Takte) movlw DA_NULL2 + DAOTX2 btfsc Filter,0 addwf FC14,w ; -5 btfsc Filter,1 addwf FC4,w ; +12 btfsc Filter,2 addwf FC13,w ; -32 btfsc Filter,3 addwf FC15,w ; +82 btfsc Filter,4 addwf FC9,w ; -3 btfsc Filter,5 addwf FC10,w ; -7 btfsc Filter,6 addwf FC0,w ; +2 btfsc Filter,7 addwf FC7,w ; -1 movwf PortB ;PTT-Information merken bcf Flags, 0 btfsc PortA, IO_DATA bsf Flags, 0 ;Positive Flanke TX-Takt bsf PortA, O_CLK ;Neue Filterkonstanten 14 und 15 fr Phase 4 movlw Val2FC14d movwf FC14 movlw Val2FC15d movwf FC15 ;Watchdog nachtriggern clrwdt ;Laufzeit-Ausgleich goto $+1 goto $+1 nop ;---------------------------------------------------------------- ; Kurve 2, Phase 4 ; Sendefilter 4 abarbeiten. ; Eingangswort fr Filter im n„chsten Durchlauf bereit stellen. ; Abbruch der Senderoutine, wenn PTT inaktiv geworden ist. ;---------------------------------------------------------------- T2Phase4: ;Filter berechnen und Wert an D/A-Wandler ausgeben (18 Takte) movlw DA_NULL2 + DAOTX2 btfsc Filter,0 addwf FC9,w ; -3 btfsc Filter,1 addwf FC2,w ; +7 btfsc Filter,2 addwf FC11,w ; -16 btfsc Filter,3 addwf FC15,w ; +89 btfsc Filter,4 addwf FC14,w ; -26 btfsc Filter,5 addwf FC1,w ; +5 btfsc Filter,6 addwf FC7,w ; -1 movwf PortB ;Neuer Wert im FIR-Filter fr den n„chsten Durchgang movf ScrambLow,w movwf Filter ;Neue Filterkonstanten 14 und 15 fr Phase 1 movlw Val2FC14a movwf FC14 movlw Val2FC15a movwf FC15 ;Laufzeit-Ausgleich goto $+1 goto $+1 nop ;Abbruch wenn PTT-Signal inaktiv geworden ist btfss Flags, 0 goto T2Phase1 goto mn_loop ;**************************************************************** ;* RESET-Einsprung * ;**************************************************************** org 0x1FF goto Reset END