Načtení a výpočet hodnot napětí s ADC v Bascom

Zdravím, pokuším se o stavbu kytarové ladičky. Mám zrelizovaný převodník Frekvence/napětí a pomocí ADC snímám napětí na jeho výstupu. Podle napětí rozděleného do 6ti úseků rozhoduji o tom, jaká struna kmitá, rozsvítím ledku. Toto mi funguje, dále se však potřebuju rozhodnout zda je napětí (frekvence) snímané struny nižší, rovnoůrovni při přesném ladění, nebo vyšší. To se mi však nedaří, jsem začátečník, prosím poraďtě. Díky moc za každou radu!!! :slight_smile: Kod zde:

$regfile = “m8def.dat”

$crystal = 1000000

Config Portd = Output
Portd = 00
Waitms 500
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Portc.5 = Output
Config Portc.4 = Output
Config Portc.3 = Output
Portc.5 = 1
Portc.4 = 1
Portc.3 = 1

Start Adc

Struna Alias Portd
Nizsi Alias Portc.5
Rovna Alias Portc.4
Vyssi Alias Portc.3

Dim Ref As Integer
Dim Ton As Integer
Dim X As Word
Dim Mereny As Integer

Const E1 = &B01111111
Const B2 = &B10111111
Const G3 = &B11011111
Const D4 = &B11101111
Const A5 = &B11110111
Const E6 = &B11111011
Const Zadna = &B11111111

Do
If Getadc(1) > 0 And Getadc(1) <= 30 Then Struna = Zadna
If Getadc(1) > 30 And Getadc(1) <= 190 Then Struna = E6
If Getadc(1) > 30 And Getadc(1) <= 190 Then Ref = 110
If Getadc(1) > 190 And Getadc(1) <= 350 Then Struna = A5
If Getadc(1) > 190 And Getadc(1) <= 350 Then Ref = 270
If Getadc(1) > 350 And Getadc(1) <= 510 Then Struna = D4
If Getadc(1) > 350 And Getadc(1) <= 510 Then Ref = 430
If Getadc(1) > 510 And Getadc(1) <= 670 Then Struna = G3
If Getadc(1) > 510 And Getadc(1) <= 670 Then Ref = 690
If Getadc(1) > 670 And Getadc(1) <= 830 Then Struna = B2
If Getadc(1) > 670 And Getadc(1) <= 830 Then Ref = 750
If Getadc(1) > 830 And Getadc(1) <= 990 Then Struna = E1
If Getadc(1) > 830 And Getadc(1) <= 990 Then Ref = 910
If Getadc(1) > 990 And Getadc(1) <= 1024 Then Struna = Zadna

X = Getadc(1)
Mereny = X
Ton = Ref - Mereny

If Ton > 0 And Ton <= 80 Then Nizsi = 0
If Ton = 0 Then Rovna = 0
If Ton => -80 And Ton < 0 Then Vyssi = 0

Loop
End

:arrow_right: administrator: přejmenováno z "Načtení a výpočer hodnot s ADC v Bascom"

Zkusil bych toto:

[code]Dim Napeti As Word

Do
Vyssi = 1
Nizsi = 1
Napeti = Getadc(1)

  If Napeti > 0 And Napeti <= 30 Then Struna = Zadna

  If Napeti > 30 And Napeti <= 190 Then Struna = E6       'Ref = 110
  If Napeti > 110 Then : Vyssi = 0 : Else : Nizsi = 0 : End If

  If Napeti > 190 And Napeti <= 350 Then Struna = A5       'Ref = 270
  If Napeti > 270 Then : Vyssi = 0 : Else : Nizsi = 0 : End If

  'atd

[/code]

Ale proč dávat převodník, když Avr může přímo číst kmitočet?

Omluvte moji sklerozu.
Mělo to být takto

[code]Dim Napeti As Word

Do
Vyssi = 1
Nizsi = 1
Napeti = Getadc(1)

  If Napeti > 0 And Napeti <= 30 Then Struna = Zadna

  If Napeti > 30 And Napeti <= 190 Then : Struna = E6       'Ref = 110
  If Napeti > 110 Then : Vyssi = 0 : Else : Nizsi = 0 : End If : End If

  If Napeti > 190 And Napeti <= 350 Then : Struna = A5       'Ref = 270
  If Napeti > 270 Then : Vyssi = 0 : Else : Nizsi = 0 : End If : End If

  'atd[/code]

Díky moc, vyzkouším a dám vědět, případně zašlu hotový kód, pokud se zadaří. :slight_smile: Jak měřit kmitočet? Zkoušel jsem počítat pulsy na Timeru(counteru) a bohužel se mi to nedařilo. Ale tuším, že asi bude třeba snímat počet pulsů za jednotku času. Vyzkouším nejdřív rozepsat do těch úplných podmínek, díky moc. :slight_smile:

Vše funguje přesně jak jsem chtěl, až na rozsvícení zelené ledky při (kmitočtu) napětí rovném Ref. Pokoušel jsem vložit popodmínku else if takto:

If Napeti > 0 And Napeti <= 30 Then Struna = Zadna

  If Napeti > 30 And Napeti <= 190 Then : Struna = E6       'Ref = 110
  If Napeti > 110 Then : Vyssi = 0
  Else If Napeti = 110 Then Rovna = 0
  Else : Nizsi = 0 : End If : End If

Bascom mi vypisuje error. Díky moc, až budu mít vše hotovo dám sem celý kod i schema. snad se někomu bude hodit. :slight_smile: