logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

BASCOM VU meter optymalizacja kodu

arktik1 15 Lut 2010 13:32 5688 11
REKLAMA
  • #1 7697443
    arktik1
    Poziom 27  
    Witam.
    Od jakiegoś czasu próbuje zbudować miernik głośności wyjścia słuchawkowego.
    Oczywiście wszystkie moje projekty jak do tej pory działają nie zbyt dobrze.
    pomyślałem że sięgnę po gotowca i znalazłem coś takiego:
    
    --------------------------------------------------------------------------------
    'name                     : BG30dB_LCD.bas
    'copyright                : (c) 1995-2005, MCS Electronics
    'purpose                  : create a logarithmic LCD bar graph dB (VU) meter
    'micro                    : AT90S2313-10
    'suited for demo          : yes
    'commercial addon needed  : no
    'use in simulator         : possible
    '
    ' Author     : Ger langezaal
    '
    '---[ Small program description ]-----------------------------------------------------
    '
    ' This program is written to create a logarithmic LCD bar graph dB (VU) meter
    ' on a 16x2 LCD display with peak-hold and drop-down.
    ' Custom characters are designed with the LCD Designer in BASCOM-AVR.
    ' The upper row is a scale from +6dB to -24dB with 2dB markers.
    ' The lower row is the bar graph with peak-hold and drop-down.
    ' Log conversion is done with the analog comparator on a RC discharge curve.
    ' C1 is charged every 4mS with PB0 as output on a Timer0 Interrupt.
    ' Then PB0 is set to AIN0 (analog comparator +input) Timer1 is reset
    ' and start counting, C1 will be discharged by R1.
    ' Timer1 is counting until AIN0 < AIN1.
    ' Analog Comparator Output = ACSR bit 5.
    ' Timer1 value is stored in T1 for calculation.
    '
    '---[ LCD display ]-------------------------------------------------------------
    '
    ' Display     : LCD 16 x 2
    ' Scale range : 30dB (+6dB to -24dB)
    ' Resolution  : 2dB
    '
    ' The LCD display is connected in PIN mode.
    ' See also BASCOM-AVR Index:
    '     'Attaching an LCD Display' and 'AT90S2313' for pin numbers
    '
    '   LCD pin  -  AVR
    '
    '   Vss  1   -  GND
    '   Vdd  2   -  VCC +5 Volt
    '   Vo   3   -  0-VCC     Contrast
    '   RS   4   -  PB2
    '   RW   5   -  GND
    '   E    6   -  PB3
    '   Db0  7   -  GND
    '   Db1  8   -  GND
    '   Db2  9   -  GND
    '   Db3  10  -  GND
    '   Db4  11  -  PB4
    '   Db5  12  -  PB5
    '   Db6  13  -  PB6
    '   Db7  14  -  PB7
    '
    '---[ Analog comparator inputs ]------------------------------------------------
    '
    '
    '  Meter DC input >-------[ R2 ]-------> Pb0 (AIN1 )
    '                                 |
    '             GND <---------||-----
    '                           C2
    '
    '                      ---[ R1 ]---
    '             GND <----|          |----> Pb1 (AIN0 )
    '                      -----||-----
    '                           C1
    ' R1 = 10k 5%
    ' R2 = 10k
    ' C1 = 47nF 5%
    ' C2 = 47nF
    '
    '---[ DC input versus Timer1 and Bar position ]---------------------------------
    '
    ' Measured Timer1 values for calculation:
    ' DC input = 3500mV  Timer1 =  192   ( +6dB)
    ' DC input =  350mV  Timer1 = 1482   (-14dB)   20dB = factor 10
    ' 20dB = 1482 - 192 = 1290 Timer1 counts
    '  2dB = 1290 / 10 = 129 Timer1 counts
    '
    ' Calculated Values:
    '  Input mV    Timer1   dB Scale   Bar pos
    '   3500         192       +6        16
    '   2780         321       +4        15
    '   2208         450       +2        14
    '   1754         579        0        13
    '   1393         708       -2        12
    '   1106         837       -4        11
    '    879         966       -6        10
    '    698        1095       -8         9
    '    554        1224       -10        8
    '    440        1353       -12        7
    '    350        1482       -14        6
    '    278        1611       -16        5
    '    221        1740       -18        4
    '    175        1869       -20        3
    '    139        1998       -22        2
    '    111        2127       -24        1
    '   <111       >2127     infinit     1/2 Bar
    '
    '---[ Compiler and hardware related statements ]--------------------------------
    
    $regfile = "2313def.dat"                                    'register file for AT90S2313
    $crystal = 10000000                                         '10MHz crystal
    $hwstack = 32                                               ' default use 32 for the hardware stack
    $swstack = 10                                               'default use 10 for the SW stack
    $framesize = 40                                             'default use 40 for the frame space
    
    Config Lcdbus = 4
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pb.4 , Db5 = Pb.5 , Db6 = Pb.6 , Db7 = Pb.7 , E = Pb.3 , Rs = Pb.2
    
    Ddrb = &B11111100                                           'set PB0 and PB1 as inputs
    Portb.0 = 0                                                 'disable PB0 input pullup
    Portb.1 = 0                                                 'disable PB1 input pullup
    
    Ddrd = &B10111111                                           'config PD6 as input
    Portd = &B11111111                                          'output high and enable input pullup
    
    Acsr.7 = 0                                                  'enable analog comparator (bit 7 = 0)
    
    '---[ Variables ]---------------------------------------------------------------
    
    Dim Char_pos As Byte
    Dim Peak_pos As Byte
    Dim Peak_hold As Byte
    Dim Drop_hold As Byte
    Dim Bar_len As Word
    Dim T1 As Word
    
    '---[ Constants ]---------------------------------------------------------------
    
    Const Peak_hold_time = 250
    Const Drop_down_time = 50
    Const Char_max = 16                                         'number of LCD characters (one row)
    Const T1_fs = 192                                           'full scale Timer1 value
    Const T1_step = 129                                         '2dB step Timer1  value
    Const T1_range = T1_step * Char_max + T1_fs                 'Calculate Timer1 range
    
    Ac_out Alias Acsr.5                                         'analog comparator output = ACSR bit 5
    
    '---[ Custom LCD characters ]---------------------------------------------------
    
    Deflcdchar 0 , 12 , 18 , 18 , 18 , 12 , 32 , 04 , 04        ' 0
    Deflcdchar 1 , 02 , 06 , 02 , 02 , 07 , 32 , 32 , 04        ' 1
    Deflcdchar 2 , 06 , 09 , 02 , 04 , 15 , 32 , 32 , 04        ' 2
    Deflcdchar 3 , 32 , 32 , 07 , 32 , 32 , 32 , 32 , 04        ' -
    Deflcdchar 4 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 04        ' Scale marker
    Deflcdchar 5 , 27 , 27 , 27 , 27 , 27 , 27 , 27 , 32        ' bar
    Deflcdchar 6 , 24 , 24 , 24 , 24 , 24 , 24 , 24 , 32        ' 1/2 left bar
    Deflcdchar 7 , 06 , 05 , 14 , 21 , 14 , 32 , 32 , 04        ' dB
    Cls                                                         'select LCD data RAM
    Cursor Off
    
    '---[ Timer Configuration ]-----------------------------------------------------
    
    Config Timer0 = Timer , Prescale = 256                      'On Interrupt Timer
    Config Timer1 = Timer , Prescale = 8                        'R/C Timer
    Config Watchdog = 2048
    Enable Interrupts
    Enable Timer0
    Enable Timer1
    On Timer0 Dc_input_sample                                   'goto subroutine
    Timer0 = 0
    Timer1 = 0
    Start Timer0
    Start Timer1
    
    '---[ Show software revision ]--------------------------------------------------
    
    Lcd "BAR GRAPH 30dB"
    Locate 2 , 1
    Lcd "METER  Rev.1.0"
    Waitms 1000
    Cls
    
    '---[ Draw dB Scale with custom characters ]------------------------------------
    
    Locate 1 , 1 : Lcd Chr(3) ; Chr(2) ; Chr(0) ; Chr(4) ; Chr(4) ; Chr(3)
    Locate 1 , 7 : Lcd Chr(1) ; Chr(0) ; Chr(4) ; Chr(4) ; Chr(4) ; Chr(4)
    Locate 1 , 13 : Lcd Chr(0) ; Chr(4) ; Chr(4) ; Chr(7)
    
    '---[ Main program loop ]-------------------------------------------------------
    
    Do
      Locate 2 , 1                                              'set LCD first character position
    
      If Bar_len = 0 Then
        If Peak_pos = 0 Then Lcd Chr(6)                         'print 1/2 left bar for infinit
      End If
    
      For Char_pos = 1 To Char_max                              'number of characters
        If Char_pos <= Bar_len Then                             'print one bar
          Lcd Chr(5)                                            '
        Elseif Char_pos = Peak_pos Then                         'print peak bar
          Lcd Chr(5)                                            '
        Else
          Lcd Chr(32)                                           'print spaces to fill row
        End If
      Next
    Loop
    
    '-------------------------------------------------------------------------------
    End
    '-------------------------------------------------------------------------------
    
    '---[ Interrupt Service Routine on Timer0 overflow  ]---------------------------
    
    Dc_input_sample:
      Timer0 = 100                                              'preset Timer0 for sample rate of 4mS
    
      Ddrb.0 = 1                                                'set AIN0 as PB0 output
      Portb.0 = 1                                               'set PB0 high to charge C1
      Waitus 200                                                'wait for charge complete
      Ddrb.0 = 0                                                'reset PB0 as AIN0 analog input
      Portb.0 = 0                                               'disable AIN0 pullup
    
      Timer1 = 0                                                'clear R/C Timer1
      Bitwait Ac_out , Reset                                    'wait for AIN0 < AIN1
      T1 = Timer1                                               'read Timer1 value
    
      If T1 < T1_fs Then                                        'check T1 low limit
        T1 = T1_fs                                              'T1 clipping
      Elseif T1 > T1_range Then                                 'check T1 high limit
        T1 = T1_range                                           'T1 clipping
      End If
    
      Bar_len = T1_range - T1                                   'calculate bar length
      Bar_len = Bar_len \ T1_step                               '
    
      If Bar_len >= Peak_pos Then                               'new peak value
        Peak_pos = Bar_len                                      'store peak value
        Peak_hold = Peak_hold_time                              'preset peak hold timer
      Else
        If Peak_hold > 0 Then
          Decr Peak_hold
        Else
          If Drop_hold > 0 Then
            Decr Drop_hold
          Else
            Drop_hold = Drop_down_time                          'preset drop down timer
            If Peak_pos > 0 Then Decr Peak_pos                  'drop down one position
          End If
        End If
      End If
      Reset Watchdog
    Return
    

    Tylko że nie mogę tego podłączyć .
    Jak bym nie podłączał to źle działa.
    Raz wskazuje full a innym razem nic nie pokazuje.
    Pomocy bo skończyły mi się pomysły.
    A może ktoś ma gdzieś programik który by działał??
  • REKLAMA
  • #2 7698493
    sp3ots
    Poziom 38  
    Witam !
    Ten program działa, nie raz już go testowałem.
    Ten projekt służy do wskazywania napięcia stałego, nie przemiennego jakie jest na wyjściu słuchawkowym !
    Pozdrawiam. Stefan
  • REKLAMA
  • #3 7698765
    arktik1
    Poziom 27  
    To gdzie sens :

    logarithmic LCD bar graph dB (VU) meter

    ??
  • REKLAMA
  • #4 7698865
    sp3ots
    Poziom 38  
    Meter DC input nie AC możesz dorobić prostownik

    IN -------|>|------- tu Meter DC input
    np 1N4148 jeszcze jakiś kondensator do masy i gotowe.
  • #5 7699148
    arktik1
    Poziom 27  
    To rozumiem
    Przez rezystor do kondensatora i dalej do AIN1.(kondensator do masy).
    Równolegle rezystor do kondensatora i dalej do AIN0.(kondensator i rezystor do masy)
    Tak jest na schemacie załączonym do programu.
    Jest jeszcze końcówka PD.6 ,gdzie ją podłączamy??
  • REKLAMA
  • #6 7699449
    sp3ots
    Poziom 38  
    Pd.6 nie podłączony
  • #7 7702957
    arktik1
    Poziom 27  
    Poskładałem coś takiego:
    
    $regfile = "M8def.dat"                                      ' use the Mega8
    
    $crystal = 16000000
    Config Portc = Input
            Portc = &B0000000
    Config Portd = Input
            Portd = &B11111111
    '----------------------------------do VU---------------
    Deflcdchar 0 , 32 , 32 , 31 , 31 , 31 , 31 , 32 , 32
    Deflcdchar 2 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16        ' replace ? with number (0-7)
    Deflcdchar 3 , 16 , 16 , 31 , 31 , 31 , 31 , 16 , 16        ' replace ? with number (0-7)
    Deflcdchar 4 , 32 , 32 , 31 , 31 , 31 , 31 , 32 , 32
    Deflcdchar 6 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16        ' replace ? with number (0-7)
    Deflcdchar 7 , 16 , 16 , 31 , 31 , 31 , 31 , 16 , 16        ' replace ? with number (0-7)
    '---------------------------------VU
    Config Lcd = 16 * 4
    Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0
    
    Config Adc = Single , Prescaler = Auto , Reference = Avcc   'config ADC
    
    Start Adc
    '-------------------------------do VU--------------------------------
    
    Dim W0 As Word , P0 As Word , V0 As Word , I0 As Byte , Cols0 As Byte , X As Word
    Dim Ps0 As String * 3
    Dim W1 As Word , P1 As Word , V1 As Word , I1 As Byte , Cols1 As Byte
    Dim Ps1 As String * 3
    X = 1
    
    '------------------------------VU
    Cls
    
    
    
    
    Do
    
    
    '----------------------------vu
      W0 = Getadc(0)
      V0 = W0 / 1
      P0 = W0 / 1
      Ps0 = Str(p0)
      Cols0 = P0 / X
      If Cols0 >= 15 Then Cols0 = 15
      If W0 > 20 Or W1 > 20 Then X = 2
      If W0 < 2 And W1 < 2 Then X = 1
    
    
      W1 = Getadc(1)
      V1 = W1 / 1
      P1 = W1 / 1
      Ps1 = Str(p1)
      Cols1 = P1 / X
    If Cols1 >= 15 Then Cols1 = 15
    
     Locate 1 , 2
      For I0 = 1 To Cols0
           Select Case I0
       Case 1 : Lcd Chr(3)
        Case Else : Lcd Chr(0)
      End Select
      Next I0
    
      Cols0 = Cols0 + 1
    
      For I0 = Cols0 To 15
      Select Case I0
       Case 1 : Lcd Chr(2)
       Case Else : Lcd Chr(32)
       End Select
          Next I0
    
    
       Locate 2 , 2
      For I1 = 1 To Cols1
       Select Case I1
       Case 1 : Lcd Chr(7)
       Case Else : Lcd Chr(4)
      End Select
      Next I1
    
      Cols1 = Cols1 + 1
    
      For I1 = Cols1 To 15
      Select Case I1
       Case 1 : Lcd Chr(6)
       Case Else : Lcd Chr(32)
       End Select
       Next I1
    
    Locate 1 , 1
     Lcd "L"
    Locate 2 , 1
    Lcd "R"
    '-----------------------------------------------VU
      Loop
    End
    

    Tylko przydała by się do tego opadająca belka wartości max.
    Nie musi opadać po woli w dół ,wystarczy że będzie zostawać na wartości max przez ok 1sec. i znikać.
    Potrzebuję pomocy nie mam pojęcia jak to napisać.
  • #8 7742929
    arktik1
    Poziom 27  
    Czy można to napisać krócej??
    Używając np CASE?
    
    If Cols0 = 0 Then Lcd Chr(0) ; Spc(18)
    If Cols0 = 1 Then Lcd Chr(1) ; Spc(18)
    If Cols0 = 2 Then Lcd Chr(1) ; L ; Spc(17)
    If Cols0 = 3 Then Lcd Chr(1) ; C ; Spc(17)
    If Cols0 = 4 Then Lcd Chr(1) ; C ; L ; Spc(16)
    If Cols0 = 5 Then Lcd Chr(1) ; C ; C ; Spc(16)
    If Cols0 = 6 Then Lcd Chr(1) ; C ; C ; L ; Spc(15)
    If Cols0 = 7 Then Lcd Chr(1) ; C ; C ; C ; Spc(15)
    If Cols0 = 10 Then Lcd Chr(1) ; C ; C ; C ; L ; Spc(14)
    If Cols0 = 15 Then Lcd Chr(1) ; C ; C ; C ; C ; Spc(14)
    If Cols0 = 20 Then Lcd Chr(1) ; C ; C ; C ; C ; L ; Spc(13)
    If Cols0 = 25 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; Spc(13)
    If Cols0 = 30 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; L ; Spc(12)
    If Cols0 = 35 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; Spc(12)
    If Cols0 = 40 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; L ; Spc(11)
    If Cols0 = 45 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; Spc(11)
    If Cols0 = 50 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; L ; Spc(10)
    If Cols0 = 55 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; Spc(10)
    If Cols0 = 60 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; L ; Spc(9)
    If Cols0 = 65 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; Spc(9)
    If Cols0 = 70 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; L ; Spc(8)
    If Cols0 = 75 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; Spc(8)
    If Cols0 = 80 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; L ; Spc(7)
    If Cols0 = 85 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; Spc(7)
    If Cols0 = 90 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; L ; Spc(6)
    If Cols0 = 95 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; Spc(6)
    If Cols0 = 100 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; L ; Spc(5)
    If Cols0 = 105 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; Spc(5)
    If Cols0 = 110 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; L ; Spc(4)
    If Cols0 = 115 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; Spc(4)
    If Cols0 = 120 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; L ; Spc(3)
    If Cols0 = 125 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; Spc(3)
    If Cols0 = 130 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; L ; Spc(2)
    If Cols0 = 135 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; Spc(2)
    If Cols0 = 140 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; L ; Spc(1)
    If Cols0 = 145 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; Spc(1)
    If Cols0 = 150 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; L
    If Cols0 >= 155 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C
    
  • #9 7743267
    Freddy
    Poziom 43  
    arktik1 napisał:
    Czy można to napisać krócej??
    Używając np CASE?
    
    If Cols0 = 0 Then Lcd Chr(0) ; Spc(18)
    If Cols0 = 1 Then Lcd Chr(1) ; Spc(18)
    If Cols0 = 2 Then Lcd Chr(1) ; L ; Spc(17)
    If Cols0 = 3 Then Lcd Chr(1) ; C ; Spc(17)
    If Cols0 = 4 Then Lcd Chr(1) ; C ; L ; Spc(16)
    If Cols0 = 5 Then Lcd Chr(1) ; C ; C ; Spc(16)
    If Cols0 = 6 Then Lcd Chr(1) ; C ; C ; L ; Spc(15)
    If Cols0 = 7 Then Lcd Chr(1) ; C ; C ; C ; Spc(15)
    If Cols0 = 10 Then Lcd Chr(1) ; C ; C ; C ; L ; Spc(14)
    If Cols0 = 15 Then Lcd Chr(1) ; C ; C ; C ; C ; Spc(14)
    If Cols0 = 20 Then Lcd Chr(1) ; C ; C ; C ; C ; L ; Spc(13)
    If Cols0 = 25 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; Spc(13)
    If Cols0 = 30 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; L ; Spc(12)
    If Cols0 = 35 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; Spc(12)
    If Cols0 = 40 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; L ; Spc(11)
    If Cols0 = 45 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; Spc(11)
    If Cols0 = 50 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; L ; Spc(10)
    If Cols0 = 55 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; Spc(10)
    If Cols0 = 60 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; L ; Spc(9)
    If Cols0 = 65 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; Spc(9)
    If Cols0 = 70 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; L ; Spc(8)
    If Cols0 = 75 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; Spc(8)
    If Cols0 = 80 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; L ; Spc(7)
    If Cols0 = 85 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; Spc(7)
    If Cols0 = 90 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; L ; Spc(6)
    If Cols0 = 95 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; Spc(6)
    If Cols0 = 100 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; L ; Spc(5)
    If Cols0 = 105 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; Spc(5)
    If Cols0 = 110 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; L ; Spc(4)
    If Cols0 = 115 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; Spc(4)
    If Cols0 = 120 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; L ; Spc(3)
    If Cols0 = 125 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; Spc(3)
    If Cols0 = 130 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; L ; Spc(2)
    If Cols0 = 135 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; Spc(2)
    If Cols0 = 140 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; L ; Spc(1)
    If Cols0 = 145 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; Spc(1)
    If Cols0 = 150 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; L
    If Cols0 >= 155 Then Lcd Chr(1) ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C ; C
    


    Przepraszam, gdzie ten CAse, bo jakoś nie mogę zauważyć ?
    Poszukaj na forum, zamieściłem krótki dobry i sprawdzony programik pochodzący z AVRFreaks.
  • #10 7743302
    arktik1
    Poziom 27  
    No właśnie.
    Jak widać to w tym kawałku
    
    If Cols0 = 2 Then Lcd Chr(1) ; L ; Spc(17)
    If Cols0 = 3 Then Lcd Chr(1) ; C ; Spc(17)
    

    Przy wartości 2 jest wyświetlany jeden słupek a przy wartości 3 są na tym samym miejscu wyświetlane 2 słupki.
    Ale przy tym

    
     Locate 1 , 2
      For I0 = 1 To Cols0
           Select Case I0
       Case 1 : Lcd Chr(3)
        Case Else : Lcd Chr(0)
      End Select
      Next I0
    

    mogę wyświetlić tylko słupek przy wartości 2 bo przy 3 przeskakuje na następne pole.

    Dodano po 5 [godziny] 57 [minuty]:

    Widziałem twój program, podobny do tego co napisałem 3 posty wyżej.
    Nie o to chodzi.
    Chodzi o to by zapalał 2 belki w 1 polu nie zależnie od siebie.
  • #11 7748361
    arktik1
    Poziom 27  
    Nikt nie wie jak to zoptymalizować, nie da się tego zrobić?
  • #12 7992323
    arktik1
    Poziom 27  
    Zrobiłem coś takiego:
    
    Q = Getadc(0)
    
    If Q < 6 Then
    W = Q
    Else
    W = Q / 25
    End If
    
    W2 = W / 2
    W1 = W + 1
    W1 = W1 / 2
    
    Locate 1 , 1
     Lcd "L"
     If Q < 6 Then
     Temp_l = W2 + 2
     Else
    Temp_l = W2 + 5
    End If
    
    If W1 = W2 Then
    Locate 1 , Temp_l
     Lcd Chr(0)
     End If
     If W1 > W2 Then
    Locate 1 , Temp_l
     Lcd Chr(1)
    End If
    If Q < 6 Then
     Temp_l = W2 + 3
    Else
    Temp_l = W2 + 6
    End If
    
     If W1 = W2 Or W1 > W2 Then
    Locate 1 , Temp_l
     Lcd "                    "
     End If
    

    Tylko jest mały problem.
    Gdy sygnał skoczy gwałtownie w górę to w pasku pozostają nie wypełnione pola.
    Co dopisac by to się nie działo?
REKLAMA