' Read six ADC inputs and display six bars - use ATM88 or above ' 0x3C = Block ' 0x3E = Half block $crystal = 20000000 $BAUD = 0 ' Reserve screen variable area at start of RAM ' Assembler interrupt code has two byte variables IN BETWEEN two word variables Dim ScreenAddr1 as word at $100 Dim RAMVar1 as byte at $102 Dim RAMVar2 as byte at $103 Dim ScreenAddr2 as word at $104 Dim ScreenRAM(600) as byte AT $106 Dim Addr As Word Dim ADCIN as Word Dim NumChar as byte Dim Bar as word Dim I as byte Dim Colour as byte Config Adc = Single , Prescaler = Auto , Reference = Avcc On Oc2a Tvinterrupt Nosave Goto Main !.org $100 $inc Tvinterrupt , Nosize , "tvinc.bin" Return Main: ' Set up clock division - only need to do this if DIV8 fuse not set, as default fuse setting is div. by 8 Config Clockdiv = 1 ' CLKPR=$80 ' CLKPR=0 ' Setup timer 2 TCCR2B=$02 OCR2A=158 OCR2B=160 TIMSK2=&b00000110 ' Now set up sleep mode [SMCR = Sleep Mode Control Register] - must be enabled or TV code cannot work accurately SMCR=1 ' Set PORTB to all outputs for video signal DDRB=$FF ' Enable & config SPI SPCR=$54 SPSR=1 ' Init RAM variables for interrupt code RAMVar1=0 RAMVar2=0 ScreenAddr1=$106 ScreenAddr2=$106 ENABLE OC2A ' ENABLE OC2B ENABLE INTERRUPTS ' Now continue with user code 'Now give power to the chip Start Adc Do Addr=1 ' Set Addr to address of first screen location NumChar=$30 ' ASCII value for 0 GoSub TwoBars GoSub TwoBars GoSub TwoBars Incr Addr ScreenRAM(Addr)=13 ' Decimal {012} = $0C = END OF LINE MARKER ' Decimal {013} = $0D = END OF SCREEN MARKER ' Decimal {017} = $11 = Green on black ' Decimal {019} = $13 = Cyan on blue ' Decimal {020} = $14 = Yellow on red ' Decimal {022} = $16 = White on magenta Wait 1 Loop TwoBars: Incr NumChar Colour=19 GoSub DisplayBar Incr NumChar Colour=20 GoSub DisplayBar Return DisplayBar: ScreenRAM(Addr)="A" Incr Addr ScreenRAM(Addr)="D" Incr Addr ScreenRAM(Addr)="C" Incr Addr ScreenRAM(Addr)=" " Incr Addr ScreenRAM(Addr)=NumChar Incr Addr ScreenRAM(Addr)=":" Incr Addr ScreenRAM(Addr)=12 Incr Addr ' Display row of bar characters plus an end of line char ' First convert ADC reading into bar characters ' 4095 = Max 45 chars, so conversion means 4095/45 = divide by 91 ' e.g. 2000 = 2000/91 = 21 bar characters I=Numchar-$30 ' Extract ADC number Bar=GetADC(I) Bar=Bar/91 Incr Bar ' Make sure Bar is not zero ScreenRAM(Addr)=Colour Incr Addr For I=1 to Bar ScreenRAM(Addr)=$3C Incr Addr Next I ScreenRAM(Addr)=" " Incr Addr Incr Bar ScreenRAM(Addr)=17 Incr Addr Incr Bar For I=Bar to 50 ScreenRAM(Addr)=" " Incr Addr Next I ScreenRAM(Addr)=12 Incr Addr Return End