asm den hex çeviri yardımı

Başlatan montoya, 15 Haziran 2014, 19:53:38

montoya

Selamlar iyi akşamlar;

Çok afedersiniz, elimde asm kodu var ama hex e çevirecek programım yok. Rica etsem aşağıdaki kodu hex e çevirebilir misiniz?


Saygılarımla.

; Binäruhr mit 6 Bit bei Sekunden und Minuten, 5 Bit bei Stunden
; LED-Array gemultiplext zwischen RA0 - RA2 und RB0 - RB5

; RA0 out		high-aktiv		Sekunden Zeile
; RA1 out		high-aktiv		Minuten Zeile
; RA2 out		high-aktiv		Stunden Zeile

; RA4 in 		-				DCF-Signal vom Empfänger (100ms oder 200ms high; 900ms oder 800ms low)

; RA3 in 		high-aktiv		Taster Abfrage (gemultiplext mit RA0 - RA2)
; RB6 in		low-aktiv		Spannungskontrolle

; RB0 out		low-aktiv		2^0 Bit
; RB1 out		low-aktiv		2^1 Bit
; RB2 out		low-aktiv		2^2 Bit
; RB3 out		low-aktiv		2^3 Bit
; RB4 out		low-aktiv		2^4 Bit
; RB5 out		low-aktiv		2^5 Bit
;**************************************************************
	#include <P16f84A.INC>
	__CONFIG	_PWRTE_ON & _WDT_OFF & _XT_OSC 
;**************************************************************
; Variablennamen vergeben
Help_w		Equ			0x22	; Hilfsarbeitspeicher
Aloops		Equ			0x23	; Zähler für Warteschleife 
Bloops		Equ			0x24	; Zähler für Warteschleife 
Bits		Equ			0x25	; Speicherstelle für einzelne Bits

T1_Wert		Equ			0x26	; Betätigungszeit Taster1 Messen
T2_Wert		Equ			0x27	; Betätigungszeit Taster2 Messen
T3_Wert		Equ			0x28	; Betätigungszeit Taster3 Messen

DCF_Zeit_L	Equ			0x29	; Zeit die das DCF_Signal Low ist
DCF_Zeit_H	Equ			0x2a	; Zeit die das DCF_Signal High ist
DCF_BitN	Equ			0x2b	; Zählt mit, welches Bit vom DCF nun kommt
DCF_WertM	Equ			0x2c	; Zähler zur Mittelung des DCF-Signals
DCF_ok		Equ			0x2d	; Stundenwechsel seit dem letzten erfolgreichen DCF-Empfang, 7 Bit gehört nicht zum Zähler

Teiler		Equ			0x2e	; Teiler für weiteres Herunterteilen des Timers

Sekunden	Equ			0x2f	; Speicher für die aktuellen Sekunden
Minuten		Equ			0x30	; Speicher für die aktuellen Minuten
Stunden		Equ			0x31	; Speicher für die aktuellen Stunden

Min_dcf_zw	Equ			0x32	; Zwischenspeicher für die empfangenen DCF Minuten
Std_dcf_zw	Equ			0x33	; Zwischenspeicher für die empfangenen DCF Stunden

Sek_dcf		Equ			0x34	; Speicher für die empfangenen DCF Sekunden
Min_dcf		Equ			0x35	; Speicher für die empfangenen DCF Minuten
Std_dcf		Equ			0x36	; Speicher für die empfangenen DCF Stunden

Help_w1		Equ			0x37

; Konstanten definieren
#define		DCF_Bit_L	Bits,0
#define		DCF_Bit_H	Bits,1
#define		DCF_Good	Bits,2
#define		DCF_PortM	Bits,3
#define		DCF_ON		Bits,4

#define		Power_Good	PORTB,6
#define		DCF_Port	PORTA,4

#define		Sec_Zeile	PORTA,0
#define		Min_Zeile	PORTA,1
#define		Std_Zeile	PORTA,2
#define		T_Input		PORTA,3

;**************************************************************
; Initialisieren

; Ausgänge und 256 Hz-Timer einstellen
	bsf		STATUS,RP0		; auf Bank 1 umschalten
	movlw	B'10000010'
	movwf	OPTION_REG		; internen Takt zählen, Vorteiler zum Timer0, 8:1
	movlw	B'11111000'	
	movwf	TRISA			; PortA RA0-RA2 output, RA3,RA4 input
	movlw	B'11000000'
	movwf	TRISB			; PortB RB0-RB5 output, RB6 input
	bcf		STATUS,RP0		; auf Bank 0 zurückschalten
	clrf	TMR0			; (((2097152Hz : 4 ): 8 ): 256 = 256 Hz)

; Variablen setzen
	clrf	T1_Wert
	clrf	T2_Wert
	clrf	T3_Wert
	clrf	Sekunden
	clrf	Minuten
	clrf	Stunden
	clrf	Bits
	clrf	Teiler
	clrf	DCF_WertM
	bsf		DCF_WertM,3
	clrf	Min_dcf_zw
	clrf	Std_dcf_zw
	clrf	Min_dcf
	clrf	Std_dcf
	clrf	Sek_dcf
	clrf	DCF_Zeit_L
	clrf	DCF_Zeit_H	
	clrf	DCF_BitN
	clrf	DCF_ok
	bsf		DCF_ON
;**************************************************************
	goto all_on
;**************************************************************
; Tabelle für die Bitwertigkeit der empfangenen Bits (dcf)
table
	movwf	Help_w1			; Den Wert des Aufrufs zwischenspeichern
	andlw	B'11111000'		; Und Vergleichen, nur Werte zwischen 0 und 7 kommen durch
	btfss	STATUS,Z
	retlw	d'0'			; Wert über 7 => Zurück mit Wert 0
	movfw	Help_w1
	addwf	PCL,1			; Die Wertigkeiten der Bits anspringen
	retlw	d'0'			; 20  28
	retlw	D'1'			; 21  29
	retlw	D'2'			; 22  30
	retlw	D'4'			; 23  31
	retlw	D'8'			; 24  32
	retlw	D'10'			; 25  33
	retlw	D'20'			; 26  34
	retlw	D'40'			; 27
;**************************************************************
; Alle LEDs kurz Aufblitzen lassen
all_on
	bsf		Sec_Zeile
	bsf		Min_Zeile
	bsf		Std_Zeile		; Alle Zeilen an
	clrf	PORTB			; Alle LEDs an
	movlw	D'250'			; 25 ms Pause
	call	wait
	bcf		Sec_Zeile
	bcf		Min_Zeile
	bcf		Std_Zeile		; Alle Zeilen aus
;**************************************************************
; Anzeige Hauptschleife
anzeige
; Sekunden Anzeigen, Taster 1 abfragen
	comf	Sekunden,0		; Sekunden laden und negieren
	btfss	DCF_ok,7		; Wenn DCF_ok,7 = 0, dann LEDs auslassen
	movlw	B'11111111'
	movwf	PORTB			; Sekunden in PORTB schreiben
	bsf		Sec_Zeile		; Sekunden an
	movlw	D'3'			; 0.3 ms Pause
	call	wait
	clrz
	btfsc	T_Input
	incf	T1_Wert,1		; Wenn Taster 1 gedrückt, dann erhöhen
	btfsc	STATUS,Z		; Wenn Taster 1 lange genug gedrückt(Überlauf; 256 Durchläufe; 1,14s), dann zum einstellmod
	goto	einstellmod
	btfss	T_Input
	clrf	T1_Wert			; Wenn Taster 1 nicht gedrückt, dann Zähler löschen
	clrf	PORTB
	bcf		Sec_Zeile		; Sekunden aus
	movlw	D'12'			; 1.2 ms Pause
	call	wait

; Minuten Anzeigen
	comf	Minuten,0		; Minuten laden und negieren
	btfss	DCF_ok,7		; Wenn DCF_ok,7 = 0, dann LEDs auslassen
	movlw	B'11111111'
	movwf	PORTB			; Minuten in PORTB schreiben
	bsf		Min_Zeile		; Minuten an
	movlw	D'3'			; 0.3 ms Pause
	call	wait
	clrf	PORTB
	bcf		Min_Zeile		; Minuten aus
	movlw	D'12'			; 1.2 ms Pause
	call	wait

; Stunden Anzeigen
	comf	Stunden,0		; Stunden laden und negieren
	btfss	DCF_ok,7		; Wenn DCF_ok,7 = 0, dann LEDs auslassen
	movlw	B'11111111'
	movwf	PORTB			; Stunden in PORTB schreiben
	bsf		Std_Zeile		; Stunden an
	movlw	D'3'			; 0.3 ms Pause
	call	wait
	clrf	PORTB
	bcf		Std_Zeile		; Stunden aus
	movlw	D'12'			; 1.2 ms Pause
	call	wait

	goto	anzeige			; Wiederholen
;**********************************************************
; Schleife wird 256 mal pro Sekunde ausgeführt
zaehler
; Diese Schleife nur ausführen, wenn noch mindestens 0.5 ms gewartet werden soll
	movlw	D'5'
	subwf	Aloops,0
	btfss	STATUS,C
	return					; Wenn Aloops größer als 5, dann nicht zurück

	movlw	D'3'
	subwf	Aloops,1		; Die Zeit, die die Schleifen etwa brauchen werden (ca 0.3ms) von der Wartevariable abziehen

	bcf		INTCON,T0IF		; Interruptbit wieder löschen um das nächste Interrupt zu bemerken

; Tiefpass mit nachgeschaltetem Schmitt-Trigger
	btfsc	DCF_Port
	incf 	DCF_WertM,1		; Wenn DCF-Port 1, dann Mittelwert hochzählen
	btfss	DCF_Port
	decf 	DCF_WertM,1		; Wenn DCF-Port 0, dann Mittelwert runterzählen

	btfsc	DCF_WertM,7		; Wenn DCF_WertM,7 = 1, dann Wert größer 128, negativer Überlauf
	bcf		DCF_PortM		; DCF_PortM auf 0
	btfsc	DCF_WertM,7
	incf 	DCF_WertM,1		; Wert wieder in den gewünschten Bereich zurückbringen

	btfsc	DCF_WertM,3		; Wenn DCF_WertM,3 = 1, dann Wert auf 8 gestiegen, Grenze 
	bsf		DCF_PortM		; DCF_PortM auf 1
	btfsc	DCF_WertM,3
	decf 	DCF_WertM,1		; Wert wieder in den gewünschten Bereich zurückbringen

	call	anzeige_flacker	; Erzeugt Flackern falls letzter erfolgreicher DCF-Empfang zu lange zurückliegt

	btfss	DCF_ON
	bcf		DCF_PortM		; Wenn DCF_ON nicht 1, dann DCF_PortM immer wieder auf 0 => kein DCF-Empfang
	btfss	DCF_ON
	bsf		DCF_ok,7		; Wenn DCF_ON nicht 1, dann DCF_Bit_OK immer 1, weil im Quarzmodus der Empfang nie zu lang her sein kann

	call	dcf_zeit_fax	; DCF-Signale Auswerten, wenn eine gültige Zeit in Speicher, dann ist Sek_dcf größer 0 

	incf 	Teiler,1		; Teiler um 1 erhöhen
	btfss	STATUS,Z
	return					; Wenn Teiler noch nicht überläuft, dann zurück

	call	zaehler_normal	; Sonst die Zähler bedienen
	call	zaehler_dcf

	return
;**********************************************************
; Stellt die Anzeige für 8/256 aus, um zu signalisieren, dass letzter gültiger Empfang zu lange her
anzeige_flacker
	bsf		DCF_ok,7

	movlw	B'10000000'
	xorwf	DCF_ok,0
	btfss	STATUS,Z
	return					; Wenn DCF_ok gleich 128 (nur Bit gesetzt, Zähler aber auf Null), dann flackern und nicht zurück

	movlw	D'245'
	subwf	Teiler,0
	btfsc	STATUS,C
	bcf		DCF_ok,7		; Wenn Teiler größer als 245, dann Anzeige aus

	return
;**********************************************************
; Normaler Zähler, der mit dem Teiler (Quarz und DCF abhängig) die Zeit zählt
zaehler_normal
	incf 	Sekunden,1		; Sekunden um 1 erhöhen

	movlw	D'60'
	xorwf	Sekunden,0
	btfss	STATUS,Z		
	return					; Wenn Sekunden noch nicht 60, dann zurück

	incf 	Minuten,1		; Minuten um 1 erhöhen
	clrf	Sekunden		; Sekunden löschen

	movlw	D'60'
	xorwf	Minuten,0
	btfss	STATUS,Z
	return					; Wenn Minuten noch nicht 60, dann zurück

	incf 	Stunden,1		; Stunden um 1 erhöhen
	clrf	Minuten			; Minuten löschen

	movlw	D'24'
	xorwf	Stunden,0
	btfsc	STATUS,Z
	clrf	Stunden			; Wenn Vergleich 0 ergibt, war Stunden vorher 24

	movlw	B'01111111'
	andwf	DCF_ok,0
	btfss	STATUS,Z
	decf	DCF_ok,1		; Wenn DCF_ok ohne das Bit geleich 0, dann nicht mehr runterzählen, Empfang zu lange her

	return
;**********************************************************
; Schreibt bei gültigem Empfang zur vollen Minute die neue Zeit in die normalen Variablen
zaehler_dcf
	movf	Sek_dcf,1		; Wenn Sek_dcf gleich 0, dann zurück, weil kein gültiger Empfang vorliegt
	btfsc	STATUS,Z
	return

	incf 	Sek_dcf,1		; Sek_dcf um 1 erhöhen

	movlw	D'60'
	xorwf	Sek_dcf,0
	btfss	STATUS,Z		
	return					; Wenn Sek_dcf noch nicht 60, dann zurück

	movfw	Min_dcf			; Min_dcf nach Minuten schreiben
	movwf	Minuten
	movfw	Std_dcf			; Std_dcf nach Stunden schreiben
	movwf	Stunden
	clrf	Sek_dcf			; Sek_dcf löschen
	clrf	Sekunden		; Sekunden löschen

	movlw	D'24'			; Erfolgreicher Empfang, Countdown wieder auf 24 Stunden setzen
	movwf	DCF_ok

	return
;**********************************************************
dcf_zeit_fax
; Liest die Daten aus dem DCF Brief, Aufruf 256 mal die Sekunde

; Wartet auf mindestens 1 Sekunde Pause im DCF um den Anfang zu erkennen
	btfsc	DCF_PortM		; Wenn 1, dann DCF_Zeit_H erhöhen 
	incf 	DCF_Zeit_H,1
	btfsc	DCF_PortM		; Wenn 1, dann DCF_Zeit_L löschen
	clrf 	DCF_Zeit_L

	clrz
	btfss	DCF_PortM		; Wenn DCF-Port 0, dann DCF_Zeit_L erhöhen
	incf 	DCF_Zeit_L,1
	btfsc	STATUS,Z		; Wenn DCF_Zeit_L überläuft, dann 1 Sekunde Pause im Signal => neues Fax
	clrf 	DCF_BitN
	btfsc	STATUS,Z
	clrf 	Min_dcf_zw
	btfsc	STATUS,Z
	clrf 	Std_dcf_zw

; Länge der Signale messen um zu entscheiden, ob es korrekt als 1 oder 0 erkannt wurde
	btfsc	DCF_PortM		; Wenn DCF-Port 1, dann zurück
	return

	movf	DCF_Zeit_H,1	; Wenn DCF_Zeit_H gleich 0, dann zurück		
	btfsc	STATUS,Z
	return

	bcf		DCF_Bit_L		; Wenn high dann eine 0
	bcf		DCF_Bit_H		; Wenn high dann eine 1

	movlw	D'18'
	subwf	DCF_Zeit_H,0
	btfsc	STATUS,C
	bsf		DCF_Bit_L		; Wenn DCF_Zeit_H größer als 18, dann war Signal länger als 0,07 Sekunden => lang genug für eine 0

	movlw	D'34'
	subwf	DCF_Zeit_H,0
	btfsc	STATUS,C
	bcf		DCF_Bit_L		; Wenn DCF_Zeit_H größer als 34, dann war Signal länger als 0,13 Sekunden => zu lang für eine 0

	movlw	D'44'
	subwf	DCF_Zeit_H,0
	btfsc	STATUS,C
	bsf		DCF_Bit_H		; Wenn DCF_Zeit_H größer als 44, dann war Signal länger als 0,17 Sekunden => lang genug für eine 1

	movlw	D'59'
	subwf	DCF_Zeit_H,0
	btfsc	STATUS,C
	bcf		DCF_Bit_H		; Wenn DCF_Zeit_H größer als 59, dann war Signal länger als 0,23 Sekunden => zu lang für eine 1

	bcf		DCF_Good		; Mindestens DCF_Bit_H = 1 oder DCF_Bit_L = 1, dann wird DCF_Good gesetzt
	btfsc	DCF_Bit_H
	bsf		DCF_Good
	btfsc	DCF_Bit_L
	bsf		DCF_Good

	btfss	DCF_Good		; Wenn ein Error, dann DCF_BitN auf 0 um neu zu beginnen, verzichte auf return
	clrf	DCF_BitN
	btfsc	DCF_Good		; Wenn ein kein Error...
	call	teiler_dcf_sync

	clrf	DCF_Zeit_H		; DCF_Zeit_H ausgewertet, wieder löschen (erst hier, damit in teiler_dcf_sync vorhanden)

; Die Bits nach Wertigkeit zuordnen
	movlw	D'20'
	subwf	DCF_BitN,0
	call	table
	btfss	DCF_Bit_H
	clrw
	addwf	Min_dcf_zw,1

	movlw	D'28'
	subwf	DCF_BitN,0
	call	table
	btfss	DCF_Bit_H
	clrw
	addwf	Std_dcf_zw,1

	movlw	D'34'			; Zeit empfangen, jetzt prüfen
	xorwf	DCF_BitN,0
	btfsc	STATUS,Z
	call	dcf_zeit_test	; DCF-Zeit auf Schlüssigkeit prüfen

	incf 	DCF_BitN,1
	return
;**********************************************************
teiler_dcf_sync
	movfw	DCF_Zeit_H		; Teiler_dcf syncronisieren
	subwf	Teiler,0
	btfss	STATUS,C
	incf 	Teiler,1		; Wenn Teiler_dcf kleiner als DCF_Zeit_H => + 1, incf, weil Carry unbeeinflusst
	btfsc	STATUS,C
	decf 	Teiler,1		; Wenn Teiler_dcf größer als DCF_Zeit_H => - 1, decf, weil Carry unbeeinflusst
	return
;**********************************************************
; Überprüft die empfangenen Zeiten auf Schlüssigkeit, bei Zeitumstellung Syncronisation mit 1 min Verspätung
dcf_zeit_test
	movlw	D'34'			; Sek_dcf auf die 34 Sekunde setzen
	movwf	Sek_dcf

	incf	Min_dcf,1		; Zählt die Min_dcf hoch um zu gucken ob sie dann mit Min_dcf_zw passen 
	movlw	D'60'
	subwf	Min_dcf,0
	btfsc	STATUS,C
	clrf	Min_dcf
	btfsc	STATUS,C
	incf	Std_dcf,1		; Wenn die Min_dcf überlaufen, dann auch die Std_dcf_zw +1
	movfw	Min_dcf
	xorwf	Min_dcf_zw,0
	btfss	STATUS,Z
	clrf	Sek_dcf			; Wenn die Minuten passen, dann Sek_dcf nicht löschen

	movlw	D'24'			; Vergleicht Std_dcf mit Std_dcf_zw, wenn gleich, dann ok
	subwf	Std_dcf,0
	btfsc	STATUS,C
	clrf	Std_dcf
	movfw	Std_dcf
	xorwf	Std_dcf_zw,0
	btfss	STATUS,Z
	clrf	Sek_dcf

	movfw	Min_dcf_zw		; Min_dcf und Std_dcf mit Aktuellem füllen
	movwf	Min_dcf
	movfw	Std_dcf_zw
	movwf	Std_dcf

	return
;**********************************************************
einstellmod
	movlw	B'11111111'
	movwf	PORTB			; Alle Transistoren aus
	bsf		Sec_Zeile		; Nur Sekundenzeile an
	movlw	D'100'			; 10 ms Pause
	call	wait
	btfsc	T_Input
	goto	einstellmod		; Warten bis Taster losgelassen 
	bcf		Sec_Zeile		; Jetzt Sekundenzeile aus
	clrf	T1_Wert
	clrf	T2_Wert
	clrf	T3_Wert

dcf_test
	movlw	B'11100000'
	movwf	PORTB

	bsf		Sec_Zeile
	bsf		Min_Zeile
	bsf		Std_Zeile

	btfss	DCF_Port
	bsf		PORTB,2

	btfss	DCF_ON
	bsf		PORTB,1
	btfss	DCF_ON
	bsf		PORTB,3

	call	pol_taster
	btfsc	T1_Wert,7		; Taster 1 nächster Modus
	goto 	edit_sek_on

	btfsc	T2_Wert,7		; Taster 2 DCF off
	bcf 	DCF_ON

	btfsc	T3_Wert,7		; Taster 3	DCF on
	bsf		DCF_ON

	goto 	dcf_test

edit_sek_on
	bsf		Sec_Zeile
	bcf		Min_Zeile
	bcf		Std_Zeile		; Nur Sekunden an
	clrf	PORTB
	movlw	D'250'			; 25 ms Pause
	call	wait
	bcf		Sec_Zeile		; Sekunden aus

edit_sec
	call	pol_taster

	comf	Sekunden,0		; Sekunden laden und negieren
	movwf	PORTB			; Sekunden in PORTB schreiben
	bsf		Sec_Zeile		; Sekunden an

	btfsc	T1_Wert,7		; Taster 1 nächster Modus
	goto 	edit_min_on

	btfsc	T2_Wert,7
	clrf	Sekunden
	btfsc	T2_Wert,7
	clrf	Teiler

	btfsc	T3_Wert,7
	clrf	Sekunden
	btfsc	T3_Wert,7
	clrf	Teiler

	goto	edit_sec

edit_min_on
	bcf		Sec_Zeile
	bsf		Min_Zeile
	bcf		Std_Zeile		; Nur Minuten an
	clrf	PORTB
	movlw	D'250'			; 25 ms Pause
	call	wait
	bcf		Min_Zeile		; Minuten aus

edit_min
	call	pol_taster

	comf	Minuten,0		; Minuten laden und negieren
	movwf	PORTB			; Minuten in PORTB schreiben
	bsf		Min_Zeile		; Minuten an

	btfsc	T1_Wert,7		; Taster 1 nächster Modus
	goto 	edit_std_on

	btfsc	T2_Wert,7
	incf	Minuten,1
	movlw	B'00111100'
	xorwf	Minuten,0
	btfsc	STATUS,Z
	clrf	Minuten

	btfsc	T3_Wert,7
	decf	Minuten,1
	movlw	B'11111111'
	xorwf	Minuten,0
	btfsc	STATUS,Z
	movlw	B'00111011'
	btfsc	STATUS,Z
	movwf	Minuten			; Wenn -1 (255), dann Minuten auf 59 stellen

	goto	edit_min

edit_std_on
	bcf		Sec_Zeile
	bcf		Min_Zeile
	bsf		Std_Zeile		; Nur Stunden an
	clrf	PORTB
	movlw	D'250'			; 25 ms Pause
	call	wait
	bcf		Std_Zeile		; Stunden aus

edit_std
	call	pol_taster

	comf	Stunden,0		; Stunden laden und negieren
	movwf	PORTB			; Stunden in PORTB schreiben
	bsf		Std_Zeile		; Stunden an

	btfsc	T1_Wert,7		; Taster 1 nächster Modus
	goto 	all_on

	btfsc	T2_Wert,7
	incf	Stunden,1
	movlw	B'00011000'
	xorwf	Stunden,0
	btfsc	STATUS,Z
	clrf	Stunden

	btfsc	T3_Wert,7
	decf	Stunden,1
	movlw	B'11111111'
	xorwf	Stunden,0
	btfsc	STATUS,Z
	movlw	B'00010111'
	btfsc	STATUS,Z
	movwf	Stunden			; Wenn -1 (255), dann Stunden auf 23 stellen

	goto	edit_std

pol_taster
	movlw	D'3'			; 0.3 ms Pause, die Zeit für die Anzeige
	call	wait
	bcf		Sec_Zeile
	bcf		Min_Zeile
	bcf		Std_Zeile		; Alle Zeilen aus
	movlw	B'11111111'		; Alle LEDs aus
	movwf	PORTB
	movlw	D'3'			; 0.3 ms Pause, damit LEDs sicher aus
	call	wait

; Drücken von Taster 1 Überwachen
	bsf		Sec_Zeile		; Taster 1 an
	movfw	T1_Wert
	call	ask_taster
	movwf	T1_Wert
	bcf		Sec_Zeile		; Taster 1 aus

; Drücken von Taster 2 Überwachen
	bsf		Min_Zeile		; Taster 2 an
	movfw	T2_Wert
	call	ask_taster
	movwf	T2_Wert
	bcf		Min_Zeile		; Taster 2 aus

; Drücken von Taster 3 Überwachen
	bsf		Std_Zeile		; Taster 3 an
	movfw	T3_Wert
	call	ask_taster
	movwf	T3_Wert
	bcf		Std_Zeile		; Taster 3 aus

	movlw	D'3'			; 0.3 ms Pause, damit LEDs sicher aus
	call	wait

	return
;**********************************************************
ask_taster
	movwf	Help_w
	bcf		Help_w,7		; Den Wert im Hilfsspeicher speichern und das Tasterbit löschen
	incf	Help_w,1		; Den Wert 1 hochzählen

	btfsc	Help_w,5
	bsf		Help_w,7
	btfss	Help_w,6
	bcf		Help_w,7		; Wenn Bit 5 (8)  und Bit 6 (64, Schnellbit) wahr, dann Taster Bit setzen
	btfsc	Help_w,7
	bcf		Help_w,5		; Wurde Tasterbit gesetzt, dann Bit 5 zurücksetzen

	movlw	D'12'
	call	wait			; 1,2 ms Pause damit Tastersignal sicher gewechselt und LED ON/OFF Verhältnis stimmt

	btfss	T_Input
	bsf		Help_w,7		; Taster nicht mehr gedrückt Tasterbit auch setzen

	movlw	B'01111100'
	andwf	Help_w,0
	btfsc	STATUS,Z
	bcf		Help_w,7		; Wenn der Wert noch nicht größer als 3, dann kann Tasterbit nie gesetzt sein 
	
	movlw	B'10000000'
	btfss	T_Input
	andwf	Help_w,1		; Taster nicht mehr gedrückt Zähler resetten, Tasterbit lassen

	movfw	Help_w
	return
;**********************************************************
; Ohne Anzeige
power_save
	movlw	B'11111111'
	movwf	PORTB
	movlw	B'00000000'
	movwf	PORTA			; Alle Transistoren aus

	movlw	D'5'			; Zeitkonstante setzen, damit Zähler ausgeführt werden kann
	movwf	Aloops
	btfsc	INTCON,T0IF		; Wenn Interuptbit gesetzt ist...
	call	zaehler

	btfsc	Power_Good
	goto	power_save
	return
;**********************************************************
; Warteschleife
wait
	movwf	Aloops			; Zeitkonstante für gewünschte Wartezeit in 0.1 ms
await
	movlw	D'5'			; Zeitkonstante für 0.1ms
	movwf	Bloops
	btfsc	INTCON,T0IF		; Wenn Interuptbit gesetzt ist...
	call	zaehler
	btfsc	Power_Good
	call	power_save		; Wenn der Power_Good Pin high wird dann Anzeige aus
	nop
	nop
bwait
	nop
	nop
	nop
	nop
	nop
	decfsz	Bloops, F		; 0.1 ms vorbei?
	goto	bwait			; nein, noch nicht
	decfsz	Aloops, F		; Wunschzeit vorbei?
	goto	await			; nein, noch nicht
	return					; das Warten hat ein Ende
;**********************************************************
	end


ipek

#1
:020000040000FA
:10000000831682308100F8308500C030860083126C
:100010008101A601A701A801AF01B001B101A501AD
:10002000AE01AC01AC15B201B301B501B601B4012A
:10003000A901AA01AB01AD0125162C28B700F8399A
:10004000031D0034370882070034013402340434BD
:1000500008340A341434283405148514051586012F
:10006000FA30B7210510851005112F09AD1FFF309B
:10007000860005140330B72103118519A60A031958
:100080000F29851DA601860105100C30B721300906
:10009000AD1FFF30860085140330B721860185101F
:1000A0000C30B7213109AD1FFF3086000515033034
:1000B000B721860105110C30B72135280530230200
:1000C000031C08000330A3020B11051AAC0A051E1D
:1000D000AC03AC1BA511AC1BAC0AAC19A515AC1933
:1000E000AC037D20251EA511251EAD17AE20AE0A3E
:1000F000031D080087209D200800AD1780302D06C5
:10010000031D0800F5302E020318AD130800AF0AD6
:100110003C302F06031D0800B00AAF013C3030060A
:10012000031D0800B10AB001183031060319B101EE
:100130007F302D05031DAD030800B4080319080026
:10014000B40A3C303406031D08003508B0003608F8
:10015000B100B401AF011830AD000800A519AA0A1A
:10016000A519A9010311A51DA90A0319AB010319BA
:10017000B2010319B301A5190800AA080319080060
:100180002510A51012302A020318251422302A0245
:10019000031825102C302A020318A5143B302A021C
:1001A0000318A5102511A518251525182515251D99
:1001B000AB012519EE20AA0114302B021E20A51C2C
:1001C0000301B2071C302B021E20A51C0301B3073C
:1001D00022302B060319F520AB0A08002A082E024C
:1001E000031CAE0A0318AE0308002230B400B50A9F
:1001F0003C3035020318B5010318B60A350832063B
:10020000031DB401183036020318B6013608330650
:10021000031DB4013208B5003308B6000800FF30F2
:10022000860005146430B72185190F290510A60131
:10023000A701A801E0308600051485140515051EE8
:100240000615251E8614251E86157B21A61B2D2925
:10025000A71B2512A81B25161A29051485100511A0
:100260008601FA30B72105107B212F09860005147D
:10027000A61B4329A71BAF01A71BAE01A81BAF01FB
:10028000A81BAE0134290510851405118601FA302A
:10029000B72185107B21300986008514A61B5F29B4
:1002A000A71BB00A3C3030060319B001A81BB003ED
:1002B000FF30300603193B300319B0004A290510FE
:1002C000851005158601FA30B72105117B2131090A
:1002D00086000515A61B2C28A71BB10A183031066D
:1002E0000319B101A81BB103FF3031060319173000
:1002F0000319B10066290330B721051085100511D7
:10030000FF3086000330B721051426089621A60089
:100310000510851427089621A700851005152808C3
:100320009621A80005110330B7210800A200A213EE
:10033000A20AA21AA217221FA213A21BA2120C30F9
:10034000B721851DA2177C3022050319A213803026
:10035000851DA20522080800FF30860000308500B8
:100360000530A3000B195E20061BAC290800A30072
:100370000530A4000B195E20061BAC210000000014
:1003800000000000000000000000A40BC029A30B27
:04039000B829080080
:02400E00F13F80
:00000001FF


mesaj birleştirme:: 15 Haziran 2014, 21:36:53

bir txt dosyası yarat. kod seç ile kopyala,yaptığın dosyaya yapıştır.işlem bitince dosyanın soy adını hex olarak değiştir.

montoya

Hocam çok teşekkürler, zahmet oldu.

montoya

Selam;
Aşağıdaki koduda çevirebilir misiniz? Mplab'ı kurdum, kendim yapıp öğrenmek için ama sürekli hata alıyorum aşağıdaki kodda.
Symbol not previously defined (TMR0IF) bu hatayı alıyorum.

Nasıl çözebilirim bunu?

list p=16F628
include <P16F628.INC>

;TITLE "Smazlogio v1.7"
;AUTHOR Santelelle


 ;min 1 porta.2
 ;min 2 porta.3
 ;min 4 porta.4
 ;min 8 portb.0
 ;min 16 portb.1
 ;min 32 portb.3

 ;portb minutes b'00001011'
 ;porta minutes b'00011100'

 ;ore 1 porta.1
 ;ore 2 porta.0
 ;ore 4 porta.7
 ;ore 8 porta.6

 ;portb hours b'00000000'
 ;porta hours b'11000011'

 ;pulsante sinistro  portb.4
 ;pulsante destro    portb.5

 ;led MODE portb.3

SEC   EQU  0x20
MIN  EQU   0x21
ORE EQU   0x22
W_TEMP EQU 0x23
S_TEMP EQU 0x24
TMR1_INTERRUPT_FLAG EQU 0x25
LED_ON EQU 0x26
CONTATORE_PULSANTE1 EQU 0x27
PROGRAM EQU 0x28
DELAY_COUNTER EQU 0x29
TMR0_INTERRUPT_FLAG EQU 0x2A
CONTATORE EQU 0x2B
PORTB_INTERRUPT_FLAG EQU 0x2C
CONTATORE_PULSANTE2 EQU 0x2D

  ORG   0000H
    goto  START
;

  ORG   0004H            ;interrupt occurred
      BTFSC PIR1, TMR1IF   ;Timer1 overflowed?
         call T1_OVERFL    ;YES, Service the Timer1 Overflow Interrupt
      BTFSC INTCON,RBIF        ;portb changed?
         call PORTB_INTERRUPT  ;goto portb_interrupt routine
      BTFSC INTCON,TMR0IF        ;portb changed?
         call TMR0_INTERRUPT  ;goto portb_interrupt routine
      retfie
;
; Should NEVER get here
;
  ERROR1 ; NO, Unknown Interrupt Source
  BSF PORTA , 4 ; Toggle a port pin to indicate error
  BCF PORTA , 4
  GOTO ERROR1

START

;inizializzazione variabili
      bcf INTCON,GIE            ;global interrupt enable

      clrf SEC
      clrf MIN
      clrf ORE
      clrf TMR1_INTERRUPT_FLAG
      clrf LED_ON
      clrf PROGRAM
      clrf TMR0_INTERRUPT_FLAG
      clrf CONTATORE
      clrf PORTB_INTERRUPT_FLAG
      clrf DELAY_COUNTER

;fine inizializzazione variabili

;settaggio registri
      bcf   STATUS,RP0   ; select bank0
      clrf  PORTA
      bsf   STATUS,RP0   ; select bank1
      movlw b'00100000'
      movwf TRISA
    
      bcf  STATUS,RP0  ; select bank0
      clrf PORTB
      bsf  STATUS,RP0  ; select bank1
      movlw b'11110000'
      movwf TRISB
     

      bsf  STATUS,RP0  ; select bank1
      movlw b'00000111'
      movwf OPTION_REG 

      movlw b'00000001'  ; enable TMR1 overflow
      movwf PIE1

      movlw b'00000011'
      movwf PCON

      bcf  STATUS,RP0  ; select bank0

      movlw b'00000111'
      movwf CMCON 

      clrf PORTA      ; accende tutti i led
      clrf PORTB      ; accende tutti i led
;fine settaggio registri


ASPETTA_PULS                     ;until the button isn't pushed the program doesn't start
     btfsc PORTB,4               ;
         goto ASPETTA_PULS       ;

      movlw b'11111111'          ;turn off all portb
      movwf PORTA                ;
      movlw b'11111111'          ;turn off all portb
      movwf PORTB                ;

      ;movlw b'00001111'          ;set timer1 as external asyncronous counter
      movlw b'00111111'          ;16 seconds
      movwf T1CON                ;

      goto PROGRAMMING_MODE
    


m_cicle                          ;main cicle

      btfsc TMR1_INTERRUPT_FLAG,0     ;if an interrupt occurred
         call AGGIORNA_ORA       ;upgrade time
  
      btfss TMR0_INTERRUPT_FLAG,0
         goto NO_TMR0_INTERRUPT
      bcf TMR0_INTERRUPT_FLAG,0
      clrf CONTATORE
      bcf LED_ON,0
      clrf CONTATORE
NO_TMR0_INTERRUPT


      btfss PORTB_INTERRUPT_FLAG,0  
         goto NO_PORTB_INTERRUPT
      bcf PORTB_INTERRUPT_FLAG,0 

      btfss PORTB,4
         incf CONTATORE

   bsf LED_ON,0
      clrf TMR0
      bcf INTCON,T0IF           ;clear the interrupt TMR0 flag
      bsf INTCON,T0IE           ;activate timer0 interrupt
NO_PORTB_INTERRUPT


      movlw b'00001000'
      subwf CONTATORE,0
      btfsc STATUS,Z
         goto PROGRAMMING_MODE

      btfss LED_ON,0             ;se è attivo il flag accende i led
         goto NO_OUTPUT
      call OUTPUT_MINUTI
      call OUTPUT_ORE
      goto  m_cicle

NO_OUTPUT
       
       call ALL_LED_OFF

       sleep;

goto   m_cicle             ;end main cicle


PROGRAMMING_MODE

     bcf INTCON,GIE        ;disables interrupt

     bcf INTCON,RBIF
     bcf INTCON,TMR0IF
     bcf PIR1, TMR1IF

     call ALL_LED_OFF
     bcf PORTB,2         ;turn on blue led
     clrf MIN
     clrf ORE
     call DELAY

     clrf CONTATORE_PULSANTE1
     clrf CONTATORE_PULSANTE2
     clrf CONTATORE

PROG_MINUTI
;
     btfss PORTB,4
        incf CONTATORE_PULSANTE1
     btfsc PORTB,4
        clrf CONTATORE_PULSANTE1
     movlw b'00001110'
     subwf CONTATORE_PULSANTE1,w
     btfsc STATUS,Z
        goto RELASE_CYCLE1R_
;
     btfss PORTB,5
        incf CONTATORE_PULSANTE2
     btfsc PORTB,5
        clrf CONTATORE_PULSANTE2 
     movlw b'00001110'
     subwf CONTATORE_PULSANTE2,w
     btfsc STATUS,Z
        goto RELASE_CYCLE1L_

     goto PROG_MINUTI
;
RELASE_CYCLE1R_
    incf MIN
    call OUTPUT_MINUTI
    clrf CONTATORE_PULSANTE1
    clrf CONTATORE_PULSANTE2
RELASE_CYCLE1R
    btfss PORTB,4
       clrf CONTATORE_PULSANTE1
    btfsc PORTB,4
       incf CONTATORE_PULSANTE1
    movlw b'00001110'
    subwf CONTATORE_PULSANTE1,w
    btfsc STATUS,Z
        goto PROG_MINUTI
    goto RELASE_CYCLE1R
;
   
RELASE_CYCLE1L_
    clrf CONTATORE_PULSANTE1
    clrf CONTATORE_PULSANTE2
RELASE_CYCLE1L
    btfss PORTB,5
       clrf CONTATORE_PULSANTE2
    btfsc PORTB,5
       incf CONTATORE_PULSANTE2
    movlw b'00001110'
    subwf CONTATORE_PULSANTE2,w
    btfsc STATUS,Z
        goto PROG_HOUR_
    goto RELASE_CYCLE1L
;;
PROG_HOUR_
    clrf CONTATORE_PULSANTE1
    clrf CONTATORE_PULSANTE2
PROG_HOUR
     btfss PORTB,4
        incf CONTATORE_PULSANTE1
     btfsc PORTB,4
        clrf CONTATORE_PULSANTE1
     movlw b'00001110'
     subwf CONTATORE_PULSANTE1,w
     btfsc STATUS,Z
        goto RELASE_CYCLE2R_

     btfss PORTB,5
        incf CONTATORE_PULSANTE2
     btfsc PORTB,5
        clrf CONTATORE_PULSANTE2 
    movlw b'00001110'
    subwf CONTATORE_PULSANTE2,w
     btfsc STATUS,Z
        goto RELASE_CYCLE2L_
     goto PROG_HOUR

RELASE_CYCLE2R_
    incf ORE
     call OUTPUT_ORE
    clrf CONTATORE_PULSANTE1
    clrf CONTATORE_PULSANTE2
RELASE_CYCLE2R
    btfss PORTB,4
       clrf CONTATORE_PULSANTE1
    btfsc PORTB,4
       incf CONTATORE_PULSANTE1
    movlw b'00001110'
    subwf CONTATORE_PULSANTE1,w
    btfsc STATUS,Z
        goto PROG_HOUR
    goto RELASE_CYCLE2R

   
RELASE_CYCLE2L_
    clrf CONTATORE_PULSANTE1
    clrf CONTATORE_PULSANTE2
RELASE_CYCLE2L
    btfss PORTB,5
       clrf CONTATORE_PULSANTE2
    btfsc PORTB,5
       incf CONTATORE_PULSANTE2
    movlw b'00001110'
    subwf CONTATORE_PULSANTE2,w
    btfsc STATUS,Z
        goto END_PROGRAMMING
    goto RELASE_CYCLE2L

END_PROGRAMMING

     call ALL_LED_OFF
     bcf T1CON,T1OSCEN
     clrf TMR1H
     clrf TMR1L
     bsf T1CON,T1OSCEN

     bsf INTCON,RBIE           ;portb interrupt on change enable
     bsf INTCON,PEIE           ;peripheral interrupt enable
     bsf INTCON,GIE            ;global interrupt enable

goto m_cicle


ALL_LED_OFF
   movlw b'11111111'
   movwf PORTA
   movwf PORTB
return


OUTPUT_MINUTI

      movlw b'00001011'
      iorwf PORTB,f
      movlw b'00011100'
      iorwf PORTA,f

      btfsc MIN,0
         bcf PORTA,2
      btfsc MIN,1
         bcf PORTA,3
      btfsc MIN,2
         bcf PORTA,4
      btfsc MIN,3
         bcf PORTB,0
      btfsc MIN,4
         bcf PORTB,1
      btfsc MIN,5
         bcf PORTB,3
return

OUTPUT_ORE

      movlw b'11000011'
      iorwf PORTA,f

      btfsc ORE,0
         bcf PORTA,1
      btfsc ORE,1
         bcf PORTA,0
      btfsc ORE,2
         bcf PORTA,7
      btfsc ORE,3
         bcf PORTA,6
     
return


AGGIORNA_ORA

      bcf TMR1_INTERRUPT_FLAG,0        ;clear interrupt TMR1 flag

      ;incf SEC                    ;inc seconds
      ;incf SEC                    ;inc seconds

      movlw b'00010000'
      addwf SEC,f

      movlw b'00111100'           ;are seconds >= 60?
      subwf SEC,W                 ;
      btfsc STATUS,C              ;
      call INC_MIN             ; call the function that increment minutes

      movlw b'00111100'           ;are minutes >= 60?
      subwf MIN,W                 ;
      btfsc STATUS,Z              ;
      call INC_ORE             ; call the function that increment hours
      movlw b'11111111'
     
return                           ;return to main

INC_MIN                           ;increment minutes
      incf MIN,f 
      movlw b'00111100'           ;seconds = seconds - 60                 
      subwf SEC , f               ;
return

INC_ORE                           ;increment minutes
      incf ORE                    ;inc ore
      movlw b'00111100'           ;minutes = minutes - 60                 
      subwf MIN , f               ;

      movlw b'00001100'           ;are hours = 12?
      subwf ORE,W                 ;
      btfsc STATUS,Z              ;
      clrf ORE                 ; if hours=12 then hours=0
return


TMR0_INTERRUPT
      bsf TMR0_INTERRUPT_FLAG,0
      bcf INTCON,T0IF
      bcf INTCON,T0IE
      bsf INTCON,7        ;enable interrupt
return

PORTB_INTERRUPT
      movf PORTB,w
      bcf INTCON,RBIF

      btfss PORTB,4
         goto SET_PORTB_FLAG
      btfss PORTB,5
         goto SET_PORTB_FLAG
      bsf INTCON,7        ;enable interrupt
      return

SET_PORTB_FLAG
      bsf PORTB_INTERRUPT_FLAG,0 
      bsf INTCON,7        ;enable interrupt
return

T1_OVERFL                        ;TMR1 overflowed
      bsf TMR1_INTERRUPT_FLAG,0
      bcf PIR1, TMR1IF ; Clear Timer1 Interrupt Flag
      bsf INTCON,7        ;enable interrupt
return

DELAY
     clrf DELAY_COUNTER
DELAY_CYCLE
     incf DELAY_COUNTER
     btfss STATUS,Z
        goto DELAY_CYCLE
return



end

94220039

Bilgisayarındaki P16F628.INC dosyasını aşağıdaki ile değiştrirsen sorunun çözülecektir.


        LIST

;==========================================================================
;  MPASM PIC16F628 processor include
; 
;  (c) Copyright 1999-2012 Microchip Technology, All rights reserved
;==========================================================================

        NOLIST

;==========================================================================
;  This header file defines configurations, registers, and other useful
;  bits of information for the PIC16F628 microcontroller.  These names
;  are taken to match the data sheets as closely as possible.
;
;  Note that the processor must be selected before this file is included.
;  The processor may be selected the following ways:
;
;       1. Command line switch:
;               C:\MPASM MYFILE.ASM /PIC16F628
;       2. LIST directive in the source file
;               LIST   P=PIC16F628
;       3. Processor Type entry in the MPASM full-screen interface
;       4. Setting the processor in the MPLAB Project Dialog
;==========================================================================

;==========================================================================
;
;       Verify Processor
;
;==========================================================================
        IFNDEF __16F628
           MESSG "Processor-header file mismatch.  Verify selected processor."
        ENDIF



;==========================================================================
;
;       Register Definitions
;
;==========================================================================

W                EQU  H'0000'
F                EQU  H'0001'

;----- Register Files -----------------------------------------------------

;-----Bank0------------------
INDF             EQU  H'0000'
TMR0             EQU  H'0001'
PCL              EQU  H'0002'
STATUS           EQU  H'0003'
FSR              EQU  H'0004'
PORTA            EQU  H'0005'
PORTB            EQU  H'0006'
PCLATH           EQU  H'000A'
INTCON           EQU  H'000B'
PIR1             EQU  H'000C'
TMR1             EQU  H'000E'
TMR1L            EQU  H'000E'
TMR1H            EQU  H'000F'
T1CON            EQU  H'0010'
TMR2             EQU  H'0011'
T2CON            EQU  H'0012'
CCPR1            EQU  H'0015'
CCPR1L           EQU  H'0015'
CCPR1H           EQU  H'0016'
CCP1CON          EQU  H'0017'
RCSTA            EQU  H'0018'
TXREG            EQU  H'0019'
RCREG            EQU  H'001A'
CMCON            EQU  H'001F'

;-----Bank1------------------
OPTION_REG       EQU  H'0081'
TRISA            EQU  H'0085'
TRISB            EQU  H'0086'
PIE1             EQU  H'008C'
PCON             EQU  H'008E'
PR2              EQU  H'0092'
TXSTA            EQU  H'0098'
SPBRG            EQU  H'0099'
EEDATA           EQU  H'009A'
EEADR            EQU  H'009B'
EECON1           EQU  H'009C'
EECON2           EQU  H'009D'
VRCON            EQU  H'009F'

;----- STATUS Bits -----------------------------------------------------
C                EQU  H'0000'
DC               EQU  H'0001'
Z                EQU  H'0002'
NOT_PD           EQU  H'0003'
NOT_TO           EQU  H'0004'
IRP              EQU  H'0007'

RP0              EQU  H'0005'
RP1              EQU  H'0006'


;----- PORTA Bits -----------------------------------------------------
RA0              EQU  H'0000'
RA1              EQU  H'0001'
RA2              EQU  H'0002'
RA3              EQU  H'0003'
RA4              EQU  H'0004'
RA5              EQU  H'0005'
RA6              EQU  H'0006'
RA7              EQU  H'0007'


;----- PORTB Bits -----------------------------------------------------
RB0              EQU  H'0000'
RB1              EQU  H'0001'
RB2              EQU  H'0002'
RB3              EQU  H'0003'
RB4              EQU  H'0004'
RB5              EQU  H'0005'
RB6              EQU  H'0006'
RB7              EQU  H'0007'


;----- INTCON Bits -----------------------------------------------------
RBIF             EQU  H'0000'
INTF             EQU  H'0001'
T0IF             EQU  H'0002'
RBIE             EQU  H'0003'
INTE             EQU  H'0004'
T0IE             EQU  H'0005'
PEIE             EQU  H'0006'
GIE              EQU  H'0007'

TMR0IF           EQU  H'0002'
TMR0IE           EQU  H'0005'


;----- PIR1 Bits -----------------------------------------------------
TMR1IF           EQU  H'0000'
TMR2IF           EQU  H'0001'
CCP1IF           EQU  H'0002'
TXIF             EQU  H'0004'
RCIF             EQU  H'0005'
CMIF             EQU  H'0006'
EEIF             EQU  H'0007'


;----- T1CON Bits -----------------------------------------------------
TMR1ON           EQU  H'0000'
TMR1CS           EQU  H'0001'
NOT_T1SYNC       EQU  H'0002'
T1OSCEN          EQU  H'0003'

T1CKPS0          EQU  H'0004'
T1CKPS1          EQU  H'0005'


;----- T2CON Bits -----------------------------------------------------
TMR2ON           EQU  H'0002'

T2CKPS0          EQU  H'0000'
T2CKPS1          EQU  H'0001'
TOUTPS0          EQU  H'0003'
TOUTPS1          EQU  H'0004'
TOUTPS2          EQU  H'0005'
TOUTPS3          EQU  H'0006'


;----- CCP1CON Bits -----------------------------------------------------
CCP1Y            EQU  H'0004'
CCP1X            EQU  H'0005'

CCP1M0           EQU  H'0000'
CCP1M1           EQU  H'0001'
CCP1M2           EQU  H'0002'
CCP1M3           EQU  H'0003'


;----- RCSTA Bits -----------------------------------------------------
RX9D             EQU  H'0000'
OERR             EQU  H'0001'
FERR             EQU  H'0002'
ADEN             EQU  H'0003'
CREN             EQU  H'0004'
SREN             EQU  H'0005'
RX9              EQU  H'0006'
SPEN             EQU  H'0007'

ADDEN            EQU  H'0003'


;----- CMCON Bits -----------------------------------------------------
CIS              EQU  H'0003'
C1INV            EQU  H'0004'
C2INV            EQU  H'0005'
C1OUT            EQU  H'0006'
C2OUT            EQU  H'0007'

CM0              EQU  H'0000'
CM1              EQU  H'0001'
CM2              EQU  H'0002'


;----- OPTION_REG Bits -----------------------------------------------------
PSA              EQU  H'0003'
T0SE             EQU  H'0004'
T0CS             EQU  H'0005'
INTEDG           EQU  H'0006'
NOT_RBPU         EQU  H'0007'

PS0              EQU  H'0000'
PS1              EQU  H'0001'
PS2              EQU  H'0002'


;----- TRISA Bits -----------------------------------------------------
TRISA0           EQU  H'0000'
TRISA1           EQU  H'0001'
TRISA2           EQU  H'0002'
TRISA3           EQU  H'0003'
TRISA4           EQU  H'0004'
TRISA5           EQU  H'0005'
TRISA6           EQU  H'0006'
TRISA7           EQU  H'0007'


;----- TRISB Bits -----------------------------------------------------
TRISB0           EQU  H'0000'
TRISB1           EQU  H'0001'
TRISB2           EQU  H'0002'
TRISB3           EQU  H'0003'
TRISB4           EQU  H'0004'
TRISB5           EQU  H'0005'
TRISB6           EQU  H'0006'
TRISB7           EQU  H'0007'


;----- PIE1 Bits -----------------------------------------------------
TMR1IE           EQU  H'0000'
TMR2IE           EQU  H'0001'
CCP1IE           EQU  H'0002'
TXIE             EQU  H'0004'
RCIE             EQU  H'0005'
CMIE             EQU  H'0006'
EEIE             EQU  H'0007'


;----- PCON Bits -----------------------------------------------------
NOT_BOR          EQU  H'0000'
NOT_POR          EQU  H'0001'
OSCF             EQU  H'0003'

NOT_BO           EQU  H'0000'

NOT_BOD          EQU  H'0000'


;----- TXSTA Bits -----------------------------------------------------
TX9D             EQU  H'0000'
TRMT             EQU  H'0001'
BRGH             EQU  H'0002'
SYNC             EQU  H'0004'
TXEN             EQU  H'0005'
TX9              EQU  H'0006'
CSRC             EQU  H'0007'


;----- EECON1 Bits -----------------------------------------------------
RD               EQU  H'0000'
WR               EQU  H'0001'
WREN             EQU  H'0002'
WRERR            EQU  H'0003'


;----- VRCON Bits -----------------------------------------------------
VRR              EQU  H'0005'
VROE             EQU  H'0006'
VREN             EQU  H'0007'

VR0              EQU  H'0000'
VR1              EQU  H'0001'
VR2              EQU  H'0002'
VR3              EQU  H'0003'




;==========================================================================
;
;       RAM Definitions
;
;==========================================================================
       __MAXRAM  H'01FF'
       __BADRAM  H'0007'-H'0009'
       __BADRAM  H'000D'
       __BADRAM  H'0013'-H'0014'
       __BADRAM  H'001B'-H'001E'
       __BADRAM  H'0087'-H'0089'
       __BADRAM  H'008D'
       __BADRAM  H'008F'-H'0091'
       __BADRAM  H'0093'-H'0097'
       __BADRAM  H'009E'
       __BADRAM  H'0105'
       __BADRAM  H'0107'-H'0109'
       __BADRAM  H'010C'-H'011F'
       __BADRAM  H'0150'-H'016F'
       __BADRAM  H'0185'
       __BADRAM  H'0187'-H'0189'
       __BADRAM  H'018C'-H'019F'
       __BADRAM  H'01A0'-H'01EF'

;==========================================================================
;
;       Configuration Bits
;
;   NAME            Address
;   CONFIG            2007h
;
;==========================================================================

; The following is an assignment of address values for all of the
; configuration registers for the purpose of table reads
_CONFIG          EQU  H'2007'

;----- CONFIG Options --------------------------------------------------
_FOSC_LP             EQU  H'3FEC'    ; LP oscillator: Low-power crystal on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN
_LP_OSC              EQU  H'3FEC'    ; LP oscillator: Low-power crystal on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN
_FOSC_XT             EQU  H'3FED'    ; XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN
_XT_OSC              EQU  H'3FED'    ; XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN
_FOSC_HS             EQU  H'3FEE'    ; HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN
_HS_OSC              EQU  H'3FEE'    ; HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN
_FOSC_ECIO           EQU  H'3FEF'    ; EC: I/O function on RA6/OSC2/CLKOUT pin, CLKIN on RA7/OSC1/CLKIN
_EXTCLK_OSC          EQU  H'3FEF'    ; EC: I/O function on RA6/OSC2/CLKOUT pin, CLKIN on RA7/OSC1/CLKIN
_FOSC_INTOSCIO       EQU  H'3FFC'    ; INTRC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN
_INTRC_OSC_NOCLKOUT  EQU  H'3FFC'    ; INTRC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN
_FOSC_INTOSCCLK      EQU  H'3FFD'    ; INTRC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN
_INTRC_OSC_CLKOUT    EQU  H'3FFD'    ; INTRC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN
_FOSC_ERIO           EQU  H'3FFE'    ; ER oscillator: I/O function on RA6/OSC2/CLKOUT pin, Resistor on RA7/OSC1/CLKIN
_ER_OSC_NOCLKOUT     EQU  H'3FFE'    ; ER oscillator: I/O function on RA6/OSC2/CLKOUT pin, Resistor on RA7/OSC1/CLKIN
_FOSC_ERCLK          EQU  H'3FFF'    ; ER oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, Resistor on RA7/OSC1/CLKIN
_ER_OSC_CLKOUT       EQU  H'3FFF'    ; ER oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, Resistor on RA7/OSC1/CLKIN

_WDTE_OFF            EQU  H'3FFB'    ; WDT disabled
_WDT_OFF             EQU  H'3FFB'    ; WDT disabled
_WDTE_ON             EQU  H'3FFF'    ; WDT enabled
_WDT_ON              EQU  H'3FFF'    ; WDT enabled

_PWRTE_ON            EQU  H'3FF7'    ; PWRT enabled
_PWRTE_OFF           EQU  H'3FFF'    ; PWRT disabled

_MCLRE_OFF           EQU  H'3FDF'    ; RA5/MCLR pin function is digital input, MCLR internally tied to VDD
_MCLRE_ON            EQU  H'3FFF'    ; RA5/MCLR pin function is MCLR

_BOREN_OFF           EQU  H'3FBF'    ; BOD Reset disabled
_BODEN_OFF           EQU  H'3FBF'    ; BOD Reset disabled
_BOREN_ON            EQU  H'3FFF'    ; BOD Reset enabled
_BODEN_ON            EQU  H'3FFF'    ; BOD Reset enabled

_LVP_OFF             EQU  H'3F7F'    ; RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming
_LVP_ON              EQU  H'3FFF'    ; RB4/PGM pin has PGM function, low-voltage programming enabled

_CPD_ON              EQU  H'3EFF'    ; Data memory code protected
DATA_CP_ON           EQU  H'3EFF'    ; Data memory code protected
_CPD_OFF             EQU  H'3FFF'    ; Data memory code protection off
DATA_CP_OFF          EQU  H'3FFF'    ; Data memory code protection off

_CP_ALL              EQU  H'03FF'    ; 0000h-07FFh code protected
_CP_75               EQU  H'17FF'    ; 0200h-07FFh code protected
_CP_50               EQU  H'2BFF'    ; 0400h-07FFh code protected
_CP_OFF              EQU  H'3FFF'    ; Program memory code protection off

;----- DEVID Equates --------------------------------------------------
_DEVID1          EQU  H'2006'

;----- IDLOC Equates --------------------------------------------------
_IDLOC0          EQU  H'2000'
_IDLOC1          EQU  H'2001'
_IDLOC2          EQU  H'2002'
_IDLOC3          EQU  H'2003'

        LIST