люди помогите пожалуста.выбивает noitem
CODE
;----------------------------------------------------------------------------;
; Laser Display Controller ©ChaN, 2006
;----------------------------------------------------------------------------;
.include "m64def.inc"
.include "avr.inc"
.include "ldp.inc"
;----------------------------------------------------------;
; SRAM Area
.dseg
.org RAMTOP100
Buff0: .byte 512 ;File system working buffer
Buff1: .byte 512 ;File buffer1
.byte 512 ;File buffer2
FatBase: .byte 3 ; FAT start sector
DirBase: .byte 3 ; Directory start sector
DataBase: .byte 3 ; Data start sector
DirNum: .byte 2 ; Number of root directory entry
ClstSize: .byte 1 ; Cluster size (sectors)
CurrSect0: .byte 3 ; Current sector in Buff0
DirIndex: .byte 2 ; Directory index (file_dir_)
DirClst: .byte 2 ; Directory cluster number (0:Null, 1:Root, >1:clst#)
DirSect: .byte 3 ; Current sector
DirInClst: .byte 1 ; Current sector in currrent cluster
FileName: .byte 11 ; File name buffer for file_open
; File control structure 1
File1: .byte 18 ; 0[4]: File ptr
File2: .byte 18 ; 4[4]: File size
; 8[3]: Current sector
; 11[1]: Current sector in currrent cluster
; 12[2]: Current cluster
; 14[2]: Start cluster
; 16[2]: Ptr to file buffer
LineBuf: .byte 40 ;Command Input buffer
DumpAdr: .byte 3
RxBuff: .byte 2+32 ;Serial Receiving Buffer
KeyCmd: .byte 3 ;Key input buffer
Lcdp: .byte 1 ;LCD cursor position
VectFifo: .byte 2+1 ;Vector FIFO buffer {RPtr, Count}
Index: .byte 2 ;Current, Items
ListPtr: .byte 2 ;
List: .byte 2000 ;File List
;----------------------------------------------------------;
; Program Code
.cseg
; Interrupt Vectors (ATmega64)
jmp reset ; Reset
jmp 0 ; Extrenal INT0
jmp 0 ; External INT1
jmp 0 ; External INT2
jmp 0 ; External INT3
jmp 0 ; External INT4
jmp 0 ; External INT5
jmp 0 ; External INT6
jmp 0 ; External INT7
jmp 0 ; TC2 COMP
jmp 0 ; TC2 OVF
jmp 0 ; TC1 CAPT
jmp isr_tc1_coma ; TC1 COMPA
jmp 0 ; TC1 COMPB
jmp 0 ; TC1 OVF
jmp isr_tc0_com ; TC0 COMP
jmp 0 ; TC0 OVF
jmp 0 ; SPI,STC
jmp isr_usart0_rx ; USART0 RX
jmp 0 ; USART0 UDRE
jmp 0 ; USART0 TX
jmp 0 ; ADC
jmp 0 ; EE READY
jmp 0 ; ANALOG COMP
jmp 0 ; TC1 COMPC
jmp 0 ; TC3 CAPT
jmp 0 ; TC3 COMPA
jmp 0 ; TC3 COMPB
jmp 0 ; TC3 COMPC
jmp 0 ; TC3 OVF
jmp 0 ; USART1 RX
jmp 0 ; USART1 UDRE
jmp 0 ; USART1 TX
jmp 0 ; TWI
jmp 0 ; SPM READY
.include "LDP_MMC.ASM" ; MMC control and FAT16 file system
.include "LDP_MON.ASM" ; Monitor
.include "LDP_UI.ASM" ; Key, Serial, LCD
;----------------------------------------------------------;
; Initailize peripherals and work area
reset:
clr _0 ;Zero reg.
ldiw Z, RAMEND ;SP
outw SP, Z ;/
ldiw X, 4096-1 ;Clear RAM
st -Z, _0 ;
sbiw XL, 1 ;
brne PC-2 ;/
outi PORTA, 0b01111111 ;Port A
outi DDRA, 0b01110000 ;
outi PORTB, 0b11111001 ;Port B
outi DDRB, 0b00000111 ;
outi PORTD, 0b11000000 ;Port D
outi DDRD, 0b00111111 ;
outi PORTE, 0b11111111 ;Port E
outi DDRE, 0b00110010 ;
stsi PORTF, 0b11111111 ;Port F
stsi PORTG, 0b11111 ;Port G
ldi AL, SYSCLK/16/BPS-1 ;Start USART0
out UBRR0L, AL ;
outi UCSR0B, 0b10011000 ;/
outi SPCR, 0b01011000 ;Enable SPI
outi SPSR, 0b00000001 ;/
outi OCR0, 156-1 ;Timer0: 100Hz interval
outi TCCR0, 0b00001111 ;/
outi TIMSK, 0b00010010 ;Enable timer interrupts
sei
rcall lcd_init ;Initialize LCD
ldi AL, 13 ;200ms
ldiw X, 0 ;
sbiw XL, 1 ;
brne PC-1 ;
dec AL ;
brne PC-5 ;/
rcall pps_stop ;Initialize DAC
rcall mmc_init ;Initialize MMC
breq PC+4 ;
ldiw Z, die_mmcerr*2 ; "MMC Err #"
rjmp die ;/
rcall file_init ;Initialize file system
breq PC+4 ;
ldiw Z, die_fserr*2 ; "FS Errr #"
rjmp die ;/
;----------------------------------------------------------;
; Main
main_index:
ldiw D, 0
rcall file_dir_init ;Initialize directory index
rcall clr_index
mi_l1:
rcall file_dir_next ;Get next file
rjne mi_err ;/
cpw Z, _0 ;No more?
breq mi_l2 ;/
rcall chk_index ;Check if *.txt
brne mi_l1 ;/
rcall add_index ;Add it to index list
brne mi_l1 ;/
mi_l2:
rcall disp_item
mi_l3:
rcall chk_online
rcall get_key_nw
breq mi_l3
sbrc AL, K_NEXT
rcall idx_next
sbrc AL, K_PREV
rcall idx_prev
sbrc AL, K_SET
rjmp main_list
sbrc AL, K_CLR
rjmp main_index
rjmp mi_l2
main_list:
rcall get_item
ldiw Y, File1
ldiw A, Buff1
rcall file_open
cpw Y, _0
rjeq mi_err
rcall clr_index
ml_l1:
ldiw Z, LineBuf ;Get next line
rcall file_gets ;
brne ml_l2 ;/
lds AL, LineBuf ;Check if valid line
cpi AL, '0' ;
brcs ml_l1 ;/
rcall add_index ;Add it to index list
brne ml_l1 ;/
ml_l2:
rcall disp_item_file
ml_l3:
rcall get_key_nw
breq ml_l3
sbrc AL, K_NEXT
rcall idx_next
sbrc AL, K_PREV
rcall idx_prev
sbrc AL, K_CLR
rjmp main_index
sbrs AL, K_SET
rjmp ml_l2
ml_l4:
rcall get_item
ldiw Y, File1
ldiw A, Buff1
rcall file_open
cpw Y, _0
breq ml_l3
rcall play
sbrc AL, K_NEXT
rjmp pi_next
sbrc AL, K_PREV
rjmp pi_prev
rjmp ml_l3
pi_next: rcall idx_next
rcall disp_item_file
rjmp ml_l4
pi_prev: rcall idx_prev
rcall disp_item_file
rjmp ml_l4
disp_item_file:
rcall lcd_clear
ldsw A, Index
cp AL, AH
brcc di_noitem
inc AL
rcall lcd_prin_val
ldi AL, ':'
rcall lcd_wr_chr
rcall get_item
ldiw Y, File1
ldiw A, Buff1
rcall file_open
brne dif_nofile
cpw Y, _0
breq dif_nofile
ldiw Z, LineBuf
ldiw C, 32
rcall file_read
brne dif_ivd
cpi CL, 32
brne dif_ivd
ldiw Z, LineBuf
lddw A, Z+0
cpi AL, 'V'
brne dif_ivd
cpi AH, 'D'
brne dif_ivd
adiw ZL, 16
std Z+14, _0
rcall lcd_mprin
ret
dif_nofile:
ldiw Z, id_nofile*2
rjmp lcd_fprin
dif_ivd:
ldiw Z, id_invalid*2
rjmp lcd_fprin
disp_item:
rcall lcd_clear
ldsw A, Index
cp AL, AH
brcc di_noitem
inc AL
rcall lcd_prin_val
ldi AL, ':'
rcall lcd_wr_chr
rcall get_item
rcall lcd_mprin
ret
di_noitem:
ldiw Z, id_noitem*2
rjmp lcd_fprin
idx_next:
ldsw B, Index
inc BL
cp BL, BH
brcc PC+3
sts Index, BL
ret
idx_prev:
lds BL, Index
subi BL, 1
brcs PC+3
sts Index, BL
ret
get_item:
lds DL, Index
ldiw Z, List
subi DL, 1
brcc PC+2
ret
ld AL, Z+
cpi AL, 0
brne PC-2
rjmp PC-6
add_index:
ldiw Z, LineBuf
ldsw X, ListPtr
ldiw C, ListPtr+2000
cpw X, C
breq PC+10
ld AL, Z+
st X+, AL
cpi AL, 0
brne PC-6
lds AL, Index+1
inc AL
sts Index+1, AL
stsw ListPtr, X
ret
clr_index:
stsw Index, _0
ldiw A, List
stsw ListPtr, A
ret
chk_index:
ldd AL, Z+8 ;*.TXT
cpi AL, 'T' ;
brne ci_ret ;
ldd AL, Z+9 ;
cpi AL, 'X' ;
brne ci_ret ;
ldd AL, Z+10 ;
cpi AL, 'T' ;
brne ci_ret ;/
ldiw X, LineBuf
ldi CL, 0
ld AL, Z+
inc CL
cpi AL, ' '+1
brcs PC+2
st X+, AL
cpi CL, 8
brne PC+3
ldi AL, '.'
st X+, AL
cpi CL, 11
brne PC-10
st X+, _0
ci_ret: ret
mi_err:
clr T14L
ldiw Z, die_ioerr*2
rjmp die
id_noitem:
.db "<no item>",0
id_nofile:
.db "<no file>",0
id_invalid:
.db "<invalid>",0
;----------------------------------------------------------;
; Play a vector file
play:
ldiw Z, Buff1 ;Get file header
ldiw C, 512 ;
rcall file_read_block ;
rjne play_break ;/
ldiw A, 32 ;Check if the file is a valid frame data
cpw C, A ;
rjcs play_break ;
lddw A, Z+0 ;
cpi AL, 'V' ;
ldi AL, 'D' ;
cpc AH, AL ;
rjne play_break ;/
sts VectFifo+2, _0 ;Start vector interruput
lddw A, Z+4 ;
rcall pps_start ;/
play_l1:
ldiw A, 0 ;Seek to top of vector data
ldiw B, 0 ;
rcall file_seek ;
brne play_break ;/
lds AL, VectFifo+2 ;Wait for FIFO empty
cpi AL, 0 ;
brne PC-3 ;/
ldiw Z, Buff1 ;Load first data block (with 32 byte header)
ldiw C, 512 ;
rcall file_read_block ;
brne play_break ;/
lsrw C ;Initialize FIFO
lsrw C ;
subi CL, 32/4 ;
ldiw A, Buff1+32 ;
stsw VectFifo+0, A ;
sts VectFifo+2, CL ;/
play_l2:
rcall chk_rcvr ;Check if any data or key is received
brne play_break ;
rcall get_key_nw ;
brne play_exit ;/
lds AL, VectFifo+2 ;Wait for data size in FIFO < 128 pts
cpi AL, 512/4 ;
brcc play_l2 ;/
addi ZH, high(512) ;WritePtr++
cpi ZH, high(Buff1+512*2) ;
brcs PC+2 ;
subi ZH, high(512*2) ;/
ldiw C, 512 ;Load next data block
rcall file_read_block ;
brne play_break ;/
lsrw C ;Number of sample ++
lsrw C ;
cli ;
lds AL, VectFifo+2 ;
add AL, CL ;
sts VectFifo+2, AL ;
sei ;/
cpi CL, 512/4 ;End of block?
breq play_l2 ;/
rjmp play_l1 ;Is end of block
play_break:
rcall receive
clr AL
play_exit:
push AL
rcall pps_stop
pop AL
ret
;----------------------------------------------------------;
; Point output driver
pps_start:
cpi AL, 250 ;Clip A between 250-30000
cpc AH, _0 ;
brcs PC+2 ;
ldi AL, 250 ;
ldiw B, 30000 ;
cpw A, B ;
brcs PC+2 ;
movw AL, BL ;/
ldi BL, byte1(SYSCLK) ;CL:B = SYSCLK
ldi BH, byte2(SYSCLK) ;
ldi CL, byte3(SYSCLK) ;/
clrw T0 ;CL:B /= A
ldi CH, 24 ;
lslw B ;
rol CL ;
rolw T0 ;
cpw T0, A ;
brcs PC+4 ;
subw T0, A ;
inc BL ;
dec CH ;
brne PC-12 ;/
outw TCNT1, _0
outw OCR1A, B
outi TCCR1B, 0b00001001
cbi PORTE, OUTEN
ret
pps_stop:
out TCCR1B, _0 ;Stop PPS
ldiw A, 2048
ldiw B, 2048
rcall set_vector
ret
; Vector output interrupt
isr_tc1_coma:
push AL
in AL, SREG
pushw A
pushw B
pushw X
lds AL, VectFifo+2 ;Check if vector data is available
subi AL, 1 ;
brcc PC+3 ;
sbi PORTE, LDMOD ; Stop laser if under-flow occured
rjmp vo_ret ; /
sts VectFifo+2, AL ;/
ldsw X, VectFifo+0 ;X = Read ptr
ldw B, X+ ;Get vector
ldw A, X+ ;
rcall set_vector ;/
ldiw A, Buff1+512*2 ;Next read ptr
cpw X, A ;
brcs PC+2 ;
subi XH, high(512*2) ;/
stsw VectFifo+0, X ;Restore read ptr
vo_ret: popw X
popw B
popw A
out SREG, AL
pop AL
reti
;----------------------------------------------------------;
; Vector output functions
;
; Call: A = vector Y (0..4095)
; B = vector X (0..4095), BH.7 = Mod
set_vector:
andi AH, 0b00001111 ; Send Y value into buffer
ori AH, 0b00010000
cbi PORTB, DACS
rcall send_spi
mov AH, AL
rcall send_spi
sbi PORTB, DACS
mov AH, BH ; Send X value and latch both channels
andi AH, 0b00001111
ori AH, 0b10000000
cbi PORTB, DACS
rcall send_spi
mov AH, BL
rcall send_spi
sbi PORTB, DACS
sbrc BH, 7 ;Set modulation
cbi PORTE, LDMOD ;
sbrs BH, 7 ;
sbi PORTE, LDMOD ;/
ret
send_spi:
out SPDR, AH
ldi AH, 12/3
dec AH
brne PC-1
ret
после нажатия set выбивает IO Err
CODE
;---------------------------------------------------------------;
; Space, CRLF
crlf:
ldi AL, 13
rcall xmit
ldi AL, 10
rjmp xmit
space:
ldi AL,' '
;---------------------------------------------------------------;
; UART control driver
xmit: ; Transmit AL
sbis UCSR0A, UDRE0
rjmp PC-1
out UDR0, AL
ret
chk_rcvr:
ldsw A, RxBuff
cp AL, AH
ret
receive:; Receive a char into AL. (ZR=no data)
ldiw Y, RxBuff
cli
ldd AH, Y+0
ldd AL, Y+1
cp AH, AL
breq PC+9
mov AL, AH
inc AL
andi AL, 31
std Y+0, AL
add YL, AH
adc YH, _0
ldd AL, Y+2
clz
sei
ret
isr_usart0_rx:
push AL
in AL, SREG
push BL
pushw A
pushw Y
in BL, UDR0
ldiw Y, RxBuff
ldd AL, Y+0
ldd AH, Y+1
inc AH
andi AH, 31
cp AH, AL
breq PC+7
std Y+1, AH
dec AH
andi AH, 31
add YL, AH
adc YH, _0
std Y+2, BL
popw Y
popw A
pop BL
out SREG, AL
pop AL
reti
;----------------------------------------------------------;
; Key driver
get_key:
lds AL, KeyCmd
andi AL, K_MASK
breq get_key
get_key_nw:
lds AL, KeyCmd
andi AL, K_MASK
breq PC+8
sts KeyCmd, _0
lds AH, KeyCmd+1
andi AH, K_MASK
swap AH
or AL, AH
ret
isr_tc0_com:
push T0L
in T0L, SREG
sei
pushw A
in AL, PINF
com AL
andi AL, K_MASK
lds AH, KeyCmd+2
sts KeyCmd+2, AL
cp AL, AH
brne isc_0e
lds AH, KeyCmd+1
sts KeyCmd+1, AL
eor AH, AL
and AH, AL
breq isc_0e
sts KeyCmd+0, AH
isc_0e:
popw A
out SREG, T0L
pop T0L
reti
;-------------------------------------------------------;
; Die with dieing message
;
;Call: Z = Pointer to the message
; T14L = Error code (0..9)
die:
rcall lcd_fprin_clr
mov AL, T14L
rcall lcd_prin_val
rjmp PC
die_mmcerr: .db "MMC Err ", 0
die_fserr: .db "FS Err ", 0
die_ioerr: .db "IO Err ", 0
;----------------------------------------------------------;
; LCD control
;
; Data:PD[3..0], RS:PD4, E:PD5
;
.equ LCDRS = PD4
.equ LCDEN = PD5
lcd_init:
rcall delay_5ms
rcall delay_5ms
rcall delay_5ms
cbi PORTD, LCDRS ; RS=0
ldi AL, 0b00110000
rcall lcd_wr_n
rcall delay_5ms
ldi AL, 0b00110000
rcall lcd_wr_n
rcall delay_5ms
ldi AL, 0b00110000
rcall lcd_wr_n
rcall delay_5ms
ldi AL, 0b00100000
rcall lcd_wr_n
ldi AL, 0b00101000 ;DL=0, N=1, F=0
rcall lcd_wr_cmd
ldi AL, 0b00001100 ;D=1, C=0, B=0
rcall lcd_wr_cmd
ldi AL, 0b00000110 ;I/D=1, S=0
rcall lcd_wr_cmd
rjmp lcd_clear
lcd_prin_val:
clr CH
inc CH
ldi CL, 8
clr AH
lslw A
cpi AH, 10
brcs PC+3
subi AH, 10
inc AL
dec CL
brne PC-7
addi AH, '0'
push AH
cpi AL, 0
brne PC-14
pop AL
rcall lcd_wr_chr
dec CH
brne PC-3
ret
lcd_mprin_clr:
rcall lcd_clear
lcd_mprin:
ld AL, Z+
tst AL
brne PC+2
ret
rcall lcd_wr_chr
rjmp lcd_mprin
lcd_fprin_clr:
rcall lcd_clear
lcd_fprin:
lpm AL, Z+ ;Get a char
tst AL ;Zero?
brne PC+2 ;/
ret
rcall lcd_wr_chr ;
rjmp lcd_fprin ;/
lcd_clear:
stsi Lcdp, 8
ldi AL, 0x01
rcall lcd_wr_cmd
rjmp delay_5ms
lcd_wr_chr:
sbi PORTD, LCDRS
rcall lcd_delay
rcall lcd_wr_n
rcall lcd_wr_n
lds AL, Lcdp
dec AL
sts Lcdp, AL
breq PC+2
ret
ldi AL, 0xC0
lcd_wr_cmd:
cbi PORTD, LCDRS
rcall lcd_delay
rcall lcd_wr_n
lcd_wr_n:
swap AL
push AL
andi AL, 0b00001111
in AH, PORTD
andi AH, 0b11110000
or AH, AL
out PORTD, AH
pop AL
sbi PORTD, LCDEN
rjmp PC+1
cbi PORTD, LCDEN
ret
lcd_delay:
ldi AH, 848/4 ;Delay 53us
dec AH ;
nop ;
brne PC-2 ;/
ret
delay_5ms: ;Delay 5ms
ldiw X, 80000/4
sbiw XL, 1
brne PC-1
ret
в архиве лежит вся прошивка к проэкту и файлы для флэш карты
Сообщение отредактировал extreme - May 31 2010, 23:08
Прикрепленные файлы
ldp2.zip ( 503.35 килобайт )
Кол-во скачиваний: 11