Termometr Uniwersalny


9.28571
Ocena: None Średnia: 9.3 (14 głosujących)

Termometr ten pracuje w zakresie temperatur od -50.0 do +99.9 stopni lub w drugiej wersji oprogramowania aż do +125 stopni. Układ został zaprojektowany do mierzenia temperatury w akwarium ale z powodzeniem można dla niego znaleźć wiele innych zastosowań. Na płytce znajduje się miejsce na dwa przyciski oraz dodatkowe złącze ogólnego przeznaczenia. Po zmianie oprogramowania urządzenie może pełnić funkcję prostego termostatu, lub bardziej złożonego regulatora temperatury. Układ został zbudowany w oparciu o popularny, często stosowany czujnik DS18B20 i mikrokontroler AT89C2051 co znacznie uprościło jego konstrukcję i zmniejszyło wymiary. W układzie można też bez większego trudu zastosować mikrokontroler ATTiny2313, wymaga to tylko wprowadzenia kilku prostych modyfikacji.

Działanie:


Schemat termometru przedstawia poniższy rysunek:

Sercem urządzenia jest mikrokontroler U2 (AT89C2051) wraz z rezonatorem kwarcowym X1 (12MHz) i dwoma kondensatorami C4 (33pF) i C5 (33pF). Kondensator C3 (1uF) resetuje procesor po włączeniu napięcia zasilającego, a C1 (220uF) filtruje to napięcie. Do złącza zas podłączamy napięcie zasilające o wartości 5V. Rezystory R9 - R16 (330R) ograniczają prąd wyświetlaczy. Tranzystory T1 - T3 (BC557B) wraz z rezystorami R1 - R6 (3,3k) sterują anodami wyświetlaczy.

Budowa:


Termometr można zbudować z wykorzystaniem dostępnej tutaj płytki drukowanej. Wersja płytki w odbiciu lustrzanym dostępna jest tutaj. Montaż elementów można dokonać w dowolnej kolejności, najlepiej od najmniejszych do największych. Pod wyświetlacz dobrze jest wlutować kawałek podstawki DIP40, natomiast pod mikrokontroler podsatwka jest bezwzględnie konieczna. Od strony druku należy wlutować rezystor 4,7k podciągający magistralę 1-Wire (nóźka 9 układu U2) do plusa zasilania. Złącze GP1 w wersji podstawowej służy do podłączenia diody sygnalizującej ujemną temperaturę (katodą do portu procesora, anodą do VCC) gdyby miało być wykorzystywane w inny sposób należy usunąć z kodu programu linijkę: P3.7 = Not Minus. Przód obudowy można z powodzeniem wykonać z kawałka laminatu. Płytkę termometru mocujemy do panelu przedniego za pomocą dwóch przylutowanych do niego śrub. Pomocą przy konstrukcji może okazać się schemat montażowy dostępny tutaj.

Jeżeli w układzie będzie zastosowany mikrokontroler ATTiny2313 zamiast AT89C2051, nie należy montować kondensatora C3, a kondensatory C4 i C5 powinny mieć wartość 22pF.

Wykaz Elementów:

8x 330R
6x 3,3k

2x 33pF
1x 1uF
1x 220uF

1x Rezonator Kwarcowy 12MHz
1x AT89C2051 (lub ATTiny2313)
3x BC557B
1x DS18B20
1x AT5636BG-B Pb-free (TOT-5362BG-B) Wyświetlacz potrójny

Programowanie:


Oprogramowanie do termometru zostało napisane w wersji demo programu BASCOM 8051 firmy MCS Electronics (http://www.mcselec.com/). Program w całości przedstawiony jest poniżej:

'****************************
           'Konfiguracja
'****************************
$crystal = 12000000                                           '12MHz
$regfile = "89C2051.DAT"
 
Config 1wire = P3.5
 
Config Timer0 = Timer , Gate = Internal , Mode = 2
On Timer0 Przerwanie0
Load Timer0 , 250
Enable Timer0
Start Timer0
 
Enable Interrupts
'****************************
      'Zmienne
'****************************
Dim Lsb As Byte
Dim Msb As Byte
Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
Dim Wysw As Word , Wysw1 As Byte , Wysw10 As Byte , Wysw100 As Byte
Dim Tempa As Word
Dim Mux As Byte
 
Dim Zezw_wysw As Bit
Dim Pomiar_odczyt As Bit
Dim Minus As Bit
Dim Ur As Bit
'****************************
      'Wartosci Poczatkowe
'****************************
Reset Pomiar_odczyt
Reset Ur
Wysw1 = 191
Wysw10 = 191
Wysw100 = 191
'****************************
      'Petla glowna
'****************************
Do
 
If Zezw_wysw = 1 Then
  Reset Zezw_wysw                                             'co 4ms
  Wysw = Tempa
 
  If Ur = 1 Then Gosub Przelicz
  Gosub Wyswietl
End If
 
Loop
End
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Incr Co4ms
 If Co4ms = 16 Then
   Co4ms = 0
   '***************************************  co 4ms
   Set Zezw_wysw
   Incr Co100ms
   If Co100ms = 25 Then
     Co100ms = 0
     '*************************************** co 100 ms
     'ew flaga obslugi przyciskow
     Incr Co1s
     If Co1s = 7 Then
       Co1s = 0
       '*************************************** co 1s
       Pomiar_odczyt = Not Pomiar_odczyt
 
       Disable Interrupts
       1wreset
 
       If Pomiar_odczyt = 1 Then
        1wwrite &HCC
        1wwrite &H44
       Else
        If Err = 0 Then
 
          1wwrite &HCC
          1wwrite &HBE
          Lsb = 1wread():
          Msb = 1wread():
 
          Minus = Msb.7
 
          Tempa = Msb * 256
          Tempa = Tempa + Lsb
 
 
          If Minus = 1 Then
            Tempa = Not Tempa
            Tempa = Tempa + 1
          End If
 
          Tempa = Tempa * 10                                  'temperatura *10
          Tempa = Tempa / 16
 
          If Ur = 0 Then Ur = 1
 
        Else
          Tempa = 10000                                       'Er wyswietli wyswietlacz potem
        End If
       End If
 
       Enable Interrupts
       '***************************************
     End If
     '***************************************
   End If
   '***************************************
 End If
 
Return
'****************************
      'Inne Etykiety
'****************************
Przelicz:
 If Wysw < 1000 Then
   Wysw1 = Wysw Mod 10
   Wysw = Wysw / 10
   Wysw10 = Wysw Mod 10
   Wysw = Wysw / 10
   Wysw100 = Wysw Mod 10
 
   If Wysw100 = 0 Then Wysw100 = 10                           'wygaszenie zera wiodcego
 
   Wysw1 = Lookup(wysw1 , Tabela)
   Wysw10 = Lookup(wysw10 , Tabela2)
   Wysw100 = Lookup(wysw100 , Tabela)
 
 Else
   Wysw1 = 175                                                'r
   Wysw10 = 175                                               'r
   Wysw100 = 134                                              'E
 End If
 
Return
 
Wyswietl:
  Incr Mux
  If Mux = 3 Then Mux = 0
  P3.7 = Not Minus
 
  Select Case Mux
    Case 0:
     Set P3.0
      P1 = Wysw100
     Reset P3.2
 
    Case 1:
     Set P3.2
      P1 = Wysw10
     Reset P3.1
 
    Case 2:
     Set P3.1
     P1 = Wysw1
     Reset P3.0
  End Select
Return
 
                         'Tabele do wyswietlania na wyswietlaczu
Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255
'znak:    0     1     2     3     4     5     6     7     8     9     pusty
 
Tabela2:
    Data 64 , 121 , 36 , 48 , 25 , 18 , 2 , 120 , 0 , 16 , 255
'znak:    0.    1.  2.    3.   4.   5.  6.   7.   8.  9.    pusty

Ustawienia Fusebitów dla mikrokontrolera ATTiny2313:

Zdjęcia Projektu:

ZałącznikWielkość
Schemat87.5 KB
Płytka11.03 KB
Płytka (odbicie lustrzane)11.01 KB
Płytka (6 na stronie)61.72 KB
Montowanie15.44 KB
Kod źródłowy (wersja podstawowa)4.46 KB
Program po kompilacji (BIN) (wersja podstawowa)1.03 KB
Program po kompilacji (HEX) (wersja podstawowa)2.96 KB
Kod źródłowy (obsługuje temperatury powyżej 100 stopni)4.91 KB
Kod Źrodłowy (wersja z termostatem) (jeszcze nie testowana)7.57 KB
Program po kompilacji (wersja z termostatem) (BIN)1.72 KB
Program po kompilacji (wersja z termostatem) (HEX)4.85 KB
Kod Źródłowy (dla ATTiny2313, Bascom AVR)4.43 KB
Kod Źrodłowy (wersja z termostatem, dla ATTiny2313, Bascom AVR) (jeszcze nie testowana)7.28 KB
Program po kompilacji (BIN) (dla ATTiny2313, Bascom AVR)1.59 KB
Program po kompilacji (HEX) (dla ATTiny2313, Bascom AVR)4.49 KB
Kod źródłowy (dla ATMega8, Bascom AVR)4.6 KB
Nadruk na obudowę64.22 KB



Portret użytkownika janek

termometr

Mam ten sam problem.Z czujnikiem lub bez wyświetlacz pokazuje [---] .mam rezystor 4,7k dolutowany do nóżki sygnałowej ds18b20 i plusa zasilania. Nie mam pojęcia co może być nie tak, źle zaprogramowany procesor?

Portret użytkownika Virus

Termometr

Czujnik jest podłączony i rezystor podciągający również jest. Jeśli nie będzie czujnika to według opisu powinien pojawić się napis "Err" a takiego nie ma przy odłączonym DS-ie. Niezależnie od tego czy jest czy go nie ma migają tylko kreski na przemian.

Portret użytkownika mirley

Re: Termometr

A co pokazuje jak nie ma czujnika w ogóle..... powinno pokazać dokładnie to samo. Coś jest nie tak z podłączeniem czujnika albo samym czujnikiem. Gdyby był problem z zaprogramowaniem to by nie wyświetlał nic. Znaki --- wyświetlają się na samym początku a znikną jak pierwszy raz temperatura zostanie odczytana z czujnika. Skoro nie znikają to coś jest z czujnikiem. Poszukaj zwarcia, wymień ds na nowego i sprawdź ten rezystor i napięcie na czujniku

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika janek

działa!!

wszystko jasne:)
odwrotnie przylutowany ds18b2. Virus przelutuj czujnik i daj znać czy działa
Mirley dzięki za pomoc.
Pozdrawiam

Portret użytkownika Virus

Działa - ale !?

Panowie - czujnik sprawdzony po raz n-ty czy jest właściwie podłączony i jest Ok! Niestety niezależnie jak bym go podłączał to i tak na wyświetlaczu migają tylko środkowe kreski. Postanowiłem wyjąć z zupełnie innego układu mikrokontroler AT89C2051 i sprawdzić jak on będzie się zachowywał w termometrze. Zaprogramowałem i podłączyłem tylko kondensator resetujący. Tych przy kwarcu nie wymieniałem na 33pF bo nie mam akurat. Układ ruszył ale pokazał "Err" więc pierwsza myśl a jednak walnięty DS. Nówka ze sklepu nie lutowana bo wyjścia pod zasilanie i czujnik mam na listwie ze śrubkami. Jednak przypomniałem sobie że na elektrodzie dość często czytałem o rezystorze 3,3k jako podciągnięcie ( oczywiście dużo osób używa 4,7k ) Zamieniłem więc rezystor i ..... pokazała mi się temperatura! Układ termometru w tej chwili działa prawidłowo ( nie mam zwykłego termometru aby sprawdzić temperaturę ) ale tylko na AT89C2051. Jak wstawię Attiny2313 to dalej tylko migają kreseczki. Dziwna sprawa no ale cóż mam zrobić. Jedynie coś przekaźnik mi nie załącza tylko nie wiem czy powinno poniżej ustawionej czy powyżej ustawionej go włączać?

Portret użytkownika Virus

Termometr - Klimatyzator

Mam wielką prośbę o pomoc w przerobieniu sterowania przekaźnikiem. Chciałbym wykorzystać termometr do sterowania klimatyzatorem domowym ale nie daje sobie rady z przeróbką programu. Przykładowo ustawiam temperaturę 20 stopni i histerezę 2 stopnie więc termometr włącza klimę aż do uzyskania 18stopni i włącza ja ponownie dopiero po przekroczeniu 20 stopni. Kombinuje od kilku godzin ale coś nie daje sobie rady z bascomem. Pewnie to drobnostka dla niektórych ale mnie ciągle kompilator wywala jakieś błędy. Za pomoc z góry dziękuję.

Portret użytkownika mirley

Re: Termometr

Kod do termostatu jest przecież w załącznikach.... sprawdzałeś czy działa?

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Virus

Re: Termostat

Jeśli chodzi o kod to w Twoim termostacie jest podgrzewanie a mnie chodziło o chłodzenie i rozwiązanie okazało się banalnie proste. Drobna przeróbka i działa jak powinno:

Sterowanie:
 If P3.7 = 1 Then
   If Tempa >= Tempu Then P3.7 = 0
 Else
   Tempp = Tempu - Histereza
   If Tempa < Tempp Then P3.7 = 1
 End If
Return

Układ jest już zmontowany i od dzisiaj zaczął swoją pracę. Teraz zobaczymy jak będzie się sprawował. Bardzo dziękuję za wszelką pomoc.

Portret użytkownika korek

Złącze GP1

Witam
jak odwrócić stan na wyjściu Gp1?

Portret użytkownika mirley

Re: Termometr

W linijce "P3.7 = Not Minus" wywalić słówko "Not"

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Virus

Attiny2313

Wstyd się przyznać ale w końcu wiem dlaczego mój termometr nie chciał działać na Attiny2313. Używam programatora pożyczonego z pracy UniProg48 podłączonego pod lpt. Nie znam go zbyt dobrze i okazało się, że ustawiłem fusebity ale nie zaznaczyłem odpowiedniego okienka. Podczas programowania wczytywał program ale nie ustawiał fusebitów i Attina ciągle była na ustawieniach domyślnych. Programowałem układ do zupełnie innych zadań gdzie dużo poleceń jest opartych na timerach. Po uruchomieniu nie zgadzały mi się czasy i dopiero po przeliczeniach wyszło, że układ pracuje na parametrach jak z fabryki.

Portret użytkownika gosc123412341

znak minusa

czemu jak temperatura na + to znak minusa(u mnie dioda) się świeci a jak temp - to nie świeci?

Portret użytkownika mirley

Re: Dioda

A jak podłączyłeś tą diodę? Dioda powinna być anodą do +5V i przez rezystor katodą do portu procka

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Virus

Zapamiętywanie ustawień

Już ze dwa tygodnie mija jak mam zamontowany termoregulator w aucie. Jak wcześniej wspomniałem wstawiłem układ AT89C2051 ale chcę zmienić na Attiny2313 ponieważ posiada on pamięć eeprom. Chciałbym aby ustawienia które dokonam zostały wpisane do tej pamięci aby przy wyłączaniu auta i ponownym włączeniu nie ustawiać parametrów na nowo. Powiem szczerze, że jeśli chodzi o programowanie jestem cienki więc jeśli ktoś zechciałby mnie chociaż nakierować jak to zrobić to byłbym wdzięczny.

Portret użytkownika mirley

Re: Termostat

Do procka zapisujesz poleceniem writeeeprom a czytasz na początku programu readeeprom. Poszukaj informacji o tych poleceniach w helpie do bascoma. Tam wszystko jest opisane.

W miejscu gdzie skończysz ustawienia wykonaj polecenie zapisu do eeprom a na samym początku przed do loop wczytaj dane.

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Virus

Re: Zapamiętywanie ustawień

Poniżej podaję kod w którym użyłem instrukcji zapisywania i odczytu z pamięci eeprom. Gdybyś rzucił na to okiem czy ma to rację bytu.

'****************************
           'Konfiguracja
'****************************
$regfile = "attiny2313.dat"
$crystal = 12000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11100111 : Portd = &B11111111
 
Config 1wire = Pind.5
 
Config Timer0 = Timer , Prescale = 64
Enable Timer0 : On Timer0 Przerwanie0
 
Enable Interrupts
'****************************
      'Zmienne
'****************************
Dim Lsb As Byte
Dim Msb As Byte
Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
Dim Wysw As Word , Wysw1 As Byte , Wysw10 As Byte , Wysw100 As Byte
Dim Wysw_pomoc As Word
Dim Tempa As Word
Dim Tempu As Word
Dim Histereza As Byte
Dim Mux As Byte
Dim Poz_menu As Byte
Dim Tempp As Word                                           'zmiena pomocnicza
Dim Autopowrot As Byte
 
Dim Zezw_wysw As Bit , Zezw_przyciski As Bit
Dim Pomiar_odczyt As Bit
Dim Minus As Bit
Dim Ur As Bit
Dim Miganie As Bit
Dim Sw_port As Byte , Stan_portu As Byte , Licznik_sw As Byte
'****************************
      'Wartosci Poczatkowe
'****************************
Reset Pomiar_odczyt
Reset Ur
Poz_menu = 0
Readeeprom Tempu , 1
Readeeprom Histereza , 2
Wysw1 = 191
Wysw10 = 191
Wysw100 = 191
'****************************
      'Petla glowna
'****************************
Do
 
If Zezw_wysw = 1 Then
  Reset Zezw_wysw                                           'co 4ms
 
  Select Case Poz_menu
    Case 0:
      Wysw = Tempa
    Case 1:
      If Miganie = 1 Then Wysw = Tempu Else Wysw = 10000
    Case 2:
       If Miganie = 1 Then Wysw = Histereza Else Wysw = 10000
  End Select
 
  If Ur = 1 Then Gosub Przelicz
  Gosub Wyswietl
End If
 
 
If Zezw_przyciski = 1 Then
  Reset Zezw_przyciski                                      'co 100ms
'(
Sw_port = Pind And &B11100111
Shift Sw_port , Left , 3
 
If Sw_port <> 255 And Stan_portu = Sw_port Then
  Incr Licznik_sw
  If Licznik_sw = 4 Then
    Licznik_sw = 0
    Autopowrot = 0
    Select Case Stan_portu
      Case 2:                                               'plus
       Select Case Poz_menu
          Case 0:
           Poz_menu = 1
          Case 1:
           If Tempu < 900 Then Incr Tempu
          Case 2:
           If Histereza < 100 Then Incr Histereza
        End Select
      Case 1:                                               'minus
        Select Case Poz_menu
          Case 0:
            Poz_menu = 2
          Case 1:
           If Tempu > 100 Then Decr Tempu
          Case 2:
           If Histereza > 0 Then Decr Histereza
        End Select
      Case 0:                                               'plus i minus
        Incr Poz_menu
        If Poz_menu = 3 Then Poz_menu = 0
        Writeeeprom Tempu , 1
        Writeeeprom Histereza , 2
    End Select
  End If
Else
  Stan_portu = Sw_port
  Licznik_sw = 2
End If
 
 
  If Poz_menu <> 0 Then                                     'jezeli jest w menu
   Incr Autopowrot
   If Autopowrot = 50 Then Poz_menu = 0                     'wraca do wysw. temperatury po 50* 0,1s (5sekund)
  End If
')
   Gosub Sterowanie
 
End If
 
Loop
End
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 5
Incr Co4ms
 If Co4ms = 3 Then
   Co4ms = 0
   '***************************************  co 4ms
   Set Zezw_wysw
   Incr Co100ms
   If Co100ms = 25 Then
     Co100ms = 0
     '*************************************** co 100 ms
     Set Zezw_przyciski                                     'zezwolenie obslugi przyciskow
     Miganie = Not Miganie                                  'umozliwia miganie cyfr podczas wyswietlania menu
     Incr Co1s
     If Co1s = 7 Then
       Co1s = 0
       '*************************************** co 1s
       Pomiar_odczyt = Not Pomiar_odczyt
 
       Disable Interrupts
       1wreset
 
       If Pomiar_odczyt = 1 Then
        1wwrite &HCC
        1wwrite &H44
       Else
        If Err = 0 Then
 
          1wwrite &HCC
          1wwrite &HBE
          Lsb = 1wread():
          Msb = 1wread():
 
          Minus = Msb.7
 
          Tempa = Msb * 256
          Tempa = Tempa + Lsb
 
 
          If Minus = 1 Then
            Tempa = Not Tempa
            Tempa = Tempa + 1
          End If
 
          Tempa = Tempa * 10                                'temperatura *10
          Tempa = Tempa / 16                                'wartosc 123 dla 12.3 stopnia itp.
 
          If Ur = 0 Then Ur = 1
 
        Else
          Tempa = 10000                                     'Err wyswietli wyswietlacz potem
        End If
       End If
 
       Enable Interrupts
       '***************************************
     End If
     '***************************************
   End If
   '***************************************
 End If
 
Return
'****************************
      'Inne Etykiety
'****************************
Przelicz:
 If Wysw < 1000 Then
   Wysw_pomoc = Wysw Mod 10
   Wysw1 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw10 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw100 = Wysw_pomoc
 
 
   If Wysw100 = 0 Then Wysw100 = 10                         'wygaszenie zera wiodacego
 
   Wysw1 = Lookup(wysw1 , Tabela)
   Wysw10 = Lookup(wysw10 , Tabela2)
   Wysw100 = Lookup(wysw100 , Tabela)
 
 Else
   If Wysw = 10000 Then
     Wysw1 = 255                                            'wygaszony
     Wysw10 = 255                                           'wygaszony
     Wysw100 = 255                                          'wygaszony
   Else
     Wysw1 = 175                                            'r
     Wysw10 = 175                                           'r
     Wysw100 = 134                                          'E
   End If
 End If
Return
 
 
Wyswietl:
  Incr Mux
  If Mux = 3 Then Mux = 0
 
  Select Case Mux
    Case 0:
     Set Portd.0
      Portb = Wysw100
     Reset Portd.2
 
    Case 1:
     Set Portd.2
      Portb = Wysw10
     Reset Portd.1
 
    Case 2:
     Set Portd.1
     Portb = Wysw1
     Reset Portd.0
  End Select
Return
 
 
Sterowanie:
 If Portd.6 = 1 Then
   If Tempa >= Tempu Then Portd.6 = 0
 Else
   Tempp = Tempu - Histereza
   If Tempa < Tempp Then Portd.6 = 1
 End If
Return
'****************************
 
'****************************
 
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255
'znak:    0     1     2     3     4     5     6     7     8     9     pusty
 
Tabela2:
    Data 64 , 121 , 36 , 48 , 25 , 18 , 2 , 120 , 0 , 16 , 255
'znak:    0.    1.  2.    3.   4.   5.  6.   7.   8.  9.    pusty
'*******************************************************************************
 
'*******************************************************************************

Przy okazji to jeszcze jedno pytanie. Jeśli dobrze wyczytałem to istnieje możliwość użycia tej samej końcówki jako wejścia oraz jako wyjścia. Pytanie więc czy rzeczywiście mogę np jedno w wejść jednego z przycisków użyć również jako sterowanie wskazaniem minusa temperatury?

Portret użytkownika mirley

Re: Termostat

Chyba dobrze z tym że musisz zmienić adresy zapisu i odczytu na:

 Writeeeprom Tempu , 1
 Writeeeprom Histereza , 3

zmienna Tempu jest typu word i zapisanie jest do adresu 1 powoduje defakto zapis do 1 i 2, tak samo z odczytem

Port można konfigurować podczas pracy za pomocą bezpośredniego wpisu do rejestrów ddr ale wciśnięcie przycisków w momencie jak piny są wyjściami spowoduje zwarcie. Trzeba by nad tym pomyśleć trochę ale to nie jest takie proste

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Virus

Re: Termostat

Dzięki za podpowiedź ze zmianą adresów. W swoim układzie zastosowałem wyświetlacz 4 cyfrowy bo taki miałem w swoich zasobach. Jak już wcześniej wspomniałem termometr jest zamontowany w aucie i dlatego chciałbym aby była możliwość wyświetlania minusa. Przyda się szczególnie zimą. Muszę jeszcze tylko popracować nad przyciskami bo mi teraz brakuje wejść ale już widziałem jak to rozwiązać od strony elektroniki. Troszkę trzeba będzie się na główkować nad kodem ale jest to do zrobienia.

Portret użytkownika Virus

Dwa przysiski na jednym porcie

Ostatnio chciałem wpisywać ustawienia do pamięci EEPROM ale sposób jaki podałem według mnie nie jest właściwy. Rozkaz wpisu jest w pętli głównej a jak wiadomo ilość dokonywania wpisów do pamięci jest ograniczona. Należałoby tak zmienić program aby wpis został dokonany tylko w przypadku zmiany wartości. Jednak teraz mam inne pytanie związane z programem. Używam go do sterowania klimy więc używam wyjścia PD7 do sterowania przekaźnikiem. Dodatkowo chcę sterować wyjściem PD3 do wskazywania minusa. Zostaje mi tylko wejście PD4 do kontroli przycisków. Wiem że można podłączyć przyciski do jednego wejścia separując je diodami a minus do sterowania brać z segmentów wyświetlaczy. W takim przypadku jeśli pojawi się stan niski na PD4 wystarczy sprawdzić który segment jest sterowany i wiadomo jaki przycisk był naciśnięty. Z programowania jestem cienki jednak spróbowałem to jakoś ogarnąć. Poniżej podaję kod z moją propozycją. Proszę o opinie czy to zadziała czy też zmieniać kod.

'****************************
           'Konfiguracja
'****************************
$regfile = "attiny2313.dat"
$crystal = 12000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11101111 : Portd = &B11111111
 
Config 1wire = Pind.5
 
Config Timer0 = Timer , Prescale = 64
Enable Timer0 : On Timer0 Przerwanie0
 
Enable Interrupts
'****************************
      'Zmienne
'****************************
Dim Lsb As Byte
Dim Msb As Byte
Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
Dim Wysw As Word , Wysw1 As Byte , Wysw10 As Byte , Wysw100 As Byte , Wysw1000 As Byte
Dim Wysw_pomoc As Word
Dim Tempa As Word
Dim Tempu As Word
Dim Histereza As Byte
Dim Mux As Byte
Dim Poz_menu As Byte
Dim Tempp As Word                                           'zmiena pomocnicza
Dim Autopowrot As Byte
Dim Zezw_wysw As Bit , Zezw_przyciski As Bit
Dim Pomiar_odczyt As Bit
Dim Minus As Bit
Dim Ur As Bit
Dim Miganie As Bit
Dim Stan_portu As Byte , Licznik_sw As Byte
'****************************
      'Wartosci Poczatkowe
'****************************
Reset Pomiar_odczyt
Reset Ur
Poz_menu = 0
Tempu = 230
Histereza = 15
Wysw1 = 191
Wysw10 = 191
Wysw100 = 191
'****************************
      'Petla glowna
'****************************
Do
 
If Zezw_wysw = 1 Then
  Reset Zezw_wysw                                           'co 4ms
 
  Select Case Poz_menu
    Case 0:
      Wysw = Tempa
    Case 1:
      If Miganie = 1 Then Wysw = Tempu Else Wysw = 10000
    Case 2:
       If Miganie = 1 Then Wysw = Histereza Else Wysw = 10000
  End Select
 
  If Ur = 1 Then Gosub Przelicz
  Gosub Wyswietl
End If
 
 
If Zezw_przyciski = 1 Then
  Reset Zezw_przyciski                                      'co 100ms
'(
  Incr Licznik_sw
  If Licznik_sw = 4 Then
    Licznik_sw = 0
    Autopowrot = 0
    Select Case Stan_portu
      Case 2:                                               'plus
       Select Case Poz_menu
          Case 0:
           Poz_menu = 1
          Case 1:
           If Tempu < 900 Then Incr Tempu
          Case 2:
           If Histereza < 100 Then Incr Histereza
        End Select
      Case 1:                                               'minus
        Select Case Poz_menu
          Case 0:
            Poz_menu = 2
          Case 1:
           If Tempu > 100 Then Decr Tempu
          Case 2:
           If Histereza > 0 Then Decr Histereza
        End Select
      Case 0:                                               'plus i minus
        Incr Poz_menu
        If Poz_menu = 3 Then Poz_menu = 0
    End Select
  End If
Else
  Stan_portu = 0
  Licznik_sw = 2
End If
 
 
  If Poz_menu <> 0 Then                                     'jezeli jest w menu
   Incr Autopowrot
   If Autopowrot = 50 Then Poz_menu = 0                     'wraca do wysw. temperatury po 50* 0,1s (5sekund)
  End If
')
   Gosub Sterowanie
 
End If
 
Loop
End
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 5
Incr Co4ms
 If Co4ms = 3 Then
   Co4ms = 0
   '***************************************  co 4ms
   Set Zezw_wysw
   Incr Co100ms
   If Co100ms = 25 Then
     Co100ms = 0
     '*************************************** co 100 ms
     Set Zezw_przyciski                                     'zezwolenie obslugi przyciskow
     Miganie = Not Miganie                                  'umozliwia miganie cyfr podczas wyswietlania menu
     Incr Co1s
     If Co1s = 7 Then
       Co1s = 0
       '*************************************** co 1s
       Pomiar_odczyt = Not Pomiar_odczyt
 
       Disable Interrupts
       1wreset
 
       If Pomiar_odczyt = 1 Then
        1wwrite &HCC
        1wwrite &H44
       Else
        If Err = 0 Then
 
          1wwrite &HCC
          1wwrite &HBE
          Lsb = 1wread():
          Msb = 1wread():
 
          Minus = Msb.7
 
          Tempa = Msb * 256
          Tempa = Tempa + Lsb
 
 
          If Minus = 1 Then
            Tempa = Not Tempa
            Tempa = Tempa + 1
          End If
 
          Tempa = Tempa * 10                                'temperatura *10
          Tempa = Tempa / 16                                'wartosc 123 dla 12.3 stopnia itp.
 
          If Ur = 0 Then Ur = 1
 
        Else
          Tempa = 10000                                     'Err wyswietli wyswietlacz potem
        End If
       End If
 
       Enable Interrupts
       '***************************************
     End If
     '***************************************
   End If
   '***************************************
 End If
 
Return
'****************************
      'Inne Etykiety
'****************************
Przelicz:
 If Wysw < 1000 Then
   Wysw_pomoc = Wysw Mod 10
   Wysw1 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw10 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw100 = Wysw_pomoc
 
   Wysw1 = Lookup(wysw1 , Tabela)
   Wysw10 = Lookup(wysw10 , Tabela2)
   Wysw100 = Lookup(wysw100 , Tabela)
 
   Wysw1000 = 255
   If Wysw100 = 192 Then
     Wysw100 = 255                                          'wygaszenie zera wiodšcego
     If Minus = 1 Then Wysw100.6 = 0
   Else
     If Minus = 1 Then Wysw1000.6 = 0
   End If
 
 
 Else
   Wysw1 = 175                                              'r
   Wysw10 = 175                                             'r
   Wysw100 = 134                                            'E
   Wysw1000 = 255
 End If
 
Return
 
 
Wyswietl:
  Incr Mux
  If Mux = 4 Then Mux = 0
 
  Select Case Mux
    Case 0:
     Set Portd.3
      Portb = Wysw100
     Reset Portd.2
     If Portd.4 = 0 Then Stan_portu = 2
 
    Case 1:
     Set Portd.2
      Portb = Wysw10
     Reset Portd.1
 
    Case 2:
     Set Portd.1
     Portb = Wysw1
     Reset Portd.0
     If Portd.4 = 0 Then Stan_portu = 1
 
    Case 3:
     Set Portd.0
     Portb = Wysw1000
     Reset Portd.3
 
  End Select
Return
 
 
Sterowanie:
 If Portd.6 = 1 Then
   If Tempa >= Tempu Then Portd.6 = 0
 Else
   Tempp = Tempu - Histereza
   If Tempa < Tempp Then Portd.6 = 1
 End If
Return
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255
'znak:    0     1     2     3     4     5     6     7     8     9     pusty
 
Tabela2:
    Data 64 , 121 , 36 , 48 , 25 , 18 , 2 , 120 , 0 , 16 , 255
'znak:    0.    1.  2.    3.   4.   5.  6.   7.   8.  9.    pusty
'*******************************************************************************
 
'*******************************************************************************

Portret użytkownika mirley

Re: Zapis

Po pierwsze to zapis dobrze jest zrobić tutaj:

 If Poz_menu <> 0 Then                                     'jezeli jest w menu
   Incr Autopowrot
   If Autopowrot = 50 Then Poz_menu = 0                     'wraca do wysw. temperatury po 50* 0,1s (5sekund)
  End If

zmieniając na:

 If Poz_menu <> 0 Then                                     'jezeli jest w menu
   Incr Autopowrot
   If Autopowrot = 50 Then 
     Poz_menu = 0                     'wraca do wysw. temperatury po 50* 0,1s (5sekund)
     'zapis do EEPROM tutaj
   end if
  End If

Co do działania przycisków to powinno działać tak jak masz o ile dodasz diody katodami do portów procka sterujących anodami wyświetlacza. potem 3 przyciski poprzez te diody do wspólnego pinu procka. Port powinien być ustawiony jako wejście i stan logiczny 1 (wewnętrzny pull up)

Aha... nie może być If Portd.4 = 0 ...... tylko musi być If Pind.4 = 0 ....

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Virus

Re; Dwa przyciski na jednym porcie

Niestety w realu termometr nie reaguje w ogóle na przyciski. Sprawdzałem czy na pewno diody są prawidłowo podłączone. Mierzyłem miernikiem czy po naciśnięciu dowolnego przycisku pojawia się stan niski ( miernik wskazywał spadek do około 3,7V ale trzeba pamiętać, że zero pojawia się co 16ms więc zwykły miernik tego nie pokaże tylko wartość średnią ) Zmieniałem kod na Twoje wskazówki jak również zmieniałem na swoje jakieś pomysły i niestety ale nic z tego. Jedyną różnicą jaką zaproponowałeś jest to, że ja mam diody podłączone do wyjść sterujących Attiny a nie do anod wyświetlacza. Taki sposób podłączenia znalazłem u gościa w zegarze i myślę, że to bez różnicy skoro jemu to działa. Przy okazji to w kodzie który zaproponowałem jest namieszane wyświetlanie bo jak podłączyłem to nic nie pokazywał dopiero po zmianach ruszył. Teraz mam pytanie - jak na razie nie sprawdzę minusa bo za ciepło ale na wyświetlaczu który będzie go wskazywał mam cały czas lekko podświetlone cyfry ( tak jakby cały czas było 8 ale bardziej widoczna jest cyfra taka jak na pierwszym wyświetlaczu ) Jak się tego pozbyć ? Przy okazji to anodę tego segmentu mam podłączoną bezpośrednio do Attiny nie jak w pozostałych segmentach przez tranzystor.

Przelicz:
 If Wysw < 1000 Then
   Wysw_pomoc = Wysw Mod 10
   Wysw1 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw10 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw100 = Wysw_pomoc
 
 
   If Wysw100 = 0 Then Wysw100 = 10                         'wygaszenie zera wiodacego
 
   Wysw1 = Lookup(wysw1 , Tabela)
   Wysw10 = Lookup(wysw10 , Tabela2)
   Wysw100 = Lookup(wysw100 , Tabela)
 
   Wysw1000 = 255
   If Wysw100 = 192 Then
     Wysw100 = 255                                          'wygaszenie zera wiodącego
     If Minus = 1 Then Wysw100.6 = 0
   Else
     If Minus = 1 Then Wysw1000.6 = 0
   End If
 Else
   If Wysw = 10000 Then
     Wysw1 = 255                                            'wygaszony
     Wysw10 = 255                                           'wygaszony
     Wysw100 = 255                                          'wygaszony
     Wysw1000 = 255                                         'wygaszony
   Else
     Wysw1 = 175                                            'r
     Wysw10 = 175                                           'r
     Wysw100 = 134                                          'E
     Wysw1000 = 255
   End If
 End If
Return

Portret użytkownika Virus

Re; Dwa przyciski na jednym porcie

Po długiej przerwie wrócę do tematu. Wszystkie zmiany które chciałem wprowadzić w programie nie były możliwe do zrealizowania w bascomie. Po dopisaniu wszystkiego okazywało się, że program jest za długi. Postanowiłem go przerobić na asemblera i uprościć pewne procedury. Teraz wszystko śmiga jak należy i zmieściło się do Attiny. Jeśli chodzi o to podświetlanie na czwartym wyświetlaczu który miał tylko wyświetlać minus okazało się, że skoro nie dałem tranzystora sterującego to trzeba sterować plusem a nie minusem. Po dokonaniu tej zmiany wyświetlacz jest pusty a dopiero jak temperatura schodzi poniżej zera ( użyłem zmrażacza ) ukazuje się tylko minus. Projekt został zakończony pomyślnie i można rozglądać się za nowym.

Portret użytkownika ozzy

Zasilanie z linii danych

Witam, nie mogę nigdzie doczytać czy próbował ktoś podłączać czujnik do układu przez zasilanie pasożytnicze? Nie ma żadnych dziwnych zachowań układu?

Portret użytkownika ozzy

Zasilanie pasożytnice

Witam! jak zachowuje się układ przy zasilaniu pobieranym z linii danych? sprawdzał ktoś? mam 3 czujniki ds w metalowych obudowach które są już zalane żywicą i troszkę mnie kosztowały, więc nie chcę robić czegoś co mi nie będzie działało :/

Portret użytkownika mirley

Re: Czujniki Ds18b20

A czemu miały by nie działać.... w ostateczności zwiększysz w programie czas między odczytami bo na zasilaniu 2 przewodowym będzie on dłużej mierzył. Sprawdź podłączając jakiś czujnik na 3 przewodach a potem inny na 2 przewodach

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika ozzy

Ok, dzięki ale wolałem się

Ok, dzięki ale wolałem się upewnić bo jeden czujnik kosztował mnie ok 40zł (tokarz, czujnik i czujnik temp. od opla - dla wtyczki) a wszystko już jest zalane żywicą więc nie rozebrał bym tego :)

Portret użytkownika Chester

wyświetlacz

Witam!
Wyświetlacz jaki ma być zastosowany to ze wspólną katodą czy anodą?
Pozdrawiam!

Portret użytkownika mirley

Re: Termometr

Wspólna anoda... ze schematu przecież to widać

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Łukasz

pytanko

Witam jak widze moje wpisy sie posypały . Więc powtarzam pytanko ..czy termostat działa na attiny2313 bo wgrałem tą wersje i nic :(

Portret użytkownika Chester

Wyświetlacz

Witam!
Mam mały problem z wyświetlaczem led :( ponieważ mój wyświetlacz jest 4-pozycyjne ze wspólną anodą ale ma aż 14 wyprowadzeń anie 12 jak jest w projekcie. Niestety zasugerowałem się PDF'em :
http://sklep.avt.pl/p/pl/47225/wyswietlacz+zielony+4+cyfry+14-2mm+wa.html
http://sklep.avt.pl/photo/_pdf/TOF5462.pdf
gdzie jest tylko 6 wyprowadzeń.
Czy istnieje jakiś sposób podłączenia tego wyświetlacza? czy trzeba projektować płytkę od początku ?
Z góry dziękuję za odpowiedź!
Pozdrawiam!

Portret użytkownika Łukasz

Hej wydaje mi sie ze bez

Hej wydaje mi sie ze bez problemu podłaczysz ten wyswietlacz porównaj piny wyswietlacza i podłacz na tasmie tak jak ja zrobilem wyprowadzenie 12 wyswietlacza u ciebie bedzie wyprowadzeniem 11 ,9-10, 6-8 to wyprowadzenia anod wyswietlacza a zreszta tak samo zrób

Portret użytkownika Chester

Wyświetlacz

Porównałem wyprowadzenie i nóżki na moim wyświetlaczu o numerze 8 i 7 są niepotrzebne prawda? ponieważ są one odpowiedzialne za dwie środkowe kropki.
Tylko mam ostatni problem hehe która nóżka to pierwsza nóżka ? W jaki sposób je liczyć? :)

Jakoś to podłączyłem ale nie do końca wszystko się zgadza bo podłączyłem 11 pinów czyli jeden segment z pinem 6 nie świeci.
Zaprogramowałem mikroklocka attiny2313 wybierając opcję kod źródłowy dla attiny2313. Program skompilowałem i ustawiłem fuse bity zgodnie z tym co jest podane wyżej :)
Po podłączeniu zasilania pojawiły się tylko 2 poziome kreski w segmencie pierwszym i trzecim.
Proszę mi powiedzieć gdzie jest błąd? Na pewno trzeba przerobić program tylko do końca nie wiem jak :( chciałbym aby temperatury ujemne poprzedzał znak minus.

Pozdrawiam!

Wprowadziłem poprawki czyli zauważyłem że odwrotnie zamontowałem czujnik DS i teraz na wyświetlaczu pojawia się na pierwszym segmencie cyfra "2" a na trzecim jest odliczanie od cyfry "9" do cyfry "0" i tak bez przerwy. W czym tkwi problem?

Z góry dziękuję za odpowiedź!

Portret użytkownika mirley

Re: Wyśiwetlacz

Prawdopodobnie nie podłączyłeś jednej z anod lub źle podłaczyłeś. Sprawdź najpierw wszystkie segmenty czy świecą. Wyjmij procka z podstawki i weź dwa kawałki drutu. Przeczytaj to punkt 7 na temat wyświetlacza LED i sprawdź podobnie swój

-----

co do termostatu to program jest w załączniku

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Chester

Wyświetlacz

Z godnie z Twoja radą posprawdzałem wszystkie luty jeszcze raz oraz ścieżki i okazało się że miałem jedno zwarcie. Po usunięciu problemu wszystko działa bardzo ładnie ale nie do końca.
Z godnie z pdf'em wyświetlacza:
http://sklep.avt.pl/photo/_pdf/TOF5462.pdf
temperatura pokazywana jest na pozycji DIG1, DIG2, DIG3.
Pozostał mi jeszcze jeden wolny pin w procesorze czyli mogę go podłączyć za pomocą tranzystora i rezystora tak aby DIG4 także uczestniczył w wyświetlaniu temperatury? Ponieważ chce to całe wyświetlenie przesunąć a segment DIG1 służył by tylko za wyświetlanie znaku ujemnego.
Prawdopodobnie to kwestia zmiany programu gdzie problem był już wspominany w poście numer: #15 na stronie 4 tego tematu ale proszę o wyjaśnienie jak dokładnie podłączyć ostatnią pozycję wyświetlacza?

Pozdrawiam!

Portret użytkownika mirley

Re: Termometr

Dokładnie tak samo masz podłączyć za pomocą tranzystora jak inne segmenty. W programie trzeba tylko zmienić kilka linijek w procedurze wyświetlania, wprowadzić tam dodatkowego case, który włącza ostatni tranzystor i wyświetla na nim znak -

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Chester

program

Napisałem taki program lub inaczej mówiąc przerobiłem Twój program :) Czy teraz jest dobrze i odpowiednio będzie wyświetlana temperatura? Znak minus ma być wyświetlany na pierwszym od lewej segmencie czyli DIG1.

'****************************
           'Konfiguracja
'****************************
$regfile = "attiny2313.dat"
$crystal = 12000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11111111 : Portd = &B11111111
 
Config 1wire = Pind.5
 
Config Timer0 = Timer , Prescale = 64
Enable Timer0 : On Timer0 Przerwanie0
 
 
Enable Interrupts
'****************************
      'Zmienne
'****************************
Dim Lsb As Byte
Dim Msb As Byte
Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
Dim Wysw As Word , Wysw1 As Byte , Wysw10 As Byte , Wysw100 As Byte
Dim Wysw_pomoc As Word
Dim Tempa As Word
Dim Mux As Byte
 
Dim Zezw_wysw As Bit
Dim Pomiar_odczyt As Bit
Dim Minus As Bit
Dim Ur As Bit
'****************************
      'Wartosci Poczatkowe
'****************************
Reset Pomiar_odczyt
Reset Ur
Wysw1 = 191
Wysw10 = 191
Wysw100 = 191
'****************************
      'Petla glowna
'****************************
Do
 
If Zezw_wysw = 1 Then
  Reset Zezw_wysw                                           'co 4ms
  Wysw = Tempa
 
  If Ur = 1 Then Gosub Przelicz
  Gosub Wyswietl
End If
 
Loop
End
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 5
Incr Co4ms
 If Co4ms = 3 Then
   Co4ms = 0
   '***************************************  co 4ms
   Set Zezw_wysw
   Incr Co100ms
   If Co100ms = 25 Then
     Co100ms = 0
     '*************************************** co 100 ms
     'ew flaga obslugi przyciskow
     Incr Co1s
     If Co1s = 7 Then
       Co1s = 0
       '*************************************** co 1s
       Pomiar_odczyt = Not Pomiar_odczyt
 
       Disable Interrupts
       1wreset
 
       If Pomiar_odczyt = 1 Then
        1wwrite &HCC
        1wwrite &H44
       Else
        If Err = 0 Then
 
          1wwrite &HCC
          1wwrite &HBE
          Lsb = 1wread():
          Msb = 1wread():
 
          Minus = Msb.7
 
          Tempa = Msb * 256
          Tempa = Tempa + Lsb
 
 
          If Minus = 1 Then
            Tempa = Not Tempa
            Tempa = Tempa + 1
          End If
 
          Tempa = Tempa * 10                                'temperatura *10
          Tempa = Tempa / 16
 
          If Ur = 0 Then Ur = 1
 
        Else
          Tempa = 10000                                     'Er wyswietli wyswietlacz potem
        End If
       End If
 
       Enable Interrupts
       '***************************************
     End If
     '***************************************
   End If
   '***************************************
 End If
 
Return
'****************************
      'Inne Etykiety
'****************************
Przelicz:
 If Wysw < 1000 Then
   Wysw_pomoc = Wysw Mod 10
   Wysw1 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw10 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw100 = Wysw_pomoc
 
   Wysw1 = Lookup(wysw1 , Tabela)
   Wysw10 = Lookup(wysw10 , Tabela2)
   Wysw100 = Lookup(wysw100 , Tabela)
 
   Wysw1000 = 255
   If Wysw100 = 192 Then 
     Wysw100 = Lookup(wysw100 , Tabela)                         'wygaszenie zera wiodšcego
     if Minus = 1 then Wysw100.6 = 0
   else
     if Minus = 1 then Wysw1000.6 = 0
   end if
 
 
 Else
   Wysw1 = 175                                              'r
   Wysw10 = 175                                             'r
   Wysw100 = 134                                            'E
   Wysw1000 = 255
 End If
 
Return
 
 
Wyswietl:
 
  Incr Mux
  If Mux = 4 Then Mux = 0
 
  Select Case Mux
    Case 0:
     Set Portd.6
      Portb = Wysw100
     Reset Portd.2
 
    Case 1:
     Set Portd.2
      Portb = Wysw10
     Reset Portd.1
 
    Case 2:
     Set Portd.1
     Portb = Wysw1
     Reset Portd.0
 
    Case 3:
     Set Portd.0
     Portb = Wysw1000
     Reset Portd.6
 
  End Select
 
Return
 
'****************************
 
'****************************
 
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255
'znak:    0     1     2     3     4     5     6     7     8     9     pusty
 
Tabela2:
    Data 64 , 121 , 36 , 48 , 25 , 18 , 2 , 120 , 0 , 16 , 255
'znak:    0.    1.  2.    3.   4.   5.  6.   7.   8.  9.    pusty
'*******************************************************************************
 
'*******************************************************************************

Dzięki za pomoc!
Pozdrawiam!

P.S.
Dopiero teraz miałem możliwość sprawdzenia programu i niestety się nie chce skompilować :( Gdzie jest błąd?

Portret użytkownika mirley

Re: Program

A jaki jest komunikat i w której linii??

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Chester

program

Program zmieniłem dodałem zmienną Wysw1000

'****************************
           'Konfiguracja
'****************************
$regfile = "attiny2313.dat"
$crystal = 12000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11111111 : Portd = &B11111111
 
Config 1wire = Pind.5
 
Config Timer0 = Timer , Prescale = 64
Enable Timer0 : On Timer0 Przerwanie0
 
 
Enable Interrupts
'****************************
      'Zmienne
'****************************
Dim Lsb As Byte
Dim Msb As Byte
Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
Dim Wysw As Word , Wysw1 As Byte , Wysw10 As Byte , Wysw100 As Byte , Wysw1000 As Byte
Dim Wysw_pomoc As Word
Dim Tempa As Word
Dim Mux As Byte
 
Dim Zezw_wysw As Bit
Dim Pomiar_odczyt As Bit
Dim Minus As Bit
Dim Ur As Bit
'****************************
      'Wartosci Poczatkowe
'****************************
Reset Pomiar_odczyt
Reset Ur
Wysw1 = 191
Wysw10 = 191
Wysw100 = 191
'****************************
      'Petla glowna
'****************************
Do
 
If Zezw_wysw = 1 Then
  Reset Zezw_wysw                                           'co 4ms
  Wysw = Tempa
 
  If Ur = 1 Then Gosub Przelicz
  Gosub Wyswietl
End If
 
Loop
End
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 5
Incr Co4ms
 If Co4ms = 3 Then
   Co4ms = 0
   '***************************************  co 4ms
   Set Zezw_wysw
   Incr Co100ms
   If Co100ms = 25 Then
     Co100ms = 0
     '*************************************** co 100 ms
     'ew flaga obslugi przyciskow
     Incr Co1s
     If Co1s = 7 Then
       Co1s = 0
       '*************************************** co 1s
       Pomiar_odczyt = Not Pomiar_odczyt
 
       Disable Interrupts
       1wreset
 
       If Pomiar_odczyt = 1 Then
        1wwrite &HCC
        1wwrite &H44
       Else
        If Err = 0 Then
 
          1wwrite &HCC
          1wwrite &HBE
          Lsb = 1wread():
          Msb = 1wread():
 
          Minus = Msb.7
 
          Tempa = Msb * 256
          Tempa = Tempa + Lsb
 
 
          If Minus = 1 Then
            Tempa = Not Tempa
            Tempa = Tempa + 1
          End If
 
          Tempa = Tempa * 10                                'temperatura *10
          Tempa = Tempa / 16
 
          If Ur = 0 Then Ur = 1
 
        Else
          Tempa = 10000                                     'Er wyswietli wyswietlacz potem
        End If
       End If
 
       Enable Interrupts
       '***************************************
     End If
     '***************************************
   End If
   '***************************************
 End If
 
Return
'****************************
      'Inne Etykiety
'****************************
Przelicz:
 If Wysw < 1000 Then
   Wysw_pomoc = Wysw Mod 10
   Wysw1 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw10 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw100 = Wysw_pomoc
 
   Wysw1 = Lookup(wysw1 , Tabela)
   Wysw10 = Lookup(wysw10 , Tabela2)
   Wysw100 = Lookup(wysw100 , Tabela)
 
   Wysw1000 = 255
   If Wysw100 = 192 Then
     Wysw100 = 255                                          'wygaszenie zera wiodšcego
     If Minus = 1 Then Wysw100.6 = 0
   Else
     If Minus = 1 Then Wysw1000.6 = 0
   End If
 
 
 Else
   Wysw1 = 175                                              'r
   Wysw10 = 175                                             'r
   Wysw100 = 134                                            'E
   Wysw1000 = 255
 End If
 
Return
 
 
Wyswietl:
 
  Incr Mux
  If Mux = 4 Then Mux = 0
 
  Select Case Mux
    Case 0:
     Set Portd.6
      Portb = Wysw100
     Reset Portd.2
 
    Case 1:
     Set Portd.2
      Portb = Wysw10
     Reset Portd.1
 
    Case 2:
     Set Portd.1
     Portb = Wysw1
     Reset Portd.0
 
    Case 3:
     Set Portd.0
     Portb = Wysw1000
     Reset Portd.6
 
  End Select
 
Return
 
'****************************
 
'****************************
 
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255
'znak:    0     1     2     3     4     5     6     7     8     9     pusty
 
Tabela2:
    Data 64 , 121 , 36 , 48 , 25 , 18 , 2 , 120 , 0 , 16 , 255
'znak:    0.    1.  2.    3.   4.   5.  6.   7.   8.  9.    pusty
'*******************************************************************************
 
'*******************************************************************************

ale jeszcze chciałbym aby temperatura była wyświetlana na pierwszej drugiej i trzeciej pozycji (licząc od prawej) co muszę pozmieniać ?

Z góry dzięki :)

już wiem gdzie był błąd :) wszystko działa wyśmienicie :)

P.S.
Chciałbym się dowiedzieć jaki jest pobór prądu takiego wyświetlacza 7-segmentowego??

Portret użytkownika Smat

Czasy ?

Witam !
Chciałbym się dowiedzieć coś na temat tego fragmentu kodu:

Przerwanie0:
Timer0 = 5
Incr Co4ms
 If Co4ms = 3 Then
   Co4ms = 0
   '***************************************  co 4ms
   Set Zezw_wysw
   Incr Co100ms
   If Co100ms = 25 Then
     Co100ms = 0
     '*************************************** co 100 ms
     'ew flaga obslugi przyciskow
     Incr Co1s
     If Co1s = 7 Then
       Co1s = 0
       '*************************************** co 1s

Nie mogę się doliczyć skąd się biorą 4ms a co za tym idzie 1sekunda ?
Po obliczeniach wychodzą mi 3mili sekundy.
Bardzo proszę o wyjaśnienie.
Pozdrawiam. Stefan

Portret użytkownika mirley

Re: termometr

Pobór prądu to 8*(5V-2V)/330 [A]= 73mA, tyle co jeden wyświetlacz pojedynczy bo praca jest multipleksowana. Przerwanie policzone jest dla kwarca 12MHz, mowa tutaj o programie dla tiny2313. 12MHz, dzielone jest przez 64 i jeszcze przez 250 w timerze. W zasadzie jak teraz patrzę to powinno być Timer0 = 6 a nie 5. Daje to częstotliwość przerwań 750Hz, potem jeszcze zmienna liczy do 3 uzyskując 250Hz czyli 4ms. Reszta podziałów jest zmiennymi, do 25 liczenie daje 100ms a potem do 7 daje defakto 700ms, nazwa 1s została z wcześniejszej wersji

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Chester

Wygaszanie

Dziękuję Ci bardzo za odpowiedź :)

Mam jeszcze jedno pytanie dotyczące tego termometru. Chciałbym się doradzić jak rozwiązać problem wygaszania wyświetlacza. Ponieważ to urządzenie będzie działać na zasadzie gdy ktoś do niego podejdzie to powinno pokazać temperaturę i tutaj moje pytanie czy nie uszkodzi to w jakimś stopniu urządzenia jak nie będzie pracować ciągle tylko raz pojawi się zasilanie a po 15 minutach zniknie i tak z jakąś częstotliwością? Czy może lepiej zrobić tak że termometr non stop pracuje a jest wygaszany sam wyświetlacz??
Które rozwiązanie lepsze?

Mam nadzieję że zrozumiale to opisałem :)

Portret użytkownika mirley

Re: Termometr

Nie ma to znaczenia z punktu widzenia uszkodzenia układu, jednak pamiętaj że po włączeniu zasilania pomiar temperatury zawsze trochę trwa. Więc jak po kliknięciu chciałbyś od razu wynik uzyskać to termometr musi pracować cały czas.

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gavron04

Witam. Czy mógłbyś wstawić

Witam. Czy mógłbyś wstawić program pod Attiny2313 do wersji z termostatem?

Pozdrawiam

Portret użytkownika mirley

Re: Termometr

Przecież jest takowy w załącznikach.... innych programów nie posiadam

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gavron04

W załącznikach z programów

W załącznikach z programów jest taki > Program po kompilacji (HEX) (dla ATTiny2313, Bascom AVR) (tylko nie wiem czy jest to wersja z termostatem).

Portret użytkownika mirley

Re: Termostat

To jest wersja zwykła... ściągnij sobie kod źródłowy z termostatem, otwórz i skompiluj sam.

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Początkujący

Witam zbudowałem ten

Witam zbudowałem ten termometr i po uruchomieniu pojwiły mi się 3 kreski na wyświetlaczu.Po przestawieniu fusebitow dalej to samo a teraz źle zaznaczyłem i ustawiłem procek na 128Khz i programator mi nie widzi procesora. Programatora używam uspasp pomóżcie rozwiązać ten problem

Portret użytkownika mirley

Re: Fusy

Teraz nic nie zrobisz poza dołaczeniem tych 125kHz do procka. Jak świecą się kreski na wyświetlaczu to trzeba sprawdzić czy czujnik jest dobrze podłączony i czy nie brakuje mu rezystora zewnętrznego 4,7k

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika szamot

zmiana kodu

Witam.
Jak i gdzie trzeba zmienić kod aby wyświetlanie było na 3 wyświetlaczach i na płytkę taką ja w pierwszym projekcie, może mi to ktoś to wytłumaczyć?

*************************************
Sub Pobr_znaku(cyfra As Byte) 'pobiera znak

If Cyfra < 10 Then
Portb = Lookup(cyfra , Liczba)
Else
Portb = 127 'w przeciwnym razie wygas wyswietlacz
End If

End Sub
'*************************************

Wyswietlacz:
Load Timer0 , 125
Set Portd.0
Set Portd.1
Set Portd.2
Set Portd.3

Select Case Nr_wys
Case 3:
Call Pobr_znaku(a)
Reset Portd.3 'dziesiatki
Nr_wys = 0
Case 2:
Call Pobr_znaku(b)
Reset Portd.2 'jednosci
Nr_wys = 3
Case 1:
Portb = 28
Reset Portd.1
Nr_wys = 2
Case 0:
Portb = 70
Reset Portd.0
Nr_wys = 1
End Select

Flaga = 1
Return

Liczba:
Data 64 , 121 , 36 , 48 , 25 , 18 , 2 , 120 , 0 , 16

' znak: 0 1 2 3 4 5 6 7 8 9

Portret użytkownika mirley

Re: Termometr

Co to ma wspólnego z termometrem wyżej? Pytania nie związane z artykułami mają być an forum

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.