ep4isoerr_isr:
ep6isoerr_isr:
ep8isoerr_isr:
+ep6_isr:
+ep2_isr:
+
push dps
push dpl
;;; then engages in an endless loop
main:
mov DPTR,#CPUCS ; CPU control register
- mov a,#000100100b ; 48MHz clock
+ mov a,#00010000b ; 48Mhz
movx @DPTR,a ; do it
+ lcall syncdelay
mov dptr,#INTSETUP ; IRQ setup register
mov a,#08h ; enable autovector
movx @DPTR,a ; do it
+ lcall syncdelay
lcall initAD ; init the ports to the converters
- lcall inieplo ; init the isochronous data-transfer
+ lcall initeps ; init the isochronous data-transfer
mloop2: nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
sjmp mloop2 ; do nothing. The rest is done by the IRQs
clr IOA.1 ; set /CS to zero
;; send the control byte to the AD-converter
mov R2,#8 ; bit-counter
-S1: jnb ACC.7,bitzero ; jump if Bit7 = 0?
+bitlp: jnb ACC.7,bitzero ; jump if Bit7 = 0?
setb IOA.2 ; set the DIN bit
sjmp clock ; continue with the clock
bitzero:clr IOA.2 ; clear the DIN bit
clock: setb IOA.0 ; SCLK = 1
clr IOA.0 ; SCLK = 0
rl a ; next Bit
- djnz R2,S1
+ djnz R2,bitlp
;; continue the aquisition (already started)
clr IOA.2 ; clear the DIN bit
-;;; initilise the transfer for full speed
+;;; initilise the transfer
;;; It is assumed that the USB interface is in alternate setting 3
-inieplo:
+initeps:
mov dptr,#FIFORESET
mov a,#0fh
movx @dptr,a ; reset all fifos
mov dptr,#EP2BCL ; "arm" it
mov a,#80h
movx @DPTR,a ; can receive data
+ lcall syncdelay ; wait to sync
movx @DPTR,a ; can receive data
+ lcall syncdelay ; wait to sync
movx @DPTR,a ; can receive data
+ lcall syncdelay ; wait to sync
mov DPTR,#EP4CFG
mov a,#10100000b ; valid
mov dptr,#EP4BCL ; "arm" it
mov a,#80h
movx @DPTR,a ; can receive data
+ lcall syncdelay ; wait until we can write again
movx @dptr,a ; make shure its really empty
+ lcall syncdelay ; wait
mov DPTR,#EP6CFG ; ISO data from here to the host
mov a,#11010010b ; Valid
mov DPTR,#EP6BCH ; byte count H
mov a,#0 ; is zero
movx @DPTR,a
+ lcall syncdelay ; wait until we can write again
mov DPTR,#EP6BCL ; byte count L
mov a,#10H ; is 8x word = 16 bytes
movx @DPTR,a
+ lcall syncdelay ; wait until we can write again
epfull:
;; do the D/A conversion
mov dptr,#EP2BCL ; "arm" it
mov a,#80h
movx @DPTR,a ; can receive data
- movx @dptr,a
+ lcall syncdelay ; wait for the rec to sync
+ movx @dptr,a ; just to make sure that it's empty
+ lcall syncdelay ; wait for the rec to sync
epempty:
;; clear INT2
mov dptr,#EP4BCL
mov a,#80h
movx @DPTR,a ; arm it
+ lcall syncdelay ; wait
movx @DPTR,a ; arm it
+ lcall syncdelay ; wait
movx @DPTR,a ; arm it
+ lcall syncdelay ; wait
;; clear INT2
mov a,EXIF ; FIRST clear the USB (INT2) interrupt request
mov DPTR,#EP6BCH ; byte count H
mov a,#0 ; is zero
movx @DPTR,a
+ lcall syncdelay ; wait until the length has arrived
mov DPTR,#EP6BCL ; byte count L
mov a,#10H ; is one
movx @DPTR,a
+ lcall syncdelay ; wait until the length has been proc
ret
-
-;;; get all 8 channels in the high speed mode
-;;; not used just now
-ep6_isr:
- push dps
- push dpl
- push dph
- push dpl1
- push dph1
- push acc
- push psw
- push 00h ; R0
- push 01h ; R1
- push 02h ; R2
- push 03h ; R3
- push 04h ; R4
- push 05h ; R5
- push 06h ; R6
- push 07h ; R7
-
- lcall convlo ; conversion
-
- mov DPTR,#EP6BCH ; byte count H
- mov a,#0 ; is zero
- movx @DPTR,a
-
- mov DPTR,#EP6BCL ; byte count L
- mov a,#10H ; is 8x word = 16 bytes
- movx @DPTR,a
-
- ;; clear INT2
- mov a,EXIF ; FIRST clear the USB (INT2) interrupt request
- clr acc.4
- mov EXIF,a ; Note: EXIF reg is not 8051 bit-addressable
-
- mov DPTR,#EPIRQ ;
- mov a,#01000000b ; clear the ep6irq
- movx @DPTR,a
- pop 07h
- pop 06h
- pop 05h
- pop 04h ; R4
- pop 03h ; R3
- pop 02h ; R2
- pop 01h ; R1
- pop 00h ; R0
- pop psw
- pop acc
- pop dph1
- pop dpl1
- pop dph
- pop dpl
- pop dps
- reti
-
-
-
;;; converts one analog/digital channel and stores it in EP8
;;; also gets the content of the digital ports B and D
ep8_adc:
reti
+;; need to delay every time the byte counters
+;; for the EPs have been changed.
-
-
-
-;;; high speed mode, IRQ mode. Asynchronous transmission.
-;;; not used just now
-ep2_isr:
- push dps
- push dpl
- push dph
- push dpl1
- push dph1
- push acc
- push psw
- push 00h ; R0
- push 01h ; R1
- push 02h ; R2
- push 03h ; R3
- push 04h ; R4
- push 05h ; R5
- push 06h ; R6
- push 07h ; R7
-
- mov dptr,#0F000H ; EP2 fifo buffer
- lcall dalo ; conversion
-
- mov dptr,#EP2BCL ; "arm" it
- mov a,#80h
- movx @DPTR,a ; can receive data
- movx @dptr,a
-
- ;; clear INT2
- mov a,EXIF ; FIRST clear the USB (INT2) interrupt request
- clr acc.4
- mov EXIF,a ; Note: EXIF reg is not 8051 bit-addressable
-
- mov DPTR,#EPIRQ ; points to the usbirq
- mov a,#00010000b ; clear the usbirq of ep 2
- movx @DPTR,a
-
- pop 07h
- pop 06h
- pop 05h
- pop 04h ; R4
- pop 03h ; R3
- pop 02h ; R2
- pop 01h ; R1
- pop 00h ; R0
- pop psw
- pop acc
- pop dph1
- pop dpl1
- pop dph
- pop dpl
- pop dps
- reti
-
-
-
-
-
-
-
+syncdelay:
+ nop
+ nop
+ nop
+ nop
+ ret
.End
:030000000201A258
:03004300020100B7
-:1001000002017F000202D40002017F0002017F0091
+:1001000002017F000202EF0002017F0002017F0076
:1001100002017F0002017F0002017F0002017F00D7
:1001200002017F0002017F0002017F0002017F00C7
-:10013000020507000203450002042B000204BB0075
+:1001300002017F0002036C0002017F0002049900AB
:1001400002017F0002017F0002017F0002017F00A7
:1001500002017F0002017F0002017F0002017F0097
:1001600002017F0002017F0002017F0002017F0087
:1001700002017F0002017F0002017F0002017FC0B7
:1001800086C082C083C084C085C0E0C0D0E591C273
:10019000E4F591D0D0D0E0D085D084D083D082D087
-:1001A000863290E6007424F090E6687408F012013C
-:1001B000B712027C0080FD75B22775802222547C24
-:1001C0004481C2817A0830E704D2828002C282D29E
-:1001D00080C28023DAF0C2827A05D280C280DAFA45
-:1001E0007C007A047D08D280C280E58030E403EC94
-:1001F0004DFCED03FDDAEF7B007A087D80D280C2F2
-:1002000080E58030E403EB4DFBED03FDDAEFD281B6
-:1002100022759AF8759B0075AF077880E61201BECB
-:10022000EB90E67BF0ECF008E61201BEEB90E67B8B
-:10023000F0ECF008E61201BEEB90E67BF0ECF00883
-:10024000E61201BEEB90E67BF0ECF008E61201BE90
-:10025000EB90E67BF0ECF008E61201BEEB90E67B5B
-:10026000F0ECF008E61201BEEB90E67BF0ECF00853
-:10027000E61201BEEB90E67BF0ECF02290E604740F
-:100280000FF07400F090E6127492F090E61874008B
-:10029000F090E6917480F0F0F090E61374A0F09086
-:1002A000E6197400F090E6957480F0F090E614740E
-:1002B000D2F090E61574E0F090E65E74A0F090E65F
-:1002C0005F74A0F090E65C7402F075E80175A88098
-:1002D0001204AE22C086C082C083C084C085C0E044
-:1002E000C0D0C000C001C002C003C004C005C00629
-:1002F000C007E5AA5420700F12021190E69874000E
-:10030000F090E6997410F0E5AA5401700D90F00099
-:100310001203DB90E6917480F0F0E591C2E4F59170
-:1003200090E65D7402F0D007D006D005D004D0036B
-:10033000D002D001D000D0D0D0E0D085D084D083FE
-:10034000D082D08632C086C082C083C084C085C0BF
-:10035000E0C0D0C000C001C002C003C004C005C0DE
-:1003600006C00790F400E090036C237380068017AA
-:10037000801D802378807A0890F401E0F6A308DAE3
-:10038000FAE47890F6802190F4011203DB80199052
-:10039000F401E0F5B3801190F401E0F5B3A3E0F5CA
-:1003A0009074FF7890F6800090E6957480F0F0F0FD
-:1003B000E591C2E4F59190E65F7420F0D007D00695
-:1003C000D005D004D003D002D001D000D0D0D0E0EE
-:1003D000D085D084D083D082D08632E0A3F8E0FBF1
-:1003E000A3E0FCA3E0A31203ECD8F32254C04430F2
-:1003F0004CC2857A0830E704D2828002C282D28061
-:10040000C28023DAF0EB7A0830E704D2828002C29D
-:1004100082D280C28023DAF0D2852212021190E6C5
-:10042000987400F090E6997410F022C086C082C0E3
-:1004300083C084C085C0E0C0D0C000C001C002C07D
-:1004400003C004C005C006C00712021190E69874EC
-:1004500000F090E6997410F0E591C2E4F59190E611
-:100460005F7440F0D007D006D005D004D003D0028E
-:10047000D001D000D0D0D0E0D085D084D083D0823D
-:10048000D086327890E670107880E61201BE90FC3B
-:1004900000EBF0A3ECF0800990FC00E590F0A3E401
-:1004A000F090E69C7400F090E69D7410F02290E6C7
-:1004B0009C7400F090E69D7401F022C086C082C05A
-:1004C00083C084C085C0E0C0D0C000C001C002C0ED
-:1004D00003C004C005C006C007120483E591C2E44E
-:1004E000F59190E65F7480F0D007D006D005D00477
-:1004F000D003D002D001D000D0D0D0E0D085D084BD
-:10050000D083D082D08632C086C082C083C084C0EF
-:1005100085C0E0C0D0C000C001C002C003C004C09C
-:1005200005C006C00790F0001203DB90E6917480CE
-:10053000F0F0E591C2E4F59190E65F7410F0D00719
-:10054000D006D005D004D003D002D001D000D0D046
-:0D055000D0E0D085D084D083D082D0863218
+:1001A000863290E6007410F01204E590E668740858
+:1001B000F01204E51201C3120288000000000000E2
+:1001C0000080F775B22775802222547C4481C28159
+:1001D0007A0830E704D2828002C282D280C28023B1
+:1001E000DAF0C2827A05D280C280DAFA7C007A0420
+:1001F0007D08D280C280E58030E403EC4DFCED0345
+:10020000FDDAEF7B007A087D80D280C280E5803005
+:10021000E403EB4DFBED03FDDAEFD28122759AF892
+:10022000759B0075AF077880E61201CAEB90E67BFC
+:10023000F0ECF008E61201CAEB90E67BF0ECF00877
+:10024000E61201CAEB90E67BF0ECF008E61201CA78
+:10025000EB90E67BF0ECF008E61201CAEB90E67B4F
+:10026000F0ECF008E61201CAEB90E67BF0ECF00847
+:10027000E61201CAEB90E67BF0ECF008E61201CA48
+:10028000EB90E67BF0ECF02290E604740FF0740043
+:10029000F090E6127492F090E6187400F090E691F7
+:1002A0007480F01204E5F01204E5F01204E590E623
+:1002B0001374A0F090E6197400F090E6957480F045
+:1002C0001204E5F01204E590E61474D2F090E615FD
+:1002D00074E0F090E65E74A0F090E65F74A0F09099
+:1002E000E65C7402F075E80175A88012048C22C0E7
+:1002F00086C082C083C084C085C0E0C0D0C000C0BA
+:1003000001C002C003C004C005C006C007E5AA546E
+:1003100020701512021D90E6987400F01204E5900A
+:10032000E6997410F01204E5E5AA5401701390F0F8
+:100330000012040B90E6917480F01204E5F01204B0
+:10034000E5E591C2E4F59190E65D7402F0D007D046
+:1003500006D005D004D003D002D001D000D0D0D038
+:10036000E0D085D084D083D082D08632C086C0824F
+:10037000C083C084C085C0E0C0D0C000C001C0023E
+:10038000C003C004C005C006C00790F400E090039D
+:1003900093237380068017801D802378807A0890CD
+:1003A000F401E0F6A308DAFAE47890F6802190F4FC
+:1003B0000112040B801990F401E0F5B3801190F460
+:1003C00001E0F5B3A3E0F59074FF7890F68000901B
+:1003D000E6957480F01204E5F01204E5F01204E5ED
+:1003E000E591C2E4F59190E65F7420F0D007D00665
+:1003F000D005D004D003D002D001D000D0D0D0E0BE
+:10040000D085D084D083D082D08632E0A3F8E0FBC0
+:10041000A3E0FCA3E0A312041CD8F32254C0443090
+:100420004CC2857A0830E704D2828002C282D28030
+:10043000C28023DAF0EB7A0830E704D2828002C26D
+:1004400082D280C28023DAF0D2852212021D90E689
+:10045000987400F01204E590E6997410F01204E527
+:10046000227890E670107880E61201CA90FC00EBCA
+:10047000F0A3ECF0800990FC00E590F0A3E4F0908C
+:10048000E69C7400F090E69D7410F02290E69C7457
+:1004900000F090E69D7401F022C086C082C083C047
+:1004A00084C085C0E0C0D0C000C001C002C003C08D
+:1004B00004C005C006C007120461E591C2E4F591CD
+:1004C00090E65F7480F0D007D006D005D004D0034A
+:1004D000D002D001D000D0D0D0E0D085D084D0835D
+:0A04E000D082D08632000000002216
:00000001FF