; 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-8 | 0
|