Termostat na Attiny2313 na "Termometr uniwersalny"


Witam!
Przeczytałem na tej stronie, że program termostatu nie zmieści się na attiny2313. Jednak po kilku próbach udało mi się to i chciałbym zaprezentować swoje wyniki pracy. Układ termometru uniwersalnego miałem już wcześniej zbudowany i postanowiłem go wykorzystać jako termostat do mojej wytrawiarki. Schemat jest taki sam jak termometru uniwersalnego z tej stronki. Wystarczy do złącza GP dołączyć przekaźnik lub układ wykonawczy z triakiem, aby sterować grzałką.
Oczywiście to nie jest mój autorski program, zmodyfikowałem tylko program Mirleya bo pomyśłałem, że może się komuś przydać.
Proszę o opinie.
Pozdrawiam!

'****************************
           '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 Mux As Byte
 
Dim Zezw_wysw As Bit
Dim Pomiar_odczyt As Bit
Dim Minus As Bit
Dim Ur As Bit
Dim L_sw As Byte
Dim P As Bit
Dim Ww As Byte
Dim Flaga_s As Bit
Dim Th As Word , Tl As Word , Tt As Word
 
Th = 290                                                    'wstępna temperatura włączenia *10, 290 oznacza 29 stopni 500 to 50 stopni
Tl = Th - 20                                                ' temperatura wyłaczenia, 20 to histereza - można zmienić na własne potrzeby
'****************************
      'Wartosci Poczatkowe
'****************************
Reset Pomiar_odczyt
Reset Ur
Wysw1 = 191
Wysw10 = 191
Wysw100 = 191
'****************************
      'Petla glowna
'****************************
Do
 
Tl = Th - 20
If Zezw_wysw = 1 Then
  Reset Zezw_wysw
 
  If Ur = 1 Then Gosub Przelicz
  Gosub Wyswietl
  End If
 
  If Flaga_s = 1 Then
  Reset Flaga_s
 
  If Tempa > Th Then
    Portd.6 = 1
  Else
    If Tempa < Tl Then Portd.6 = 0
  End If
 
End If
 
If P = 1 Then
  Wysw = Th
Else
  Wysw = Tempa
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
     'obsluga przyciskow
If Pind.4 = 0 Then
      Incr L_sw
         If L_sw = 3 Then
         L_sw = 0
         Set P
         Th = Th + 10
         Ww = 1
            If Th = 500 Then                                ' górny zakres ustawianej temperatury
            Th = 490
            End If
         End If
End If
 
If Pind.3 = 0 Then
Incr L_sw
     If L_sw = 3 Then
      L_sw = 0
      Set P
      Th = Th - 10
      Ww = 1
            If Th = 200 Then                                ' dolny zakres ustawianej temperatury
            Th = 210
            End If
       End If
 
End If
 
Incr Ww
If Ww = 50 Then                                             'czas wyświetlania ustawionej temperatury (50 x 10ms = 5s)
Ww = 0
Reset P
End If
 
     Incr Co1s
     If Co1s = 7 Then
       Co1s = 0
       '*************************************** co 1s
       Set Flaga_s
       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
          Tempa = Tempa / 16
 
          If Ur = 0 Then Ur = 1
 
        Else
          Tempa = 10000
        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 wiodącego
 
   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
 
  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
 
'****************************
 
'****************************
 
 
'*******************************************************************************
                           '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 kaban

temperatura

Th = 290                                                    'wstępna temperatura włączenia *10, 290 oznacza 29 stopni 500 to 50 stopni
Tl = Th - 20                                                ' temperatura wyłaczenia, 20 to histereza - można zmienić na własne potrzeby

Czyli temperatura musi być tam wpisana na stałe? Czy można ją ręcznie ustawiać na tych przyciskach?
Bo sam właśnie zbierałem się z wykonaniem tego termometru w roli termostatu, więc muszę dopytać :)
Pozdrawiam.

Portret użytkownika Konrad

re: temperatura

Ta temperatura 29*C którą wskazałeś to ustawienie wstępne, gdy włączamy układ do zasilania. Można ją ustawiać dwoma przyciskami
+ i - co jeden stopień (domyślnie) (oczywiście to można zmienić na np. co 0,1 stopień w kodzie programu). Obecnie jest ustawiony zakres od 21 do 49 stopni (to też oczywiście da się zmodyfikować). Robiłem ten termostat do sterowania grzałką wytrawiarki stąd takie temperatury.
Dzięki za zainteresowanie :)

Portret użytkownika kaban

re:temperatura

Aha, już rozumiem. Dzięki za odpowiedź. :)
I wszystko po przeróbkach dla 2313 działa prawidłowo?
Jeszcze mam pytanie gdzie kupiłeś taki wyświetlacz potrójny jak w projekcie, jeśli takiego używasz? W sklepach takiego dostać nie mogę. Na avt.pl tylko taki jest, ale tam jego koszt to 3zł, a przesyłka 15 więc się niezbyt mi kalkuluje ;)
Ew. czy jest możliwość użycia jakiegoś innego wyświetlacza?

Portret użytkownika drowning_man

odp

Jesli chodzi o wyświetlacz to proponuje przejść się na złomowisko i poszukać starego sprzetu RTV. Jest tam sporo wyświetlaczy (wiem z doświadczenia:-) ), a często można się natknąć na niezłe perełki elektroniczne:-).

Portret użytkownika kaban

wyswietlacz

mam w domu jakieś stare dekodery od satelity, muszę sprawdzić jakie tam będą wyświetlacze

Portret użytkownika mirley

Re: Termostat

Extra uwaga.... obsługa przycisków nie powinna być w przerwaniu..... powinieneś dac w tym miejscu flagę bitową i sprawdzać ją w pętli głównej czy została ustawiona. Podobnie jak to ma miejsce z flagą 4ms do wyświetlania.

W oryginalnym kodzie w przerwaniu mam zaznaczone gdzie ma być flaga obsługi przycisków a nie cała obsługa.

Program jest prosty więc dlatego działa, jak będziesz chciał potem napisać coś więcej to się wszystko wysypie

-

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 Konrad

wyświetlacz

Co do wyświetlacza do zobacz na allegro u tego użytkownika. Ma dużo wyświetlaczy więc coś napewno znajdziesz. Zamawiałem u niego i wszystko jest ok.
http://allegro.pl/listing.php/search?category=67282&string=art&order=p&change_view=1

Obsługa przycisków rzeczywiście jest w przerwaniu. Zaczynam projektowanie i dlatego popełniam błędy. Ale dziękuje za wskazłwki. Program jest prosty jednak na jego rozbudowe na Attiny2313 raczej nie ma szans by w tej postaci zajmuje 99% pamięci.

Portret użytkownika gosc

mruganie wyswietlacza

co może powodować mruganie delikatne wyswietlacza co ok 0,5s?
i jeszcze mam pytanie co do działania termostatu - na razie na wyjściu diodę podłączyłem, ale coś działa to na odwrót - ma grzać - nie świeci, a jak grzać nie ma (bo temp zadana została osiągnięta) to dioda się zapala
no i jeszcze mam problem ze zmianą histerezy - ten program tu wrzucony wgram jest ok, zmienię z 2 na 1 stopien to programu juz wgrac nie idzie - wysypuje się przy weryfikacji

Portret użytkownika gosc

No też widzę , że jest

No też widzę , że jest odwrotnie. 5V na GP pojawia się kiedy temperatura przekroczy zadaną, natomiast zanika kiedy temperatura spadnie poniżej zadanej. Czemu tak jest?

Portret użytkownika mirley

Re: Termostat

sterowanie jest stanem niskim, stan aktywny to zwarcie do masy, a nieaktywny to +5V, stąd takie działanie. Histerezę 1 stopień ustawiasz w tej linijce:

Tl = Th - 20   'tu ma być 10 a nie 20 żeby zrobić 1 stopień

-

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 gosc

temperatura 0.0

zrobiłem płytkę, zaprogramowałem procka, ale tempratura na wyświetlaczu to cały czas 0.0
nie wiem dlaczego...
Nie mam rezonatora kwarcowego, korzystam z wbudowanego zegara 8 mhz, czy to może być przyczyną ?

Portret użytkownika gosc

Quote:zrobiłem płytkę,

Quote:
zrobiłem płytkę, zaprogramowałem procka, ale tempratura na wyświetlaczu to cały czas 0.0
nie wiem dlaczego...
Nie mam rezonatora kwarcowego, korzystam z wbudowanego zegara 8 mhz, czy to może być przyczyną ?

dołożyłem kwarc, ustawilem fuse bity, to samo...

Portret użytkownika gosc

Quote:Quote:zrobiłem

Quote:
Quote:zrobiłem płytkę,

Quote:
zrobiłem płytkę, zaprogramowałem procka, ale tempratura na wyświetlaczu to cały czas 0.0
nie wiem dlaczego...
Nie mam rezonatora kwarcowego, korzystam z wbudowanego zegara 8 mhz, czy to może być przyczyną ?

dołożyłem kwarc, ustawilem fuse bity, to samo...

Działa, sprawe załatwił opornik 4,7 kom pomiędzy zasilaniem a drugą nogą ds.

Portret użytkownika gosc

Termostat gotowy :)

http://zapodaj.net/72df2eacac355.jpg.html

DZIEKUJĘ ZA UDOSTĘPNIENIE WSADU :)
Zastanawiam się jeszcze czy da się zrobić regulowaną histerezę w zakresie 0.5 - 2.0 stopni celsjusza ze skokiem co 0.5 stopnia, np wciskając oba przyciski na raz ...

Portret użytkownika mirley

Re: Termostat

Da się zrobić regulowaną histerezę. Wystarczy dodac parametr H, który będzie histerezą/2 a regulator będzie działał między Tust-H a Tust+H. Nie potrzeba wykrywać dwóch przycisków na raz. Wystarczy dodać zmienną Poz_menu która przyjmie wartości 0-wyświetlanie temp, 1 -ustaw temp i 2-ustaw H. Nie potrzena stanie się zmienna P bo zamiast niej jest teraz Poz_menu. Wyświetlanie musi wpisywać d Wysw jedną z trzech wartości zależnie od Poz_menu. W obsłudze każdego z przycisków trzea zrobić case rozróżniajacy wartość Poz_menu. Jeśli Poz_menu = 0 to kliknięcie przycisku + przechodzi do ustaweń temperatury a - do ustawień histerezy. Od tego momentu + i - działają normalnie.

Wyjście z menu można zrobić czasowe jak np 3 sek nic się nie klika to jeśli poz_menu <> 0 to poz_menu = 0

Obliczanie progów temperatury włączenia i wyłączenia nie możesz robić teraz na początku ale w pętli tam gdzie porównujesz temperatury.

Ps. Obrazka nie ma bo go zamieściłeś na jakimś dziwnym serwisie i nie masz liku bezpośredniego do obrazka tylko html. Znacznik img wczytuje tylko obrazki, a nie html. Pisanie 3 postów jeden pod drugim w niczym nie przyspieszy twojej odpowiedzi, a wręcz przeciwnie. Po pierwsze muszę skasować daremne posty ze strony, a po drugie odpowiadam zawsze w kolejności od najstarszych wpisów, więc napisanie czegoś w stylu "jest tam kto?" sprawia że strona automatycznie przenosi twoje pytanie na koniec kolejki

-

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 Noel

Bład na płytce i schemacie ?

Nie wiem ale coś m i tu nie gra ;-)

Na płytce i na schemacie jest pokazane że dioda LED jedną nogą idzie do nóżki '11' procka a druga do minus '-'
natomiast w wypowiedzi tutaj "
==========================================
cytuje
Re: termometr

Należy zastosować dowolną diodę LED z szeregowym rezystorem 330R-510R... katoda idzie do złącza GP1(ten pin co trafia do procka) a anoda idzie do +5V

============================================

i jak tak podłączę to dioda zaświeca sie przy temp. ujemnej

???