;Version 1 - 11/17/02 ;UART Writes 0 until eeprom write is done ;UART writes 1 after that ;PB0 - Enable (must be zero to work) ;PC0 - Analog in ;r0 = zero register ;r1 = 128 register ;r2 = 6 register ;r3 = 240 register ;r4 = 3 register ;r5 = 255 register ;r6 = 1 register ;r10 = count 1 register ;r11 = count 2 register ;r12 = eeprom location pointer ;r21 = port b input ;r22 = analog input data (top 8 bits only) ;r31 = tmp register ;EEPROM 0-127 is used .device at90s2333 reset: cli clr r0 ;set r0 as zero register ldi r31,0x80 mov r1,r31 ;set r1 as 128 register ldi r31,0x06 mov r2,r31 ;set r2 as 6 register ldi r31,0xf0 mov r3,r31 ;set r3 as 240 register ldi r31,0x03 mov r4,r31 ;set r4 as 3 register ldi r31,0xff mov r5,r31 ;set r5 as 255 register ldi r31,0x01 mov r6,r31 ;set r6 as 1 register out 0x17,r0 ;set port b to inputs out 0x18,r31 ;set port b to internal pull up devices out 0x07,r0 ;set pc0 as the analog in pin ldi r31,0x86 out 0x06,r31 ;set analog input as single conversion and clock at 8Mhz/64 out 0x0a,r0 ;clr UART control register sbi 0x0a,3 ;set UART to transmitting out 0x03,r0 ldi r31,0x9f out 0x09,r31 ;set baud rate to 2400 at 6.144Mhz (159) ldi r31,0x00 out 0x1c,r31 ;set eeprom controls to zero clr r10 clr r11 ;initialize counts to 0 clr r12 ;initialize eeprom pointer to 0 ;This code delays 3 seconds before starting to read the A to D ;The delay is by sending 720 bytes to the UART at 2400 Baud prewait: in r31,0x0b ;Check UART status sbrc r31,5 rjmp psend rjmp prewait psend: out 0x0c,r0 ;output data add r10,r6 cpse r10,r3 ;count to 240 rjmp prewait clr r10 add r11,r6 cpse r11,r4 ;count to 240 3 times rjmp prewait clr r10 clr r11 ;reclear counters main: in r21,0x16 ;read port b ;The mext two insrtuctions cause the micro to stop here untill ;port b bit 0 is pulled low by a switch ;sbrc r21,0 ;wait if bit0=1 ;rjmp main sbi 0x06,6 ;start analog conversion ;This routine sends 6 bytes of 0's on the Uart ;This is a delay of 1/40 second so the A to D is read 40 times ;a second wait6: in r31,0x0b ;Check UART status sbrc r31,5 rjmp wait6send rjmp wait6 wait6send: out 0x0c,r0 ;output data add r10,r6 cpse r10,r2 ;count to 6 rjmp wait6 clr r10 ;clear r10 counter read: in r31,0x06 sbrs r31,4 ;check analog conversion status rjmp read clr r22 ;start with a clear input register in r31,0x04 sbrc r31,7 ;shift 2 bits positions to the right ori r22,0x20 sbrc r31,6 ori r22,0x10 sbrc r31,5 ori r22,0x08 sbrc r31,4 ori r22,0x04 sbrc r31,3 ori r22,0x02 sbrc r31,2 ori r22,0x01 in r31,0x05 ;read 2 most sig bits on analog sbrc r31,1 ;put into the two high bit positions ori r22,0x80 sbrc r31,0 ori r22,0x40 sbi 0x06,4 ;Clear the analog read so we are good to go eps: in r31,0x1c ;Check eprom status sbrc r31,1 rjmp eps out 0x1e,r11 ;set eeprom address out 0x1d,r22 ;set eeprom data ldi r31,0x04 out 0x1c,r31 ;set first eeprom write criteria sbi 0x1c,1 ;set second eeprom write criteria add r11,r6 ;increment counter cpse r11,r1 ;see if 128 counts rjmp main ;When done the micro just sends 1's forever on the Uart done: in r31,0x0b ;Check UART status sbrc r31,5 rjmp donesend rjmp done donesend: out 0x0c,r5 ;output data rjmp done