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

[Bascom][atmega8]- Program termometru z przyciskami

02 Sie 2011 14:44 1695 12
  • Poziom 18  
    Witam

    Jako że z mikrokontrolerami dopiero zaczynam chciał bym zrobić termometr, a właściwie to przerobić program. Obecnie na lcd mam wyświetlane wszystkie wyniki a chciał bym aby były 4 przyciski i każdy odpowiadał za inny czujnik. To znaczy np. jak wcisnę 1 przycisk to pojawia się informacja z pierwszego czujnika, a jak wcisnę następny to z następnego. Na zasadzie prób i błędów próbowałem i niestety nic z tego. Jedynie co udało mi się zrobić to jak przytrzymam przycisk to się wyświetla temperatura a ja chcę aby jednorazowe przyciśnięcie zmieniało wynik.

    poniżej kod jaki obecnie posiadam. Docelowo mają być wykorzystane 4 przyciski. Proszę was bardzo o pomoc, bo wiem że możecie to rozwiązać

    Code:

    $regfile = "m8def.dat"
    $crystal = 8000000
    Config Pinc.5 = Input
    Config Pinc.4 = Input
    Config Pinc.3 = Input
    Config Pinc.2 = Input
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
    Config 1wire = Portd.5
    Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32
    Cursor Off
    Cls
    Lcd "TEST LCD" ;
    Lowerline
    Lcd "TERMOMETR  2011        "
    Wait 5
    Cls
    Cursor Off
    Cls

    Dim Dsid1(8) As Byte
    Dim Dsid2(8) As Byte
    Dim Dsid3(8) As Byte
    Dim Dsid4(8) As Byte
    Dim I1 As Integer , Ss As String * 6
    Dim I2 As Integer
    Dim I3 As Integer ,
    Dim I4 As Integer
    S1 Alias Pinc.5
          'nazwy S1
    S2 Alias Pinc.4
          'nazwy S2
    S3 Alias Pinc.3
          'nazwy S3
    S4 Alias Pinc.2
          'nazwy S4
    Cursor Off
    Cls
     Dsid1(1) = 1wsearchfirst()
     Dsid2(1) = 1wsearchnext()
     Dsid3(1) = 1wsearchnext()
     Dsid4(1) = 1wsearchnext()



     Do
       1wreset
       1wwrite &H55
       1wverify Dsid1(1)                                        'wysyłamy adres pierwszego czujnika
       1wwrite &HBE
       I1 = 1wread(2)
    '---------------------------------
       1wreset
       1wwrite &H55
       1wverify Dsid2(1)                                        'wysylam adres drugiego czujnika
       1wwrite &HBE
       I2 = 1wread(2)

    '---------------------------------
       1wreset
       1wwrite &HCC
       1wwrite &H44
    Wait 1


      Cls
      If S1 = 0 Then
      Waitms 25
      If S1 = 0 Then
     I1 = I1 * 10
       I1 = I1 / 16
       'If I1 > 0 Then Cls
       Ss = Str(i1)
       Ss = Format(ss , " 0.0")
       Locate 1 , 1
       Lcd "wlaczono 1:" ; Ss ; Chr(0) ;
       End If
       End If

     If S2 = 0 Then
      Waitms 25
      If S2 = 0 Then
       I2 = I2 * 10
       I2 = I2 / 16
       'If I2 > 0 Then Cls
       Ss = Str(i2)
       Ss = Format(ss , " 0.0")
       Locate 1 , 1

      Lcd "wlaczono 2:" ; Ss ; Chr(0) ;
       End If
       End If
       Loop
  • Poziom 18  
    cześć

    jak wgrałem twój program to aby odczytać temperaturę to muszę trzymać przycisk a ja chcę raz wcisnąć i ona ma być tak długo aż ja nie wcisnę innego przycisku. Jeżeli mój sposób pisania jest zły to jak byś mógł to napisz to po swojemu.

    dziękuję za zainteresowanie:)
  • Poziom 25  
    Sorry za błąd, ale tak to jest jak się przerabia czyjeś programy .
    Teraz powinno być w porządku.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod



    Twój sposób nie jest zły, ale można to zrobić inaczej, zależy od tego w jakim stopniu kumasz uK.

    W twoim przypadku odczytywania temperatury czyli czekaniu na wynik 1 sek obsługę klawiatury powinno się zrobić na przerwaniu, ponieważ odczyt klawiatury praktycznie dokonuje się co sek w bardzo krótkich odcinkach czasów.

    Tak więc jeżeli się nie mylę aby przełączyć się pomiędzy wyświetlaniem kolejnych wyników musisz przytrzymać klawisz min sek? prawda?

    Na przekonwertowanie temperatury też nie trzeba czekać 1sek tylko po wydaniu komendy CONVERT T należy sprawdzać co wysyła termometr jeżeli ) to wyśle 1 to znaczy że skończył pomiar i można odczytać temperaturę itp. itd.

    Obecnie program nie jest optymalnie napisany ale za to prosty w zrozumieniu.
    a co idzie za tym prosty w zrozumieniu.

    Pozdrawiam.
  • Poziom 18  
    Niestety mój poziom w uC jest niski ale się uczę. Ten program był na elektrodzie i jeden termometr już działa jako termometr pokojowy i tam są dwa wyniki między którymi nie chce mieć przełączania a ten termometr który teraz robie chce mieć przełączany. Mam nadzieje, że teraz będzie dobrze.

    Dodano po 19 [minuty]:

    Niestety po wgraniu programu pojawił się kolejny problem: kiedy wciskam S1 to wyświetla to co ma się wyświetlać, lecz jeżeli wcisnę S2 to wyświetla się to co ma lecz po ok 1s powraca do wyświetlania danych z S1. Czyli znów gdzieś jest mały błąd którego jak zwykle nie wiem jak poprawić. Może by tak zrezygnować z przycisków i zrobić aby wyniki zmieniały się zo 5s?
  • Moderator na urlopie...
    Cóż, mam wrażenie, że Kolega jest kolejną osobą oczekującą na gotowca i rzucającą się od razu na środek oceanu. Owszem, sam wiem jak bardzo cieszy uruchomienie urządzenia, szczególnie jeśli jest się początkującym, ale powtarzam też wszystkim początkującym - zacznij od głupiego migania diodą i rozpracowywania poszczególnych zagadnień, a sam dojdziesz w niedługim czasie do pisania na prawdę zaawansowanych programów. To samo mówię i tu, bo forum to ma z tego co wiem służyć nauce, a nie dawaniu komuś otwarcie oczekującemu gotowca takiego programu.
    Dlaczego ta moja cała dywagacja na temat nie związany zabardzo z pytaniem Autora?
    Bo problem w programach kolegi snnaap (nb. nie powinieneś na forum sypać gotowcami...) leży u samych podstaw - podpowiedź: "Odczyt stanu przycisku - programowanie w BASCOM - lekcja 2"
    Mam nadzieję, że sami wpadniecie na to co jest nie tak i proszę jednocześnie innych kolegów o trzymanie języka za zębami.
    Poza tym - brakuje schematu, który jedną rzecz też mógłby teoretycznie wyjaśnić...
  • Poziom 18  
    Niestety nie potrafię na obecną chwilę rozwiązać tego problemu. Wiec zrobię przełączanie pomiarów co 5 sek. a może kiedyś jak nauczę się programować to wrócę sobie do tego tematu i go rozwiąże.
  • Poziom 25  
    Kolega piotrva zamiast pomagać zadaje dodatkowe zagadki, no ale cóż tak też można - zmusza nas do myślenia - może to i dobrze.

    Problem polega zapewne na tym, że przyciski nie są podciągnie ani fizycznie ani programowo do + , czyż nie o to chodzi kolego piotrva?

    Czekamy z niecierpliwością na odpowiedz.

    W przypadku prawidłowej odpowiedzi liczę na nagrodę.
  • Pomocny post
    Moderator na urlopie...
    Cóż, podpowiem jeszcze raz:
    1. Sprawdź w necie jak odczytać stan przycisku
    ----
    EDIT: w necie też piszą różnorakie bzdury o tym zatem może napiszę jak być powinno:
    Zwykle przyciski podłączamy tak, aby zwierały pin do masy. Aby odczytać stan danego pinu musimy:

    1. skonfigurować go jako wejście instrukcją (np. - istnieje wiele odmian konfiguracji, ale nie to tym teraz mowa):
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    czyli np.:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    [to kolega ma w programie]

    2. ustawić podciąganie [TEGO BRAKUJE] - normalnie pin (jeśli nie jest zwarty do masy przyciskiem) nie jest podłączony do niczego - zatem jeśli wykonamy prosty eksperyment - spróbujemy zmierzyć napięcie końcówki woltomierza nie dotykającej niczego (podobnie jak nasz pin) względem masy i zasilania - za każdym razem otrzymamy wynik 0. Nasz procesor nie jest jednak na tyle mądry, aby rozpoznać, że pin nie jest do niczego podłączony - przecież może rozpoznać tylko stan 0 (GND) lub 1 (VCC). Co zatem się stanie? Procesor będzie losowo odczytywał stan pinu jako 0 lub 1 (w zależności od gromadzących się na nim ładunku, etc.). I to będzie powodowało, że pomimo puszczonych przycisków procesorowi będzie się wdawało jakby ktoś stale przycisk (i to czasem z dużą częstotliwością) przyciskał! Tego nie chcemy! Na szczęście uP z rodziny AVR mają wbudowane rezystory podciągające do VCC. Co to oznacza? Że pin jest połączony przez rezystor wewnątrz układu z zasilaniem, przez co jeśli nie jest zwarty do masy panuje na nim stale stan wysoki. Tylko zwarcie pinu do masy powoduje przepływ prądu przez rezystor i "ściągnięcie" pinu do masy i odczytanie jego stanu jako 0. Podciągnie włączamy zapisując 1 do odpowiedniego bitu w rejestrze wyjściowym PORT (jeśli pin skonfigurowany jest jako wyjście to rejestr prot nie wymusza stanu, ale konfiguruje podciąganie), zatem możemy zapisać np:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    3. Odczytujemy w programie stan pinu z rejestru PinN.x [to jest więc się nie rozpisuję]
    ----
    2. Czego brakuje w programie?
    ----
    EDIT: Jak wyżej napisałem podciągania, czyli początek programu powinien wyglądać np. tak:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    PS. Mam dziś coś za dobre serce, mam nadzieję, że pomogłem ;-)
    ----
  • Pomocny post
    Poziom 25  
    A czytasz co napisałem wyżej ?

    Cytat:
    Problem polega zapewne na tym, że przyciski nie są podciągnięte ani fizycznie ani programowo do + , czyż nie o to chodzi kolego piotrva?




    PS.
    Napisałem 'podciągnie' -literówka
  • Poziom 18  
    Po zastosowaniu się do uwag kolegi piotrva i wprowadzeniu ich do programu kolegi snnaap wszystko działa poprawnie. Wielkie dzięki za rozwiązanie tego problemu.
  • Moderator na urlopie...
    snnaap napisał:
    A czytasz co napisałem wyżej ?

    Cytat:
    Problem polega zapewne na tym, że przyciski nie są podciągnięte ani fizycznie ani programowo do + , czyż nie o to chodzi kolego piotrva?




    PS.
    Napisałem 'podciągnie' -literówka

    Po prostu napisałeś to w czasie, w którym ja pisałem swojego posta ;-) Dokładnie o to chodziło ;-)
    Cieszę się, że pomogłem i zmusiłem do myślenia ;-)
  • Poziom 18  
    Na koniec chcę wrzucić program który działa poprawnie
    Code:

    $regfile = "m8def.dat"
    $crystal = 8000000
    Config Pinc.5 = Input
    Set Portc.5
    Config Pinc.4 = Input
    Set Portc.4
    Config Pinc.3 = Input
    Set Portc.3
    Config Pinc.2 = Input
    Set Portc.2
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
    Config 1wire = Portd.5
    Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32
    Cursor Off
    Cls
    Lcd "TEST LCD" ;
    Lowerline
    Lcd "TERMOMETR  2011        "
    Wait 5
    Cls
    Cursor Off
    Cls
    Dim Dsid1(8) As Byte
    Dim Dsid2(8) As Byte
    Dim Dsid3(8) As Byte
    Dim Dsid4(8) As Byte
    Dim I1 As Integer , Ss As String * 6
    Dim I2 As Integer
    Dim I3 As Integer ,
    Dim I4 As Integer

    Dim Ktory_wynik As Byte


    S1 Alias Pinc.5
          'nazwy S1
    S2 Alias Pinc.4
          'nazwy S2
    S3 Alias Pinc.3
          'nazwy S3
    S4 Alias Pinc.2
          'nazwy S4
    Cursor Off
    Cls
     Dsid1(1) = 1wsearchfirst()
     Dsid2(1) = 1wsearchnext()
     Dsid3(1) = 1wsearchnext()
     Dsid4(1) = 1wsearchnext()



     Do
       1wreset
       1wwrite &H55
       1wverify Dsid1(1)                                        'wysyłamy adres pierwszego czujnika
       1wwrite &HBE
       I1 = 1wread(2)
    '--'-------------------------------
       1wreset
       1wwrite &H55
       1wverify Dsid2(1)                                        'wysylam adres drugiego czujnika
       1wwrite &HBE
       I2 = 1wread(2)

    '---------------------------------
       1wreset
      1wwrite &HCC
      1wwrite &H44
     Wait 1






      If S1 = 0 Then

       Waitms 100

       If S1 = 0 Then

          While S1 = 0
          Wend

          Cls
          Ktory_wynik = 1


       End If

      End If



      If S2 = 0 Then
      Waitms 100

       If S2 = 0 Then

          While S2 = 0
          Wend


          Cls
          Ktory_wynik = 2


       End If
      End If



      If S3 = 0 Then
      Waitms 100

       If S3 = 0 Then

          While S3 = 0
          Wend

          Cls
          Ktory_wynik = 3


       End If
      End If



      If S4 = 0 Then
      Waitms 100

       If S4 = 0 Then

          While S4 = 0
          Wend

          Cls
          Ktory_wynik = 4


       End If
      End If





       If Ktory_wynik = 1 Then

       I1 = I1 * 10
       I1 = I1 / 16
       Ss = Str(i1)
       Ss = Format(ss , " 0.0")
       Locate 1 , 1
       Lcd "wlaczono 1:" ; Ss ; Chr(0) ;

       End If



       If Ktory_wynik = 2 Then
       I2 = I2 * 10
       I2 = I2 / 16
       Ss = Str(i2)
       Ss = Format(ss , " 0.0")
       Locate 1 , 1
       Lcd "wlaczono 2:" ; Ss ; Chr(0) ;
       End If

       If Ktory_wynik = 3 Then

       End If


       If Ktory_wynik = 4 Then

       End If


       Loop