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.

[ATMega16][BASCOM]Termostat LCD +LED

11 Gru 2008 13:19 4328 9
  • Poziom 27  
    Witam.
    Napisałem taki kod :
    Code:

    'termostat do chłodzenia

    $regfile = "m16def.DAT"
    $crystal = 8000000
    Config Portb = Output
    Config Lcdpin = Pin , Rs = Portb.2 , E = Portb.3 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7

    Config Lcd = 16 * 2
    Config Portc = &B1000011
    Config 1wire = Portc.5

    Dim Temp As Integer , Ss As String * 6
    Dim Tzad As Integer , Tzadana As String * 6
    Dim Dsid As Byte
    Dim Hist As Integer

    Declare Sub Pomiar
    Declare Sub Ustaw_t

    Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32             'znak stopnia Celcjusza
    Deflcdchar 1 , 28 , 8 , 8 , 8 , 5 , 5 , 5 , 7               'ikonka ustawionej temperatury
    Deflcdchar 2 , 32 , 32 , 32 , 32 , 32 , 32 , 31 , 32        ' część ikonki przekaźnika

    Portc.2 = 1 : K1 Alias Pinc.2                               'Podciągnięcie portów do 1 dla obsługi klawitury
    Portc.3 = 1 : K2 Alias Pinc.3
    Portc.4 = 1 : K3 Alias Pinc.4

    Pk Alias Portc.0

    Tzad = 320

    Writeeeprom Tzad , 1
    Cursor Off
    Cls
    Pomiar:

    Do
    Hist = Temp + 10
       1wreset
       1wwrite &H55
       1wverify Dsid
       1wwrite &HBE
       Temp = 1wread(2)
       1wreset
       1wwrite &HCC
       1wwrite &H44
    Waitms 100
        Temp = Temp * 10
       Temp = Temp / 16
       Ss = Str(temp)
       Ss = Format(ss , "0.0")
       Tzadana = Str(tzad)
       Tzadana = Format(tzadana , "0.0")
       Cls
       Readeeprom Tzad , 1
       If Tzad >= Hist Then
        Set Pk
        Locate 2 , 10
        Lcd "CZEKAM"
       End If

       If Tzad < Temp Then
        Reset Pk
       End If
       Locate 1 , 1
       Lcd "T:"
       Locate 1 , 4
       Lcd ; Ss ; Chr(0) ;
       Locate 2 , 1
       Lcd ; Chr(1) ; ":"
       Locate 2 , 4
       Lcd ; Tzadana ; Chr(0)

       Wait 2
       If K1 = 0 Then
        Waitms 30
        If K1 = 0 Then
         Readeeprom Tzad , 1
         Reset Pk
         Call Ustaw_t
        End If
       End If
    Loop                                                        'Pętla (koniec programu)
    Ustaw_t:
       Waitms 150
       Cls
       Locate 1 , 1
       Lcd "Ustawienie temp."
       Locate 2 , 1
       Lcd "zadanej"

       Tzadana = Str(tzad)
       Tzadana = Format(tzadana , "0.0")

       Locate 2 , 9
       Lcd Tzadana ; Chr(0)

       If K2 = 0 Then
        Waitms 150
        If K2 = 0 Then
        Tzad = Tzad + 5
         If Tzad = 500 Then
          Tzad = 0
         End If
        End If
       End If

       If K3 = 0 Then
        Waitms 150
        If K3 = 0 Then
        Tzad = Tzad - 5
         If Tzad = 0 Then
          Tzad = 500
         End If
        End If
       End If

       If K1 = 0 Then
        Waitms 600
        If K1 = 0 Then
        Writeeeprom Tzad , 1
            Waitms 150
            Cls
        Locate 1 , 1
        Lcd "Temperatura"
        Locate 2 , 1
        Lcd "ustawiona"
        Wait 1
        Call Pomiar
        End If
       End If

    Goto Ustaw_t

    Na wyświetlaczu jest widoczna :
    Temperatura otoczenia np 25.5°C
    i temperatura załączenia termostatu np.28.0°C.
    Chciał bym żeby temperatura OTOCZENIA wyświetlana była jeszcze na wyświetlaczu LED 3 segmentowym w postaci 25.5
    A w momencie przejścia do MENU wyświetlacz wygaszał się.
    Po czym wracał do normalnej pracy po powrocie temperatur na wyświetlacz LCD.

    Proszę o pomoc w dopisaniu kodu.

    Poprawiłem tytuł i przeniosłem do właściwego subforum.
    [zumek]
  • Poziom 42  
    Jak nic - trzeba zrobić procedurę odpowiedzialną za multipleksowane wyświetlanie na wyświetlaczu LED. Można do tego użyć jakiegoś Timera, który będzie wciąż wyświetlał zawartość np 3 komórek pamięci RAM np: Cyfra1, Cyfra2, Cyfra3. Dzięki temu później już łatwo będzie zrobić procedurę typu DisplayLED, która będzie do tych 3 komórek wpisywała kolejno cyfry z wartości temperatury. Oczywiście przyda się zrobić także jakąś tablicę znaków LED, którą w Timerze będzie się obsługiwało przy pomocy polecenia LOOKUP
  • Poziom 27  
    Odchudziłem trochę program.
    Wykasowałem MENU ustawiania temperatury.
    W zasadzie mogę w tym wypadku zrezygnować z LCD dla LED.
    Code:


    'termostat do chłodzenia

    $regfile = "m16def.DAT"
    $crystal = 8000000
    Config Portb = Output
    Config Lcdpin = Pin , Rs = Portb.2 , E = Portb.3 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7

    Config Lcd = 16 * 2
    Config Portc = &B1000011
    Config 1wire = Portc.5

    Dim Temp As Integer , Ss As String * 6
    Dim Tzad As Integer , Tzadana As String * 6
    Dim Dsid As Byte
    Dim Hist As Integer

    Declare Sub Pomiar

    Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32       'znak stopnia Celcjusza
    Deflcdchar 1 , 28 , 8 , 8 , 8 , 5 , 5 , 5 , 7       'ikonka ustawionej temperatury
    Deflcdchar 2 , 32 , 32 , 32 , 32 , 32 , 32 , 31 , 32       ' część ikonki przekaźnika
    Pk Alias Portc.0
    Tzad = 310


    Cursor Off
    Cls
    Pomiar:

    Do
    Hist = Temp + 10
       1wreset
       1wwrite &H55
       1wverify Dsid
       1wwrite &HBE
       Temp = 1wread(2)
       1wreset
       1wwrite &HCC
       1wwrite &H44
    Waitms 100
        Temp = Temp * 10
       Temp = Temp / 16
       Ss = Str(temp)
       Ss = Format(ss , "0.0")
       Tzadana = Str(tzad)
       Tzadana = Format(tzadana , "0.0")
       Cls
       Readeeprom Tzad , 1
       If Tzad >= Hist Then
       Set Pk
        Locate 2 , 10
        Lcd "CZEKAM"
       End If

       If Tzad < Temp Then
       Reset Pk
       End If
       Locate 1 , 1
       Lcd "T:"
       Locate 1 , 4
       Lcd ; Ss ; Chr(0) ;
       Locate 2 , 1
       Lcd ; Chr(1) ; ":"
       Locate 2 , 4
       Lcd ; Tzadana ; Chr(0)


    Loop                     'Pętla (koniec programu)
    End
  • Poziom 27  
    Nikt nie wie jak to napisać??
  • Poziom 42  
    przecież napisałem ci - nie widzisz ??? Chyba, że ty czekasz na gotowca
  • Poziom 27  
    Czyli można to zrobić w tym jednym kontrolerze ?
    Nie trzeba kasować kodu LCD?
    Czy polecenie WAITMS 100 nie będzie źle wpływało na wyświetlanie led?
  • Poziom 42  
    tak spokojnie można to zrobić w jednym procku. Tyle że musisz sobie poczytać gdzieś i zobaczyć sposoby oprogramowania multipleksowanych wyświetlaczy LED. Generalnie chodzi o to, że za pomocą przerwania Timera (czas dobrany tak aby nie było widać migotania) obsługujesz wyświetlanie danych na tych wyświetlaczach LED. I nie ma najmniejszego wpływu na to, polecenie Waitms czy Wait. (te polecenia tak jak program w pętli głównej cały czas są przerywane na czas obsługi każdego włączonego przerwania). Ważne tylko aby tak pisać procedury obsługi przerwań aby były jak najkrótsze i broń boże nie umieszczać tam np poleceń np do wyświetlania na LCD.

    Hmmm może musisz sobie jeszcze poczytać o przerwaniach i jak one działają.
  • Poziom 27  
    Poskładałem taki termometr:
    Code:
    $regfile "m8def.dat"
    
    $crystal = 8000000
    Config Portb = &B11111111
             Portb = &B11111111
    Config Portd = &B11111111
             Portd = &B11111111
    Config Portc = Output
    Portc = &B1111111
    Config 1wire = Portb.0

    Dim Ktorywysw As Byte
    Dim Dziesiatych As Word
    Dim Jednosci As Word
    Dim Dziesiatki As Word
    Dim Setki As Byte
    Dim Temp(2) As Byte
    Dim T As Integer
    Dim T1 As Single
    Dim Petla As Word
    Dim Pomocnicza As Word
    Dim Pomocnicza2 As Single

    Petla = 1
    Do

    If Petla = 1 Then
       1wreset
       1wwrite &HCC
       1wwrite &H44
    End If

    If Petla = 500 Then
       1wreset
       1wwrite &HCC
       1wwrite &HBE
       Temp(1) = 1wread(2)
       T = Temp(2)
       Shift T , Left , 8
       T = T + Temp(1)
       T1 = T * 0.0625

       If T1 < 0 Then
          Pomocnicza2 = T1 * -10
       Else
          Pomocnicza2 = T1 * 10
       End If
       Pomocnicza = Int(pomocnicza2)
       Dziesiatych = Pomocnicza Mod 10
       Jednosci = Pomocnicza - Dziesiatych
       Jednosci = Jednosci / 10
       Jednosci = Jednosci Mod 10
       Dziesiatki = Pomocnicza - Dziesiatych
       Dziesiatki = Dziesiatki / 10
       Dziesiatki = Dziesiatki - Jednosci
       Dziesiatki = Dziesiatki / 10
         If T1 < 100 Then
          Setki = 11
             End If
       If T1 < 10 And T1 > 0 Then
          Dziesiatki = 11
       End If

       If T1 < 0 And T1 > -10 Then
          Setki = 11
          Dziesiatki = 10
       End If
       If T1 < -10 Then
          Setki = 10
       End If
       If T1 = 0 Then
          Setki = 11
          Dziesiatki = 11
          Jednosci = 0
          Dziesiatych = 0
       End If
       Petla = 0
    End If

    Incr Petla

    Gosub Wyswietlanie
    Loop
    End

    Wyswietlanie:
    Incr Ktorywysw
    If Ktorywysw = 6 Then
       Ktorywysw = 0
    End If
    Portb.1 = 1
    Portb.2 = 1
    Portb.3 = 1
    Portb.4 = 1


    Select Case Ktorywysw
    Case 0:
    Portd = Lookup(dziesiatych , Tabela)
    Portb.1 = 0
    Case 1:
    Portd = Lookup(jednosci , Kropa)
    Portb.2 = 0
    Case 2:
    Portd = Lookup(dziesiatki , Tabela)
    Portb.3 = 0
    Case 3:
    Portd = Lookup(setki , Tabela)
    Portb.4 = 0
    Case 4:
    Portd = Lookup(13 , Tabela)

    Case 5:
    Portd = Lookup(12 , Tabela)

    End Select
    Return


    Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 191 , 255 , 156 , 198       ' liczby od 0 do 9 i znak - oraz pusty wyswietlacz, znak stopnia, C

    Kropa:
    Data 64 , 121 , 36 , 48 , 25 , 18 , 2 , 120 , 0 , 16 , 63 , 127

    i wyszedł kolejny problem
    Nie potrafię dopisać termostatu do tego kodu.
    Proszę o dopisanie mi tego ponieważ nie poradzę sobie z tematem.
    Próbowałem "tysiąc" razy i BASCOM pokazuje błędy.

    Hist = Temp + 10
    If Tzad >= Hist Then
    Set Pk
    If Tzad < Temp Then
    Reset Pk
  • Poziom 13  
    Witam

    Trochę dziwnie napisany masz ten program. Poniżej masz mój programik który mierzy temperature i wyświetla na 4 wyświetlaczach., powinien ci trochę zmienić tok myślenia (bez urazy):D
    Oczywiście musisz go dostosować do swojego projektu.

    Code:


    '*****1 Wire na wyświetlaczu LED na Płytce testowej ***********


    $regfile "2313def.dat"
    $crystal = 4000000

       Config 1wire = Portd.5
       Config Timer0 = Timer , Prescale = 64
       Enable Interrupts
       Enable Timer0
       On Timer0 Co4ms

          Dim Odczyt(2)as Byte , A As Integer , Licznik As Byte , T As Integer ,
          Dim Tysiace As Byte , Setki As Byte , Dziesiatki As Byte , Jednostki As Byte
          Dim Mux As Byte

       Do

       1wreset                    'reset
       1wwrite &HCC               'jedna kostka więc wykorzystujemy rozkaz SKIP ROM
       1wwrite &H44               'dokonaj konwersji
          Waitms 750              'poczekaj czas konwersji
       1wreset                    'reset
       1wwrite &HCC               'rozkaz adresowy SKIP ROM
       1wwrite &HBE               'rozkaz funkcyjny - polecenie odczytu
       Odczyt(1) = 1wread(2)      'odczytaj dwa pierwsze bajty
       T = Odczyt(2)              'przepisz starszy bajt do zmiennej Integrer
       Shift T , Left , 8         'przesuń ten bajt w lewo na wyższe pozycje
       T = T + Odczyt(1)          'przepisz - dodaj młodszy bajt
       T = 1 / 16                 'wyraź w stopniach celsjusza, wynik wpisz do zmiennej Singel

       Loop
       End                        'end program


       Co4ms:
       'Standardowa konwersja binarna 0...255 na trzycyfrową BCD
       A = T
          If A > 100 Then
              Setki = 1
              A = A - 100
           Else
              Setki = 10
           End If




        A = Makebcd(a)
        Jednostki = A And 15
        Dziesiatki = A
        Shift Dziesiatki , Right , 4
        'Standardowa obsługa wyświetlaczy
        Incr Mux
        If Mux = 4 Then Mux = 0
        Portd = 127
        Select Case Mux
        Case 0
          Portb = Lookup(jednostki , Tabela)
          Portd.3 = 0
        Case 1
          Portb = Lookup(dziesiatki , Tabela)
          Portd.4 = 0
        Case 2
          Portb = Lookup(setki , Tabela)
          Portd.5 = 0
        Case 3
          Portb = Lookup(tysiace , Tabela)
          Portd.6 = 0
        End Select
       Return

     Tabela:
     Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255 , 137


    A propos jaki w końcu masz procek M16 czy M8 ?
    Bo widze oba

    Pozdro
  • Poziom 27  
    NO DOBRA WSZYSTKO DZIAŁA
    Procek TO m8
    Jeszcze jedno pytanie .
    Jak temperatura przekracza 32 stopnie to zaczyna wariować odczyt.
    Pokazują się na ułamki sekund same zera.
    Czy może ktoś wie czym jest to spowodowane??