;*****************************************************************
; 
;                            2007
;                      Debreczeni János
;                        potmeter.asm
; 
;*****************************************************************

;		A PARANCSOK SZERKEZETE 

;		Hívó parancs: 00	Válasz: HByte LByte 
;		Közben 2!6=64 darab akkumuláció 
;		 
;		Memória foglalás a RAM-ban

;		30,31			OUT LATCH 1,2 
;		32,33			IN LATCH 1,2 

;		34..43		TL 1549 DATA Ch0..Ch7 

;		44			AD aktuális adat
;		44			Low 
;		45			High 
;		46			Channel counter 
;		47			Counter L byte 
;		48			Counter H byte 
;		49			AD acquisition mode 


;P1		EQU 90H			; P1 port byte címe 
;P3		EQU 0B0H			; P3 port byte címe 

GAIN1		EQU 93H			; Erősítés, itt nem használt
GAIN2		EQU 94H			; Erősítés, itt nem használt
SCLK		EQU 95H			; A/D konverter órajel
SDATA		EQU 96H			; A/D konverter adatvonal
CE		EQU 97H			; A/D konverter engedélyezés
;SBUF		EQU 99H			; RS232 ki-bemeneti tároló
;RI		EQU 98H			; bit címhely S0CON-ban 
;TI		EQU 99H			; bit címhely S0CON-ban 

;DPL		EQU 82H			; DPTR LOW BYTE 
;DPH		EQU 83H			; DPTR HIGH BYTE 

;AD CHIP ENABLE MASK 
CEBIT		EQU 80H			; AD ENABLE/DISABLE MASK 
MDATA		EQU 40H			; SDATA MASK 

;RAM DEFINITIONS

DRAM		EQU 30H			; Data RAM terület kezdete
DRAML		EQU 30H			; Data RAM area length 

;		AD: TLC1549 

DRADDL	EQU 44H			; AD DATA BYTES 
DRADDH	EQU 45H 

DRADCL	EQU 4AH			; AD DATA ACCUMULATED L BYTE 
DRADCH	EQU 4BH			; AD DATA ACCUMULATED H BYTE 

;		OTHER 

HEXMSK	EQU 0FH			; MASK FOR HEX CODE 

;*****************************************************************

; 
;		START 
; 
		ORG 0000H			; A 0-ás címen kezdődjön a program

		MOV SP,#62H			; Stack pointer iniciálás

; 
;		INIT 
; 

INIT:		NOP 

; 
;		TLC1549 PORT INIT 
; 
		MOV P1,#CEBIT		; Engedélyezés alaphelyzetbe
		SETB SDATA			; Adatvonal H értékbe

; 
;		SIO inicializlsa	 8 BIT 2 STOP NO PARITY 
; 
		MOV SCON, #11011111B	; 9 BIT 1 START 2 STOP 
		MOV TH1,#0FDH		; 9600 BAUD 
		MOV TH0,#0FFH		; TIMER MAX VALUE 
		MOV TMOD,#00100010B	; TIMER 0,1 AUTO RELOAD 
		MOV TCON,#01010000B	; TIMER 0,1 RUN 

; 
;		RAM area init 
; 
	 
		MOV R0,#DRAM		; Data RAM start cím 
		MOV R4,#DRAML		; Data RAM hossz 
DRFILL:	MOV A,#00H			; Kitöltés nullával 
		MOV @R0,A			; 0 beírása indirekt címzéssel
		INC R0			; Cím léptetése
		DEC R4			; Hossz számláló csökkentése
		MOV A,R4			; Másolás 'A'-ba
		JNZ DRFILL			; Ha nem 0 akkor folytatás

; 
;		SIO INIT 
; 

		LCALL IN232		; A puffer tartalmának ürítése

;*****************************************************************

; 
;		MAIN LOOP 
; 


MAIN:		NOP 				; Központi hurok belépési pont

		LCALL ADREAD		; A mérés végrehajtása

		LCALL IN232		; Parancs lekérdezés

		MOV A,R4			; Friss-parancs flag másolása
						; Az 'A' vizsgálata 0-ra
		JZ MAIN			; Feltételes ugrás, A = 0
						; Ha 0 (nem jött) akkor ugrik

		MOV B,DRADCH		; H byte másolása 'B'-be
		LCALL OUT232		; Elküldés RS232-n
		MOV B,DRADCL		; L byte másolása 'B'-be
		LCALL OUT232		; Elküldés RS232-n

		LJMP MAIN			; Vissza a fő-ciklus elejére

;*****************************************************************

; 
;		TLC1549 rutinok 
; 


ADREAD:	MOV DRADCL,#0		; Nullázzuk a tárolókat, L-Byte
		MOV DRADCH,#0		; Nullázzuk a tárolókat, H-Byte

		MOV R5,#64			; 64 akkumuláció lesz
ADREA1:	LCALL READAD		; Az A/D konverter kiolvasása
		MOV A,DRADCL		; L-Byte tárolója az akkumulátorba
		ADD A,DRADDL		; Az L-Byte hozzáadása a tárolóhoz
		MOV DRADCL,A		; Az úl összeg visszaírása
		MOV A,DRADCH		; H-Byte tárolója az akkumulátorba
		ADDC A,DRADDH		; A H-Byte hozzáadása a tárolóhoz
						; Ha az L-Byte hozzáadása során
						; átvitel keletkezett az a CARRY-n
						; keresztül most adódik a H-hoz
		MOV DRADCH,A		; Visszaírás a tárolóba
		DJNZ R5,ADREA1		; A ciklusszervező utasítás
						; Összesen 64-szer fog lefutni
ADREND:	RET 

;*****************************************************************

; 
;		SUBROUTINES 
; 

; 
;		READ AD DATA 
; 

READAD:	NOP 
		SETB SDATA			; Adatvonal H szintre emelése
		CLR CE			; Engedélyezés

		MOV A,#00H			; Akkumulátor törlése

		MOV C,SDATA		; Az adatvonal értékének beolvasása a
						; CARRY bitbe
		RLC A				; Akkumulátor forgatása CARRY-vel
		SETB SCLK			; 1.BIT 
		NOP 
		CLR SCLK 
		NOP 
		MOV C,SDATA 
		RLC A 
		SETB SCLK			; 2.BIT 
		NOP 
		CLR SCLK 
		NOP 
		MOV DRADDH,A		; Kész a H-Byte, eltároljuk

		MOV A,#00H			; Akkumulátor törlés
		MOV R7,#00H			; BIT COUNTER ZERO 
READAC:	MOV C,SDATA		; Az adatbit beolvasása CARRY-be
		RLC A				; A CARRY beforgatása az A-ba
		SETB SCLK			; Órajel emelés
		NOP				; 1 μsec várakozás
		CLR SCLK			; Órajel lehúzása
		INC R7			; Ciklusváltozó növelése
		CJNE R7,#08H,READAC	; Ciklusszervezés, 8 bitet olvasunk be
		MOV DRADDL,A		; Kész a L-Byte, eltároljuk

		SETB CE			; Engedélyezés elvétele
		RET				; Visszatérés a rutinból

; 
;	DELAY ROUTINE 
;	REGISTER 'B' -> NUMBER OF CYCLES 
; 

DELAY:		MOV R4,B				; 0.0194 s/számérték - #05H 
DELAY1:	MOV R5,#0FH 
DELAY2:	MOV R6,#0FFH 
DELAY3:	DJNZ R6,DELAY3 
		DJNZ R5,DELAY2 
		DJNZ R4,DELAY1 
		RET 

FDELAY:	MOV R4,B			; FAST DELAY 
FDELA1:	MOV R5,#0FFH 
FDELA2:	DJNZ R5,FDELA2 
		DJNZ R4,FDELA1 
		RET 

; 
;		RS232 Out 
;		Out byte -> Register 'B' 
; 

OUT232:	JNB TI,OUT232		; Ha még nem üres a puffer
		CLR TI			; Flag törlése
		MOV A,B			; Kiírandó érték másolása
		MOV SBUF,A			; A kiírandó adat betöltése

		MOV B,#1			; Rövid várakozás
		LCALL FDELAY 
		MOV B,A			; A kiírandó érték B-be töltése
		RET 

; 
;		RS232 In 
;		In byte -> Register 'B' 
;		Data flag ->	R4  
;		0FFH	received 
;		00H	not received 
; 

IN232:		MOV R4,#00H		; Friss-adat flag törlése
		MOV B,#00H			; Adat visszatérési változó törlése

		JNB RI,IX232		; Ha nincs friss adat akkor RET
		CLR RI			; Törölni kell az RI flag-et

		MOV R4,#0FFH		; Friss adat flag állítása
		MOV A,SBUF			; Az érkezett adat kiolvasása
		MOV B,A			; Másolás, visszatérési változó

IX232:		RET 


;*****************************************************************

; 
;		HEX CODE TABLE 
; 

HEX:		DB 48		; 0 
		DB 49		; 1 
		DB 50		; 2 
		DB 51		; 3 
		DB 52		; 4 
		DB 53		; 5 
		DB 54		; 6 
		DB 55		; 7 
		DB 56		; 8 
		DB 57		; 9 
		DB 65		; A 
		DB 66		; B 
		DB 67		; C 
		DB 68		; D 
		DB 69		; E 
		DB 70		; F 

		END
