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

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

kazix771 17 Sty 2011 22:26 3163 20
REKLAMA
  • #1 9020617
    kazix771
    Poziom 10  
    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:
    
    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
  • REKLAMA
  • Pomocny post
    #2 9020645
    Fredy
    Poziom 27  
    A niby jak ma ten program wyjść z tej pętli do-loop ?
    Wpisz kod jako "code"
  • Pomocny post
    #3 9020754
    piotrva
    VIP Zasłużony dla elektroda
    Popraw pętle usuń tę z okolic display on off i ujmij cały program w taką pętlę
  • #4 9020833
    kazix771
    Poziom 10  
    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
  • #5 9021036
    Fredy
    Poziom 27  
    no jeśli na tym pinieD.6 masz niski stan to czego sie spodziewasz?
  • REKLAMA
  • #6 9021054
    kazix771
    Poziom 10  
    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?
  • #8 9021209
    kazix771
    Poziom 10  
    Jaca napisał:
    Ma być:

    [...]
    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.
  • REKLAMA
  • #9 9021217
    Jaca
    Poziom 31  
    1. Co podajesz na PinA.6 ?
    2. Podłączyłeś AVCC uC przez dławik do VCC + 100nF do GND ?
  • #10 9021234
    kazix771
    Poziom 10  
    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
  • REKLAMA
  • Pomocny post
    #12 9021273
    Konto nie istnieje
    Poziom 1  
  • #13 9024374
    kazix771
    Poziom 10  
    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:
    
    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?
  • #14 9026313
    piotrva
    VIP Zasłużony dla elektroda
    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
  • #15 9026409
    kazix771
    Poziom 10  
    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
  • #16 9026424
    Jaca
    Poziom 31  
    Napisz jaki czujnik ciśnienia posiadasz i jak go podłączyłeś.
  • #17 9026473
    kazix771
    Poziom 10  
    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
    #18 9026606
    piotrva
    VIP Zasłużony dla elektroda
    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
    
    Dim W as word, L as long
    '...
    W=getadc(0)
    L=L+W
    '...
    L=L/10
    W=L
    '... i dalsze obliczenia
    
  • #19 9026681
    kazix771
    Poziom 10  
    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
    
    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 :
    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
    #20 9026730
    Jaca
    Poziom 31  
    Zerknij do wiadomości PW...
  • #21 18262383
    kazix771
    Poziom 10  
    Wszystko zadziałało po wgraniu poprawnego programu :)
REKLAMA