Source file: /~heha/ewa/Ofen/8te.zip/Firmware/8te.a15

; 8 Thermoelemente an MAX31855 auslesen und per serielle Schnittstelle
; oder WebUSB ausgeben

	radix	dec
	list	n=0,st=off
	nolist
	include	"p16f1454.inc"
	nolist
	include	"mymacros.i15"
	list

;Hardware: PIC16F1454 + MAX31855 + 2× 74HC4051
;(13) RA0/D+	USB D+
;(12) RA1/D-	USB D-
; (4) RA3/!MCLR	Reset (ungenutzt, Lo springt zum Urlader)
; (3) RA4	/CS MAX31855, muss als Open-Drain-Ausgang arbeiten
; (2) RA5/PWM2	Spannungsinverter für Analogmultiplexer: 1 MHz
;(10) RC0/SCK	SCK zum MAX31855, max. 5 MHz
; (9) RC1/SDI	SO vom MAX31855
; (8) RC2	LED grün, H-aktiv
; (7) RC3	Analogmultiplexer Bit 0
; (6) RC4	Analogmultiplexer Bit 1
; (5) RC5	Analogmultiplexer Bit 2

E0_SSH 		equ	4	;EP0: 1<<4 = 16 Byte
E1O_SSH		equ	6	;EP1OUT (CDC-Daten): 1<<6 = 64 Byte
E1I_SSH		equ	6	;EP1IN (CDC-Daten): 1<<6 = 64 Byte
E2I_SSH		equ	4	;Dummy-In-Endpoint: 16 Byte
E3O_SSH		equ	6	;EP3OUT: 64 Byte
E3I_SSH		equ	6	;EP3IN: 64 Byte

;Exy_STA bits
BSTALL		equ	2
DTSEN		equ	3
DTS		equ	6
UOWN		equ	7

;list of Bank0 RAM variables, starting with BDT
	cblock 0x20	;Bank 0 (completely full)
E0O_STA		;@0x20
E0O_CNT
E0O_ADR:2
E0I_STA
E0I_CNT
E0I_ADR:2
E1O_STA		;@0x28: 3 Endpoints für CDC, davon 1 Dummy-In-Endpoint
E1O_CNT
E1O_ADR:2
E1I_STA
E1I_CNT
E1I_ADR:2
; Der Platz für Endpoint 2 Out wird für Arbeitsvariablen imn Bank 0 missbraucht
USB_STATE	;@0x30; Einige Flags
SETUPDAT_CNT	;Bytes die noch zu senden oder empfangen sind
SETUPDAT_PTR:2	;Datenzeiger
E2I_STA
E2I_CNT
E2I_ADR:2
E3O_STA		;@0x38: 2 Endpoints für WebUSB
E3O_CNT
E3O_ADR:2
E3I_STA
E3I_CNT
E3I_ADR:2
E0_BUF:1<<E0_SSH	;@0x40: Shared für EP0 Setup-, Out-, und In-Transfer
E1O_BUF:1<<E1O_SSH	;@0x50: Hintere 32 Bytes hängen in Bank 1 über
	endc
	cblock	0x70	;Nicht-Bank-Register
CL		;Zählregister, 3. Argument
CH
DL
DH
DIV		;Divisor für Divisionsroutine
REM		;Divisionsrest
T2H		;Zähler für Timer1
chr		;Zeichenpuffer für putchar
E		;für putFix
TL		;für putInt
TH		;für sendToEp1
linefill	;für putchar
	endc
	cblock	0xC0	; Bank 1 + 32
E1I_BUF:1<<E1I_SSH	;Hintere 16 Byte hängen in Bank 2 über
	endc
	cblock 0x130	;Bank2 + 16
E3O_BUF:1<<E3O_SSH	;passt genau hinein
	endc
	cblock 0x1A0	;Bank3
E3I_BUF:1<<E3I_SSH	;noch 16 Byte Platz
E2I_BUF:1<<E2I_SSH	;Platz für Dummy-In-Endpoint
	endc
	cblock	0x220	;Bank 4
MaxArray:4*8	;@0x220: Messwerte vom MAX31855 für 8 Eingangskanäle
LineCoding:7	;@0x240: Baudrate(4),Stoppbits,Parität,Datenbits
strbuf:5	;@0x247: Platz für Rückwärtsausgabe der Ziffern bei outInt()
r1p:2		;@0x24C: Flash-Lesezeiger für EP1 (÷8 teilbar)
r3p:2		;@0x24E: Flash-Lesezeiger für EP3
wp:2		;@0x250: Flash-Schreibzeiger für Temperatur-Record
lfdnr:2		;@0x252: Laufende Nummer
	endc
	cblock	0x2A0	;Bank 5
linebuf:80
	endc
bmRequestType	equ	E0_BUF+0
bRequest	equ	E0_BUF+1
wValueL		equ	E0_BUF+2
wValueH		equ	E0_BUF+3
wLengthL	equ	E0_BUF+6
wLengthH	equ	E0_BUF+7
;Lineare (und zusammenhängende) Pufferadressen
LIN_E0_BUF	equ	0x2020	;bis 0x202F
LIN_E1O_BUF	equ	0x2030	;bis 0x206F
LIN_E1I_BUF	equ	0x2070	;bis 0x20AF
LIN_E3O_BUF	equ	0x20B0	;bis 0x20EF
LIN_E3I_BUF	equ	0x20F0	;bis 0x212F
LIN_E2I_BUF	equ	0x2130	;bis 0x213F

	org	0x200
	goto	onReset
	nop
	nop
	nop
;Einzige Interruptquelle: Timer2 (generiert Wechselspannung für 5V-Inverter)
	;banksel	0
	;btfss	PIR1,TMR2IF
	; bra	_no_t2
	;incf	T2INT,f
	;skpnz
	; incf	T2INT+1,f
	;bcf	PIR1,TMR2IF
;_no_t2
	retfie

onReset
	banksel	PCON		;Bank1
	bsf	PCON,NOT_RMCLR	; clear !MCLR reset reason for next onReset
	call	ioInit
	call	usbInit
;Hauptschleife
_loop	call	ioPoll
	call	usbPoll
	bra	_loop

;CDC-Kommando ausführen
exec_cmd1
	return
exec_cmd3
	return

memcpyW
;PE:	FSR0 = Quelle
;	FSR1 = Ziel
;	W = Länge in Bytes, 0 = 256
	movwf	CL
_mc	moviw	FSR0++
        movwi	FSR1++
        loop	CL,_mc
	return

	include	"usb.i15"
	include	"io.i15"
	include	"flash.i15"
	include	"descriptors.i15"

LINE_CODING
	dtw	9600
	dt	0,0,0,0,8

	end
Detected encoding: UTF-80