ZFU-4788-02
Fecha de ingreso: 27/dic/2002
|
Hex v2.5 Final (27.07.2007) para el Pic 16F84 y 16F84A by Vinix:
(no contiene HOT-CODE)
SL35_SO_FB_WDT_V2_5.HEX
Código:
:020000040000FA
:020000001928BD
:080008009800030E99000108A5
:100010009A0064001714971081018316C430810080
:1000200083128B10190E8300980E180E0B168B1767
:1000300009006400AA131F3085008316850083120F
:10004000813086008316860083128316C4308100B7
:10005000831286140611061606136400A501861B7A
:10006000A5174922861B482864008B130508A600A3
:1000700026189828A6189B2826199E280608803935
:100080002506031D2D2806180616061C0612342800
:1000900064000B309300D7309500970196019A01C8
:1000A000A301A4016400060880392506031D2D283C
:1000B0000B168B176400171C5E286E28050807397D
:1000C000A60026181429A618172926191A29060881
:1000D00080392506031D2D2864005B289714971886
:1000E0006F2864001A081502031C77287928161453
:1000F0007A281610930B7D288128960D971464009A
:100100006F28640000309300640083121308890094
:100110008316081483120808940016081406031D99
:1001200092281D29930A22301306031D842848288B
:100130001E30A800A1282830A800A1282A30A80035
:10014000A128291CA428AE28F730900006126D22A1
:100150000616D620F520D6202914B828F7309000AE
:1001600006126D220616D620D620D6202910B828D1
:100170000830A700A81FD328D620A80DA70BBA289F
:10018000003090006D22003090006D220030900011
:100190006D22003090006D22003090006D22003002
:1001A00090006D223428F520A80DBE281C30900048
:1001B0006D22F930900006126D2200000000000050
:1001C000000000000000000000000000000000002F
:1001D000000000000000000000000000000000001F
:1001E000000000000000061608006A3090006D2232
:1001F000F930900006126D2200000000000000009F
:1002000000000000000000000000000000000000EE
:1002100000000000000000000000000000000000DE
:100220000000000006160800003093001D290D3064
:1002300093001D29113093001D298616640021307A
:1002400013060319752AAA1B772A1308A200A30113
:1002500064003E2264002308A400AA1F3929C73085
:10026000A40703300318013E8A002408C7239B001B
:100270004229CB30A40702300318013E8A0024082B
:10028000CB229B00A30AA40164002308A400AA1F98
:100290005329C730A40703300318013E8A002408FD
:1002A000C7239C005C29CB30A40702300318013E11
:1002B0008A002408CB229C00A30AA401640023081E
:1002C000A400AA1F6D29C730A40703300318013EFC
:1002D0008A002408C7239D007629CB30A40702306A
:1002E0000318013E8A002408CB229D00A30AA40122
:1002F00064002308A400AA1F8729C730A40703307D
:100300000318013E8A002408C7239E009029CB30A1
:10031000A40702300318013E8A002408CB229E0065
:10032000A30AA40164002308A400AA1FA129C730BE
:10033000A40703300318013E8A002408C7239F0046
:10034000AA29CB30A40702300318013E8A002408F2
:10035000CB229F00A30AA40164002308A400AA1FC3
:10036000BB29C730A40703300318013E8A002408C4
:10037000C723A000C429CB30A40702300318013ED4
:100380008A002408CB22A000A30AA4016400230849
:10039000A400AA1FD629C730A40703300318013EC2
:1003A0008A002408C723A100AA13DF29CB30A407A1
:1003B00002300318013E8A002408CB22A100A401C8
:1003C00064000822E6211422861248280730930090
:1003D00030220830930030221B08930030221C0882
:1003E000930030221D08930030221E089300302213
:1003F0001F08930030222008930030220130930020
:10040000302221089300302201309300302208006E
:100410000612003090006D22D73090006D22061633
:10042000753090006D2208000616053093000030EC
:1004300090006D22930B172A7D3090006D220612DA
:10044000013090006D22E13090006D220616BD3023
:1004500090006D220612E93090006D220616080009
:100460000612E93090006D220616F23090006D22DF
:10047000930B302AD03090006D2208000030220605
:100480000319472A2308073EA300A20B422AA30A06
:10049000080014309100861B512A05309200061383
:1004A000542A033092000617861008309300110D6D
:1004B0000318861591006922930B572A0830930080
:1004C000120D0318861592006922930B602A861478
:1004D0000800061506118611080009309400940BD7
:1004E0006F2A6400900F6D2A0800AA17482864003C
:1004F000163013060319992A1730130603199C2A7C
:10050000183013060319A02A193013060319A42A58
:100510001A3013060319A82A1B3013060319AC2A34
:100520001C3013060319B02A1D3013060319B42A10
:10053000482800309300B72A013093006400B72A9E
:10054000023093006400B72A033093006400B72A96
:10055000043093006400B72A053093006400B72A82
:10056000063093006400B72A073093006400252901
:0A05960082000334023405340234FD
:1005A000023401340134023401340334063401349A
:1005B0000234013402340134023401340634033489
:1005C000013404340234043401340234023401347A
:1005D0000434043402340134023401340234023469
:1005E0000134013402340734023401340234033458
:1005F0000134053401340334013403340534023446
:100600000234013401340234033403340434023438
:100610000134023401340234063403340134013429
:100620000134023408340234013401340134013419
:100630000234053401340434013401340334013408
:1006400002340134013401340934013401340234F8
:1006500001340234073402340134013402340434E6
:1006600005340134013402340134023402340134DB
:1006700006340334013401340634043401340134C3
:1006800001340234013403340134013405340434B8
:1006900001340134023401340134013401340934A9
:1006A0000134033401340134013404340534013499
:1006B0000234023401340134053404340134033487
:1006C0000134023404340334023401340234093472
:1006D0000134013401340134013403340734023469
:1006E0000134013401340134023401340934013459
:1006F0000134013401340434063401340234013449
:100700000134013402340234073402340134013438
:100710000134033401340634033401340134013428
:100720000234013401340934013401340134053414
:100730000534013401340234013401340234033409
:1007400006340134023401340134033402340134F8
:1007500004340234033401340A34013401340134E2
:1007600001340134013402340234043403340234D9
:04077000013402341A
:02078E008200E7
:1007900002340134013404340534013402340234A7
:1007A0000134053404340134013402340334013497
:1007B0000434023403340134023404340434023483
:1007C0000134023401340234043401340134043479
:1007D0000134043401340434013405340134033465
:1007E0000134013402340234023405340234023458
:1007F0000134023402340434033402340134023448
:02400E00F53F7C
:104200001E00100022001900140032001A002600BF
:104210002000300027002F0037002800210029004F
:1042200031002A0023001B002E00180035002D004D
:1042300025001D0034002C0024001C003300360033
:104240002B001F00560049004E0049005800200076
:0842500032003000300037009D
:00000001FF
Se acuerdan cuando posteabamos los hex para las PIC1...
Que tiempos aquellos!!!...
Código fuente de la v2.4, el de la v2.5 no estaba:
(Solo como verificación del contenido del HEX)
SL35_SO_FB_WDT_V2_4.asm
Código:
; Init Sequenzer für PCM1742 DAC in SL35 und SL35/1CI
; FB Code Swaper für Comag an Truman Software auf SL35 und SL35/1CI
; Abfrage ob Truman Firmware oder Orginal Firmware benutzt werden soll
; Orginal Fernbedienung von Comag auf Truman Firmware
; SOFTWARE VERSION 2.04
;
; 26.06.2007 by VINIX
; 27.06.2007 Abfrage ob Truman FIRMWARE oder COMAG Firmware benutzt wird hinzugefügt,Sound INIT "professionalisiert" ;-)
; 28.06.2007 FB Emulator COMAG FB auf Truman FIRMWARE hinzugefügt
; 02.07.2007 Emulator Implementiert
; 06.07.2007 Interrupt Versuch RB0, Hardware Modifiziert
; 07.07.2007 Tabelle Vervollständigt und Optimiert
; 08.07.2007 IR Indikator bleibt in der Software / war Urrsprünglich nur zum Test Eingebaut / ist aber auch so nützlich
; 09.07.2007 Mode Abfrage zur Laufzeit
; 10.07.2007 WDT Implementiert (soll ein "Hängen" der FB bei längerer Nichtbenutzung Verhindern)
; Hintergrund ist die Empfindlichkeit des IR Empfängers. Dieser Reagiert auf alle Impulse, dadurch kann es
; Vorkommen das die Software in der Datenempfangs Routine, die Interruptgesteuert ist, "Gefangen" ist.
; Sollte das Passieren so wird der WDT nach ca. 10 - 20 mS nicht mehr gelöscht und dieser Löst dann ein
; RESET aus und der Controller begint wieder von Vorne.
; 14.07.2007 Tabelleadressberechnung verbessert
; 20.07.2007 Fronttastatur Funktion über FB EMU zum Portpin Sparen für den TRUMAN und den COMAG Mode Eingebaut
; PORTBELEGUNG des PIC 16F84:
; ===========================
; Hardware Version 2_4
;
; RA 0 = POWER (EINGANG)
; RA 1 = UP (EINGANG)
; RA 2 = DOWN (EINGANG)
; RA 3 = NC (EINGANG)
; RA 4 = NC (EINGANG)
;
; RB 0 = IR_IN (EINGANG) INTERRUPT EINGANG !
; RB 1 = ML/15 Data Latch (AUSGANG)
; RB 2 = MC/14 CLOCK (AUSGANG)
; RB 3 = MD/13 DATA (AUSGANG)
; RB 4 = FBC_OUT (AUSGANG)
; RB 5 = LED IR AKTIV (AUSGANG)
; RB 6 = LED C/T (AUSGANG)
; RB 7 = Truman Enable (EINGANG) / Hinzugefügt um bei FB EMU implementation eine Möglichkeit zu haben die
; / Orginal Firmware wieder Benutzen zu können ohne den Verlust der FB Funktion
; / wenn die Versorgungsspannung vom Pic genommen würde.
TITLE "SL35_FB.ASM"
include "p16f84.inc"
LIST P=16F84
__CONFIG _CP_OFF & _WDT_ON & _XT_OSC & _PWRTE_ON
; Fileregister Definieren für Konastanten und Variablen
; =====================================================
VERKO EQU 0x10 ; Speicher der Verzögerungsdurchläufe
FDIX EQU 0x11 ; First out / MSB also Register Index
LDDX EQU 0x12 ; Last out / LSB also Register Data
ZWI EQU 0x13 ; Zwischenspeicher für Vergleichsroutine usw.
ZWI2 EQU 0x14 ; Zwischenspeicher 2 für Vergleichsroutine usw.
ENT EQU 0x15 ; Entscheidungszahl
IRIN1 EQU 0x16 ; Speicher für das 16 Bit LSB Empfangsbyte
FIRST EQU 0x17 ; Interrupt Durchlauf Flag's
W_TEMP EQU 0x18 ; TEMPFILE Work
STA_TMP EQU 0x19 ; TEMPFILE Status
ZEIT EQU 0x1A ; TMR0 Speicher nach Interrupt
TCA1 EQU 0x1B ; Truman Code Ausgabe 1'te Byte
TCA2 EQU 0x1C ; Truman Code Ausgabe 2'te Byte
TCA3 EQU 0x1D ; Truman Code Ausgabe 3'te Byte
TCA4 EQU 0x1E ; Truman Code Ausgabe 4'te Byte
TCA5 EQU 0x1F ; Truman Code Ausgabe 5'te Byte
TCA6 EQU 0x20 ; Truman Code Ausgabe 6'te Byte
TCA8 EQU 0x21 ; Truman Code Ausgabe 8'te Byte
MULTI EQU 0x22 ; Multiplikator
ERGEB EQU 0x23 ; Tabellen Index Comag
VV EQU 0x24 ; Tabellensprungadresse aus Comag Index und Truman Code Table
ITE EQU 0x25 ; INIT TEST Register / Mode Umschaltung
FRONTP EQU 0x26 ; Frontpanel Abfrage
SCHI EQU 0x27 ; SCHLEIFENZÄHLER COMAG
IHCS EQU 0x28 ; COMAG TASTENSPEICHER
WETA EQU 0x29 ; COMAG Zwischenspeicher für den Wechsel der Präambel im Comag FB / Frontpanel Mode
ORG 0 ; RESET VECTOR (Hauptprogramm)
GOTO HAUPTPROGRAMM
; ################################################################################################################################
; INTERRUPT SERVICE ROUTINEN (werden Aufgerufen sobald eine Interrupt Kondition erfüllt wurde)
; ============================================================================================
ORG 4 ; Start der Interrupt Routine
; PUSH (Retten von System Registern vor dem Interrupt)
; ====================================================
MOVWF W_TEMP ; Work FR Sichern
SWAPF STATUS, W ; STATUS ins W Register
MOVWF STA_TMP ; STATUS im Temporary File Speichern
; Hier wird Abgefragt welche Quelle den Interrupr Ausgelöst hat:
; ==============================================================
; In diesem Programm wird nur der INT am RB0 Benutzt, deshalb frei
; Register für die Spätere Verarbeitung Sichern:
; ==============================================
MOVF TMR0,W ; Timerwert sichern PRIORITÄT, die Größe ist equivalent des Bitzustandes Kurz = 0 / Lang = 1
MOVWF ZEIT ; Zeit bis zum Auslösen des Interrupt Speichern
; Watchdog Löschen wenn Interrupr Ausgelöst wird:
; ===============================================
CLRWDT ; Watchdog Löschen
; Startimpuls Flag setzen:
; ========================
BSF FIRST,0 ; Schleifenflag setzen, wenn 0 dann ist das der Start des FB Telegramm (Startimpuls)
; Daten Flag Löschen:
; ======================
BCF FIRST,1 ; Flag Löschen
; TMR0 Löschen:
; =============
CLRF TMR0 ; TMR0 0
; TMR0 Neu Starten, da nach einem Schreibzugriff /CLRF ist auch Schreiben/ der Vorteiler Automatisch auf 1:2 Gesetzt wird:
; ========================================================================================================================
BSF STATUS,RP0 ; Page Select 0
MOVLW B'11000100' ; Option Register laden mit: Pullup AUS / INT bei 0->1 / RTCC auf INTERN / Prescaler 1:32
MOVWF OPTION_REG ; In das Option Register schreiben
BCF STATUS,RP0 ; Page Select 1
; Löschen des Interrupt Flags für RB0
; ===================================
BCF INTCON,INTF ; Interrupt Flag Löschen (WICHTIG, da sonst sofort nach RETFIE wieder ein INT Ausgelöst wird)
; POP (Zurückschreiben von System Registern nach dem Interrupt)
; =============================================================
SWAPF STA_TMP, W ; STATUS in das W
MOVWF STATUS ; STATUS Restaurieren
SWAPF W_TEMP,F ; Nibble Tauschen und im FR speichern
SWAPF W_TEMP,W ; Nibbles Tauschen im W Register Speichern
BSF INTCON,INTE ; RB-0 Interrupt Einschalten
BSF INTCON,GIE ; Generell Interrupt Enable
RETFIE ; Rücksprung vom Interrupt
; #################################################################################################################################
; Hier Startet das HAUPTPROGRAMM
; ==============================
HAUPTPROGRAMM:
; Watchdog Löschen:
; =================
CLRWDT ; Watchdog Löschen
; Port A initialisieren und Tris Register setzten
; ===============================================
; 1 = EINGANG
; 0 = AUSGANG
; BIT 76543210
MOVLW B'00011111' ; APORT PIN 0 - 4 Eingang
MOVWF PORTA ; an den PORT Anlegen
BSF STATUS,RP0 ; Page Select ausführen 1
MOVWF TRISA ; ins Tris Register übernehmen
BCF STATUS,RP0 ; Page select wieder auf 0
; Port B initialisieren und Tris Register setzten
; ===============================================
; 1 = EINGANG
; 0 = AUSGANG
; BIT 76543210
MOVLW B'10000001' ; BPORT Pin 0 und 7 Ausgang, 1 - 6 Ausgang
MOVWF PORTB ; an den PortB legen
BSF STATUS,RP0 ; Page select ausführen 1
MOVWF TRISB ; PortB lesen und ins TRIS Register schreiben
BCF STATUS,RP0 ; Page select wieder auf 0
; TMR0 und Prescaler definieren
; =============================
; Bit Value TMR0 Rate t/count bei 4 MHz
; ------------------------------------------
; 000 1:2 2 uS
; 001 1:4 4 uS
; 010 1:8 8 uS
; 011 1:16 16 uS
; 100 1:32 32 uS
; 101 1:64 64 uS
; 110 1:128 128 uS
; 111 1:256 256 uS
BSF STATUS,RP0 ; Page Select 0
MOVLW B'11000100' ; Option Register laden mit: Pullup AUS / INT bei Wechsel von 0->1 / RTCC auf INTERN / Prescaler 1:32
MOVWF OPTION_REG ; In das Option Register schreiben
BCF STATUS,RP0 ; Page Select 1
; Portpins für den PCM1742 Labeln:
; ================================
; ACHTUNG HARDWARE GEÄNDERT WEGEN INTERRUPT EINGANG IR AUF RB0:
; =============================================================
#DEFINE ML PORTB,1 ; PCM 1742KE Latch
#DEFINE MC PORTB,2 ; PCM 1742KE Clock
#DEFINE MD PORTB,3 ; PCM 1742KE Data
; Portpins für den IR Empfänger und Fernbedienung Ausgang COMAG Labeln:
; =====================================================================
#DEFINE IR PORTB,0 ; Infrarot FB Eingangssignal von der Frontplatine
#DEFINE FBC PORTB,4 ; FB Ausgang zum ALI vom Emulator
; Portpins für den IR Indikator LED Labeln:
; =========================================
#DEFINE LEDI PORTB,5 ; LED IR Indikator (Blinkt bei Empfang von der Fernbedienung)
; Portpins für den Wahlschalter Firmware und Anzeige LED Labeln:
; ==============================================================
#DEFINE LED PORTB,6 ; LED AUS = COMAG Firmware / LED AN = Truman Firmware
#DEFINE TB PORTB,7 ; Schalter Eingang Comag oder Truman Firmware
; Anweisung für den Compiler / MPASM Microchip
; ============================================
#DEFINE TABLELENGTH d'238' ; Tabellelänge der Codes
; Grundzustände Herstellen, egal ob Truman Firmware oder Comag Firmware:
; ======================================================================
BSF ML ; Latch ist aktiv Low, Ruhezustand High
BCF MC ; Clock ist aktiv High, Ruhezustand Low
BSF FBC ; FBC ist aktiv LOW, Ruhezustand High
BCF LED ; LED Ausgeschaltet beim Einschalten des Receivers am Netzschalter
; Grundeinstellung nach dem Einschalten Speichern:
; ================================================
REINIT: CLRWDT ; Watchdog Löschen
CLRF ITE ; LÖSCHEN
BTFSC TB ; Aktuellen MODE Speichern
BSF ITE,7 ; 1 Speichern
; PCM 1742 KE Initialisieren:
; ===========================
CALL PCMINIT ; SOUNDINI Auswahl des Modes nun in der INIT Routine
; Truman Software Enable Abfragen, um Festzustellen ob die FB Emulation laufen soll oder nur Signale Relayed werden / HIGH = Truman / LOW = SL35:
; ======================================================================================================================================================
BTFSC TB ; Zeiter Test ob HIGH, wenn LOW (COMAG Ausgewählt) Überspringe nächste Zeile
GOTO FBEMU ; Springe in die Fernbedienungsemulation COMAG FB auf TRUMAN Firmware
; Truman Bit war nicht gesetzt,
; COMAG Fernbedienung für COMAG Orginal Firmware bzw. Truman, es werden nur die Eingangszustände auf den Ausgang gelegt:
; ======================================================================================================================
COMAG: CLRWDT ; Watchdog Löschen
BCF INTCON,GIE ; Generell Interrupt Disable (sonst würde ein IR Signal diese Routine Stören)
MOVF PORTA,W ; Port A Einlesen
MOVWF FRONTP ; Speichern im FR
BTFSC FRONTP,0 ; Auf 0 Testen / wenn 0 dann POWER Auslösen
GOTO FCPOWER ; Funktion POWER
BTFSC FRONTP,1 ; Auf 0 Testen / wenn 0 dann CH UP Auslösen
GOTO FCUP ; Funktion UP
BTFSC FRONTP,2 ; Auf 0 Testen / wenn 0 dann CH DOWN Auslösen
GOTO FCDOWN ; Funktion DOWN
MOVF PORTB,W ; Gesammten Port B Einlesen
ANDLW b'10000000' ; Bit 7 Filtern
XORWF ITE,W ; Neuen Zustand mit Alten Zustand Vergleichen
BTFSS STATUS,Z ; Zero Flag = 1 / MODE hat nicht gewechselt, Keine Reinitialisierung Notwendig
GOTO REINIT ; Zero Flag = 0 / MODE hat gewechselt, Reinitialisiere
BTFSC IR ; IR Eingang Abfragen, wenn 0 dann nächste Zeile Überspringen
BSF FBC ; FB AUSGANG zum COMAG auf High setzen
BTFSS IR ; IR EINGANG Abfragen, wenn 1 dann nächste Zeile Überspringen
BCF FBC ; FB AUSGANG zum COMAG auf LOW setzen
GOTO COMAG ; Do it Forever / bis zum Nächsten Ausschalten über den Netzschalter
; #############################################################################################################################
; Ab hier wirds TRICKY ( Tricky... Tricky... Tricky ...its Tricky
; Schlaflose Nächte, Viereckige Augen, der Penetrante Geruch von durch Lötspitzen verbrannten Fingern, Hurra wir Basteln
; #############################################################################################################################
; IR Empfänger mit Hilfe der Interruptroutine Abfragen und Auswerten:
; ===================================================================
FBEMU: MOVLW d'11' ; Anzahl der Bits im Datentelegramm der COMAG Fernbedienung
MOVWF ZWI ; Speichere im Zwischenspeicher für die Bit Abzählschleife
MOVLW d'215' ; Operationswert für die Ermittlung des Bitzustandes Anhand der Impulslänge
MOVWF ENT ; Speichern im FR
CLRF FIRST ; Merker für den Startimpuls Löschen
; Auswertungs Register Löschen (alte Werte):
; ==========================================
CLRF IRIN1 ; Löschen des 'alten' Inhaltes
CLRF ZEIT ; TMR0 Zwischenspeicher Löschen
CLRF ERGEB ; Speicher für Comag Index Löschen
CLRF VV ; Adressoffset für den Tabellensprung Löschen
CLRWDT ; Watchdog Löschen (alle 15 - 18 mS) sonst RESET
; Prüfen ob der Mode gewechselt werden soll:
; ==========================================
MOVF PORTB,W ; Gesammten Port B NEU Einlesen
ANDLW b'10000000' ; Unrelevante Bit's Ausblenden (Nur Bit 7 Interessant)
XORWF ITE,W ; Nun den NEUEN Zustand mit dem ALTEN Vergleichen
BTFSS STATUS,Z ; Zero Flag = 1 / MODE hat nicht gewechselt, Keine Reinitialisierung Notwendig
GOTO REINIT ; Zero Flag = 0 / MODE hat gewechselt, Reinitialisiere
; Interrupt Quelle Wählen:
; ========================
BSF INTCON,INTE ; RB-0 Interrupt Einschalten
; Ab jetzt Interrupt Erlauben:
; ============================
BSF INTCON,GIE ; Generell Interrupt Enable
CLRWDT ; Watchdog Löschen nur zur Sicherheit
; Startimpuls Filtern (Flag wird in der Interruptroutine gesetzt):
; ================================================================
STAIMP: BTFSS FIRST,0 ; Warten auf den ersten Interrupt (Startimpuls)
GOTO MCII ; Zwischendurch das Frontpannel und den Mode Schalter Überprüfen
GOTO WWW ; Startimpuls der FB Empfangen, nun zum Datenempfang Springen
; Prüfen ob der Mode gewechselt werden soll:
; ==========================================
MCII: MOVF PORTA,W ; Port A Einlesen
ANDLW b'00000111' ; Nur RA 0-2 Filtern
MOVWF FRONTP ; Speichern im FR
BTFSC FRONTP,0 ; Auf 0 Testen / wenn 1 dann POWER Auslösen
GOTO FPOWER ; Funktion POWER
BTFSC FRONTP,1 ; Auf 0 Testen / wenn 1 dann CH UP Auslösen
GOTO FUP ; Funktion UP
BTFSC FRONTP,2 ; Auf 0 Testen / wenn 1 dann CH DOWN Auslösen
GOTO FDOWN ; Funktion DOWN
MOVF PORTB,W ; Gesammten Port B NEU Einlesen
ANDLW b'10000000' ; Unrelevante Bit's Ausblenden (Nur Bit 7 Interessant)
XORWF ITE,W ; Nun den NEUEN Zustand mit dem ALTEN Vergleichen
BTFSS STATUS,Z ; Zero Flag = 1 / MODE hat nicht gewechselt, Keine Reinitialisierung Notwendig
GOTO REINIT ; Zero Flag = 0 / MODE hat gewechselt, Reinitialisiere
GOTO STAIMP ; Nein, der Erste Interrupt ist noch nicht Aufgetreten, Erneut auf FI Warten
; Flag für Datenimpuls setzen:
; ============================
WWW: BSF FIRST,1 ; STARTIMPULS VORBEI 0000 = Programmstart / 0001 = Startimpuls OK / 0011 = im Datenempfang
; Abfrage ob Datenempfang mit Hilfe des 'Datenempfang Flag's':
; ============================================================
DAIMP: BTFSC FIRST,1 ; Prüfen ob der nächste Interupt Ausgelöst wurde
GOTO DAIMP ; Nein, Warte auf Interrupt
; FUZZY LOGIC ZEIT (Impulslänge) Auswerten und Entsprechenden Bitzustand Zuweisen:
; ================================================================================
FLA: CLRWDT ; Watchdog Löschen
MOVF ZEIT,W ; Inhalt TMR0 von Interrupt1 zu Inerrupt2 in das Work kopieren
SUBWF ENT,W ; TMR0 - ENT = + XXX (1) oder -XXX (0)
BTFSS STATUS,C ; Carry ist 1 wenn Ergebniss negativ => 0 wurde Empfangen
GOTO SEIR1 ; CARRY = 0 / LANG / Bitzustand ist 1 gehe Zuweisen
GOTO SEIR0 ; CARRY = 1 / KURZ / Bitzustand ist 0 gehe Zuweisen
; Empfangenes Bit war eine 1:
; ===========================
SEIR1: BSF IRIN1,0 ; LSB Bit 0 auf 1 Setzen
GOTO FER ; Weiter zum Prüfen ob weitere Bit's Empfangen werden müßen
; Empfangenes Bit war eine 0:
;============================
SEIR0: BCF IRIN1,0 ; LSB Bit 0 auf 0 Setzen
; Prüfen ob alle 11 Bit's Empfangen wurden:
; =========================================
FER: DECFSZ ZWI,F ; Bitzähler -1
GOTO WEITER ; Noch nicht alle Bit's Empfangen
GOTO AUWEIA ; Alle 11 Bit's Empfangen nun zur Auswertung und Codewandlung gehen
; Schieben der FR NACH Bitzähler:
; ===============================
WEITER: RLF IRIN1,F ; Nach Links Schieben für den Empfang des nächsten Bit
BSF FIRST,1 ; Datenempfang Flag wieder setzen, wurde im Interrupt gelöscht
CLRWDT ; Watchdog Löschen
GOTO DAIMP ; Zurück zur Abfrage da noch nicht alle Bit's Empfangen wurden
; Alle 11 Bits sind nun in den Registern IRIN1 und IRIN2, nun an die Auswertung
; =============================================================================
; IRIN2 enthält nur einen Indikator für das Wechseln der Codefunktion:
; z.B.: Als 1'stes 'POWER' Taste Gedrückt IRN2 = 0000 0111 danach als 2'tes 'OK' Taste Gedrückt IRN2 = 0000 0101
; Dies wird hier nicht Gebraucht und deshalb braucht man das IRIN2 eigentlich nicht.
; DANKE an KOSOVO für den Hinweis
; FB COMAG Code wird aus dem EEPROM geholt und in einer Zählschleife Vergleichen.
; Stimmt der Empfangene Code mit einem COMAG Code dann addiere Zählerinhalt zum PC und hole Ausgabedaten im Trumanformat
; Wenn der Empfangene Code <> COMAG Code dann Ignorieren und erneut zur IR Abfrage Wechseln
; ACHTUNG: Wer 'TURBO ZAPPER' ist, der sollte sich eine Truman FB Kaufen, dies ist eine NOTLÖSUNG !
; Auch bitte keine Kritik das ab und zu die FB nicht Reagiert, siehe Oben.
; Wer es besser machen kann, sollte das Tun (!) und mir eine Kopie des Source Senden, ich Lernen gerne auch noch dazu.
; CODEVERGLEICH COMAG FERNBEDIENUNG:
; ==================================
AUWEIA: CLRWDT ; Watchdog Löschen
MOVLW d'00' ; Lade den Schleifenzähler mit der Ersten Adresse für das EEPROM
MOVWF ZWI ; Speichere im Schleifenzähler
; Daten aus dem EEPROM Holen:
; ===========================
LOS: CLRWDT ; Watchdog Löschen
BCF STATUS,RP0 ; Bank select 0
MOVF ZWI,W ; EEPROM Speicherstelle die Gelesen werden soll in das W Kopieren
MOVWF EEADR ; In das EEPROM Adressregister Schreiben
BSF STATUS,RP0 ; Bank select 1
BSF EECON1,RD ; EEprom Lesen
BCF STATUS,RP0 ; Bank select 0
MOVF EEDATA,W ; Lade WORK mit Bitmuster für die Taste XXX aus dem EEprom
MOVWF ZWI2 ; Speichere im Zwischenspeicher
; Hier findet der Vergleich Statt:
; ================================
MOVF IRIN1,W ; Lade W mit IRIN1 zum Vergleichen
XORWF ZWI2,W ; Exclusiv Oder Verknüpfen und Ergebniss im W speichern
BTFSS STATUS,Z ; Sind beide Wert identisch so wird das Zero Flag gesetzt / Überspringe nächste Zeile
GOTO LNT ; Der Vergleich war negativ, Lade nächste Bitfolge aus dem EEPROM
GOTO AUTRUFO ; Vergleich war positiv, Aktueller Wert in ZWI ist nun der INDEX für die Tabelle CODE TRUMAN Format
; Nächster Tastencode aus dem EEprom Holen:
; =========================================
LNT: INCF ZWI,F ; Schleifenzähler +1 (Index +1)
MOVLW d'33' ; Max 34 Befehle Vergleichen ( 0 - 33 )
XORWF ZWI,W ; Exclusiv ODER mit Work
BTFSS STATUS,Z ; Sind beide Wert identisch so wird das Zero Flag gesetzt / Überspringe nächste Zeile
GOTO LOS ; Hole den nächsten Wert aus dem EEPROM
; Kein Zeichen aus dem EEprom stimmt mit dem Empfangenen Zeichen Überein, gehe zurück zur FB Abfrage
; ==================================================================================================
GOTO FBEMU ; FB erneut Abfragen
; Frontpannel Auslöse Routine für den COMAG MODE:
; ===============================================
; POWER TASTE Manuel Ausgelöst:
; =============================
FCPOWER:MOVLW d'30' ; EEprom Speicherinhalt direkt Eingeben
MOVWF IHCS ; IM FR Speichern
GOTO COMAAA ; Ausgabe Aufrufen
; UP TASTE
; ========
FCUP: MOVLW d'40' ; EEprom Speicherinhalt direkt Eingeben
MOVWF IHCS ; IM FR Speichern
GOTO COMAAA ; Ausgabe Aufrufen
; DOWN TASTE
; ==========
FCDOWN: MOVLW d'42' ; EEprom Speicherinhalt direkt Eingeben
MOVWF IHCS ; IM FR Speichern
GOTO COMAAA ; Ausgabe Aufrufen
; Hier wird der zur Taste gehörende FB Code an den IR Eingang im COMAG Format Ausgegeben:
; =======================================================================================
COMAAA: BTFSS WETA,0 ; Wechsel Taste Speicher / Präambelwechsel wie Orginal
GOTO FIRS ; 101
GOTO LAST ; 111
FIRS: MOVLW d'247' ; Verzögerungszeit für 300 uS
MOVWF VERKO ; Speichere in der Verzögerungskonstante
BCF FBC ; LOW IMPULS von 300 uS (Start Impuls)
CALL VERZO ; Verzögerung Abarbeiten
BSF FBC ; HIGH Zustand Wiederherstellen
CALL COEI ; 1 Ausgeben
CALL CONU ; 0 Ausgeben
CALL COEI ; 1 Ausgeben
BSF WETA,0 ; wechsel merker
GOTO COSI ; weiter
LAST: MOVLW d'247' ; Verzögerungszeit für 300 uS
MOVWF VERKO ; Speichere in der Verzögerungskonstante
BCF FBC ; LOW IMPULS von 300 uS (Start Impuls)
CALL VERZO ; Verzögerung Abarbeiten
BSF FBC ; HIGH Zustand Wiederherstellen
CALL COEI ; 1 Ausgeben
CALL COEI ; 1 Ausgeben
CALL COEI ; 1 Ausgeben
BCF WETA,0 ; wechsel merker
GOTO COSI ; weiter
; Präambel gesendet, nun den FB CODE Senden:
; ==========================================
COSI: MOVLW d'08' ; 8 BIT Ausgeben
MOVWF SCHI ; Speichern im Schleifenregister
PCB: BTFSS IHCS,7 ; Bitzustand Prüfen
GOTO HELO ; LOW AUSGABE
CALL COEI ; 1 Ausgeben
RLF IHCS,F ; Nach Links Schieben, MSB FIRST
MEW: DECFSZ SCHI,F ; 8 Bit fertig ?
GOTO PCB ; Prüfe Comag BIT
MOVLW d'00' ; Volle Verzögerung
MOVWF VERKO ; Verzögerung
CALL VERZO ; Verzögerung
MOVLW d'00' ; Verzögerung
MOVWF VERKO ; Verzögerung
CALL VERZO ; Verzögerung
MOVLW d'00' ; Verzögerung
MOVWF VERKO ; Verzögerung
CALL VERZO ; Verzögerung
MOVLW d'00' ; Verzögerung
MOVWF VERKO ; Verzögerung
CALL VERZO ; Verzögerung
MOVLW d'00' ; Verzögerung
MOVWF VERKO ; Verzögerung
CALL VERZO ; Verzögerung
MOVLW d'00' ; Verzögerung
MOVWF VERKO ; Verzögerung
CALL VERZO ; Verzögerung
GOTO COMAG ; zurück zur Comag Routine
HELO: CALL CONU ; Null Ausgeben
RLF IHCS,F ; Nach Links Schieben
GOTO MEW ; Zurück zum Bitzähler
; CODE Ausgabe im Comag Mode für Frontpanel Tasten im FB Format:
; ==============================================================
; COMAG EINS
COEI: MOVLW d'28' ; Verzögerungszeit für 1 = 7,3 mS
MOVWF VERKO ; Speichere in der Verzögerungskonstante
CALL VERZO ; Verzögerung Abarbeiten
MOVLW d'249' ; Verzögerungszeit für 300 uS
MOVWF VERKO ; Speichere in der Verzögerungskonstante
BCF FBC ; LOW IMPULS von 300 uS
CALL VERZO ; Verzögerung Abarbeiten
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
BSF FBC ; HIGH Zustand Wiederherstellen
RETURN ; Zurück zum Aufrufenden Programmteil
; COMAG NULL
CONU: MOVLW d'106'
MOVWF VERKO ; Speichere in der Verzögerungskonstante
CALL VERZO ; Verzögerung Abarbeiten
MOVLW d'249' ; Verzögerungszeit für 300 uS
MOVWF VERKO ; Speichere in der Verzögerungskonstante
BCF FBC ; LOW IMPULS von 300 uS
CALL VERZO ; Verzögerung Abarbeiten
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
NOP ; Feinjustierung der Zeit auf 1 uS Genau
BSF FBC ; HIGH Zustand Wiederherstellen
RETURN ; Zurück zum Aufrufenden Programmteil
; Frontpannel Auslöse Routine für den TRUMAN MODE:
; ================================================
; POWER TASTE Manuel Ausgelöst:
; =============================
FPOWER: MOVLW d'00' ; EEprom Speicherstelle direkt Auswählen
MOVWF ZWI ; IM FR Speichern
GOTO AUTRUFO ; Ausgabe Aufrufen
; UP TASTE
; ========
FUP: MOVLW d'13' ; EEprom Speicherstelle direkt Auswählen
MOVWF ZWI ; IM FR Speichern
GOTO AUTRUFO ; Ausgabe Aufrufen
; DOWN TASTE
; ==========
FDOWN: MOVLW d'17' ; EEprom Speicherstelle direkt Auswählen
MOVWF ZWI ; IM FR Speichern
GOTO AUTRUFO ; Ausgabe Aufrufen
; Mit Hilfe des Schleifenzählers ist nun die Funktion Adressierbar, hier wird mit Hilfe des ZWI der zu Sendene TRUMAN Code
; aus einer Tabelle geholt und auf den IR Eingang des COMAG Ausgegeben
; ========================================================================================================================
AUTRUFO:BSF LEDI ; Erreichen dieser Position mit LED Anzeigen (Kann später auch al FB Indikator benutzt werden)
MOVF ZWI,W ; Lade Aktuelle Position des Schleifendurchlaufs (0 - 33)
MOVWF MULTI ; Multiplikator
CLRF ERGEB ; Ergebnis der letzten Adressoffset Berechnung für das Tabellenlesen Löschen
CLRWDT ; Watchdog Löschen
; Berechne die Startadresse für ein Lesen aus der CODE Tabelle Equivalent zum Ermittelten Comag CODE Index:
; =========================================================================================================
CALL AOERM ; Tabellen Offset Berechnen (pro Index + 7 Stellen)
CLRWDT ; Watchdog Löschen
; Hier findet der Eigentliche Sprung in die Tabelle statt:
; ========================================================
; 1'te Speicherstelle Auslesen
; ============================
MOVF ERGEB,W ; Tabellen Offset über das W Register nach VV
MOVWF VV ; Kopieren um den Orginal Inhalt von ERGEB nicht zu Verändern
MOVLW LOW TABLE ; Lade untere Adresse der Tabelle
ADDWF VV,F ; Addiere Offset mit Tabellenadresse
MOVLW HIGH TABLE ; Lade obere Adresse der Tabelle
BTFSC STATUS,C ; Prüfe ob die Obere Adresse in der 2'ten Bank ist
ADDLW d'01' ; JA, Addiere 1 zum Program Counter Latch
MOVWF PCLATH ; Speichere im PCL
MOVF VV,W ; Kopiere Offset ins Work
CALL TABLE ; Hole Byte aus der Tabelle von Position VV und kehre mit DATA XX im W zurück
MOVWF TCA1 ; 1'te Byte für die Spätere Verarbeitung in der Senderoutine Speichern
INCF ERGEB,F ; Erhöhe Adresse um eins (es müßen ja 7 Bytes gelesen werden)
CLRF VV ; Lösche die Alte Berechnung des Sprungadresse
CLRWDT ; Watchdog Löschen
; 2'te Speicherstelle Auslesen
; ============================
MOVF ERGEB,W ; Tabellen Offset über das W Register nach VV
MOVWF VV ; Kopieren um den Orginal Inhalt von ERGEB nicht zu Verändern
MOVLW LOW TABLE ; Lade untere Adresse der Tabelle
ADDWF VV,F ; Addiere Offset mit Tabellenadresse
MOVLW HIGH TABLE ; Lade obere Adresse der Tabelle
BTFSC STATUS,C ; Prüfe ob die Obere Adresse in der 2'ten Bank ist
ADDLW d'01' ; JA, Addiere 1 zum Program Counter Latch
MOVWF PCLATH ; Speichere im PCL
MOVF VV,W ; Kopiere Offset ins Work
CALL TABLE ; Hole Byte aus der Tabelle von Position VV und kehre mit DATA XX im W zurück
MOVWF TCA2 ; 2'te Byte für die Spätere Verarbeitung in der Senderoutine Speichern
INCF ERGEB,F ; Erhöhe Adresse um eins (es müßen ja 7 Bytes gelesen werden)
CLRF VV ; Lösche die Alte Berechnung des Sprungadresse
CLRWDT ; Watchdog Löschen
; 3'te Speicherstelle Auslesen
; ============================
MOVF ERGEB,W ; Tabellen Offset über das W Register nach VV
MOVWF VV ; Kopieren um den Orginal Inhalt von ERGEB nicht zu Verändern
MOVLW LOW TABLE ; Lade untere Adresse der Tabelle
ADDWF VV,F ; Addiere Offset mit Tabellenadresse
MOVLW HIGH TABLE ; Lade obere Adresse der Tabelle
BTFSC STATUS,C ; Prüfe ob die Obere Adresse in der 2'ten Bank ist
ADDLW d'01' ; JA, Addiere 1 zum Program Counter Latch
MOVWF PCLATH ; Speichere im PCL
MOVF VV,W ; Kopiere Offset ins Work
CALL TABLE ; Hole Byte aus der Tabelle von Position VV und kehre mit DATA XX im W zurück
MOVWF TCA3 ; 3'te Byte für die Spätere Verarbeitung in der Senderoutine Speichern
INCF ERGEB,F ; Erhöhe Adresse um eins (es müßen ja 7 Bytes gelesen werden)
CLRF VV ; Lösche die Alte Berechnung des Sprungadresse
CLRWDT ; Watchdog Löschen
; 4'te Speicherstelle Auslesen
; ============================
MOVF ERGEB,W ; Tabellen Offset über das W Register nach VV
MOVWF VV ; Kopieren um den Orginal Inhalt von ERGEB nicht zu Verändern
MOVLW LOW TABLE ; Lade untere Adresse der Tabelle
ADDWF VV,F ; Addiere Offset mit Tabellenadresse
MOVLW HIGH TABLE ; Lade obere Adresse der Tabelle
BTFSC STATUS,C ; Prüfe ob die Obere Adresse in der 2'ten Bank ist
ADDLW d'01' ; JA, Addiere 1 zum Program Counter Latch
MOVWF PCLATH ; Speichere im PCL
MOVF VV,W ; Kopiere Offset ins Work
CALL TABLE ; Hole Byte aus der Tabelle von Position VV und kehre mit DATA XX im W zurück
MOVWF TCA4 ; 4'te Byte für die Spätere Verarbeitung in der Senderoutine Speichern
INCF ERGEB,F ; Erhöhe Adresse um eins (es müßen ja 7 Bytes gelesen werden)
CLRF VV ; Lösche die Alte Berechnung des Sprungadresse
CLRWDT ; Watchdog Löschen
; 5'te Speicherstelle Auslesen
; ============================
MOVF ERGEB,W ; Tabellen Offset über das W Register nach VV
MOVWF VV ; Kopieren um den Orginal Inhalt von ERGEB nicht zu Verändern
MOVLW LOW TABLE ; Lade untere Adresse der Tabelle
ADDWF VV,F ; Addiere Offset mit Tabellenadresse
MOVLW HIGH TABLE ; Lade obere Adresse der Tabelle
BTFSC STATUS,C ; Prüfe ob die Obere Adresse in der 2'ten Bank ist
ADDLW d'01' ; JA, Addiere 1 zum Program Counter Latch
MOVWF PCLATH ; Speichere im PCL
MOVF VV,W ; Kopiere Offset ins Work
CALL TABLE ; Hole Byte aus der Tabelle von Position VV und kehre mit DATA XX im W zurück
MOVWF TCA5 ; 5'te Byte für die Spätere Verarbeitung in der Senderoutine Speichern
INCF ERGEB,F ; Erhöhe Adresse um eins (es müßen ja 7 Bytes gelesen werden)
CLRF VV ; Lösche die Alte Berechnung des Sprungadresse
CLRWDT ; Watchdog Löschen
; 6'te Speicherstelle Auslesen
; ============================
MOVF ERGEB,W ; Tabellen Offset über das W Register nach VV
MOVWF VV ; Kopieren um den Orginal Inhalt von ERGEB nicht zu Verändern
MOVLW LOW TABLE ; Lade untere Adresse der Tabelle
ADDWF VV,F ; Addiere Offset mit Tabellenadresse
MOVLW HIGH TABLE ; Lade obere Adresse der Tabelle
BTFSC STATUS,C ; Prüfe ob die Obere Adresse in der 2'ten Bank ist
ADDLW d'01' ; JA, Addiere 1 zum Program Counter Latch
MOVWF PCLATH ; Speichere im PCL
MOVF VV,W ; Kopiere Offset ins Work
CALL TABLE ; Hole Byte aus der Tabelle von Position VV und kehre mit DATA XX im W zurück
MOVWF TCA6 ; 6'te Byte für die Spätere Verarbeitung in der Senderoutine Speichern
INCF ERGEB,F ; Erhöhe Adresse um eins (es müßen ja 7 Bytes gelesen werden)
CLRF VV ; Lösche die Alte Berechnung des Sprungadresse
CLRWDT ; Watchdog Löschen
; 7'te Speicherstelle Auslesen
; ============================
MOVF ERGEB,W ; Tabellen Offset über das W Register nach VV
MOVWF VV ; Kopieren um den Orginal Inhalt von ERGEB nicht zu Verändern
MOVLW LOW TABLE ; Lade untere Adresse der Tabelle
ADDWF VV,F ; Addiere Offset mit Tabellenadresse
MOVLW HIGH TABLE ; Lade obere Adresse der Tabelle
BTFSC STATUS,C ; Prüfe ob die Obere Adresse in der 2'ten Bank ist
ADDLW d'01' ; JA, Addiere 1 zum Program Counter Latch
MOVWF PCLATH ; Speichere im PCL
MOVF VV,W ; Kopiere Offset ins Work
CALL TABLE ; Hole Byte aus der Tabelle von Position VV und kehre mit DATA XX im W zurück
MOVWF TCA8 ; 7'te Byte für die Spätere Verarbeitung in der Senderoutine Speichern
CLRF VV ; Lösche die Alte Berechnung des Sprungadresse
CLRWDT ; Watchdog Löschen
; Ausgabe zum IR Eingang der COMAG Hardware:
; ==========================================
CALL TRUSTA ; Truman IR Startsequenz Ausgeben
CALL CODAUS ; Truman CODE Ausgeben
CALL TRUSTO ; Truman Stopsequenz Ausgeben
BCF LEDI ; LED IR Indikator wieder Ausschalten wenn die Aussendung zum COMAG Erfolgt ist
; Alles Erledigt, Frage Fernbedienung erneut ab und Warte auf einen Befehl:
; =========================================================================
GOTO FBEMU ; Zurück zum Anfang
; Routine zur Codeausgabe im Truman Format:
; =========================================
CODAUS: MOVLW d'7' ; 1. Byte zu Senden (Inhalt 07) ist ein Statischer Wert, d.h. er ist in jedem Code immer gleich !
MOVWF ZWI ; Übergabe an die Ausgabe Routine mit Hilfe unseren Zwischenspeichers
CALL BYAUS ; Bytes Ausgeben auf FBC
MOVLW d'8' ; 2. Byte Senden (Inhalt = 08) ist ein Statischer Wert, d.h. er ist in jedem Code immer gleich !
MOVWF ZWI ; Übergabe an die Ausgabe Routine mit Hilfe unseren Zwischenspeichers
CALL BYAUS ; Bytes Ausgeben auf FBC
MOVF TCA1,W ; 3. Byte Senden, (Inhalt = XX) wurde aus der Tabelle Gelesen
MOVWF ZWI ; Übergabe an die Ausgabe Routine mit Hilfe unseren Zwischenspeichers
CALL BYAUS ; Bytes Ausgeben auf FBC
MOVF TCA2,W ; 4. Byte Senden, (Inhalt = XX) wurde aus der Tabelle Gelesen
MOVWF ZWI ; Übergabe an die Ausgabe Routine mit Hilfe unseren Zwischenspeichers
CALL BYAUS ; Bytes Ausgeben auf FBC
MOVF TCA3,W ; 5. Byte Senden, (Inhalt = XX) wurde aus der Tabelle Gelesen
MOVWF ZWI ; Übergabe an die Ausgabe Routine mit Hilfe unseren Zwischenspeichers
CALL BYAUS ; Bytes Ausgeben auf FBC
MOVF TCA4,W ; 6. Byte Senden, (Inhalt = XX) wurde aus der Tabelle Gelesen
MOVWF ZWI ; Übergabe an die Ausgabe Routine mit Hilfe unseren Zwischenspeichers
CALL BYAUS ; Bytes Ausgeben auf FBC
MOVF TCA5,W ; 7. Byte Senden, (Inhalt = XX) wurde aus der Tabelle Gelesen
MOVWF ZWI ; Übergabe an die Ausgabe Routine mit Hilfe unseren Zwischenspeichers
CALL BYAUS ; Bytes Ausgeben auf FBC
MOVF TCA6,W ; 8. Byte Senden, (Inhalt = XX) wurde aus der Tabelle Gelesen
MOVWF ZWI ; Übergabe an die Ausgabe Routine mit Hilfe unseren Zwischenspeichers
CALL BYAUS ; Bytes Ausgeben auf FBC
MOVLW d'1' ; 9. Byte zu Senden (Inhalt 01) ist ein Statischer Wert, d.h. er ist in jedem Code immer gleich !
MOVWF ZWI ; Übergabe an die Ausgabe Routine mit Hilfe unseren Zwischenspeichers
CALL BYAUS ; Bytes Ausgeben auf FBC
MOVF TCA8,W ; 10. Byte Senden, (Inhalt = XX) wurde aus der Tabelle Gelesen
MOVWF ZWI ; Übergabe an die Ausgabe Routine mit Hilfe unseren Zwischenspeichers
CALL BYAUS ; Bytes Ausgeben auf FBC
MOVLW d'1' ; 11. Byte zu Senden (Inhalt 01) ist ein Statischer Wert, d.h. er ist in jedem Code immer gleich !
MOVWF ZWI ; Übergabe an die Ausgabe Routine mit Hilfe unseren Zwischenspeichers
CALL BYAUS ; Bytes Ausgeben auf FBC
RETURN
; Startsequenz im Trumanformat: Low für 9,1 mS gefolgt von High für 4,4 mS
; ========================================================================
TRUSTA: BCF FBC ; FB Ausgang zum Receiver auf Low setzen
MOVLW d'00' ; Vorladen mit 0 ist nicht Stabil, da wir auf ZERO Flag testen, deshalb mit 1 Vorladen
MOVWF VERKO ; In das FR für die Verzögerungszeit Kopieren
CALL VERZO ; Verzögerungsroutine Aufrufen
MOVLW d'215' ; Vorladen 928 uS
MOVWF VERKO ; In das FR für die Verzögerungszeit Kopieren
CALL VERZO ; Verzögerungsroutine Aufrufen
BSF FBC ; FB Ausgang zum Receiver auf High setzen
MOVLW d'117' ; Vorladen für 4,4 mS
MOVWF VERKO ; In das FR für die Verzögerungszeit Kopieren
CALL VERZO ; Verzögerungsroutine Aufrufen
RETURN ; Zurück zum Aufrufenden Programmteil
; Stopsequenz im Trumanformat: High für 46,5 mS gefolgt von Low für 9,1 mS danach High für 2,1 mS und Low für 700 uS.
; ===================================================================================================================
TRUSTO: BSF FBC ; FB Ausgang zum Receiver auf High setzen
MOVLW d'05' ; Durchlaufschleifenzähler Laden
MOVWF ZWI ; im Zwischregister speichern
GACK: MOVLW d'00' ; Vorladen mit 8,61 mS
MOVWF VERKO ; In das FR für die Verzögerungszeit Kopieren
CALL VERZO ; Verzögerungsroutine Aufrufen
DECFSZ ZWI,F ; Schleifenzähler -1, auf 0 Testen und bei 0 nächste Zeile Überspringen
GOTO GACK ; Schleifenzähler ist noch nicht 0, also nochmal das ganze
MOVLW d'125' ; Vorladen 4,16 mS
MOVWF VERKO ; In das FR für die Verzögerungszeit Kopieren
CALL VERZO ; Verzögerungsroutine Aufrufen
BCF FBC ; FB Ausgang zum Receiver auf Low setzen
MOVLW d'01' ; Vorladen mit 0 ist nicht Stabil, da wir auf ZERO Flag testen, deshalb mit 1 Vorladen
MOVWF VERKO ; In das FR für die Verzögerungszeit Kopieren
CALL VERZO ; Verzögerungsroutine Aufrufen
MOVLW d'225' ; Vorladen 960 uS
MOVWF VERKO ; In das FR für die Verzögerungszeit Kopieren
CALL VERZO ; Verzögerungsroutine Aufrufen
BSF FBC ; FB Ausgang zum Receiver auf High setzen
MOVLW d'189' ; Vorladen 2,1 mS
MOVWF VERKO ; In das FR für die Verzögerungszeit Kopieren
CALL VERZO ; Verzögerungsroutine Aufrufen
BCF FBC ; FB Ausgang zum Receiver auf Low setzen
MOVLW d'233' ; Vorladen 704 uS
MOVWF VERKO ; In das FR für die Verzögerungszeit Kopieren
CALL VERZO ; Verzögerungsroutine Aufrufen
BSF FBC ; Ruhezustand Wiederherstellen
RETURN ; Zurück
; Byteausgabe im Trumanformat: Low für die Dauer von 700 uS, gefolgt von High für die Dauer von 400 uS LOW
; =======================================================================================================
BYAUS: BCF FBC ; FB Ausgang zum Receiver auf LOW setzen
MOVLW d'233' ; Vorladen 736 uS
MOVWF VERKO ; In das FR für die Verzögerungszeit Kopieren
CALL VERZO ; Verzögerungsroutine Aufrufen
BSF FBC ; IR EMU Ausgang auf High
MOVLW d'242' ; Vorladen 416 uS
MOVWF VERKO ; In das FR für die Verzögerungszeit Kopieren
CALL VERZO ; Verzögerungsroutine Aufrufen
DECFSZ ZWI,F ; Bitzähler -1, wenn 0 Überspringe nächste Zeile
GOTO BYAUS ; von vorne, noch nicht alle Bit's Übertragen
MOVLW d'208' ; Vorladen 1,536 mS
MOVWF VERKO ; In das FR für die Verzögerungszeit Kopieren
CALL VERZO ; Verzögerungsroutine Aufrufen
RETURN ; zurück zum Aufrufenden Programmteil
; Einfache Adressoffset Berechnung:
; =================================
AOERM:
; Zuerst Prüfen ob der Index 0 ist, dann ist die Startadresse der Tabelle = 1
MOVLW d'0' ; Vergleichswert Laden
XORWF MULTI,W ; Vergleichen
BTFSC STATUS,Z ; Prüfen ob gleich
GOTO WEIA ; Ja Inhalt ist 0, nun nur Ergebniss +1 als Startadresse
LUS: MOVF ERGEB,W ; Ergebnis der Adressberechnung ins W Laden
ADDLW d'07' ; Ergebnis +7
MOVWF ERGEB ; Speicher Ergebnis der Addition zurück in Ergebnis
DECFSZ MULTI,F ; Index -1, Wenn Index = 0 dann Überspringe nächste Zeile
GOTO LUS ; Index muß weiter Erhöht werden
WEIA: INCF ERGEB,F ; ERGEBNIS = ERGEBNIS +1
RETURN ; Zurück zum Aufrufenden Programmteil
; NEUE Init Sequenz des PCM DAC mit Wechsel des MODE:
; ===================================================
; Neue Modeumschaltung, läuft jetzt auch ohne Ausschalten am Netzschalter
; PCM 1742 Adress und Daten Register Zuweisen:
; ============================================
PCMINIT:MOVLW H'14' ; Register 20 (h14) Audio Data Format Control
MOVWF FDIX ; im Speicher Ablegen
BTFSC TB ; Auswahl Mode Abfragen
GOTO TRUSO ; Truman Sound INIT
; COMAG SOUND INIT:
; =================
MOVLW H'05' ; B0 / B1 / B2 = 101 FMT SET to 16-24 BIT Std., Left Justified Format
MOVWF LDDX ; im Speicher Ablegen
BCF LED ; Kontroll Lampe für den COMAG MODE Ausschalten
GOTO GOGO ; Zur Initialisierung gehen
; TRUMAN SOUND INIT:
; ==================
TRUSO: MOVLW H'03' ; B0 / B1 / B2 = 011 FMT SET to 16 BIT Std., RSV set to Zero, FLT default 0, RSV set to Zero
MOVWF LDDX ; im Speicher Ablegen
BSF LED ; Kontroll Lampe für den TRUMAN MODE Einschalten
; PCM Latch auf LOW setzen für Datenübernahme:
; ============================================
GOGO: BCF ML ; Latch des PCM auf LOW setzen
; MSB FIRST zuerst das REGISTER INDEX
; ===================================
MOVLW h'08' ; Lade Work mit Anzahl der Auszugebenden Bit's (Bitzähler Wert 8)
MOVWF ZWI ; speichere Zwischen
NNF1: RLF FDIX,W ; Indexbyte nun Bitweise nach Links durch das CARRY Schieben und im W Register speichern
BTFSC STATUS,C ; Carry Flag des Status Register prüfen ob eine 0 oder 1 als MD gesendet werden soll
BSF MD ; Carry war 1 also setze DATA auf HIGH
MOVWF FDIX ; Speichere Inhalt vom W zurück ins FR
CALL AUSGABE ; Gebe auf MD aus
DECFSZ ZWI,F ; Bitzähler -1, wenn 0 Überspringe nächste Zeile
GOTO NNF1 ; Bitzähler ist < 0, noch nicht alle Bits Ausgewertet und gesendet, Schleife
; MSB FIRST nun das DATAS REGISTER
; ================================
MOVLW h'08' ; Lade Work mit Anzahl der Auszugebenden Bit's (Bitzähler Wert 8)
MOVWF ZWI ; speichere Zwischen
NNF2: RLF LDDX,W ; Datenbyte nun Bitweise nach Links durch das CARRY Schieben und im W Register speichern
BTFSC STATUS,C ; Carry Flag des Status Register prüfen ob eine 0 oder 1 als MD gesendet werden soll
BSF MD ; Setze MD auf HIGH
MOVWF LDDX ; Speichere Inhalt vom W zurück ins FR
CALL AUSGABE ; Gebe auf MD aus
DECFSZ ZWI,F ; Bitzähler -1, wenn 0 Überspringe nächste Zeile
GOTO NNF2 ; Bitzähler ist < 0, noch nicht alle Bits Ausgewertet und gesendet, Schleife
; Daten sind gesendet, nun Latch des PCM wieder auf HIGH setzen zum Übernehmen der Daten
; ======================================================================================
BSF ML ; Latch auf High setzen
RETURN ; zurück zum Hauptprogramm
; Clock Leitung des PCM High / Low schalten
; =========================================
AUSGABE:BSF MC ; Clock High
BCF MC ; Clock Low
BCF MD ; MD zuücksetzen
RETURN
; NEUE VERZÖGERUNGS ROUTINE OHNE TMR0 (32 uS pro Teiler / Kalibrierbar in der ersten Zeile)
; =========================================================================================
VERZO: MOVLW d'09' ; Lade aktuellen Wert des Timers (24 +8 uS bei 4 MHz)
MOVWF ZWI2 ; Speichere im 2'ten Zwischenspeicher
VER1: DECFSZ ZWI2,F ; Inhalt von ZWI2 -1, wenn Null Überspringe die nächste Zeile
GOTO VER1 ; Weiter Verzögern
CLRWDT ; Watchdog Löschen
INCFSZ VERKO,F ; Inhalt von VERKO +1, wenn Null Überspringe nächste Zeile
GOTO VERZO ; Nochmaliger Durchlauf der Verzögerungsroutine
RETURN ; Zuück zum Aufrufenden Programmteil
; Speicherort in Ram / für den Compiler
; =====================================
ORG 0x2D9
; Tabelle der TRUMAN Codes von 1 - 34 Korospondiert mit dem im EEPROM gespeicherten COMAG Codes:
; ==============================================================================================
TABLE: MOVWF PCL
DT d'3', d'2', d'5', d'2', d'2', d'1', d'1' ; TRUMAN CODE 1 POWER
DT d'2', d'1', d'3', d'6', d'1', d'2', d'1' ; TRUMAN CODE 2 ROT
DT d'2', d'1', d'2', d'1', d'6', d'3', d'1' ; TRUMAN CODE 3 GRÜN
DT d'4', d'2', d'4', d'1', d'2', d'2', d'1' ; TRUMAN CODE 4 GELB
DT d'4', d'4', d'2', d'1', d'2', d'1', d'2' ; TRUMAN CODE 5 BLAU
DT d'2', d'1', d'1', d'2', d'7', d'2', d'1' ; TRUMAN CODE 6 SAT
DT d'2', d'3', d'1', d'5', d'1', d'3', d'1' ; TRUMAN CODE 7 TV/SAT
DT d'3', d'5', d'2', d'2', d'1', d'1', d'2' ; TRUMAN CODE 8 EPG
DT d'3', d'3', d'4', d'2', d'1', d'2', d'1' ; TRUMAN CODE 9 WEIß
DT d'2', d'6', d'3', d'1', d'1', d'1', d'2' ; TRUMAN CODE 10 EXIT
DT d'8', d'2', d'1', d'1', d'1', d'1', d'2' ; TRUMAN CODE 11 MENU
DT d'5', d'1', d'4', d'1', d'1', d'3', d'1' ; TRUMAN CODE 12 P/N
DT d'2', d'1', d'1', d'1', d'9', d'1', d'1' ; TRUMAN CODE 13 MUTE
DT d'2', d'1', d'2', d'7', d'2', d'1', d'1' ; TRUMAN CODE 14 CH UP
DT d'2', d'4', d'5', d'1', d'1', d'2', d'1' ; TRUMAN CODE 15 V-
DT d'2', d'2', d'1', d'6', d'3', d'1', d'1' ; TRUMAN CODE 16 OK
DT d'6', d'4', d'1', d'1', d'1', d'2', d'1' ; TRUMAN CODE 17 V+
DT d'3', d'1', d'1', d'5', d'4', d'1', d'1' ; TRUMAN CODE 18 CH DOWN
DT d'2', d'1', d'1', d'1', d'1', d'9', d'1' ; TRUMAN CODE 19 P+
DT d'3', d'1', d'1', d'1', d'4', d'5', d'1' ; TRUMAN CODE 20 P-
DT d'2', d'2', d'1', d'1', d'5', d'4', d'1' ; TRUMAN CODE 21 RECALL
DT d'3', d'1', d'2', d'4', d'3', d'2', d'1' ; TRUMAN CODE 22 FAV
DT d'2', d'9', d'1', d'1', d'1', d'1', d'1' ; TRUMAN CODE 23 1
DT d'3', d'7', d'2', d'1', d'1', d'1', d'1' ; TRUMAN CODE 24 2
DT d'2', d'1', d'9', d'1', d'1', d'1', d'1' ; TRUMAN CODE 25 3
DT d'4', d'6', d'1', d'2', d'1', d'1', d'1' ; TRUMAN CODE 26 4
DT d'2', d'2', d'7', d'2', d'1', d'1', d'1' ; TRUMAN CODE 27 5
DT d'3', d'1', d'6', d'3', d'1', d'1', d'1' ; TRUMAN CODE 28 6
DT d'2', d'1', d'1', d'9', d'1', d'1', d'1' ; TRUMAN CODE 29 7
DT d'5', d'5', d'1', d'1', d'2', d'1', d'1' ; TRUMAN CODE 30 8
DT d'2', d'3', d'6', d'1', d'2', d'1', d'1' ; TRUMAN CODE 31 9
DT d'3', d'2', d'1', d'4', d'2', d'3', d'1' ; TRUMAN CODE 32 INFO
DT d'10', d'1', d'1', d'1', d'1', d'1', d'1' ; TRUMAN CODE 33 0
DT d'2', d'2', d'4', d'3', d'2', d'1', d'2' ; TRUMAN CODE 34 SHIFT (ex. PAUSE)
; Über Shift "PAUSE" und Tast XX Erreichbar ; TRUMAN / COMAG
; ==========================================================================
DT d'2', d'1', d'1', d'4', d'5', d'1', d'2' ; F1 / 1
DT d'2', d'1', d'5', d'4', d'1', d'1', d'2' ; F2 / 2
DT d'3', d'1', d'4', d'2', d'3', d'1', d'2' ; HELP / 3
DT d'4', d'4', d'2', d'1', d'2', d'1', d'2' ; BLAU / 4
DT d'4', d'1', d'1', d'4', d'1', d'4', d'1' ; LUPE / 5
DT d'4', d'1', d'5', d'1', d'3', d'1', d'1' ; UHF / 6
DT d'2', d'2', d'2', d'5', d'2', d'2', d'1' ; TV/RADIO / 7
DT d'2', d'2', d'4', d'3', d'2', d'1', d'2' ; PAUSE / PAUSE
; Erste Adresse der EEprom Speichertabelle für die COMAG CODES:
; =============================================================
ORG h'2100'
; Maximal 64 Bytes können im internen EEprom des 16F84 gespeichert werden I I I I I I I
; EEPROM Daten COMAG CODE FUNKTION COMAG TRUMAN 7 8 X X X X X X 1 X 1 GETESTET
; ==========================================================================================================================
DE b'00011110' ; POWER Taste OK POWER 7 8 3 2 5 2 2 1 1 1 1 OK
DE b'00010000' ; ROT OK ROT 7 8 2 1 3 6 1 2 1 1 1 OK
DE b'00100010' ; GRÜN OK GRÜN 7 8 2 1 2 1 6 3 1 1 1 OK
DE b'00011001' ; GELB OK GELB 7 8 4 2 4 1 2 2 1 1 1 OK
DE b'00010100' ; BLAU OK BLAU 7 8 4 4 2 1 2 1 1 2 1 OK
DE b'00110010' ; AUDIO Taste <==> SAT 7 8 2 1 1 2 7 2 1 1 1 ??
DE b'00011010' ; TIMER Taste <==> TV/SAT 7 8 2 3 1 5 1 3 1 1 1 ??
DE b'00100110' ; EPG Taste OK EPG 7 8 3 5 2 2 1 1 1 2 1 OK
DE b'00100000' ; TEXT Taste OK WEIß 7 8 3 3 4 2 1 2 1 1 1 OK
DE b'00110000' ; EXIT Taste OK EXIT 7 8 2 6 3 1 1 1 1 2 1 OK
DE b'00100111' ; MENU Taste OK MENU 7 8 8 2 1 1 1 1 1 2 1 OK
DE b'00101111' ; M/P Taste <==> P/N 7 8 5 1 4 1 1 3 1 1 1 ??
DE b'00110111' ; MUTE Taste OK MUTE 7 8 2 1 1 1 9 1 1 1 1 OK
DE b'00101000' ; CH UP Taste OK CH UP 7 8 2 1 2 7 2 1 1 1 1 OK
DE b'00100001' ; V- Taste OK V- 7 8 6 4 1 1 1 2 1 1 1 OK
DE b'00101001' ; OK Taste OK OK 7 8 2 2 1 6 3 1 1 1 1 OK
DE b'00110001' ; V+ Taste OK V+ 7 8 2 4 5 1 1 2 1 1 1 OK
DE b'00101010' ; CH DOWN Taste OK CH DOWN 7 8 3 1 1 5 4 1 1 1 1 OK
DE b'00100011' ; P+ Taste OK P+ 7 8 2 1 1 1 1 9 1 1 1 OK
DE b'00011011' ; P- Taste OK P- 7 8 3 1 1 1 4 5 1 1 1 OK
DE b'00101110' ; RECALL Taste OK RECALL 7 8 2 2 1 1 5 4 1 1 1 OK
DE b'00011000' ; FAV Taste OK FAV 7 8 3 1 2 4 3 2 1 1 1 OK
DE b'00110101' ; 1 OK 1 7 8 2 9 1 1 1 1 1 1 1 OK
DE b'00101101' ; 2 OK 2 7 8 3 7 2 1 1 1 1 1 1 OK
DE b'00100101' ; 3 OK 3 7 8 2 1 9 1 1 1 1 1 1 OK
DE b'00011101' ; 4 OK 4 7 8 4 6 1 2 1 1 1 1 1 OK
DE b'00110100' ; 5 OK 5 7 8 2 2 7 2 1 1 1 1 1 OK
DE b'00101100' ; 6 OK 6 7 8 3 1 6 3 1 1 1 1 1 OK
DE b'00100100' ; 7 OK 7 7 8 2 1 1 9 1 1 1 1 1 OK
DE b'00011100' ; 8 OK 8 7 8 5 5 1 1 2 1 1 1 1 OK
DE b'00110011' ; 9 OK 9 7 8 2 3 6 1 2 1 1 1 1 OK
DE b'00110110' ; INFO Taste OK INFO 7 8 3 2 1 4 2 3 1 1 1 OK
DE b'00101011' ; 0 OK 0 7 8 10 1 1 1 1 1 1 1 1 OK
DE b'00011111' ; PAUSE Taste OK PAUSE 7 8 2 2 4 3 2 1 1 2 1 ??
DE "VINIX 2007"
; Diese Tasten sind nicht Verfügbar !
; ===================================
;
; BEI COMAG KEINE TASTE VORHANDEN UHF 7 8 4 1 5 1 3 1 1 1 1 wird nicht gebraucht
; BEI COMAG KEINE TASTE VORHANDEN F1 7 8 2 1 1 4 5 1 1 2 1 ???? Wofür
; BEI COMAG KEINE TASTE VORHANDEN F2 7 8 2 1 5 4 1 1 1 2 1 ???? Wofür
; BEI COMAG KEINE TASTE VORHANDEN HELP 7 8 3 1 4 2 3 1 1 2 1 ???? ?????
; BEI COMAG KEINE TASTE VORHANDEN TV/RADIO 7 8 2 2 2 5 2 2 1 1 1 wäre schön
; BEI COMAG KEINE TASTE VORHANDEN LUPE 7 8 4 1 1 4 1 4 1 1 1 ???? ?????
END
sl2
Lanza, si esto no se puede, a la papelera....
Última edición por vishero; 28/07/2007 a las 17:47.
|