Sterownik Pompy Kolektora Słonecznego


9
Ocena: None Średnia: 9 (1 głosujący)

Układ został zbudowany w celu automatycznego uruchamiania pompy gdy temperatura na kolektorze słonecznym osiągnie ustawiony poziom. Urządzenie to jest prostym sterownikiem, nie posiada funkcji sprawdzania temperatury w zbiorniku. Całość jest zbudowana w oparciu o mikrokontroler AT89C2051 i kilka elementów pomocniczych. W roli czujnika temperatury wykorzystano popularny DS18S20 przez co pomiar jest dokładny a program dla procesora nie jest skomplikowany. Dodanie drugiego czujnika nie stanowi problemu gdyż pracują one na magistrali 1-Wire ale konieczna jest modyfikacja programu.



Działanie:


Schemat Sterownika przedstawia poniższy rysunek:

Głównym elementem sterownika jest mikrokontroler U1 (AT89C2051) oraz kondensatory C3 (33pF) i C4 (33pF) wraz z rezonatorem kwarcowym X1 (12MHz). Elementy Br1, stabilizator U2 (7805) oraz kondensatory C1 (1000uF) i C2 (47uF) tworzą zasilacz dostarczający napięcia dla całego układu. Kondensator C5 (4,7uF) pracuje w obwodzie resetu mikrokontrolera i zapewnia jego poprawną pracę po włączeniu zasilania. Rezystory R1 - R8 (220R) ograniczają prąd wyświetlaczy LED. Złącze SW (goldpin) służy do podłączenia dwu przyciskowej klawiatury, natomiast 1W jest złączem czujnika DS18S20. Tranzystory T1 - T3 (BC557) wraz z rezystorami R12 (2,7k), R13 (2,7k) i R14 (2,7k) oraz R15 (3,3k), R16 (3,3k) i R17 (3,3k) sterują pracą anod wyświetlaczy i diodami sygnalizacyjnymi. Elementy R9 (470R), R11 (220R) oraz optotriak OPT (MOC3042) i triak T (TIC226) stanowią prosty układ wykonawczy uruchamiający pompę.

Na rysunku poniżej znajduje się schemat wyświetlacza:

Budowa:


Sterownik można zmontować w oparciu o płytkę drukowaną dostępną tutaj. Rysunek płytki w odbiciu lustrzanym można ściągnąć tutaj. Montaż płytki jest bardzo łatwy, należy go rozpocząć od wlutowania jednej zworki. Kolejność pozostałych elementów nie ma znaczenia. Pod mikrokontroler należy bezwzględnie zastosować podstawkę, gdyż w przeciwnym wypadku niemożliwe będzie jego zaprogramowanie. W miejsce złącz GP1 i COM, zapewniających kontakt sterownika z wyświetlaczem można zastosować kawałek przewodu wstążkowego wlutowanego bezpośrednio w obie płytki. Pomocą przy konstrukcji może okazać się dostępny tutaj schemat montażowy.

Płytkę wyświetlacza można wykonać w oparciu o rysunek dostępny tutaj. Rysunek płytki w odbiciu lustrzanym można ściągnąć tutaj. Montaż wyświetlacza należy rozpocząć od wlutowaniu wszystkich zworek. Pod wyświetlacz dobrze jest zastosować połowę podstawki DIP40. Diody LED należy umiejscowić trochę wyżej niż wyświetlacz, aby wystawały nieco z płyty czołowej obudowy. Pomocą przy budowie może okazać się schemat montażowy dostępny tutaj.

Wykaz Elementów:

Sterownik:


2x Złącze ARK2
3x Listwa Goldpin 1x3
1x Listwa Goldpin 1x8

9x 220R
1x 470R
3x 2,7k
3x 3,3k

2x 33pF
1x 4,7uF Elektrolit
1x 47uF Elektrolit
1x 1000uF Elektrolit

1x Rezonator Kwarcowy 12MHz
1x Mostek Prostowniczy 1A
3x BC557B
1x 7805
1x AT89C2051 + Podstawka
1x MOC3042
1x TIC226

Wyświetlacz:


1x Listwa Gold Pin 1x3
1x Listwa Gold Pin 1x8

1x Wyświetlacz podwójny 7 segmentowy
2x Dioda LED

Programowanie:


Mikrokontroler do sterownika został zaprogramowany w wersji demo programu BASCOM 8051 firmy MCS Electronics (http://www.mcselec.com/). Program przedstawiony jest poniżej:

$large
 
Config Timer0 = Timer , Gate = Internal , Mode = 2            'okres Timera0 250*12*Tosc=250us
Load Timer0 , 250
On Timer0 Przerwanie
Enable Interrupts
Enable Timer0
Start Timer0
 
Config 1wire = P3.2
 
'*******************************************************************************
                                  'Zmienne
'*******************************************************************************
Dim Lsb As Byte
Dim Msb As Byte
Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
Dim Wysw As Byte , Wysw1 As Byte , Wysw10 As Byte
Dim Tempa As Byte , Tempu As Byte , Hister As Byte , Tempw As Byte
Dim Mux As Byte
Dim Liczmig As Byte , Liczmig2 As Byte
Dim Autopowrot As Byte
Dim Ustawianie As Byte
Dim Przycisk1 As Byte , Przycisk2 As Byte , Przycisk3 As Byte
 
Dim Zezw_przyc As Bit , Zezw_wysw As Bit , Zezw_uruch As Bit
Dim Praca_automat As Bit , Stan_reczny As Bit
Dim Mig As Bit , Mig2 As Bit
Dim Pompa As Bit
Dim Pomiar_odczyt As Bit
 
'*******************************************************************************
                                  'wartosci
'*******************************************************************************
Ustawianie = 0
Tempu = 40
Hister = 4
Set Praca_automat
Set Stan_reczny
Reset Pomiar_odczyt
Set Pompa
'*******************************************************************************
                                  'Petla glowna
'*******************************************************************************
Do
 
If Zezw_wysw = 1 Then                                         'wyswietlanie
  Reset Zezw_wysw
  '*****************************************      'co 4ms
  Incr Mux
  If Mux = 3 Then Mux = 0
 
  Select Case Ustawianie
   Case 0:                                                    'temp akt
    Wysw = Tempa
   Case 1:                                                    'Temp ustawiona
    If Mig2 = 1 Then Wysw = Tempu Else Wysw = 253
   Case 2:                                                    'przedzial
    If Mig2 = 1 Then Wysw = Hister Else Wysw = 253
   Case 3:
    If Praca_automat = 1 Then Wysw = 251 Else Wysw = 252
  End Select
 
  Gosub Przelicz
 
  Select Case Mux
    Case 0:
     Set P3.3
     P1 = Wysw10
     Reset P3.5
    Case 1:
     Set P3.5
     P1 = Wysw1
     Reset P3.4
    Case 2:
     Set P3.4
     Select Case Ustawianie
      Case 0:
       P1 = 255
       If Mig = 1 Then P1.6 = P3.7 Else P1.6 = 1
       P1.7 = Praca_automat
      Case 1:
       P1 = &B01111111
      Case 2:
       P1 = &B10111111
      Case 3:
       P1 = 255
     End Select
     Reset P3.3
  End Select
  '*****************************************
End If
 
If Zezw_przyc = 1 Then
  Reset Zezw_przyc
  '*****************************************   co100ms
  Incr Liczmig
  If Liczmig = 5 Then
    Liczmig = 0
    Mig = Not Mig                                             '2Hz miganie
  End If
 
  Incr Liczmig2
  If Liczmig2 = 2 Then
    Liczmig2 = 0
    Mig2 = Not Mig2                                           '5Hz miganie
  End If
 
  If Ustawianie <> 0 Then
   Incr Autopowrot
   If Autopowrot = 100 Then                                   ' po 10s wracaj do pokazywania temperatury
     Autopowrot = 0
     Ustawianie = 0
   End If
  End If
 
  'przyciski
 
  P3.0 = 1
  P3.1 = 1
 
  If P3.0 = 0 And P3.1 = 1 Then                               'tylko minus wcisniety
   Incr Przycisk1
   If Przycisk1 = 5 Then
    Przycisk1 = 0
    Autopowrot = 0
    '***********************
    Select Case Ustawianie
       Case 0:
        If Praca_automat = 0 Then Set Stan_reczny             'gdy tryb reczny wylacz pompe
       Case 1:
        If Tempu > 20 Then Decr Tempu                         'zmniejsz ustawiona temp
       Case 2:
        If Hister > 0 Then Decr Hister                        'zmniejsz przedzial temp
       Case 3:
        Reset Praca_automat                                   'zalacze prace reczna i wyl pompe
        Set Stan_reczny
     End Select
    '***********************
   End If
  Else
   Przycisk1 = 0
  End If
 
  If P3.1 = 0 And P3.0 = 1 Then                               'tylko plus wcisniety
   Incr Przycisk2
   If Przycisk2 = 5 Then
    Przycisk2 = 0
    Autopowrot = 0
    '***********************
    Select Case Ustawianie
       Case 0:
        If Praca_automat = 0 Then Reset Stan_reczny           'gdy tryb reczny wlacz pompe
       Case 1:
        If Tempu < 90 Then Incr Tempu                         'zwieksz ustawiona temp
       Case 2:
        If Hister < 20 Then Incr Hister                       'zwieksza przedzial temp
       Case 3:
        Set Praca_automat                                     'zalacza prace automatyczna i wyl pompe
        Set Stan_reczny
     End Select
    '***********************
   End If
  Else
   Przycisk2 = 0
  End If
 
  If P3.1 = 0 And P3.0 = 0 Then                               'wcisniety plus i minus
   Incr Przycisk3
   If Przycisk3 = 8 Then
    Przycisk3 = 0
    Autopowrot = 0
    '***********************
    Incr Ustawianie
    If Ustawianie = 4 Then Ustawianie = 0
    '***********************
   End If
  Else
   Przycisk3 = 0
  End If
 
  '*****************************************
End If
 
If Zezw_uruch = 1 Then
  Reset Zezw_uruch
  '*****************************************  co 1s
  If Tempa < 100 Then
    Tempw = Tempu - Hister
 
    If Tempa >= Tempu Then Reset Pompa
 
    If Tempa < Tempw Then Set Pompa
 
  Else
   Set Pompa
  End If
 
  If Praca_automat = 0 Then Pompa = Stan_reczny
 
  If P3.7 <> Pompa Then P3.7 = Pompa
  '*****************************************
End If
 
Loop
End
'*******************************************************************************
                                  'Przerwanie Timera
'*******************************************************************************
Przerwanie:                                                   'co 250us
 Incr Co4ms
 If Co4ms = 16 Then
   Co4ms = 0
   '***************************************  co 4ms
   Set Zezw_wysw
   Incr Co100ms
   If Co100ms = 25 Then
     Co100ms = 0
     '*************************************** co 100 ms
     Set Zezw_przyc
     Incr Co1s
     If Co1s = 10 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():
 
          If Msb = 0 Then
            Tempa = Lsb / 2                                   'dokladnosc 1 stopien
          Else
            Tempa = 254                                       'LA wyswietli low alert
          End If
 
        Else
          Tempa = 255                                         'Er wyswietli wyswietlacz potem
        End If
       End If
 
       Set Zezw_uruch
       Enable Interrupts
       '***************************************
     End If
     '***************************************
   End If
   '***************************************
 End If
Return
'*******************************************************************************
'procedura przeliczajaca zmienna wysw na dwie zmienne odpowiadajace wyswietlaniu na dwoch wyswietlaczach
'*******************************************************************************
Przelicz:
 If Wysw < 100 Then
   Wysw1 = Wysw Mod 10
   Wysw1 = Lookup(wysw1 , Tabela)
   If Wysw > 9 Then
     Wysw10 = Wysw / 10
     Wysw10 = Lookup(wysw10 , Tabela)
   Else
     Wysw10 = 255                                             ' znika 0 na pierwszym miejscu
   End If
 Else
   If Wysw < 251 Then
     Wysw1 = 136                                              'A
     Wysw10 = 137                                             'H
   End If
 
   If Wysw = 251 Then
     Wysw1 = 136                                              'A
     Wysw10 = 140                                             'P
   End If
 
   If Wysw = 252 Then
     Wysw1 = 175                                              'r
     Wysw10 = 140                                             'P
   End If
 
   If Wysw = 253 Then
     Wysw1 = 255                                              'nic    potrzebne do migania
     Wysw10 = 255                                             'nic
   End If
 
   If Wysw = 254 Then
     Wysw1 = 136                                              'A
     Wysw10 = 199                                             'L
   End If
 
   If Wysw = 255 Then
     Wysw1 = 175                                              'r
     Wysw10 = 134                                             'E
   End If
 End If
 
Return
'*******************************************************************************
                           'Tabela do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144
'znak:    0     1     2     3     4     5     6     7     8     9
'*******************************************************************************

Zdjęcia Projektu:

ZałącznikWielkość
Sterownik Schemat60.05 KB
Sterownik Płytka13.42 KB
Sterownik Płytka (odbicie lustrzane)13.4 KB
Sterownik Płytka (6 na stronie)67.21 KB
Sterownik Montowanie18.63 KB
Wyświetlacz Schemat26.68 KB
Wyświetlacz Płytka7.36 KB
Wyświetlacz Płytka (odbicie lustrzane)7.47 KB
Wyświetlacz Płytka (6 na stronie)40.26 KB
Wyświetlacz Montowanie8.46 KB
Płyta Czołowa38.83 KB
Kod źródłowy10.25 KB
Program po kompilacji (BIN)1.52 KB
Program po kompilacji (HEX)4.32 KB



Portret użytkownika ziko63

ATMEL

Witaj.
Pewnie że można poszukaj na necie opisu wyprowadzeń np, dla 2313 przypisz mu odpowiednie wyprowadzenia portów zmień ustawienia $regfile.Myślę że Mirley się odezwie to jego copyright.
Pozdrawiam.

ziko.

Portret użytkownika mirley

Re: sterownik kolektora

W programie trzeba zrobić zmiany, tak poprostu to nie zadziała. Konfiguracja timera jest całkiem inna, trzeba dopisać konfigurację na początku i zmienić nazwy pinów. Szczerze mówiąc zastosował bym układ minitermometru uniwersalnego, który jest na tiny i ma program do termostatu. Nie ma co prawda ustawień temperatury ale można to ustawić na sztywno a napewno będzie działać lepiej

-

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 kaka0204

program

Witam.
Czy mógłby pan mi pomóc albo sam przemienić ten kod, jeśli chodzi o procki ta ja jestem dopiero na etapie diod, więc wiele nie zdziałam.
Pozdrawiam.

Portret użytkownika mirley

Re: Sterownik pompy

Co ma robić program, którego potrzebujesz? do czego go potrzebujesz?

-

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 kaka0204

nie proszę o to abyś zrobił

nie proszę o to abyś zrobił cały proszę o to abyś zmodyfikował lub pomógł mi zmodyfikować istniejący a potrzebuję go do pompy CO.
Pozdrawiam.

Portret użytkownika kaka0204

program

Nie proszę o to abyś napisał nowy kod tylko zmienił lub pomógł mi zmienić istniejący.
Pozdrawiam.

Portret użytkownika mirley

Re: Sterownik do CO

Jak potrzebujesz sterownika do CO, tylko do sterowania pompy to jak najbardziej minitermometr uniwersalny to to co Cię interesuje. Wystarczy do programu z termoststem trochę dopisać.... następne pytania pisz pod projektem minitermometr bo będą jego dotyczyć.

------------

Patrzyłem na kod mojego termostatu o którym mówiłem.... nie musisz nawet nic zmieniać poza ustawieniem na początku programu temperatury domyślnej na np 40 stopni (Tu=400) potem układ będzie włączał pompkę jak zostanie przekroczona temperatura 41 a wyłaczy jak spadnie do 39

-

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 kaka0204

program

dobrze ale czy w tym sterowniku temperaturę załączania i wyłączania ustawia się w programie czy już jak się zrobi sterownik?

Portret użytkownika mirley

Re: temperatura

Temperaturę startową ustawia się w programie, tą jaka ma się ustawić po włączeniu zasilania. Potem możesz przestawić przyciskami i zostanie ona taka do wyłączenia zasilania. Zapisu do pamięci nieulotnej za bardzo nie da sie zrobic bo chyba braknie miejsca w programie. Można jednak sprawdzić

-

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 Adam

jak zamontowałeś czujnik

Witam, jak zamontowałeś czujnik temperatury do solara? Włożyłeś go do obudowy od solara , nałożyłeś na rurę która do niego dochodzi czy jeszcze inaczej?

Portret użytkownika mirley

Re: Solar

Przytaśmowałem czujnik do rurki, miedzianej blisko wyjścia z kolektora. Lepszym rozwiązaniem jest wstawic czujnik do specjalnej obudowy wkręcanej w kolanko zaraz przy solarze. Są takie specjalne obudowy na czujnik dzięki czemu płyn bezpośrednio opływa czujnik, czy tez jego obudowę

-

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 gość

Program

Witam.
Czy znalazłby kolega czas, aby napisać kod pod attiny2313? Taki sterownik baaaardzo się przyda, a takie ze sklepu są dużo droższe w porównaniu z tym.
Pozdrawiam.

Portret użytkownika ziko63

Kod atiny2313

Witam czy masz jakieś doświadczenie w programowaniu "Atmeli"np. Atmega 8,16,32 i czy sprawdzałeś datasheet układu 2313 i porównałeś go z innymi atmelami?

Pozdrawiam ziko63.

Portret użytkownika colin578

AT89S2051

Witam, czy gdybym użył układ AT89S2051 i zaprogramował USBasp to trzeba coś przerabiać w programie lub płytce?

Portret użytkownika EDC

odp. AT89S2051

To chyba odpowiednik tyle że ma dodatkowo ISP. Hex pasuje na pewno. Dopiero w AVRach reset jest na odwrót i porty by trzeba było przepisać i ustawić.

-

BARTek
Moja strona

Portret użytkownika colin578

Dzięki wielkie ;) Żeby go

Dzięki wielkie ;) Żeby go zaprogramować trzeba Bascoma '51 ?

Portret użytkownika EDC

Wsad do procesora

Wsady, już skompilowane masz przecież pod projektem w postaci Hex i Bin do wyboru. To ładujesz prosto do programatora..no już nie rób się taką nogą :)

-

BARTek
Moja strona

Portret użytkownika radom20

Weryfikacja kodu pod attiny2313

Pomógłby ktoś zweryfikować przerobiony przeze mnie kod pod attiny 2313?
Jestem początkujący i bardzo prosiłbym o pomoc przy przerobieniu kodu

$regfile = "attiny2313.dat"
$crystal = 12000000
$large
 
Config Timer0 = Timer , Gate = Internal , Mode = 2          'okres Timera0 250*12*Tosc=250us
Load Timer0 , 250
On Timer0 Przerwanie
Enable Interrupts
Enable Timer0
Start Timer0
 
Config 1wire = Pd2
 
'*******************************************************************************
                                  'Zmienne
'*******************************************************************************
Dim Lsb As Byte
Dim Msb As Byte
Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
Dim Wysw As Byte , Wysw1 As Byte , Wysw10 As Byte
Dim Tempa As Byte , Tempu As Byte , Hister As Byte , Tempw As Byte
Dim Mux As Byte
Dim Liczmig As Byte , Liczmig2 As Byte
Dim Autopowrot As Byte
Dim Ustawianie As Byte
Dim Przycisk1 As Byte , Przycisk2 As Byte , Przycisk3 As Byte
 
Dim Zezw_przyc As Bit , Zezw_wysw As Bit , Zezw_uruch As Bit
Dim Praca_automat As Bit , Stan_reczny As Bit
Dim Mig As Bit , Mig2 As Bit
Dim Pompa As Bit
Dim Pomiar_odczyt As Bit
 
'*******************************************************************************
                                  'wartosci
'*******************************************************************************
Ustawianie = 0
Tempu = 40
Hister = 4
Set Praca_automat
Set Stan_reczny
Reset Pomiar_odczyt
Set Pompa
'*******************************************************************************
                                  'Petla glowna
'*******************************************************************************
Do
 
If Zezw_wysw = 1 Then                                       'wyswietlanie
  Reset Zezw_wysw
  '*****************************************      'co 4ms
  Incr Mux
  If Mux = 3 Then Mux = 0
 
  Select Case Ustawianie
   Case 0:                                                  'temp akt
    Wysw = Tempa
   Case 1:                                                  'Temp ustawiona
    If Mig2 = 1 Then Wysw = Tempu Else Wysw = 253
   Case 2:                                                  'przedzial
    If Mig2 = 1 Then Wysw = Hister Else Wysw = 253
   Case 3:
    If Praca_automat = 1 Then Wysw = 251 Else Wysw = 252
  End Select
 
  Gosub Przelicz
 
  Select Case Mux
    Case 0:
     Set Pd3
     P1 = Wysw10
     Reset Pd5
    Case 1:
     Set Pd5
     P1 = Wysw1
     Reset Pd4
    Case 2:
     Set Pd4
     Select Case Ustawianie
      Case 0:
       P1 = 255
       If Mig = 1 Then Pb6 = Pd6 Else Pb6 = 1
       Pb7 = Praca_automat
      Case 1:
       P1 = &B01111111
      Case 2:
       P1 = &B10111111
      Case 3:
       P1 = 255
     End Select
     Reset Pd3
  End Select
  '*****************************************
End If
 
 
 
 
If Zezw_przyc = 1 Then
  Reset Zezw_przyc
  '*****************************************   co100ms
  Incr Liczmig
  If Liczmig = 5 Then
    Liczmig = 0
    Mig = Not Mig                                           '2Hz miganie
  End If
 
  Incr Liczmig2
  If Liczmig2 = 2 Then
    Liczmig2 = 0
    Mig2 = Not Mig2                                         '5Hz miganie
  End If
 
  If Ustawianie <> 0 Then
   Incr Autopowrot
   If Autopowrot = 100 Then                                 ' po 10s wracaj do pokazywania temperatury
     Autopowrot = 0
     Ustawianie = 0
   End If
  End If
 
 
 
  'przyciski
 
  Pd0 = 1
  Pd1 = 1
 
  If Pd0 = 0 And Pd1 = 1 Then                               'tylko minus wcisniety
   Incr Przycisk1
   If Przycisk1 = 5 Then
    Przycisk1 = 0
    Autopowrot = 0
    '***********************
    Select Case Ustawianie
       Case 0:
        If Praca_automat = 0 Then Set Stan_reczny           'gdy tryb reczny wylacz pompe
       Case 1:
        If Tempu > 20 Then Decr Tempu                       'zmniejsz ustawiona temp
       Case 2:
        If Hister > 0 Then Decr Hister                      'zmniejsz przedzial temp
       Case 3:
        Reset Praca_automat                                 'zalacze prace reczna i wyl pompe
        Set Stan_reczny
     End Select
    '***********************
   End If
  Else
   Przycisk1 = 0
  End If
 
 
  If Pd1 = 0 And Pd0 = 1 Then                               'tylko plus wcisniety
   Incr Przycisk2
   If Przycisk2 = 5 Then
    Przycisk2 = 0
    Autopowrot = 0
    '***********************
    Select Case Ustawianie
       Case 0:
        If Praca_automat = 0 Then Reset Stan_reczny         'gdy tryb reczny wlacz pompe
       Case 1:
        If Tempu < 90 Then Incr Tempu                       'zwieksz ustawiona temp
       Case 2:
        If Hister < 20 Then Incr Hister                     'zwieksza przedzial temp
       Case 3:
        Set Praca_automat                                   'zalacza prace automatyczna i wyl pompe
        Set Stan_reczny
     End Select
    '***********************
   End If
  Else
   Przycisk2 = 0
  End If
 
 
  If Pd1 = 0 And Pd0 = 0 Then                               'wcisniety plus i minus
   Incr Przycisk3
   If Przycisk3 = 8 Then
    Przycisk3 = 0
    Autopowrot = 0
    '***********************
    Incr Ustawianie
    If Ustawianie = 4 Then Ustawianie = 0
    '***********************
   End If
  Else
   Przycisk3 = 0
  End If
 
  '*****************************************
End If
 
 
 
If Zezw_uruch = 1 Then
  Reset Zezw_uruch
  '*****************************************  co 1s
  If Tempa < 100 Then
    Tempw = Tempu - Hister
 
    If Tempa >= Tempu Then Reset Pompa
 
    If Tempa < Tempw Then Set Pompa
 
  Else
   Set Pompa
  End If
 
  If Praca_automat = 0 Then Pompa = Stan_reczny
 
  If Pd6 <> Pompa Then Pd6 = Pompa
  '*****************************************
End If
 
Loop
End
'*******************************************************************************
                                  'Przerwanie Timera
'*******************************************************************************
Przerwanie:                                                 'co 250us
 Incr Co4ms
 If Co4ms = 16 Then
   Co4ms = 0
   '***************************************  co 4ms
   Set Zezw_wysw
   Incr Co100ms
   If Co100ms = 25 Then
     Co100ms = 0
     '*************************************** co 100 ms
     Set Zezw_przyc
     Incr Co1s
     If Co1s = 10 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():
 
          If Msb = 0 Then
            Tempa = Lsb / 2                                 'dokladnosc 1 stopien
          Else
            Tempa = 254                                     'LA wyswietli low alert
          End If
 
        Else
          Tempa = 255                                       'Er wyswietli wyswietlacz potem
        End If
       End If
 
       Set Zezw_uruch
 
       Enable Interrupts
 
 
 
       '(
       Disable Interrupts
       1wreset
 
       If Err = 0 Then
 
        1wwrite &HCC
        1wwrite &HBE
        Lsb = 1wread():
        Msb = 1wread():
        1wreset
 
        1wwrite &HCC
        1wwrite &H44
 
        If Msb = 0 Then
         Tempa = Lsb / 2
         Set Zezw_uruch                                       'dokladnosc 1 stopien
        Else
         Tempa = 254                                          'LA wyswietli low alert
        End If
 
       Else
        Tempa = 255                                           'Er wyswietli wyswietlacz potem
       End If
 
       Enable Interrupts
')
       '***************************************
     End If
     '***************************************
   End If
   '***************************************
 End If
Return
'*******************************************************************************
'procedura przeliczajaca zmienna wysw na dwie zmienne odpowiadajace wyswietlaniu na dwoch wyswietlaczach
'wartosci zmiennej wysp:
'(
                        0 - 99 Wyswitla Liczby
                        100 -250 Wyswietla Ha
                         251 Pa
                         252 Pr
                         253 Nic Nie Wyswietla
                         254 La
                         255 Er
')
'*******************************************************************************
Przelicz:
 If Wysw < 100 Then
   Wysw1 = Wysw Mod 10
   Wysw1 = Lookup(wysw1 , Tabela)
   If Wysw > 9 Then
     Wysw10 = Wysw / 10
     Wysw10 = Lookup(wysw10 , Tabela)
   Else
     Wysw10 = 255                                           ' znika 0 na pierwszym miejscu
   End If
 Else
   If Wysw < 251 Then
     Wysw1 = 136                                            'A
     Wysw10 = 137                                           'H
   End If
 
   If Wysw = 251 Then
     Wysw1 = 136                                            'A
     Wysw10 = 140                                           'P
   End If
 
   If Wysw = 252 Then
     Wysw1 = 175                                            'r
     Wysw10 = 140                                           'P
   End If
 
   If Wysw = 253 Then
     Wysw1 = 255                                            'nic    potrzebne do migania
     Wysw10 = 255                                           'nic
   End If
 
   If Wysw = 254 Then
     Wysw1 = 136                                            'A
     Wysw10 = 199                                           'L
   End If
 
   If Wysw = 255 Then
     Wysw1 = 175                                            'r
     Wysw10 = 134                                           'E
   End If
 End If
 
Return
 
'*******************************************************************************
                           'Tabela do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144
'znak:    0     1     2     3     4     5     6     7     8     9
'*******************************************************************************
 
'*******************************************************************************

Portret użytkownika EDC

Odp. Sterownik Pompy Kolektora - kod dla Attiny2313

Proszę. Przetestuj bo ja nie testowałem.
Kod po poprawnym nazwaniu portów i poprawnym skonfigurowaniu Timera zajmował 108% i nie zmieściłby się w mikrokontrolerze. Pomogło użycie Bajtów zamiast Bitów i poprzenoszenie niektórych elementów.
Trochę się nagimnastykowałem :D

$regfile = "attiny2313.dat"
$crystal = 12000000
$hwstack = 32
$swstack = 8
$framesize = 16
 
'*** Timer0 Config for 10ms Interrupt CTC Mode ***
Config Timer0 = Timer , Prescale = 256 , Compare A = Disconnect , Compare B = Disconnect , Clear Timer = 1
Enable Compare0a : On Compare0a Przerwanie : Compare0a = 186       '4ms @12MHz
 
Enable Interrupts
Config Portb = Output
Config Portd = &B11111100
 
Config 1wire = Portd.2
 
'*******************************************************************************
                                  'Zmienne
'*******************************************************************************
Dim Lsb As Byte
Dim Msb As Byte
Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
Dim Wysw As Byte , Wysw1 As Byte , Wysw10 As Byte
Dim Tempa As Byte , Tempu As Byte , Hister As Byte , Tempw As Byte
Dim Mux As Byte
Dim Liczmig As Byte , Liczmig2 As Byte
Dim Autopowrot As Byte
Dim Ustawianie As Byte
Dim Przycisk1 As Byte , Przycisk2 As Byte , Przycisk3 As Byte
 
Dim Zezw_przyc As Byte , Zezw_wysw As Byte , Zezw_uruch As Byte
Dim Praca_automat As Byte , Stan_reczny As Byte
Dim Mig As Byte , Mig2 As Byte
'Dim Pompa As Byte
Pompa Alias Portd.6
 
'Dim Pomiar_odczyt As Byte
 
'*******************************************************************************
                                  'wartosci
'*******************************************************************************
'Ustawianie = 0
Tempu = 40
Hister = 4
 Praca_automat = 1
 Stan_reczny = 1
'Reset Pomiar_odczyt
 Pompa = 1
'*******************************************************************************
                                  'Petla glowna
'*******************************************************************************
Do
 
If Zezw_wysw = 1 Then                                       'wyswietlanie
   Zezw_wysw = 0
  '*****************************************      'co 4ms
  Incr Mux
  If Mux = 3 Then Mux = 0
 
  Select Case Ustawianie
   Case 0:                                                    'temp akt
    Wysw = Tempa
   Case 1:                                                    'Temp ustawiona
    If Mig2 = 1 Then Wysw = Tempu Else Wysw = 253
   Case 2:                                                    'przedzial
    If Mig2 = 1 Then Wysw = Hister Else Wysw = 253
   Case 3:
    If Praca_automat = 1 Then Wysw = 251 Else Wysw = 252
  End Select
 
  'Gosub Przelicz
 
 If Wysw < 100 Then
   Wysw1 = Wysw Mod 10
   Wysw1 = Lookup(wysw1 , Tabela)
   If Wysw > 9 Then
     Wysw10 = Wysw / 10
     Wysw10 = Lookup(wysw10 , Tabela)
   Else
     Wysw10 = 255                                             ' znika 0 na pierwszym miejscu
   End If
 Else
   If Wysw < 251 Then
     Wysw1 = 136                                              'A
     Wysw10 = 137                                             'H
   End If
 
   If Wysw = 251 Then
     Wysw1 = 136                                              'A
     Wysw10 = 140                                             'P
   End If
 
   If Wysw = 252 Then
     Wysw1 = 175                                              'r
     Wysw10 = 140                                             'P
   End If
 
   If Wysw = 253 Then
     Wysw1 = 255                                              'nic    potrzebne do migania
     Wysw10 = 255                                             'nic
   End If
 
   If Wysw = 254 Then
     Wysw1 = 136                                              'A
     Wysw10 = 199                                             'L
   End If
 
   If Wysw = 255 Then
     Wysw1 = 175                                              'r
     Wysw10 = 134                                             'E
   End If
 End If
 
 
  Select Case Mux
    Case 0:
     Set PORTD.3
     PORTB = Wysw10
     Reset PORTD.5
    Case 1:
     Set Portd.5
     PORTB = Wysw1
     Reset PORTD.4
    Case 2:
     Set Portd.4
     Select Case Ustawianie
      Case 0:
       Portb = 255
       If Mig = 1 Then Portb.6 = Portd.6 Else Portb.6 = 1
       Portb.7 = Praca_automat
      Case 1:
       PORTB = &B01111111
      Case 2:
       PORTB = &B10111111
      Case 3:
       Portb = 255
     End Select
     Reset Portd.3
  End Select
  '*****************************************
End If
 
 
 
 
If Zezw_przyc = 1 Then
   Zezw_przyc = 0
  '*****************************************   co100ms
  Incr Liczmig
  If Liczmig = 5 Then
    Liczmig = 0
    'Mig = Not Mig                                           '2Hz miganie
    If Mig = 1 Then Mig = 0 Else Mig = 1
  End If
 
  Incr Liczmig2
  If Liczmig2 = 2 Then
    Liczmig2 = 0
    'Mig2 = Not Mig2                                         '5Hz miganie
    If Mig2 = 1 Then Mig2 = 0 Else Mig2 = 1
  End If
 
  If Ustawianie <> 0 Then
   Incr Autopowrot
   If Autopowrot = 100 Then                                 ' po 10s wracaj do pokazywania temperatury
     Autopowrot = 0
     Ustawianie = 0
   End If
  End If
 
  'przyciski
 
  Portd.0 = 1
  PORTD.1 = 1
 
  If PInd.0 = 0 And PinD.1 = 1 Then                               'tylko minus wcisniety
   Incr Przycisk1
   If Przycisk1 = 5 Then
    Przycisk1 = 0
    Autopowrot = 0
    '***********************
    Select Case Ustawianie
       Case 0:
        If Praca_automat = 0 Then Stan_reczny = 1           'gdy tryb reczny wylacz pompe
       Case 1:
        If Tempu > 20 Then Decr Tempu                       'zmniejsz ustawiona temp
       Case 2:
        If Hister > 0 Then Decr Hister                      'zmniejsz przedzial temp
       Case 3:
         Praca_automat = 0                                 'zalacze prace reczna i wyl pompe
         Stan_reczny = 0
     End Select
    '***********************
   End If
  Else
   Przycisk1 = 0
  End If
 
 
  If PinD.1 = 0 And PinD.0 = 1 Then                               'tylko plus wcisniety
   Incr Przycisk2
   If Przycisk2 = 5 Then
    Przycisk2 = 0
    Autopowrot = 0
    '***********************
    Select Case Ustawianie
       Case 0:
        If Praca_automat = 0 Then Stan_reczny = 0           'gdy tryb reczny wlacz pompe
       Case 1:
        If Tempu < 90 Then Incr Tempu                       'zwieksz ustawiona temp
       Case 2:
        If Hister < 20 Then Incr Hister                     'zwieksza przedzial temp
       Case 3:
         Praca_automat = 1                                  'zalacza prace automatyczna i wyl pompe
         Stan_reczny = 1
     End Select
    '***********************
   End If
  Else
   Przycisk2 = 0
  End If
 
 
  If Pind.1 = 0 And Pind.0 = 0 Then                         'wcisniety plus i minus
   Incr Przycisk3
   If Przycisk3 = 8 Then
    Przycisk3 = 0
    Autopowrot = 0
    '***********************
    Incr Ustawianie
    If Ustawianie = 4 Then Ustawianie = 0
    '***********************
   End If
  Else
   Przycisk3 = 0
  End If
 
  '*****************************************
End If
 
 
 
'If Zezw_uruch = 1 Then
'   Zezw_uruch = 0
'  '*****************************************  co 1s
 
 
'  '*****************************************
'End If
 
Loop
End
'*******************************************************************************
                                  'Przerwanie Timera
'*******************************************************************************
Przerwanie:                                                 'co 250us
 Incr Co4ms
 If Co4ms = 16 Then
   Co4ms = 0
   '***************************************  co 4ms
    Zezw_wysw = 1
   Incr Co100ms
   If Co100ms = 25 Then
     Co100ms = 0
     '*************************************** co 100 ms
      Zezw_przyc = 1
     Incr Co1s
     If Co1s = 10 Then
         Co1s = 0
       '*************************************** co 1s
 
        'If Pomiar_odczyt = 1 Then Pomiar_odczyt = 0 Else Pomiar_odczyt = 1
       1wreset
 
       'If Pomiar_odczyt = 1 Then
 
       'Else
        If Err = 0 Then
 
          1wwrite &HCC
          1wwrite &HBE
          Lsb = 1wread():
          Msb = 1wread():
 
          If Msb = 0 Then
            Tempa = Lsb / 2                                 'dokladnosc 1 stopien
 
          Else
            Tempa = 254                                     'LA wyswietli low alert
          End If
 
        Else
          Tempa = 255                                       'Er wyswietli wyswietlacz potem
        End If
       'End If
 
        1wreset
         1wwrite &HCC
         1wwrite &H44
 
 
        'Zezw_uruch = 1
       If Tempa < 100 Then
       Tempw = Tempu - Hister
 
       If Tempa >= Tempu Then Reset Pompa
 
        If Tempa < Tempw Then Set Pompa
 
       Else
        Set Pompa
       End If
 
       If Praca_automat = 0 Then Pompa = Stan_reczny
 
       '***************************************
     End If
     '***************************************
   End If
   '***************************************
 End If
Return
'*******************************************************************************
'procedura przeliczajaca zmienna wysw na dwie zmienne odpowiadajace wyswietlaniu na dwoch wyswietlaczach
'wartosci zmiennej wysp:
'(
                        0 - 99 Wyswitla Liczby
                        100 -250 Wyswietla Ha
                         251 Pa
                         252 Pr
                         253 Nic Nie Wyswietla
                         254 La
                         255 Er
')
 
'*******************************************************************************
                           'Tabela do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144
'znak:    0     1     2     3     4     5     6     7     8     9
'*******************************************************************************
 
'*******************************************************************************

Gwarancji nie ma żadnej :D Może trzeba by to po prostu napisać na nowo, ale równie dobrze może działać :P
P.S. Wymień kondensator (C5 4,7uF) przy pinie RESET na rezystor 10k-15k

-

BARTek
Moja strona

Portret użytkownika radom20

kod

Dzięki za pomoc.

Przy kompilowaniu kodu wywala mi:

Error : 210   Line :   8     Bit definition not found [WGM01                           ]  , in File : C:\Documents and Settings\Admin\Pulpit\Sterownik kolektora s?necznego\Sterownik kolektora s?necznego2313.bas
Error : 85    Line :   9     Unknown interrupt source [COMPARE0A]  , in File : C:\Documents and Settings\Admin\Pulpit\Sterownik kolektora s?necznego\Sterownik kolektora s?necznego2313.bas
Error : 117   Line :   9     Unknown interrupt [COMPARE0A]  , in File : C:\Documents and Settings\Admin\Pulpit\Sterownik kolektora s?necznego\Sterownik kolektora s?necznego2313.bas
Error : 46    Line :   9     Assignment error [COMPARE0A: 0   186: 112]  , in File : C:\Documents and Settings\Admin\Pulpit\Sterownik kolektora s?necznego\Sterownik kolektora s?necznego2313.bas

Portret użytkownika EDC

Odp.kod

To wina tego, że masz jakaś stara wersję Bascom. One nie miały zaimplementowanych Timerów w trybie CTC.
Darmowa wersja Bascom Demo to teraz wersja 2075 i ta by sobie na pewno poradziła ;)
Pod tym linkiem jednak znajdziesz gotowy skompilowany wsad do testów. Do wyboru BIN lub HEX

Miłego dnia

-

BARTek
Moja strona

Portret użytkownika radom20

Bascom

No właśnie ja mam Bascom 2075
Ale wielkie dzięki za gotowe wsady.
Jak przetestuję dam znać co i jak.
Pozdrawiam

Portret użytkownika EDC

Odp. Bascom

Mam też 2075 i sprawdziłem. Kompiluje się bezbłędnie. Problem może leżeć w tym ze Bascom tworzy dla listingu plik config. W nim zapisany jest typ mikrokontrolera.
Czasem więc kiedy kopiujesz plik z internetu to lepiej utworzyć nowy plik naciskając w Bascom "białą kartkę" i tam go wkleić i nazwać na nowo.
Wklejenie kodu do starego projektu może powodować własnie takie komunikaty ponieważ kompilator może dalej sprawdzać kod pod kątem poprzedniego mikrokontrolera..a, jak wiesz, w 89C2051 na pewno takiego trybu dla Timera nie było.

Jeśli chcesz wiec wprowadzać zmiany w tym kodzie to utwórz nowy i tam go wklej. Gdyby Bascom zapytał czy "Leave settings?", albo coś podobnego to odpowiedz "No". Ten kod na pewno kompiluje się na 2075

-

BARTek
Moja strona