Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

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

kurczaczek699 25 Jun 2008 00:27 16303 11
  • #1
    kurczaczek699
    Level 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
    dawid512
    Level 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:

    Code:
    Config Adc = Single , Prescaler = Auto
    
    Start Adc

    Dim W As Word

    do
     
    W = Getadc(0)
     
    Loop
    End

  • #4
    dawid512
    Level 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:

    Code:
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    
  • #6
    pio_05
    Level 11  
    Wydaje mi sie ze program powinien wyglądać tak.

    Code:

    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
    dawid512
    Level 32  
    Quote:
    Code:
    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:
    Code:

    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
    dawid512
    Level 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
    ZbeeGin
    Level 39  
    A oto i gotowiec. Nie udzielam wsparcia - dostajecie tak jak jest.
    Code:
    ' 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
    kaytec
    Level 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! :)