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

[Atmega8][Bascom] ADC mój wskaźnik wysterowania

paavo91 11 Wrz 2010 17:29 6419 11
  • #1 8500017
    paavo91
    Poziom 19  
    Witam!

    Chciałem zrobić sobie wskaźnik wysterowania od 0 do 1V. Jak na razie próbuję napisać kod żeby mierzył od 0 do 5V.

    Kod wygląda tak:(sugerowałem się problemami użytkowników)

    $regfile = "m8def.dat"                                      ' INFORMACJA O PROCESORZE
    $crystal = 1000000
    
    
    
    Config Portd = Output
    Config Portb = Output
    Config Portc = Output
    
    Dim Nap As Word
    
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    
    Start Adc
    
    
    Portd.3 = 0
    Portd.4 = 0
    
    Portb.0 = 0
    Portb.1 = 0
    Portb.2 = 0
    Portb.3 = 0
    Portb.4 = 0
    
    Portc.5 = 0
    Portd.0 = 0
    Portd.1 = 0
    Portd.2 = 0
    
    
    ' deklaracje podprogramów
    Declare Sub Greena
    Declare Sub Greenb
    Declare Sub Greenc
    Declare Sub Greend
    Declare Sub Greene
    Declare Sub Greenf
    Declare Sub Greeng
    Declare Sub Greenh
    Declare Sub Greeni
    Declare Sub Grennj
    
    
    Do
    
    Nap = Getadc(0)
    
    Select Case Nap
    
    Case 1023 To 921:
    Greena
    
    Case 920 To 819:
    
    Greenb
    
    Case 818 To 717:
    Greenc
    
    Case 716 To 615:
    Greend
    
    Case 614 To 512:
    Greene
    
    Case 511 To 409:
    Greenf
    
    Case 408 To 306:
    Greeng
    
    Case 305 To 203:
    Greenh
    
    Case 202 To 100:
    Greeni
    
    Case 99 To 1:
    Greenj
    
    End Select
    
    
    
    Loop
    
    End
    
    ' ciała podprogramów
    Greena:
    
    Portb.0 = 1
    Portd.2 = 1
    Reset Portb.0
    Reset Portd.2
    Return
    
    Greenb:
    
    Portb.0 = 1
    Portd.0 = 1
    Reset Portb.0
    Reset Portd.0
    Return
    
    Greenc:
    Portb.1 = 1
    Portd.2 = 1
    Reset Portb.1
    Reset Portd.2
    Return
    
    Greend:
    Portb.1 = 1
    Portd.0 = 1
    Reset Portb.1
    Reset Portd.0
    Return
    
    Greene:
    Portb.2 = 1
    Portd.1 = 1
    Reset Portb.2
    Reset Portd.2
    Return
    
    Greenf:
    Portb.2 = 1
    Portd.0 = 1
    Reset Portb.2
    Reset Portd.0
    Return
    
    Greeng:
    Portb.3 = 1
    Portd.2 = 1
    Reset Portb.3
    Reset Portd.2
    Return
    
    Greenh:
    Portb.3 = 1
    Portd.0 = 1
    Reset Portb.3
    Reset Portd.0
    Return
    
    Greeni:
    Portb.4 = 1
    Portd.2 = 1
    Reset Portb.4
    Reset Portd.2
    Return
    
    Greenj:
    Portb.4 = 1
    Portd.0 = 1
    Reset Portb.4
    Reset Portd.0
    Return
    


    Używam do tego bargrafa dwukolorowego, lecz na razie pomińmy drugi kolor. Wiem, że w kodzie się opisałem za dużo jak na 2 kolor ale później mam zamiar to wykorzystać. No i oczywiście nie zaświeca słupka tak jak powinien. Ale mniejsza o to. Chodzi mi tylko żeby to działało. Proszę napisać czy poprawny kod ewentualnie czekam na poprawki :)


    a drugi problem w tym, że nie mogę skompilować nawet tego :/

    Błąd to:
    unknown statement [greenj]

    Dzięki za pomoc!
  • #2 8500049
    alien_audio
    Poziom 21  
    Witam
    popraw tą deklarację ma być tak :
    Declare Sub Greenj
    a jest teraz tak:
    Declare Sub Grennj
  • #3 8500086
    paavo91
    Poziom 19  
    Kurde faktycznie, człowiek zmęczony i już nie ogarnia tego.

    Wgrałem to do procka. Przyłożyłem napięcie ok 3V i nic. Pomyślałem, że to może tak szybko zapalać i gasić że nie widzę bo tak w sumie napisałem kod ponieważ jak chciałem zapalić je kolejno to stan portów z poprzedniej linii zapalał mi o 1 diodę za dużo. I chciałem, żeby po tym jak zaświeci, od razu ją resetował i to wszystko w pętli.

    No ale do rzeczy:
    usunąłem te linie reset port i dalej tak samo. Wie ktoś czemu?
  • #4 8500891
    LED5W
    Poziom 34  
    Ustawiłeś wszystkie porty jako wyjścia i chcesz odczytywać ADC...
  • #5 8500897
    xury
    Specjalista automatyka domowa
    Po pierwsze:
    Czemu deklarujesz subrutyny ?
    Do subrytyn przechodzi się przez Call, a do etykiet (których nie trzeba deklarować) przez Gosub.
    Po drugie po co w ogóle skoki do tych podprogramów ? Przecież można to było wpisać po prostu pod każdym Case ?
    Po trzecie to istotnie za szybko są zmieniane stany poszczególnych pinów.

    A i jeszcze ustawiłeś caly port jako wyjście. Wprawdzie potem jest config adc ale nie jestem pewien czy ustawi on pc0 na wejście z powrotem.
  • #6 8502269
    paavo91
    Poziom 19  
    Wybaczcie mi niewiedzę, ale to mój pierwszy "dłuższy" program. Wcześniej pisałem tylko w szkole banały typu mruganie diodą.

    W tej chwili kod wygląda tak:

    
    $regfile = "m8def.dat"                                      ' INFORMACJA O PROCESORZE
    $crystal = 1000000
    
    
    
    Config Portd = Output
    Config Portb = Output
    Config Portc = Input
    
    Dim Nap As Word
    
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    
    Start Adc
    
    
    Portd.3 = 0
    Portd.4 = 0
    
    Portb.0 = 0
    Portb.1 = 0
    Portb.2 = 0
    Portb.3 = 0
    Portb.4 = 0
    
    Portc.5 = 0
    Portd.0 = 0
    Portd.1 = 0
    Portd.2 = 0
    
    
    Do
    
    Nap = Getadc(0)
    
    Select Case Nap
    
    Case 1023 To 1:
    Portb.0 = 1
    Portd.2 = 1
    
    End Select
    
    
    
    Loop
    
    End
    


    Nie wiem czy dobrze Was zrozumiałem...

    Ps. Mam jeszcze pytanie trochę poza tematem. Czy można podpiąć switch do ADC6? Tzn czy będzie on spełniał swoją rolę?

    dzieki
  • #8 8502931
    paavo91
    Poziom 19  
    Dzięki a czy ktoś podpowie co wyrzucić żeby nie było tego podtrzymania?

    I czy znajdzie się ktoś kto będzie potrafił to zastosować do bargrafu 2-kolorowego?
  • Pomocny post
    #9 8503234
    gts1991
    Użytkownik obserwowany
    Cytat:

    $regfile = "m8def.dat"

    $crystal = 8000000
    Config Portd = Output


    Config Adc = Single , Prescaler = Auto , Reference = Avcc

    Dim Przet As Word
    Dim Dziesiatki As Integer

    Start Adc

    Do

    Przet = Getadc(0)

    Dziesiatki = Przet / 127

    If Dziesiatki = 0 Then
    Portd.0 = 1
    Portd.1 = 1
    Portd.2 = 1
    Portd.3 = 1
    Portd.4 = 1
    Portd.5 = 1
    Portd.6 = 1
    Portd.7 = 1
    Elseif Dziesiatki = 1 Then
    Portd.0 = 0
    Portd.1 = 1
    Portd.2 = 1
    Portd.3 = 1
    Portd.4 = 1
    Portd.5 = 1
    Portd.6 = 1
    Portd.7 = 1
    Elseif Dziesiatki = 2 Then
    Portd.0 = 0
    Portd.1 = 0
    Portd.2 = 1
    Portd.3 = 1
    Portd.4 = 1
    Portd.5 = 1
    Portd.6 = 1
    Portd.7 = 1
    Elseif Dziesiatki = 3 Then
    Portd.0 = 0
    Portd.1 = 0
    Portd.2 = 0
    Portd.3 = 1
    Portd.4 = 1
    Portd.5 = 1
    Portd.6 = 1
    Portd.7 = 1
    Elseif Dziesiatki = 4 Then
    Portd.0 = 0
    Portd.1 = 0
    Portd.2 = 0
    Portd.3 = 0
    Portd.4 = 1
    Portd.5 = 1
    Portd.6 = 1
    Portd.7 = 1
    Elseif Dziesiatki = 5 Then
    Portd.0 = 0
    Portd.1 = 0
    Portd.2 = 0
    Portd.3 = 0
    Portd.4 = 0
    Portd.5 = 1
    Portd.6 = 1
    Portd.7 = 1
    Elseif Dziesiatki = 6 Then
    Portd.0 = 0
    Portd.1 = 0
    Portd.2 = 0
    Portd.3 = 0
    Portd.4 = 0
    Portd.5 = 0
    Portd.6 = 1
    Portd.7 = 1
    Elseif Dziesiatki = 7 Then
    Portd.0 = 0
    Portd.1 = 0
    Portd.2 = 0
    Portd.3 = 0
    Portd.4 = 0
    Portd.5 = 0
    Portd.6 = 0
    Portd.7 = 1
    Elseif Dziesiatki = 8 Then
    Portd.0 = 0
    Portd.1 = 0
    Portd.2 = 0
    Portd.3 = 0
    Portd.4 = 0
    Portd.5 = 0
    Portd.6 = 0
    Portd.7 = 0
    End If

    Loop
    ' woltomierz liniowy by gts1991
    End
    tu masz gotowca moje dzieło działa bez zarzutu :)
  • #10 8503424
    paavo91
    Poziom 19  
    gts wielkie dzięki!

    Ale mam problem jeszcze z układem :/ Gdy przyłożyłem 3V to pokazało tak jak trzeba. Ale gdy nie przykładam nic świecą mi się ciągle 2 diody. A można powiedzieć że zapalają się i gasną z dużą częstotliwością...

    Ehh chyba moja płytka coś fiksuje tzn zimne luty. jak stoi w pionie jest ok a w poziomie mi się zaświeca dodatkowa dioda.
  • #11 8505836
    gts1991
    Użytkownik obserwowany
    u mnie ładnie działa :) pamiętaj że wejście Atmega8 nie może wisieć w powietrzu bo krzaki się robią diodach :)
    Ps : wciśnij pomógł :D
  • Pomocny post
    #12 8506707
    xixin
    Poziom 14  
    paavo91 napisał:
    gts wielkie dzięki!

    Ale mam problem jeszcze z układem :/ Gdy przyłożyłem 3V to pokazało tak jak trzeba. Ale gdy nie przykładam nic świecą mi się ciągle 2 diody. A można powiedzieć że zapalają się i gasną z dużą częstotliwością...

    Ehh chyba moja płytka coś fiksuje tzn zimne luty. jak stoi w pionie jest ok a w poziomie mi się zaświeca dodatkowa dioda.


    Dlatego te dwie diody mrugają ponieważ nie masz ustawionej opcji poniżej lub danego progu która dioda ma się świecić.
    Wszyscy tu komplikują tak prostą sprawę umieszczając tak skomplikowane procedury.
    Masz mój gotowiec, który też działa
    
    Do
    Uv = Getadc(0)
    
       If Uv <= 15 Then B = &B11111111
      If Uv > 15 And Uv <= 64 Then B = &B01111111
     If Uv > 64 And Uv <= 128 Then B = &B00111111
     If Uv > 128 And Uv <= 192 Then B = &B00011111
     If Uv > 192 And Uv <= 256 Then B = &B00001111
     If Uv > 256 And Uv <= 320 Then B = &B00000111
     If Uv > 320 And Uv <= 382 Then B = &B00000011
     If Uv > 382 And Uv <= 450 Then B = &B00000001
    If Uv > 450 Then B = &B00000000
    Portb = B
    
    Loop 
    

    Zadeklaruj tylko uv i B i ustaw port b jako wyjście
    Nie używaj, żadnych funkcji matematycznych, ponieważ opóźnią efekt i nie będzie zgodny z muzyką.
    Dodatkowo na wejście musisz dać filtr bo ogólny efekt będzie mizerny (diody będą newralgicznie mrugać)
REKLAMA