;(C)2008 T O'Brien ;28 Dec 08 Fast ADC read and block store using FAT16 file format .NOLIST .INCLUDE "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m163def.inc" ;************************** ;Set Constants .EQU baudrate = 12 ;corresponds to 19200 at 4 MHz .EQU secH = SRAM_START ;timer seconds .EQU secL = secH + 1 .EQU bcd3 = secL + 1 ;BCD of ADC .EQU bcd2 = bcd3 + 1 .EQU bcd1 = bcd2 + 1 .EQU bcd0 = bcd1 + 1 .EQU display = bcd0 + 1 ;sram used for LCD display .EQU block = display + 16 ;SD card read and write buffer .EQU blockend = block + 511 .EQU Part3 = blockend + 1 ;abs sector partition 1 .EQU Part2 = Part3 + 1 .EQU Part1 = Part2 + 1 .EQU SecClu = Part1 + 1 ;no. sector per cluster (4,8,16,32 or 64 for Fat16) .EQU ResSecH = SecClu + 1 ;no. reserve sectors .EQU ResSecL = ResSecH + 1 .EQU SecFatH = ResSecL + 1 ;no. sectors per Fat .EQU SecFatL = SecFatH + 1 .EQU Fat13 = SecFatL + 1 ;abs sector Fat1 .EQU Fat12 = Fat13 + 1 .EQU Fat11 = Fat12 + 1 .EQU Fat1E3 = Fat11 + 1 ;abs sector Fat1 entry .EQU Fat1E2 = Fat1E3 + 1 .EQU Fat1E1 = Fat1E2 + 1 .EQU Fat1EOSH = Fat1E1 + 1 ;byte offset Fat1 entry (each entry = 2 bytes) .EQU Fat1EOSL = Fat1EOSH + 1 .EQU Fat23 = Fat1EOSL + 1 ;abs sector Fat2 .EQU Fat22 = Fat23 + 1 .EQU Fat21 = Fat22 + 1 .EQU Dir3 = Fat21 + 1 ;abs sector Dir .EQU Dir2 = Dir3 + 1 .EQU Dir1 = Dir2 + 1 .EQU DirE3 = Dir1 + 1 ;abs sector Dir entry .EQU DirE2 = DirE3 + 1 .EQU DirE1 = DirE2 + 1 .EQU DirEOSH = DirE1 + 1 ;Dir entry byte offset (each entry = 32 bytes) .EQU DirEOSL = DirEOSH + 1 .EQU DirNoH = DirEOSL + 1 ;Dir entry number (0 to 511) .EQU DirNoL = DirNoH + 1 .EQU FileLn3 = DirNoL + 1 ;file length (bytes) .EQU FileLn2 = FileLn3 + 1 .EQU FileLn1 = FileLn2 + 1 .EQU FileLn0 = FileLn1 + 1 .EQU StClH = FileLn0 + 1 ;file start cluster number .EQU StClL = StClH + 1 .EQU StCl3 = StClL + 1 ;abs addr of start cluster .EQU StCl2 = StCl3 + 1 .EQU StCl1 = StCl2 + 1 .EQU noClH = StCl1 + 1 ;no. clusters written .EQU noClL = noClH + 1 ;*********************** ;Define Registers .DEF bytect3 = R2 .DEF bytect2 = R3 .DEF bytect1 = R4 .DEF bytect0 = R5 .DEF a2d = R6 ;adc interrupt temporary storage .DEF keyflag = R7 ;keypressed roll-over flag .DEF aug3 = R8 ;SD card block 32 bit address .DEF aug2 = R9 .DEF aug1 = R10 .DEF chr = R11 ;uart character .DEF sd = R16 ;SD card input/output spi chr .DEF secctH = R17 ;sector counter .DEF secctL = R18 .DEF crc = R19 ;SD card crc .DEF cmd = R20 ;SD card command .DEF statusflag = R21 ;status register .EQU ReadError = 0 ;sd card .EQU WriteError = 1 ;sd card .EQU Overrun = 2 ;adc buffer .EQU EraseError = 3 ;sd card .EQU noFAT = 4 ;no FAT .EQU DirFull = 5 ;No Directory entries available .EQU FatFull = 6 ;No Fat entries available .EQU SDFull = 7 ;sd card .DEF temp0 = R22 ;general usage temp storage .DEF temp1 = R23 .DEF temp2 = R24 .DEF temp3 = R25 ;******************************************************************************* ;Reset and Interrupt Vectors .CSEG .ORG 0x0000 jmp reset ;reset vector jmp eint0 ;external interrupt request 0 vector jmp eint1 ;external interrupt request 1 vector jmp t2cm ;timer/counter 2 compare match vector jmp t2o ;timer/counter 2 overflow vector jmp t1ce ;timer/counter 1 capture event vector jmp t1cma ;timer/counter 1 compare match A vector jmp t1cmb ;timer/counter 1 compare match B vector jmp t1o ;timer/counter 1 overflow vector jmp t0o ;timer/counter 0 overflow vector jmp spic ;spi serial transfer complete vector jmp urxc ;UART receive complete vector jmp utxdre ;UART transmit data register empty vector jmp utxc ;UART transmit complete vector jmp adcc ;analog conversion complete vector jmp epromr ;EEPROM ready vector jmp anci ;analouge comparitor interrupt vector jmp twsi ;two wire serial interface vector ;******************************************************************************* ;Interrupt Service Routines eint0: ;external interrupt 0 reti eint1: ;external interrupt 1 reti t2cm: ;timer/counter 2 compare match interrupt reti t2o: ;timer/counter 2 overflow interrupt reti t1ce: ;timer/counter 1 capture event interrupt reti t1cma: ;timer/counter 1 compare match a interrupt reti t1cmb: ;timer/counter 1 compare match b interrupt reti t1o: ;timer/counter 1 overflow interrupt reti t0o: ;timer/counter 0 overflow interrupt reti spic: ;spi serial transfer complete interrupt reti ;******************* ;UART receive charater interrupt ;gets character, out to LCD, and transmit echo ; ;input: UDR ;uses: - ;returns: chr ;calls: moveLCD ; sendchrL ;stack 2 urxc: ;UART receive complete interrupt push temp0 in chr, UDR ;read the received chr out UDR, chr ;echo chr ldi temp0, $4F ;position LCD cursor rcall moveLCD mov temp0, chr rcall sendchrL pop temp0 reti ;******************* utxdre: ;UART transmit data register empty interrupt reti utxc: ;UART transmit complete interrupt reti ;******************* ;ADC complete interrupt ; ;input: ADCL ; ADCH ; X: sd card write position in buffer ;modifies buflen ; bufwrite ; Y: adc write position in buffer ;returns: Overrun error in statusflag ;calls: - ;stack 1 adcc: ;analog conversion complete vector in a2d, ADCL ;store adc data little endian st Y+, a2d in a2d, ADCH st Y+, a2d cpi YL, LOW(blockend + 1) ;compare Y with blockend brne adc1 cpi YH, HIGH(blockend + 1) brne adc1 ldi YL, LOW(block) ldi YH, HIGH(block) adc1: cp XL, YL brne adc2 cp XH, YH brne adc2 sbr statusflag, 1<