Timer+pomiar temperatury


Witam, proszę o pomoc w umieszczeniu termostatu w programie.
Napisałem program który po naciśnięciu przycisku START zał. PK_1 i odmierza czas T1 po upływie którego wył.PK_1 i zał.PK_2 na czas T2.Po upłynięciu czasu T2 wszystko wyłącza i czeka na ponowne naciśnięcie START(obsługuje to TIMER1).Ustawianie czasów mam przyciskami. Chcę dołożyć do tego termostat działający całkowicie niezależnie,jednak nie wiem jak to zrobić i wyświetlić temperaturę na LCD Locate 1,7.Można najpierw spróbować z samym termometrem ,a później pomyślę nad obsługą przyciskami termostatu.
Czasówki działają w 100% tak jak założyłem, także nie bardzo chcę coś w nich zmieniać.

'************************TIMER  ver.testowa*************************************
'pracuja dwa TIMERY TIMER0/1
'przekazniki i wyswietlanie ok
'zajmuje 39% pamieci
'wysw. temperatury na LCD locate 1 , 7
'**************************** Konfiguracja Uc **********************************
 
$regfile = "m8def.dat"
$crystal = 16000000
 
Config Portb = &B11111111 : Portb = &B11111110
Config Portc = &B11111111 : Portc = &B11111111
Config Portd = &B00000001 : Portd = &B11111111
 
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
Cls
Cursor Off Noblink
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Prztimer0
 
Config Timer1 = Timer , Prescale = 256
Enable Timer1 : On Timer1 Prztimer1
 
Enable Interrupts
Stop Timer1
 
 Pk_0 Alias Portb.0                                         'zal. przy wlaczeniu zasilania i start
 Pk_1 Alias Portb.1                                         'zal.przy T1
 Pk_2 Alias Portb.2                                         'zal.przy T2
 Pk_3 Alias Portb.3
 Pk_4 Alias Portb.4
 
'DS18b20 na PD.1
'Buzer Alias Portd.0                                        'buzer wyzw.stanem 1
'Declare Sub Buzer_1
 
'****************************** Zmienne ****************************************
 
Dim Licz_1s As Word , Dzielnik As Byte , Dzielnik2 As Byte
Dim Flaga_4ms As Bit , Flaga_100ms As Bit , Flaga_1s As Bit
Dim Sw As Byte , Stan_sw As Byte , Licznik_sw As Byte
Dim T1_licz As Word , T2_licz As Word
Dim Out_state As Bit
Dim Help As Word , Help2 As Word , Help3 As Word
Dim Poz_menu As Byte
Dim Wysw_1 As Bit , Wysw_2 As Bit
 
'***************************warunki poczatkowe**********************************
Out_state = 0
  Readeeprom T1_licz , 2                                    'czas T1
   If T1_licz > 3599 Then
     T1_licz = 30
   End If
  Readeeprom T2_licz , 4                                    'czas T2
   If T2_licz > 3599 Then
     T2_licz = 30
   End If
 
 Lcd "   sterownik    "
 Lowerline
 Lcd "  wer.testowa   "
 Wait 2
 Cls
'*****************************petla glowna**************************************
Do
  If Flaga_4ms = 1 Then
    Flaga_4ms = 0
     Gosub Przyciski
  End If
   If Flaga_100ms = 1 Then
    Flaga_100ms = 0
     Gosub Wyswietlanie
     Gosub Wyswietlanie_1
  End If
 Loop
End
 
 
'********************* przerwanie timer 0/1 ************************************
Prztimer0:
Timer0 = 7
 Flaga_4ms = 1
 Incr Dzielnik
 If Dzielnik = 25 Then                                      '25*4ms = 100ms
   Dzielnik = 0
   Flaga_100ms = 1
   Incr Dzielnik2
   If Dzielnik2 = 10 Then                                   '10*100ms=1s'
    Dzielnik2 = 0
   End If
 End If
Return
 
Prztimer1:
 Timer1 = 3037
  Flaga_1s = 1
  Flaga_1s = 0
 
  Wysw_1 = 1
  Pk_0 = 0
  Pk_1 = 0
  Pk_2 = 1
   Incr Licz_1s
    If Out_state = 0 Then
     If Licz_1s >= T1_licz Then
      Licz_1s = 0
      Out_state = 1
    End If
   Else
  Wysw_2 = 1
  Pk_0 = 1
  Pk_1 = 1
  Pk_2 = 0
    If Licz_1s >= T2_licz Then
      Licz_1s = 0
      Out_state = 0
      Stop Timer1                                           'stop po skonczonym cyklu
   Wysw_1 = 0
   Wysw_2 = 0
   Pk_0 = 1
   Pk_1 = 1
   Pk_2 = 1
    End If
    End If
 Return
 
'********************** wyswietlanie/wyswietlanie_1 ****************************
Wyswietlanie:
 
 Select Case Poz_menu
    Case 0:
      Locate 1 , 1
      Lcd "Temp:"
      Locate 2 , 7
      Lcd "          "
        Help = Licz_1s
        Help = Help Mod 60                                  'liczenie sekund
      Locate 2 , 3
      Lcd ":"
        If Help < 10 Then Lcd "0"                           'zero wiodace,jak mniej niz 10
          Lcd Help
           Help = Licz_1s / 60                              'liczenie minut
          Locate 2 , 1
            If Help < 10 Then Lcd "0"                       'zero wiodace dla minut
              Lcd Help
 
   Case 1:
     Locate 1 , 1
     Lcd ""
     Locate 2 , 7
     Lcd "T1-sek.   "
       Help3 = T1_licz
       Help3 = Help3 Mod 60
     Locate 2 , 3
     Lcd ":"
       If Help3 < 10 Then Lcd "0"
         Lcd Help3
          Help3 = T1_licz / 60
         Locate 2 , 1
           If Help3 < 10 Then Lcd "0"
             Lcd Help3
 
   Case 2:
     Locate 1 , 1
     Lcd ""
     Locate 2 , 7
     Lcd "T1-min.   "
       Help3 = T1_licz
       Help3 = Help3 Mod 60
     Locate 2 , 3
     Lcd ":"
       If Help3 < 10 Then Lcd "0"
         Lcd Help3
          Help3 = T1_licz / 60
         Locate 2 , 1
           If Help3 < 10 Then Lcd "0"
             Lcd Help3
 
   Case 3:
     Locate 1 , 1
     Lcd ""
     Locate 2 , 7
     Lcd "T2-sek.   "
       Help2 = T2_licz
       Help2 = Help2 Mod 60
     Locate 2 , 3
     Lcd ":"
       If Help2 < 10 Then Lcd "0"
         Lcd Help2
          Help2 = T2_licz / 60
         Locate 2 , 1
           If Help2 < 10 Then Lcd "0"
             Lcd Help2
 
   Case 4:
     Locate 1 , 1
     Lcd ""
     Locate 2 , 7
     Lcd "T2-min.   "
       Help2 = T2_licz
       Help2 = Help2 Mod 60
     Locate 2 , 3
     Lcd ":"
       If Help2 < 10 Then Lcd "0"
         Lcd Help2
          Help2 = T2_licz / 60
       Locate 2 , 1
         If Help2 < 10 Then Lcd "0"
           Lcd Help2
 End Select
Return
 
Wyswietlanie_1:
 If Wysw_1 = 1 Then
  Locate 2 , 7
  Lcd "T1"
 End If
 
 If Wysw_2 = 1 Then
  Locate 2 , 7
  Lcd "T2"
 End If
 
'*****************************przyciski*****************************************
Przyciski:
Sw = Pind And &B11111100                                    'maskowanie nieużywanych pinów
 
If Sw <> &B11111100 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 100 Then
      Licznik_sw = 0
      Select Case Stan_sw
 
        Case &B01111100:                                    'poz.menu pd7
         Incr Poz_menu
          If Poz_menu = 5 Then                              'poz.menu 0/1/2/3/4, bedzie docel.5/6
          Poz_menu = 0
           Writeeeprom T1_licz , 2                          'zapis do pamieci czasow T1/T2, pozniej temp.
            Writeeeprom T2_licz , 4
             End If
 
        Case &B10111100:                                    '+sek   pd6
          Select Case Poz_menu
            Case 1:
              If T1_licz < 3600 Then Incr T1_licz
            Case 2:
              If T1_licz < 3540 Then T1_licz = T1_licz + 60
            Case 3:
              If T2_licz < 3600 Then Incr T2_licz
            Case 4:
              If T2_licz < 3540 Then T2_licz = T2_licz + 60
            'Case 5:
              'ustawianie temperatury termostatu
            'case 6:
              'ustawianie histerezy termostatu
          End Select
 
        Case &B11011100:                                    '-sek pd5
          Select Case Poz_menu
            Case 1:
              If T1_licz > 0 Then Decr T1_licz
            Case 2:
              If T1_licz > 59 Then T1_licz = T1_licz - 60
            Case 3:
              If T2_licz > 0 Then Decr T2_licz
            Case 4:
              If T2_licz > 59 Then T2_licz = T2_licz - 60
            'case 5:
              'ustawianie temperatury termostatu
            'case 6:
              'ustawianie histerezy termostatu
          End Select
 
        Case &B11101100:                                    'pd4 START
              Start Timer1
 
        'Case &B11110100:                                    'pd3
 
 
        'Case &B11111011                                     'pd2
 
 
      End Select
    End If
  Else
    Stan_sw = Sw
    Licznik_sw = 80
  End If
 
Return
 
Return
'****************************koniec przyciski***********************************

DS18B20 na PD.1 ,natomiast przekaźnik termostatu PK_3.




Portret użytkownika EDC

Odp. Timer + pomiar temp.

Jak już nie chcesz w tym grzebać to może tak: Czytać co sekunde temperature i w procedurze odczytu temperatury, już po konwersji, postawić warunek że jesli pozycja menu 0 to locate i wyświetlić temp. Jak będziesz w innej pozycji to sie nic nie nałoży. A temperature i tak bedziesz miał cały czas odczytana i termostat zadziała nawet "pod spodem" jakiegoś innego menu. Myślę też że dokładnośc do przecinka, bez dziesiętnych jest wystarczajaca, ale jak kto woli. Rezygnacja z temp ujemnych i miejsc po przecinku "ułatwia" sprawę ;) Temperaturę można wyświetlać z "garbem" :D czyli za nią ;" " i to bedzie czysciło większe liczby gdy temp spadnie.
To tak na pierwszy rzut oka ;)
Różne sa też szkoły czytania tych DSów. Jedni dzielą to na raty, czyli najpierw żądanie konwersji temp. przez DS a potem wracaja za 700ms ..a można też odczytać temp z DS`a, przeliczyc sobie i wysłać żądanie kolejnej konwersji. Tylko na czas czytania wyłączasz przerwania, więc wszystko kwestią rozpatrzenia potrzeb :P
Miłego dnia.
Ps. Na PORTD.1 jest TXD i czasem są kłopoty z czytaniem DSów na portach z RS232 bo Ci Bascom z niewyjaśnionych przyczyn włączy UART, wtedy trzeba wyłączyć UART w rejestrze UCSR.

-

BARTek
Moja strona

Portret użytkownika marekszy

Timer + pomiar temp.

Ok,dzięki, pomiar temperatury już mi działa,DS-a przeniosłem w/g sugestii na PD.2, w pomiarze musiałem wywalić

waitms 750 

ponieważ wszystko czekało ,nie wiem tylko czy tak może zostać.
Zostało jeszcze dorobić termostat i przyciski

'**************************** Konfiguracja Uc **********************************
 
$regfile = "m8def.dat"
$crystal = 16000000
 
Config Portb = &B11111111 : Portb = &B11111110
Config Portc = &B11111111 : Portc = &B11111111
Config Portd = &B00000011 : Portd = &B11111111
 
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
Cls
Cursor Off Noblink
Deflcdchar 1 , 14 , 17 , 17 , 14 , 32 , 32 , 32 , 32        ' definicja znaki stopnia
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Prztimer0
 
Config Timer1 = Timer , Prescale = 256
Enable Timer1 : On Timer1 Prztimer1
 
Enable Interrupts
Stop Timer1
 
Config 1wire = Portd.2
 
 Pk_0 Alias Portb.0                                         'zal. przy wlaczeniu zasilania i start
 Pk_1 Alias Portb.1                                         'zal.przy T1
 Pk_2 Alias Portb.2                                         'zal.przy T2
 Pk_3 Alias Portb.3
 Pk_4 Alias Portb.4
 
'Buzer Alias Portd.0                                        'buzer wyzw.stanem 1
'Declare Sub Buzer_1
 
'****************************** Zmienne ****************************************
 
Dim Licz_1s As Word , Dzielnik As Byte , Dzielnik2 As Byte , Flaga_t0_1s As Bit
Dim Flaga_4ms As Bit , Flaga_100ms As Bit , Flaga_1s As Bit
Dim Sw As Byte , Stan_sw As Byte , Licznik_sw As Byte
Dim T1_licz As Word , T2_licz As Word
Dim Out_state As Bit
Dim Help As Word , Help2 As Word , Help3 As Word
Dim Poz_menu As Byte
Dim Wysw_1 As Bit , Wysw_2 As Bit
 
Dim Odczyt(2) As Byte , A As Byte , Licznik As Byte , T As Integer , T1 As Single , Napis As String * 5
 
'***************************warunki poczatkowe**********************************
Out_state = 0
  Readeeprom T1_licz , 2                                    'czas T1
   If T1_licz > 3599 Then
     T1_licz = 30
   End If
  Readeeprom T2_licz , 4                                    'czas T2
   If T2_licz > 3599 Then
     T2_licz = 30
   End If
 
 Locate 1 , 1
 Lcd "   sterownik    "
 Locate 2 , 1
 Lcd "  wer.testowa   "
 Wait 2
 Cls
'*****************************petla glowna**************************************
Do
 
  If Flaga_4ms = 1 Then
    Flaga_4ms = 0
     Gosub Przyciski
  End If
 
   If Flaga_100ms = 1 Then
    Flaga_100ms = 0
     Gosub Wyswietlanie
     Gosub Wyswietlanie_1
   End If
 
  If Flaga_t0_1s = 1 Then
     Flaga_t0_1s = 0
    Gosub Temperatura
  End If
 
 Loop
End
 
 
'********************* przerwanie timer 0/1 ************************************
Prztimer0:
Timer0 = 7
 Flaga_4ms = 1
 Incr Dzielnik
 If Dzielnik = 25 Then                                      '25*4ms = 100ms
   Dzielnik = 0
   Flaga_100ms = 1
   Incr Dzielnik2
   If Dzielnik2 = 10 Then                                   '10*100ms=1s'
    Dzielnik2 = 0
    Flaga_t0_1s = 1
   End If
 End If
Return
 
Prztimer1:
 Timer1 = 3037
  Flaga_1s = 1
  Flaga_1s = 0
 
  Wysw_1 = 1
  Pk_0 = 0
  Pk_1 = 0
  Pk_2 = 1
   Incr Licz_1s
    If Out_state = 0 Then
     If Licz_1s >= T1_licz Then
      Licz_1s = 0
      Out_state = 1
    End If
   Else
  Wysw_2 = 1
  Pk_0 = 1
  Pk_1 = 1
  Pk_2 = 0
    If Licz_1s >= T2_licz Then
      Licz_1s = 0
      Out_state = 0
      Stop Timer1                                           'stop po skonczonym cyklu
   Wysw_1 = 0
   Wysw_2 = 0
   Pk_0 = 1
   Pk_1 = 1
   Pk_2 = 1
    End If
    End If
 Return
 
'*****************************obsluga DS18B20***********************************
Temperatura:
 
1wreset
  1wwrite &HCC
  1wwrite &H44
   'Waitms 750
  1wreset
  1wwrite &HCC
  1wwrite &HBE
  Odczyt(1) = 1wread(2)
  T = Odczyt(2)
  Shift T , Left , 8
  T = T + Odczyt(1)
  T1 = T * 0.0625
  Napis = Fusing(t1 , "#.#")
 
'********************** wyswietlanie/wyswietlanie_1 ****************************
Wyswietlanie:
Locate 1 , 1
  Lcd "Temp:     " ; Napis ; "" ; Chr(1) ; "C"              'wyświetl wynik ze zmiennej Single temperatura
 
Select Case Poz_menu
    Case 0:
      'Locate 1 , 1
      'Lcd ""
      Locate 2 , 7
      Lcd "          "
        Help = Licz_1s
        Help = Help Mod 60                                  'liczenie sekund
      Locate 2 , 3
      Lcd ":"
        If Help < 10 Then Lcd "0"                           'zero wiodace,jak mniej niz 10
          Lcd Help
           Help = Licz_1s / 60                              'liczenie minut
          Locate 2 , 1
            If Help < 10 Then Lcd "0"                       'zero wiodace dla minut
              Lcd Help
 
   Case 1:
     'Locate 1 , 1
     'Lcd ""
     Locate 2 , 7
     Lcd "T1-sek.   "
       Help3 = T1_licz
       Help3 = Help3 Mod 60
     Locate 2 , 3
     Lcd ":"
       If Help3 < 10 Then Lcd "0"
         Lcd Help3
          Help3 = T1_licz / 60
         Locate 2 , 1
           If Help3 < 10 Then Lcd "0"
             Lcd Help3
 
   Case 2:
     'Locate 1 , 1
     'Lcd ""
     Locate 2 , 7
     Lcd "T1-min.   "
       Help3 = T1_licz
       Help3 = Help3 Mod 60
     Locate 2 , 3
     Lcd ":"
       If Help3 < 10 Then Lcd "0"
         Lcd Help3
          Help3 = T1_licz / 60
         Locate 2 , 1
           If Help3 < 10 Then Lcd "0"
             Lcd Help3
 
   Case 3:
     'Locate 1 , 1
     'Lcd ""
     Locate 2 , 7
     Lcd "T2-sek.   "
       Help2 = T2_licz
       Help2 = Help2 Mod 60
     Locate 2 , 3
     Lcd ":"
       If Help2 < 10 Then Lcd "0"
         Lcd Help2
          Help2 = T2_licz / 60
         Locate 2 , 1
           If Help2 < 10 Then Lcd "0"
             Lcd Help2
 
   Case 4:
     'Locate 1 , 1
     'Lcd ""
     Locate 2 , 7
     Lcd "T2-min.   "
       Help2 = T2_licz
       Help2 = Help2 Mod 60
     Locate 2 , 3
     Lcd ":"
       If Help2 < 10 Then Lcd "0"
         Lcd Help2
          Help2 = T2_licz / 60
       Locate 2 , 1
         If Help2 < 10 Then Lcd "0"
           Lcd Help2
 End Select
Return
 
Wyswietlanie_1:
 
If Wysw_1 = 1 Then
  Locate 2 , 7
  Lcd "T1"
End If
 
If Wysw_2 = 1 Then
  Locate 2 , 7
  Lcd "T2"
End If
 
'*****************************przyciski*****************************************
Przyciski:
Sw = Pind And &B11111100                                    'maskowanie nieużywanych pinów
 
If Sw <> &B11111100 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 100 Then
      Licznik_sw = 0
      Select Case Stan_sw
 
        Case &B01111100:                                    'poz.menu pd7
         Incr Poz_menu
          If Poz_menu = 5 Then                              'poz.menu 0/1/2/3/4, bedzie docel.5/6
          Poz_menu = 0
           Writeeeprom T1_licz , 2                          'zapis do pamieci czasow T1/T2, pozniej temp.
            Writeeeprom T2_licz , 4
             End If
 
        Case &B10111100:                                    '+sek   pd6
          Select Case Poz_menu
            Case 1:
              If T1_licz < 3600 Then Incr T1_licz
            Case 2:
              If T1_licz < 3540 Then T1_licz = T1_licz + 60
            Case 3:
              If T2_licz < 3600 Then Incr T2_licz
            Case 4:
              If T2_licz < 3540 Then T2_licz = T2_licz + 60
            'Case 5:
              'ustawianie temperatury termostatu
            'case 6:
              'ustawianie histerezy termostatu
          End Select
 
        Case &B11011100:                                    '-sek pd5
          Select Case Poz_menu
            Case 1:
              If T1_licz > 0 Then Decr T1_licz
            Case 2:
              If T1_licz > 59 Then T1_licz = T1_licz - 60
            Case 3:
              If T2_licz > 0 Then Decr T2_licz
            Case 4:
              If T2_licz > 59 Then T2_licz = T2_licz - 60
            'case 5:
              'ustawianie temperatury termostatu
            'case 6:
              'ustawianie histerezy termostatu
          End Select
 
        Case &B11101100:                                    'pd4 START
              Start Timer1
 
        Case &B11110100:                                    'pd3
 
 
        Case &B11111011                                     'pd2
 
 
      End Select
    End If
  Else
    Stan_sw = Sw
    Licznik_sw = 80
  End If
 
Return
 
Return
'****************************koniec przyciski***********************************

Portret użytkownika EDC

Timer + pomiar Temp

Heheh pisałem Ci żeby najpierw czytać temp a potem kazać mu przygotować następną . I tak za sekunde po nia wrócisz, a tylko za pierwszym razem po resecie przez dwie sekundy nie masz odczytu.
A histerezę sobie dodaj jakąś żeby nie swirował tam i z powrotem na granicy przełączenia. tylko jakiś inny Help wolny znajdź :) Chyba że DSa dokłądnie do radiatora przymocujesz i zasłonisz od wiatru, bo one na zefirek reagują.

 If Flaga_t0_1s = 1 Then
     Flaga_t0_1s = 0
    Gosub Temperatura
    If T1 > Pilnuj Then Reset Pk_3
    Help = Pilnuj - 2                                           ' histereza np. 2 stopnie
    If T1 < Help Then Set Pk_3
  End If
 
 
Temperatura:
 
  1wreset                                                   ' tu czytasz temperature
  1wwrite &HCC
  1wwrite &HBE
  Odczyt(1) = 1wread(2)
  T = Odczyt(2)
  Shift T , Left , 8
  T = T + Odczyt(1)
  T1 = T * 0.0625
  Napis = Fusing(t1 , "#.#")
 
  1wreset                                                   ' tu kazesz DS`owi przygotować nowy odczyt
  1wwrite &HCC                                              ' i za sekunde juz będzie gotowy
 
  1wwrite &H44

-

BARTek
Moja strona

Portret użytkownika marekszy

Timer + pomiar temp.

Teraz działa bezbłędnie, histerezę ustawiłem na +/- 1 stopień, dołożyłem ustawianie temperatury przyciskami,zmieniłem trochę wyświetlanie (teraz w trakcie ustawiania T1 i T2 wyświetla czały czas bieżącą temperaturę),dołożyłem zapis do eeprom.
Wiesz może jak dołożyć kontrolę podłączonego DS-a,aby w przypadku wypięcia lub uszkodzenia wyłączyło grzanie.

'**************************** Konfiguracja Uc **********************************
 
$regfile = "m8def.dat"
$crystal = 16000000
 
Config Portb = &B11111111 : Portb = &B11111110
Config Portc = &B11111111 : Portc = &B11111111
Config Portd = &B00001011 : Portd = &B11111111
 
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
Cls
Cursor Off Noblink
Deflcdchar 1 , 14 , 17 , 17 , 14 , 32 , 32 , 32 , 32        ' definicja znaki stopnia
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Prztimer0
 
Config Timer1 = Timer , Prescale = 256
Enable Timer1 : On Timer1 Prztimer1
 
Enable Interrupts
Stop Timer1
 
Config 1wire = Portd.2
 
 Pk_0 Alias Portb.0                                         'zal. przy wlaczeniu zasilania i start
 Pk_1 Alias Portb.1                                         'zal.przy T1
 Pk_2 Alias Portb.2                                         'zal.przy T2
 Pk_3 Alias Portb.3
 Pk_4 Alias Portb.4
 
'Buzer Alias Portd.0                                        'buzer wyzw.stanem 1
'Declare Sub Buzer_1
 
'****************************** Zmienne ****************************************
 
Dim Licz_1s As Word , Dzielnik As Byte , Dzielnik2 As Byte , Flaga_t0_1s As Bit
Dim Flaga_4ms As Bit , Flaga_100ms As Bit , Flaga_1s As Bit
Dim Sw As Byte , Stan_sw As Byte , Licznik_sw As Byte
Dim T1_licz As Word , T2_licz As Word
Dim Out_state As Bit
Dim Help As Word , Help2 As Word , Help3 As Word
Dim Poz_menu As Byte
Dim Wysw_1 As Bit , Wysw_2 As Bit
Dim Temp As Single , Temp_1 As Single , Temp_2 As Single
Dim Odczyt(2) As Byte , A As Byte , Licznik As Byte , T As Integer , T1 As Single , Napis As String * 5
 
'***************************warunki poczatkowe**********************************
Out_state = 0
  Readeeprom T1_licz , 2                                    'czas T1
   If T1_licz > 3599 Then
     T1_licz = 30
   End If
  Readeeprom T2_licz , 4                                    'czas T2
   If T2_licz > 3599 Then
     T2_licz = 30
   End If
  Readeeprom Temp , 6                                       'temperatura zadana termostatu
   If Temp =< 0 Then                                        'mniejsza lub rowna 0 ustawia 45
     Temp = 45
   End If
 
 Locate 1 , 1
 Lcd "   sterownik    "
 Locate 2 , 1
 Lcd "  wer.testowa   "
 Wait 2
 Cls
'*****************************petla glowna**************************************
Do
 
  If Flaga_4ms = 1 Then
    Flaga_4ms = 0
     Gosub Przyciski
  End If
 
   If Flaga_100ms = 1 Then
    Flaga_100ms = 0
     Gosub Wyswietlanie
     Gosub Wyswietlanie_1
   End If
 
 
  If Flaga_t0_1s = 1 Then
     Flaga_t0_1s = 0
      Gosub Temperatura
      Temp_2 = Temp + 1
     If T1 > Temp_2 Then Set Pk_3
      Temp_1 = Temp - 1                                     ' histereza np. +/- 1 stopien
     If T1 < Temp_1 Then Reset Pk_3
  End If
 
 Loop
End
 
 
'********************* przerwanie timer 0/1 ************************************
Prztimer0:
Timer0 = 7
 Flaga_4ms = 1
 Incr Dzielnik
 If Dzielnik = 25 Then                                      '25*4ms = 100ms
   Dzielnik = 0
   Flaga_100ms = 1
   Incr Dzielnik2
   If Dzielnik2 = 10 Then                                   '10*100ms=1s'
    Dzielnik2 = 0
    Flaga_t0_1s = 1
   End If
 End If
Return
 
Prztimer1:
 Timer1 = 3037
  Flaga_1s = 1
  Flaga_1s = 0
 
  Wysw_1 = 1
  Pk_0 = 0
  Pk_1 = 0
  Pk_2 = 1
   Incr Licz_1s
    If Out_state = 0 Then
     If Licz_1s >= T1_licz Then
      Licz_1s = 0
      Out_state = 1
    End If
   Else
  Wysw_2 = 1
  Pk_0 = 1
  Pk_1 = 1
  Pk_2 = 0
    If Licz_1s >= T2_licz Then
      Licz_1s = 0
      Out_state = 0
      Stop Timer1                                           'stop po skonczonym cyklu
   Wysw_1 = 0
   Wysw_2 = 0
   Pk_0 = 1
   Pk_1 = 1
   Pk_2 = 1
    End If
    End If
 Return
 
'*****************************obsluga DS18B20***********************************
Temperatura:
 
  1wreset                                                   ' tu czytasz temperature
  1wwrite &HCC
  1wwrite &HBE
   Odczyt(1) = 1wread(2)
   T = Odczyt(2)
  Shift T , Left , 8
   T = T + Odczyt(1)
   T1 = T * 0.0625
   Napis = Fusing(t1 , "#.#")
 
  1wreset                                                   ' tu kazesz DS`owi przygotować nowy odczyt
  1wwrite &HCC                                              ' i za sekunde juz będzie gotowy
 
  1wwrite &H44
'********************** wyswietlanie/wyswietlanie_1 ****************************
Wyswietlanie:
 
Select Case Poz_menu
    Case 0:
      Locate 1 , 1
      Lcd "Temp:     " ; Napis ; "" ; Chr(1) ; "C"          'wyświetl wynik ze zmiennej Single temperatura
      Locate 2 , 7
      Lcd "          "
        Help = Licz_1s
        Help = Help Mod 60                                  'liczenie sekund
      Locate 2 , 3
      Lcd ":"
        If Help < 10 Then Lcd "0"                           'zero wiodace,jak mniej niz 10
          Lcd Help
           Help = Licz_1s / 60                              'liczenie minut
          Locate 2 , 1
            If Help < 10 Then Lcd "0"                       'zero wiodace dla minut
              Lcd Help
 
   Case 1:                                                  'ustaw.sek.T1
     Locate 1 , 1
     Lcd "Temp:     " ; Napis ; "" ; Chr(1) ; "C"
     Locate 2 , 7
     Lcd "T1-sek.   "
       Help3 = T1_licz
       Help3 = Help3 Mod 60
     Locate 2 , 3
     Lcd ":"
       If Help3 < 10 Then Lcd "0"
         Lcd Help3
          Help3 = T1_licz / 60
         Locate 2 , 1
           If Help3 < 10 Then Lcd "0"
             Lcd Help3
 
   Case 2:                                                  'ustaw.min.T1
     Locate 1 , 1
     Lcd "Temp:     " ; Napis ; "" ; Chr(1) ; "C"
     Locate 2 , 7
     Lcd "T1-min.   "
       Help3 = T1_licz
       Help3 = Help3 Mod 60
     Locate 2 , 3
     Lcd ":"
       If Help3 < 10 Then Lcd "0"
         Lcd Help3
          Help3 = T1_licz / 60
         Locate 2 , 1
           If Help3 < 10 Then Lcd "0"
             Lcd Help3
 
   Case 3:                                                  'ustaw.sek.T2
     Locate 1 , 1
     Lcd "Temp:     " ; Napis ; "" ; Chr(1) ; "C"
     Locate 2 , 7
     Lcd "T2-sek.   "
       Help2 = T2_licz
       Help2 = Help2 Mod 60
     Locate 2 , 3
     Lcd ":"
       If Help2 < 10 Then Lcd "0"
         Lcd Help2
          Help2 = T2_licz / 60
         Locate 2 , 1
           If Help2 < 10 Then Lcd "0"
             Lcd Help2
 
   Case 4:                                                  'ustaw.min.T2
     Locate 1 , 1
     Lcd "Temp:     " ; Napis ; "" ; Chr(1) ; "C"
     Locate 2 , 7
     Lcd "T2-min.   "
       Help2 = T2_licz
       Help2 = Help2 Mod 60
     Locate 2 , 3
     Lcd ":"
       If Help2 < 10 Then Lcd "0"
         Lcd Help2
          Help2 = T2_licz / 60
       Locate 2 , 1
         If Help2 < 10 Then Lcd "0"
           Lcd Help2
 
   Case 5:                                                  'ustaw.temperatury
     Locate 1 , 1
     Lcd "Temp:   > " ; Temp ; "" ; Chr(1) ; "C"
     Locate 2 , 7
      Lcd "          "
        Help = Licz_1s
        Help = Help Mod 60
      Locate 2 , 3
      Lcd ":"
        If Help < 10 Then Lcd "0"
          Lcd Help
           Help = Licz_1s / 60
          Locate 2 , 1
            If Help < 10 Then Lcd "0"
              Lcd Help
 
 End Select
Return
 
Wyswietlanie_1:
 
If Wysw_1 = 1 Then
  Locate 2 , 7
  Lcd "T1"
End If
 
If Wysw_2 = 1 Then
  Locate 2 , 7
  Lcd "T2"
End If
Return
'*****************************przyciski*****************************************
Przyciski:
Sw = Pind And &B11110000                                    'maskowanie nieużywanych pinów
 
If Sw <> &B11111100 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 100 Then
      Licznik_sw = 0
      Select Case Stan_sw
 
        Case &B01110000:                                    'poz.menu pd7
         Incr Poz_menu
          If Poz_menu = 6 Then                              'poz.menu 0/1/2/3/4/5,
          Poz_menu = 0
           Writeeeprom T1_licz , 2                          'zapis do pamieci czasow T1/T2, pozniej temp.
           Writeeeprom T2_licz , 4
           Writeeeprom Temp , 6
             End If
 
        Case &B10110000:                                    '+sek   pd6
          Select Case Poz_menu
            Case 1:
              If T1_licz < 3600 Then Incr T1_licz
            Case 2:
              If T1_licz < 3540 Then T1_licz = T1_licz + 60
            Case 3:
              If T2_licz < 3600 Then Incr T2_licz
            Case 4:
              If T2_licz < 3540 Then T2_licz = T2_licz + 60
            Case 5:
              If Temp < 100 Then Incr Temp
 
          End Select
 
        Case &B11010000:                                    '-sek pd5
          Select Case Poz_menu
            Case 1:
              If T1_licz > 0 Then Decr T1_licz
            Case 2:
              If T1_licz > 59 Then T1_licz = T1_licz - 60
            Case 3:
              If T2_licz > 0 Then Decr T2_licz
            Case 4:
              If T2_licz > 59 Then T2_licz = T2_licz - 60
            Case 5:
              If Temp > 0 Then Decr Temp
 
          End Select
 
        Case &B11100000:                                    'pd4 START
              Start Timer1
 
      End Select
    End If
  Else
    Stan_sw = Sw
    Licznik_sw = 80
  End If
 
Return
 
Return
'****************************koniec przyciski***********************************

jeszcze nie bardzo mi się widzi wyświetlanie tego
Wyswietlanie_1:
 
If Wysw_1 = 1 Then
  Locate 2 , 7
  Lcd "T1"
End If
 
If Wysw_2 = 1 Then
  Locate 2 , 7
  Lcd "T2"
End If
Return

w trakcie działania pokazuje który czas jest liczony, trochę pomruguje ale z biedy może tak zostać.

Portret użytkownika EDC

Pomrygiwanie wyswietlacza

Wydaje mi się że to dlatego że masz potem włączone Wysw_1 = 1 i po Else Wysw_2 = 1 i potem w tym Sub Wyświetlanie obydwa If`y sa prawdziwe więc maluje najpierw T1 i na nim zaraz T2. Ja bym te Wyswietlanie_1 wywalił całkiem i wrzucił obsługe tego do tego przerwania co sekunde Timera 1 zamiast odświeżać widok co 100ms ;) Na dodatek chyba Ci sie z czegoś tam zapomniała ta Flaga_1s = 1 i zaraz potem Flaga = 0 ..to bezsens i chyba tam została z jakiegoś pomysłu. Całośc chyba powinna wyglądac tak:

Prztimer1:
 Timer1 = 3037
 
  Locate 2 , 7 : Lcd "T1"
  Pk_0 = 0
  Pk_1 = 0
  Pk_2 = 1
   Incr Licz_1s
    If Out_state = 0 Then
     If Licz_1s >= T1_licz Then
      Licz_1s = 0
      Out_state = 1
    End If
   Else
  Locate 2 , 7 : Lcd "T2"
  Pk_0 = 1
  Pk_1 = 1
  Pk_2 = 0
    If Licz_1s >= T2_licz Then
      Licz_1s = 0
      Out_state = 0
      Stop Timer1                                           'stop po skonczonym cyklu
   Locate 2 , 7 : Lcd "  "                                  'czysci po T2
   Pk_0 = 1
   Pk_1 = 1
   Pk_2 = 1
    End If
    End If
 Return

Tak nie do końca chce mi sie to analizowac , ale tam chyba brakuje jakiegoś If`a na poczatku przerwania bo nawet jeśli juz liczysz T2 to i tak na poczatku przechodzisz przez stary stan T1 łacznie z ustawianiem portów.
Oczywiście wywal już Sub Wyswietlanie bo z niego wziąłem te Locate 2,7
Dwukropek oznacza w Bascom przejscie do następnej linii .
Po któreś tam..chyba nie chcialo Ci się przeczytać moich wypocin na temat wyswietlaczy LCD tu na forum. Deklaracja znaku specjalnego Deflcdchar Cie kosztuje w kodzie duuużo a możesz zamiast Chr(1) napisać Chr(223) bo taki znak jest już zdefiniowany. Wtedy Deflcdchar niepotrzebne jest..
Tu masz ściągę:
'stopien to Chr(223)
'caly kursor to Chr(255)
'duzy stopien to Chr(219)
'duza kropka to Chr(161)
'up to Chr(162)
'down to Chr(163)
'strzalka w prawo to Chr(126)
'strzalka w lewo to Chr(127)

Co do wykrywania czy podłączony DS.
Funkcja 1wreset ma wbudowane sprawdzanie i w przypadku błedu ustawia flage ERR na 1
Ni etrzeba jej kasować, sama sie kasuje jak sie DS znajdzie. Wygląda to mniej wiecej tak a wykorzystasz jak chcesz po tym Else. Sprawdzać błąd można w odczycie i w żądaniu konwersji temperatury, ale tu skróciłem.

 
  1wreset
    If Err = 0 Then                                   ' jeżeli nie ma błędu
       1wwrite &HCC
       1wwrite &H44
    Else                                             ' jeżeli błąd
            Reset Pk_3
            Alarm_on
            Koguty :D
            Dzwoń 998 :D
    End If

...albo po prostu tutaj zapomniałeś Wysw_1 = 0, bo chyba by pomogło..

    End If
   Else
  Wysw_1 = 0
  Wysw_2 = 1

Miłego testowania, no i miłego dnia ;)

-

BARTek
Moja strona

Portret użytkownika marekszy

Timer + pomiar temp.

Niestety pomimo wielu kombinacji dalej pomruguje co 1 sek, ale to nie tragedia (może później z nudów powalczę.Zapis w stylu

 Locate 2 , 7 : Lcd "T1"
  Pk_0 = 0
  Pk_1 = 0
  Pk_2 = 1
   Incr Licz_1s
    If Out_state = 0 Then
     If Licz_1s >= T1_licz Then
      Licz_1s = 0
      Out_state = 1
    End If
   Else
  Locate 2 , 7 : Lcd "T2"
  Pk_0 = 1
  Pk_1 = 1
  Pk_2 = 0

wysypuje całkowicie wyświetlacz

Odnośnie błędu ERR dla DS-a to oczywiście wykazuje, jednak PK_3 nie wyłącza się tylko mrugnie co 1 sek,
wykożystam to do sygnalizacji akustycznej, a wyłączanie PK_3 rozwiązałem dając warunek w pętli gł.

Temp_2 = Temp + 1
     If T1 > Temp_2 Then Set Pk_3
      Temp_1 = Temp - 1                                     ' histereza np. +/- 1 stopien
     If T1 < Temp_1 Then Reset Pk_3
     If T1 < 2 Then Set Pk_3

to wystarczy ponieważ po odłączeniu jakiejkolwiek nóżki DS-a wskazuje temp 00,0 lub -0,0

Wielkie podziękowania dla EDC,naprawdę wiele można się od Ciebie nauczyć i zawsze liczyć na Twoją pomoc.

Portret użytkownika EDC

Timer - może błąd?

Marek czy masz już u siebie w programie wpisany Return w Sub Temperatura?
Kiedyś tez bez Returna skompilowałem bezproblemowo i dopiero następny Return w programie po drodze kończy wtedy operacje :D

-

BARTek
Moja strona

Portret użytkownika EDC

Timer + pomiar - wersja z jednym Timerem i alarmem :)

Proszę Marku. Jako, że dziś gorąco to sobie przerwe zrobiłem i postanowiłem poprawić co nieco :P
Ma nawet Alarm, a jest mniejszy :D
Zmieniłem ostatnio taktykę i w obsłudze przerwań nie robie już tych "drabinek". Jest na to czas w pętli :)
Błąd mógł sie wkraść ale sobie poprawisz może jak się przyjrzysz :D bo mi nie chce się przepinać płytki .
Ps. Tą Single Temp masz trochę niepotrzebnie dużą ale zostawiłem :)

'**************************** Konfiguracja Uc **********************************
 
$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 64
$swstack = 64
$framesize = 64
 
Config Portb = &B11111111 : Portb = &B11111110
Config Portc = &B11111111 : Portc = &B11111111
Config Portd = &B00001011 : Portd = &B11111111
 
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
Cursor Off Noblink
Cls
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Prztimer0
 
Config 1wire = Portd.2
 
 Pk_0 Alias Portb.0                                         'zal. przy wlaczeniu zasilania i start
 Pk_1 Alias Portb.1                                         'zal.przy T1
 Pk_2 Alias Portb.2                                         'zal.przy T2
 Pk_3 Alias Portb.3
 Pk_4 Alias Portb.4
 Buzer Alias Portd.0                                        'buzer wyzw.stanem 1
'****************************** Zmienne ****************************************
Dim Timer_tick As Byte , Licz_do_100ms As Byte , Licz_do_500ms As Byte , Licz_do_1s As Byte
Dim Stan As Byte , Odliczaj As Word
Dim Sw As Byte , Stan_sw As Byte , Licznik_sw As Byte
Dim T1_licz As Word , T2_licz As Word
Dim Help As Word , Help2 As Word , Help3 As Word
Dim Poz_menu As Byte
Dim Temp As Single , Hsingle As Single
Dim Odczyt(2) As Byte , T As Integer , T1 As Single , Napis As String * 5
Dim Alarm As Byte
'***************************warunki poczatkowe**********************************
  Readeeprom T1_licz , 2                                    'czas T1
  Readeeprom T2_licz , 4                                    'czas T2
  Readeeprom Temp , 6                                       'temperatura zadana termostatu
 
 If T1_licz > 3599 Then T1_licz = 30
 If T2_licz > 3599 Then T2_licz = 30
 If Temp > 100 Then Temp = 45
 
 Lcd "   sterownik    "
 Lowerline
 Lcd "  wer.testowa   "
 Wait 2
 Cls
 'niech DS ma już gotowa temp
 1wreset
 1wwrite &HCC
 1wwrite &H44
 
 Enable Interrupts
'*****************************petla glowna**************************************
 
 Do
 ' co  4ms
 If Timer_tick = 1 Then
    Timer_tick = 0
      Incr Licz_do_100ms
      Gosub Przyciski
 End If
 'co 100ms
 If Licz_do_100ms = 25 Then
    Licz_do_100ms = 0
      Incr Licz_do_500ms
      Gosub Wyswietlanie
 End If
 'co 500ms
 If Licz_do_500ms = 5 Then
    Licz_do_500ms = 0
      Incr Licz_do_1s
 'miejsce na przerywany buzzer
  If Alarm = 1 Then
   Buzer = Not Buzer
  Else
   Buzer = 0
  End If
 End If
 'co 1s
 If Licz_do_1s = 2 Then
    Licz_do_1s = 0
    Gosub Temperatura
   If Odliczaj > 0 Then Decr Odliczaj
    Gosub Sterowanie
 
 End If
 
 Loop
 End
 '********************* sterowanie *********************************************
 Sterowanie:
 ' termostat
   Hsingle = Temp + 1
   If T1 > Hsingle Then Set Pk_3
   Hsingle = Temp - 1                                       ' histereza np. +/- 1 stopien
   If T1 < Hsingle Then Reset Pk_3
   If T1 < 2 Then Set Pk_3
  ' przekaźniki
   If Stan = 0 Then
    Pk_0 = 1
    Pk_1 = 1
    Pk_2 = 1
   End If
 
   If Stan = 1 Then
     Pk_0 = 0
     Pk_1 = 0
     Pk_2 = 1
    If Odliczaj = 0 Then 
       Stan = 2
       Odliczaj = T2_licz
    end if
   End If
 
   If Stan = 2 Then
     Pk_0 = 1
     Pk_1 = 1
     Pk_2 = 0
    If Odliczaj = 0 Then Stan = 0
   End If
 
 Return
 
 '********************* przerwanie timer 0 *************************************
Prztimer0:
Timer0 = 7
 Timer_tick = 1
Return
 
'*****************************obsluga DS18B20***********************************
Temperatura:
 
  1wreset                                                   ' tu czytasz temperature
  1wwrite &HCC
  1wwrite &HBE
   Odczyt(1) = 1wread(2)
   T = Odczyt(2)
  Shift T , Left , 8
   T = T + Odczyt(1)
   T1 = T * 0.0625
 
  If Poz_menu <> 5 Then                                     ' wyswietla co 1sec chyba że ustawiasz temp
    Napis = Fusing(t1 , "#.#")
    Locate 1 , 1
    Lcd "Temp:     " ; Napis ; "" ; Chr(223) ; "C"          'wyświetl wynik ze zmiennej Single temperatura
  End If
 
 1wreset                                                    ' tu kazesz DS`owi przygotować nowy odczyt
 If Err = 0 Then
  1wwrite &HCC                                              ' i za sekunde juz będzie gotowy
  1wwrite &H44
 Else
  Alarm = 1
 End If
 
Return
 
'********************** wyswietlanie ****************************
Wyswietlanie:
 
Select Case Poz_menu
    Case 0:
      Locate 2 , 7
     If Stan = 0 Then
        Lcd "        "
     Else
      If Stan = 1 Then Lcd "T1      "
      If Stan = 2 Then Lcd "T2      "
     End If
        Help = Odliczaj
        Help = Help Mod 60                                  'liczenie sekund
      Locate 2 , 3 : Lcd ":"
        If Help < 10 Then Lcd "0"                           'zero wiodace,jak mniej niz 10
          Lcd Help
           Help = Odliczaj / 60                             'liczenie minut
          Locate 2 , 1
            If Help < 10 Then Lcd "0"                       'zero wiodace dla minut
              Lcd Help
 
   Case 1:                                                  'ustaw.sek.T1
 
     Locate 2 , 7 : Lcd "T1-sek.   "
       Help3 = T1_licz
       Help3 = Help3 Mod 60
     Locate 2 , 3 : Lcd ":"
       If Help3 < 10 Then Lcd "0"
         Lcd Help3
          Help3 = T1_licz / 60
         Locate 2 , 1
           If Help3 < 10 Then Lcd "0"
             Lcd Help3
 
   Case 2:                                                  'ustaw.min.T1
 
     Locate 2 , 7 : Lcd "T1-min.   "
       Help3 = T1_licz
       Help3 = Help3 Mod 60
     Locate 2 , 3 : Lcd ":"
       If Help3 < 10 Then Lcd "0"
         Lcd Help3
          Help3 = T1_licz / 60
         Locate 2 , 1
           If Help3 < 10 Then Lcd "0"
             Lcd Help3
 
   Case 3:                                                  'ustaw.sek.T2
 
     Locate 2 , 7 : Lcd "T2-sek.   "
       Help2 = T2_licz
       Help2 = Help2 Mod 60
     Locate 2 , 3 : Lcd ":"
       If Help2 < 10 Then Lcd "0"
         Lcd Help2
          Help2 = T2_licz / 60
         Locate 2 , 1
           If Help2 < 10 Then Lcd "0"
             Lcd Help2
 
   Case 4:                                                  'ustaw.min.T2
 
     Locate 2 , 7 : Lcd "T2-min.   "
       Help2 = T2_licz
       Help2 = Help2 Mod 60
     Locate 2 , 3 : Lcd ":"
       If Help2 < 10 Then Lcd "0"
         Lcd Help2
          Help2 = T2_licz / 60
       Locate 2 , 1
         If Help2 < 10 Then Lcd "0"
           Lcd Help2
 
   Case 5:                                                  'ustaw.temperatury
     Locate 1 , 1
     Lcd "Temp:   > " ; Temp ; "" ; Chr(223) ; "C"
     Locate 2 , 7 : Lcd "          "
        Help = Odliczaj
        Help = Help Mod 60
      Locate 2 , 3
      Lcd ":"
        If Help < 10 Then Lcd "0"
          Lcd Help
           Help = Odliczaj / 60
          Locate 2 , 1
            If Help < 10 Then Lcd "0"
              Lcd Help
 
 End Select
Return
'*****************************przyciski*****************************************
Przyciski:
Sw = Pind And &B11110000                                    'maskowanie nieużywanych pinów
 
If Sw <> &B11111100 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 100 Then
      Licznik_sw = 0
      Select Case Stan_sw
 
        Case &B01110000:
        If Alarm = 1 Then
         Alarm = 0
        Else                                                'poz.menu pd7
         Incr Poz_menu
          If Poz_menu = 6 Then                              'poz.menu 0/1/2/3/4/5,
          Poz_menu = 0
           Writeeeprom T1_licz , 2                          'zapis do pamieci czasow T1/T2, pozniej temp.
           Writeeeprom T2_licz , 4
           Writeeeprom Temp , 6
             End If
          End If
 
        Case &B10110000:                                    '+sek   pd6
          Select Case Poz_menu
            Case 1:
              If T1_licz < 3600 Then Incr T1_licz
            Case 2:
              If T1_licz < 3540 Then T1_licz = T1_licz + 60
            Case 3:
              If T2_licz < 3600 Then Incr T2_licz
            Case 4:
              If T2_licz < 3540 Then T2_licz = T2_licz + 60
            Case 5:
              If Temp < 100 Then Incr Temp
 
          End Select
 
        Case &B11010000:                                    '-sek pd5
          Select Case Poz_menu
            Case 1:
              If T1_licz > 0 Then Decr T1_licz
            Case 2:
              If T1_licz > 59 Then T1_licz = T1_licz - 60
            Case 3:
              If T2_licz > 0 Then Decr T2_licz
            Case 4:
              If T2_licz > 59 Then T2_licz = T2_licz - 60
            Case 5:
              If Temp > 0 Then Decr Temp
 
          End Select
 
        Case &B11100000:                                    'pd4 START
              If Stan = 0 Then
                 Stan = 1
                Odliczaj = T1_licz
              End If
 
      End Select
    End If
  Else
    Stan_sw = Sw
    Licznik_sw = 80
  End If
 
Return
 
Return
'****************************koniec przyciski***********************************

-

BARTek
Moja strona

Portret użytkownika marekszy

Timer + pomiar - wersja z jednym Timerem i alarmem

No muszę przyznać,że mnie teraz zaskoczyłeś, masz to wszystko pięknie uproszczone,ja niestety robiłem to wszystko na około,ale nauka nie idzie w las tylko w nas.
Działa to teraz tak jak powinno, tylko,że zawsze jest jakieś ale...
Chodzi mi jeszcze mianowicie o problem termostatu o którym wcześniej nie wspomniałem (był mało istotny),a mianowicie:
przy wczytaniu programu do Atmegi ustawia termostat na temp. -0.0*C i w takim przypadku nie mogłem już jej zmienić +/-, załatwiłem to w warunkach początkowych

If Temp =< 0 Then Temp = 45                                'gdy temp.mniejsza/rowna "0"

nie wiem jak to zapisać w obsłudze przycisku + aby dodawało jak temp. jest ustawiona poniżej zera
Case 5:
              If Temp < 100 Then Incr Temp

Portret użytkownika EDC

Timer..

Dodaj jedna zmienna T1_word. Zaraz po tym jak masz T1. Porównujesz swoja T1_word = T1 i to odetnie tylko kropke :) i z tym wszędzie porównuj. Wynik na wyświetlaczu dalej będzie z kropką. A Temp zmień na Word i będzie po kłopocie :)

Dim T1_word As Word, Temp As Word
 
 
T1 = T * 0.0625
T1_word = T1
 
   Help = Temp + 1
   If T1_word > Help Then Set Pk_3
   Help = Temp - 1                                       ' histereza np. +/- 1 stopien
   If T1_word < Help Then Reset Pk_3
   If T1_word < 2 Then Set Pk_3

Do eeproma będzie zapisywac i czytać z niego Word . Nie powinno być kłopotu gdy FF FF bo to znaczy 65535 czyli dodatnio :)
PS. Miałeś ten Return w Temperaturze czy to jego brakowało? :P

-

BARTek
Moja strona

Portret użytkownika marekszy

Timer + pomiar temp.

Odnośnie Return w temp. to go brakowało i sprawdziłem ,faktycznie to było przyczyną mrugania, a później wysypywania się wyświetlacza.
Przerobiłem,teraz tak jak podałeś, ale....teraz temp.zadaną wyświetla 45*C*C

If Temp > 100 Then Temp = 45 
 
 
Dim Temp As Word , Hsingle As Word , T1_word As Word 
 
 
Sterowanie:
 ' termostat
   Hsingle = Temp + 1
   If T1_word > Hsingle Then Set Pk_3
   Hsingle = Temp - 1                                       ' histereza np. +/- 1 stopien
   If T1_word < Hsingle Then Reset Pk_3
   If T1_word < 2 Then Set Pk_3
 
 
 T1 = T * 0.0625
   T1_word = T1

i jeszcze zmieniłem to, ponieważ przy błędzie czujnika załączyło alarm ,a później nie chciało wyłączyć
1wreset ' tu kazesz DS`owi przygotować nowy odczyt
 If Err = 0 Then
  1wwrite &HCC                                              ' i za sekunde juz będzie gotowy
  1wwrite &H44
  Alarm = 0                                                 'to dopisalem
  Else
  Alarm = 1
 End If
Return

Portret użytkownika EDC

Odp> Timer i pomiar temp

Zmień
Lcd "Temp:   > " ; Temp ; "" ; Chr(223) ; "C"
na
Lcd "Temp:   > " ; Temp ; "" ; Chr(223) ; "C";"  "
...bo ustawiana tem jest bez przecinka i jest krótsza ;)
Alarm kasował się przyciskiem Menu..takie zabezpieczenie :P

-

BARTek
Moja strona

Portret użytkownika marekszy

Timer i pomiar temp

No i super, teraz już działa pięknie,wielkie dzięki za pomoc i cierpliwość,teraz na spokojnie mogę jeszcze raz przeanalizować Twoje zmiany i znowu być trochę mądrzejszy.
wyjaśnię jeszcze kwestię tej linijki

If T1_word < 2 Then Set Pk_3

chodzi o to, że DS podaje alarm tylko przy utracie komunikacji z up z wyjścia pomiarowego lub przy braku minusa (wyświetla -0,0), natomiast w przypadku braku plusa wyświetla 0,0 i nie generuje alarmu (termostat nadal został by w trybie grzania).

I jeszcze jedno pytanie ,na podstawie czgo określasz

$hwstack = 64
$swstack = 64
$framesize = 64

i jaki ma wpływ brak tych parametrów w takim programie

Portret użytkownika EDC

Odp.Timer i framesize

Te pierwsze to już wyjaśniałeś i zrozumiałem wczoraj to zostawiłem :D

Co do tych parametrow. Jest to temat na dłuższy opis który sobie dziś daruję :D ..ale po krótce...
Nigdy nie jest tak że tych parametrów tam nie ma. One sa zapisane w ustawieniach Bascom i automatycznie dokładane do kodu. Są w ustawieniach kompilatora -> karta Chip.
Najczęściej domyślne ustawienia sa wystarczające, ale tam sa uwzgledniające małe procki - oszczedne :D
Za każdym razem jak coś zgłasza przerwanie to procek odkłada na kupę zwana stosem wszystko, robi przerwanie a potem z tej kupy zabiera :) Tak najprosciej, im skomplikowańszy program tym więcej odkłada i kupa rosnie..może sie przewrócić :) Dane Ci umkna jakieś jak stos za mały. On odłozy i już nie odzyska. Wtedy nikt nie jest w stanie przewidzieć co się stanie.
Przerabiajac np. jakaś Single na String, albo coś do wysłania ma Print potrzebuje na to miejsca. Robi to w tej ramce (framesize) im dłuższe stringi tym większa potrzebna ramka. Taka String potrzbuje o jeden bajt więcej niż sama jest długa..bo w tym dodatkowym bajcie ma zapisany koniec itd. Niektóre trzeba liczyć razy dwa.. ale.. jak się ma Pdf`a do Atmegi8 i przeczyta że ma sie do dyspozycji tysiac bajtów to można szaleć :D
W helpie do Bascoma jest instrukcja jak to liczyć dokładnie i dodawac nawet wyrost np. +2
Pisza ile dodac jak masz przerwanie w programie..i na każde dodajesz.. Tu wpisałem "na oko" bo po co mam sie z Toba potem drapać w głowe :P Na pewno większe niż domyślne a to, plus suma wszystkich zadeklarowanych zmiennych musi sie zmiescić w procka RAM.
Warto poczytać bo jak sie bedzie chciało zrobić na odwrót, w małym gówienku ATtiny13 coś to prawie zadnej zmiennej bys nie dodał typu Word bo Bascom napisze "Out of SRAM" a to własnie przez te domyślne które tam sa w Bascom.. już za duże na te maleństwo ktore ma 64Bajty tylko. Tam na palcach sobie liczysz ile potrzebujesz na zmienne i tylko resztę możesz przeznaczyć na Hwstack i Framesize.
Swstack jest używany do zmiennych lokalnych.. tez niegłupie. Deklarujesz ja dla funkcji i tylko w funkcji , nie na poczatku, uzywasz, a jak nie używasz to to samo miejsce może wykorzystać inna funkcja na chwile. Jesli więc nie używasz zmiennych lokalnych to możesz się pokusić o zmniejszenie tego stosu a zyskasz plac na inne zmienne :D
Dlatego czasem dobrze jest samemu te dane wpisać po lekturze albo na wyrost :D jak masz z czego.
Napisze coś potem przejrzysciej w chwili natchnienia :P
Teraz walczę z jednym projektem.. mam nadzieje że w końcu zadziała tak jak chce.
Ale czas na zabawe musi być więc robie też inne mniejsze zabawki któer ciesza :D
Miłego wieczoru.

-

BARTek
Moja strona