Elektroda.pl
Elektroda.pl
X
Relpol przekaźniki nadzorczeRelpol przekaźniki nadzorcze
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Rozwiązano] Bascom, Atmega16 - problem z adc

17 Sty 2011 22:26 2800 20
  • Poziom 9  
    Witam
    Wykonałem układ elektroniczny którego zadaniem jest pomiar napięcia na porcie adc.
    Zadaniem kodu który jest poniżej jest wykrycie stanu wysokiego na porcie PA(6) i pomiar napięcia z portu PA(0) według odpowiedniej instrukcji czyli pomiar trzykrotny, porównanie ich ze sobą i jeżeli są takie same to ma włączyć się dioda czerwona, oraz włączyć przekaźnik podpięty do portu PA(7) i pokazać napis. Problem jest taki że po ustawieniu stanu wysokiego na PA(6) program nie wykrywa go, lecą napisy początkowe do momentu napisu START i wraca do początku programu itd. Nie podłączałem nic do portu PA(0) bo chyba bez tego da sie tez sprawdzić czy to działa?
    Nie wiem co jest nie tak z tym kodem, poprawiałem go już kilka razy i nadal to samo:l
    Poniżej kod programu:
    Code:

    Config Porta = &B10111110                           
            Porta = &B00100010                                  'port PA(6)

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

    Dim W1 As Word
    Dim W2 As Word
    Dim W3 As Word
      W1 = 0
      W2 = 0
      W3 = 0
     
    cls
    Cursor Off

    Lcd "START"
    Wait 5


    If Porta.6 = 1 Then
    Porta.5 = 0                                                 'zapala się dioda LED żółta
     Cls                                                        'przekaźnik wykrywa 230V i pojawia się stan wysoki
     Lcd "WYKONUJE POMIARY"

     Lowerline : Lcd Spc(4) ; "Czekaj..."
    Do
    Wait 2
     Display Off
    Wait 2
     Display On
    Loop


    W1 = Getadc(0)                                              'wykonaj pierwszy pomiar
    Wait 10                                                     'czekaj 10 sekund
    W2 = Getadc(0)                                              'wykonaj drugi pomiar
    Wait 10
    W3 = Getadc(0)

    If W1 <= W2 Or W2 <= W3 Then
         Porta.7 = 1                                         
         Porta.1 = 0                                            'zapala się czerwona dioda LED
         Cls                                                   
         Lcd Spc(5) ; "BRAK ZMIAN"
         Lcd Spc(4) ; "CIŚNIENIA"
     End If

    End If
  • Relpol przekaźniki nadzorczeRelpol przekaźniki nadzorcze
  • Pomocny post
    Poziom 27  
    A niby jak ma ten program wyjść z tej pętli do-loop ?
    Wpisz kod jako "code"
  • Pomocny post
    Moderator na urlopie...
    Popraw pętle usuń tę z okolic display on off i ujmij cały program w taką pętlę
  • Poziom 9  
    piotrva napisał:
    Popraw pętle usuń tę z okolic display on off i ujmij cały program w taką pętlę


    Poprawiłem kod, usunąłem pętle z tych okolic, i wszystko wziąłem w pętle, Program zatrzymuje się przy napisie "START" i nie idzie dalej
  • Poziom 27  
    no jeśli na tym pinieD.6 masz niski stan to czego sie spodziewasz?
  • Poziom 9  
    Fredy napisał:
    no jeśli na tym pinieD.6 masz niski stan to czego sie spodziewasz?

    nie bardzo rozumiem, w kodzie nie ma nic o pd.6. O co chodzi?
  • Pomocny post
    Poziom 28  
    Ma być:

    Code:
    [...]
    
    If Pina.6 = 1 Then
    [...]
  • Relpol przekaźniki nadzorczeRelpol przekaźniki nadzorcze
  • Poziom 9  
    Jaca napisał:
    Ma być:

    Code:
    [...]
    
    If Pina.6 = 1 Then
    [...]


    Mieniłem tak jak napisałeś, faktycznie ruszył dalej wykonuje pomiar ale dzieje się to samoczynnie bez pojawienia sie na pinie 6 stanu wysokiego, chociaż w kodzie jest zaznaczone żeby robił pomiar dopiero gdy pojawi się '1' na pinie 6.
  • Poziom 28  
    1. Co podajesz na PinA.6 ?
    2. Podłączyłeś AVCC uC przez dławik do VCC + 100nF do GND ?
  • Poziom 9  
    Jaca napisał:
    1. Co podajesz na PinA.6 ?
    2. Podłączyłeś AVCC uC przez dławik do VCC + 100nF do GND ?


    1. N PinA.6 podaje 5V przez przekaźnik 230AC(po pojawienia się napięcia na cewce przekaźnik przełącza się i na pinie pojawia sie 5V)
    2. napięcie ze stabilizatora 5V jest podawane na kondensator 100pF następnie na Vcc i Avcc + 100nF do GND
  • Poziom 28  
    Podciągnij PinA.6 do VCC:

    Code:
    Porta = &B01100010
    


    Przekaźnikiem zwieraj PinA.6 do masy a stan sprawdzaj za pomocą:

    Code:
    If Pina.6 = 0 Then
    


    ps. Zadbaj o eliminację drgań styków przekaźnika !
  • Pomocny post
    Poziom 36  
    kazix771 napisał:
    Jaca napisał:
    Ma być:

    Code:
    [...]
    
    If Pina.6 = 1 Then
    [...]


    Mieniłem tak jak napisałeś, faktycznie ruszył dalej wykonuje pomiar ale dzieje się to samoczynnie bez pojawienia sie na pinie 6 stanu wysokiego, chociaż w kodzie jest zaznaczone żeby robił pomiar dopiero gdy pojawi się '1' na pinie 6.


    Owszem, ja też przeczytałem że zmieniłes, ale nie jest wiadomo jak zakończyłeś 'poprawiony' warunek "If Pina.6 = 1 then..."
    W pierwszym listngu nie był on poprawny i skończony i wcale nie odnosił się do pomiaru ADC.

    Wyeliminuj te 10 minutowe "Wait" zastępując je jednym z trzech timerów.

    Niemniej jednak przydałoby się pokazać ostatnią, tą nie poprawnie funkcjonująca versję programu jeżeli występują pytania lub wątpliwości.
    Nie bardzo widze prawidłowość w polaryzacji Pinu A.6.

    e marcus
  • Poziom 9  
    Witam ponownie,
    Przepraszam że dopiero teraz odpisuje. Program już działa, odczytuje sygnał z czujnika dopiero po pojawieniu się '1' na Pina.6 i reaguje według instrukcji zawartej w kodzie. Co do komendy 'wait 10' to czas przerwy wynosi 10sekund jest to po to by pomiary były pobiera z jakimś odstępem czasu. Dopisałem dalszy ciąg programu i tu niby wszystko jest ok, ale są pewne niejasności. W tej części procesor pobiera 10 odczytów z czujnika(czujnik prądowy 4-20mA, 1-10bar) uśrednia a następnie wysyła na wyświetlacz. Problemem jest to, że nie mogę dojść co to jest za wartość która jest wyświetlana. Czujnik leży na biurku, nie jest umieszczony w zbiorniku a pomiar pokazuje wartość 0,3969. Docelowa ma być wyświetlana wartość ciśnienia w barach(czułość czujnika to 1,6mA=1bar). Może ktoś z was będzie wiedział gdzie leży problem. Oto część kodu:
    Code:

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

    Dim W As Word
    Dim Cis As Single
    Dim Z As Byte
      W = 0
      Z = 0
    Do
    Wait 5
      For Z = 1 To 10
       W = W + Getadc(0)
       Next
        W = W / 10
    W = Getadc(0)
    Cis = W * 0.0049                                            'dopisać modyfikacje dotyczącą czułości przetwornika

    Cls
    Lcd "Cisnienie:"
    Lowerline : Lcd "P=" ; Fusing(cis , "#.####")
    Loop
    End


    Dodano po 4 [godziny] 10 [minuty]:

    Panowie mógłby mi ktoś pomóc, naprowadzić w takiej sytuacji?
  • Moderator na urlopie...
    po pierwsze, program nie uśrednia wyników - usuń to w=getadc(0) po pętli for, a typ zmiennej w zmień na long
    to co Ci wyświetla to wartość pomiaru z adc * 0.0049 :D
  • Poziom 9  
    piotrva napisał:
    po pierwsze, program nie uśrednia wyników - usuń to w=getadc(0) po pętli for, a typ zmiennej w zmień na long
    to co Ci wyświetla to wartość pomiaru z adc * 0.0049 :D


    zmieniłem tak jak napisałęś z tym że teraz nie chce sie skompilować, pokazuje błąd"Source variable doesn't match the target variable"

    Bascom, Atmega16 - problem z adc
  • Poziom 28  
    Napisz jaki czujnik ciśnienia posiadasz i jak go podłączyłeś.
  • Poziom 9  
    Jest to przetwornik ciśnienia z wyjściem prądowym. Zakres prądowy to 4-20mA , zakres ciśnienia 1-10bar. Czujnik firmy Wika model A-10.
    www.wikapolska.pl/A_10_pl_pl.WIKA?ActiveID=7639

    Podłączony jest poprzez rezystor, znaczy się atmega dostaje spadek napięcia na tym rezystorze. jest on tak dobrany aby przy pradzie 20mA napięcie nie przekroczyło 2,5V (rezystor 110om). Zmieniłem tą linijkę w kodzie i faktycznie pokazuje mi teraz wartość napięcia '0,4410' tyle wychodzi z wyliczeń. Chodzi o to że ten czujnik przy 4mA powinien mi pokazać wartość ciśnienia równą 0, tylko nie wiem właśnie jak to zrobić programowo.
  • Pomocny post
    Moderator na urlopie...
    mój błąd - musisz zostawić W jako Word, a potem dodawać wartości do zmiennej typu Long poprzez tzw. niejawne rzutowanie typów. czyli
    Code:

    Dim W as word, L as long
    '...
    W=getadc(0)
    L=L+W
    '...
    L=L/10
    W=L
    '... i dalsze obliczenia
  • Poziom 9  
    piotrva napisał:
    mój błąd - musisz zostawić W jako Word, a potem dodawać wartości do zmiennej typu Long poprzez tzw. niejawne rzutowanie typów. czyli
    Code:

    Dim W as word, L as long
    '...
    W=getadc(0)
    L=L+W
    '...
    L=L/10
    W=L
    '... i dalsze obliczenia


    zmieniłem tak jak napisałeś, teraz ten fragment wygląda tak :
    Code:
    Wait 5
    
      For Z = 1 To 10
        W = Getadc(0)
        L = L + W
       Next
        L = L / 10

    Cis = L * 0.0049                                            'dopisać modyfikacje dotyczącą czułości przetwornika

    Cls
    Lcd "Cisnienie:"
    Lowerline : Lcd "P=" ; Fusing(cis , "#.####")


    Rozumiem że teraz on liczy sobie średnia z 10 wyników i wyświetla. Aktualnie pokazuje mi wartość napięcia równą 0,441V. Chciałbym zrobić tak żeby ta wartość napięcia była wartością '0' dla układu, ponieważ przy tej wartości ciśnienie równe jest 0, cz da się to zrobić?
  • Pomocny post
    Poziom 28  
    Zerknij do wiadomości PW...
  • Poziom 9  
    Wszystko zadziałało po wgraniu poprawnego programu :)