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

[ATMega 8][BASCOM] ADC + diody LED ?

kurczaczek699 25 Cze 2008 00:27 16525 11
  • #1 5282516
    kurczaczek699
    Poziom 22  
    Mam takie pytanie, chce zrobić sobie na diodach led coś takiego co im większe napięcie tym więcej diód się zapala. Dokładnie chodzi mi o to że chce to urządzonko podłączyć do komputera na wyjściu od karty muzycznej STEREO, mam 2*8 diód i nie wiem jak napisać do tego program, macie jakieś propozycje ?
  • #2 5282559
    dawid512
    Poziom 32  
    Użyj przetwornika A/C do mierzenia napięcia a potem to tylko przetwórz jak ci pasuje.

    Przykładowy program do miernika napięcia:

    Config Adc = Single , Prescaler = Auto
    Start Adc
    
    Dim W As Word 
    
    do
     
    W = Getadc(0)
      
    Loop
    End
    
    
  • #4 5282579
    dawid512
    Poziom 32  
    Tobie chodzi o wskaźnik wysterowania tak :?:
    Były już takie projekty na forum z wykorzystaniem avr-ka.

    Teoretycznie możesz sobie dać mostek z diod prostowniczych i podłączyć to do atmegi. Wydaje mi się że będzie ona musiała szybko działać i ważne będą nawet małe zmiany napięcia.

    Osobiście przetwornik konfiguruję tak:

    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    
  • #6 5284598
    pio_05
    Poziom 12  
    Wydaje mi sie ze program powinien wyglądać tak.

    
    Config Adc = Single , Prescaler = Auto , Reference = Avcc 
    do
    if getadc(0) = 1024 then {zapalemy 8 diód odpowiedzialnych za kanal 1}
    {i tak dalej metodą prób i blendów wartości zapalnia diód a potem to samo dla durgiego kanału}
    loop
    


    Wydaje mi się że w ten sposób powinno działać i pokazywać głośność lewego i prawego kanału głośników.

    Jeśli się mylę proszę poprawić (jeszcze czegoś takiego jak autor tematu nigdy nie robiłem, ale wydaje mi sie że powinno być dobrze)

    pozdrawiam
    pio_05
  • #7 5285595
    dawid512
    Poziom 32  
    Cytat:
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    do
    if getadc(0) = 1024 then {zapalemy 8 diód odpowiedzialnych za kanal 1}
    {i tak dalej metodą prób i blendów wartości zapalnia diód a potem to samo dla durgiego kanału}
    loop 


    Jak już chcesz na if-ach to najpierw musisz wartość z przetwornika przypisać do jakiejś zmiennej a dopiero potem pisać warunki.

    Ja wolałbym select case:
    
    config portb = output
    dim zmienna as word
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    do
    zmienna= getadc(0) 
    
    select case zmienna
    
    case 1023 to 1000:
    set portb.0
    
    case 999 to 900:
    set portb.1
    
    '...
    'i tak dalej
    
    end select
    loop
    end
    
    
  • #9 5286903
    dawid512
    Poziom 32  
    Pamiętaj o jednym:

    Lewy kanał przez mostek do adc(0) a drugi też przez mostek do adc(1). Nie zapomnij o zasileniu AVCC.
  • #11 5288007
    ZbeeGin
    Poziom 39  
    A oto i gotowiec. Nie udzielam wsparcia - dostajecie tak jak jest.
    ' VU meter na ATmega8
    ' (c) by ZbeeGin / Reset soft
    '----------------------------------------
    $regfile = "m8def.dat"
    $crystal = 1000000
    
    Config Portd = &B11111111
    Config Portb = &B00000011
    
    Config Adc = Single , Prescaler = Auto , Reference = Internal
    Start Adc
    
    Dim Vu As Byte                          ' wartosc diod dla chwilowej wartosci
    Dim Hold As Byte                        ' wartosc diody dla opcji hold
    Dim Hold_time As Byte                   ' czas w jakim opada hold
    Dim Sample As Word                      ' wartosc odczytana z przetwornika
    
    Dim Wtemp As Word
    Dim Temp_portd As Byte                  ' tymczasowa zawartosc PORTD
    Dim Temp_portb As Byte                  ' tymczasowa zawartosc PORTB
    
    Do
      Waitms 5
    
    Convert:
      Sample = Getadc(0)                    ' pobierz napiecie z ADC0
      Select Case Sample                    ' przeskaluj na ilosc diod
        Case 0 To 10 : Vu = 0
        Case 11 To 112 : Vu = 1
        Case 113 To 214 : Vu = 2
        Case 215 To 316 : Vu = 3
        Case 317 To 418 : Vu = 4
        Case 419 To 520 : Vu = 5
        Case 521 To 622 : Vu = 6
        Case 623 To 724 : Vu = 7
        Case 725 To 826 : Vu = 8
        Case 827 To 928 : Vu = 9
        Case 929 To 1023 : Vu = 10
      End Select
    
    Hold_peak:
      If Vu >= Hold Then                    ' jesli przetworzona wartosc wieksza niz zapamietana max
        Hold = Vu                           ' to przypisz max nowa wartosc odczytana
        Hold_time = 60                      ' i ustaw liczniczek czasu podtrzymania
      Else
        Decr Hold_time                      ' w przeciwnym wypadku wartosc max bedzie opadac
        If Hold_time = 0 Then               ' jesli liczniczek sie przekrecil
          Decr Hold                         ' opusc diode max o jeden
          Hold_time = 48                    ' i zmien czas po jakim ma opadac w nast. kroku
        End If
      End If
    
    Displ:
      Wtemp = Lookup(hold , Hold_table)     ' czas na wyswietlanie
      Temp_portd = Low(wtemp)               ' wg danych z linii data
      Wtemp = Lookup(vu , Vu_table)
      Temp_portd = Temp_portd And Low(wtemp)       ' po prostu zmiksuj dane chwilowej wartosci z max
    
      Wtemp = Lookup(hold , Hold_table)
      Temp_portb = High(wtemp)
      Wtemp = Lookup(vu , Vu_table)
      Temp_portb = Temp_portb And High(wtemp)
    
      Portd = Temp_portd                    ' jak dane gotowe to na porty!
      Portb = Temp_portb
    Loop
    
    End
    
    Vu_table:
      Data &B0000001111111111%
      Data &B0000001111111110%              '1
      Data &B0000001111111100%              '2
      Data &B0000001111111000%              '3
      Data &B0000001111110000%              '4
      Data &B0000001111100000%              '5
      Data &B0000001111000000%              '6
      Data &B0000001110000000%              '7
      Data &B0000001100000000%              '8
      Data &B0000001000000000%              '9
      Data &B0000000000000000%              '10
    
    Hold_table:
      Data &B0000001111111111%
      Data &B0000001111111110%              '1
      Data &B0000001111111101%              '2
      Data &B0000001111111011%              '3
      Data &B0000001111110111%              '4
      Data &B0000001111101111%              '5
      Data &B0000001111011111%              '6
      Data &B0000001110111111%              '7
      Data &B0000001101111111%              '8
      Data &B0000001011111111%              '9
      Data &B0000000111111111%              '10
    
  • #12 5903522
    kaytec
    Poziom 20  
    Odkopie temat bo zakończył się ta gotowym rozwiązaniu, bez podziękowań itp :)

    Tak działa program napisany przez ZbeeGin
    Bardzo fajnie działa to w połączeniu z czujnikiem odległości sharpa, fotorezystorami, sygnałem audio już w ogóle, program z czujnikiem sharpa można zastosować nawet jako czujnik parkowania :)
    Zrobiłem to szybko na płytce ewaluacyjnej z propox'u :) Taki program, a sprawił mi tyle zabawy z elektronika :) Nie bawiłem się tak elektroniką od czasów podstawówki :) Najwięcej frajdy jak było podłączone pod beeper - braciak (8lat) próbował swoich sił w oszukaniu czujnika. (Tak wiem w święta odwaliło nam) Na filmiku tylko potencjometr, proponuje wejść na youtube - i wybrać minimalnie lepsza jakość.

    Dzięki ZbeeGin za taki program! :)



REKLAMA