Termometr uniwersalny


Witam,
Czy ktoś pomoże mi uruchomić ten termostat? Płytka mojego autorstwa atmega8 6 wyświetlaczy led
Działa poprawnie z wsadem termometru uniwersalnego lecz niestety jak zaprogramuję wsadem termostatu pobranym z projektu termometr uniwersalny to wyświetla mi tylko wszystkie segmenty led na wszystkich wyświetlaczach. Co robić? Od czego zacząć?

$regfile = "m8def.dat"
$crystal = 12000000
 
Config Portb = &B11100101 : Portb = &B11111111              '1 3 i 4 jako wejście reszta wyjścia
Config Portd = &B11111111 : Portd = &B11111111              'wszystkie wyjścia
Config Portc = &B11111111 : Portc = &B11111111              'wszystkie wyjścia
 
Config 1wire = Pinb.2
 
' * * * * * * * * * * * * * * * * * * * * * * * * * * *
 
Config Timer0 = Timer , Prescale = 64
Enable Timer0 : On Timer0 Przerwanie0
Enable Interrupts
 
'Load Timer0 , 250
W1 Alias Portc.0
W2 Alias Portc.1
W3 Alias Portc.2
W4 Alias Portc.3
W5 Alias Portc.4
W6 Alias Portc.5
 
' ********************************************************************
Dim Lsb As Byte
Dim Msb As Byte
Dim Temp1 As Byte
Dim Temp2 As Byte
Dim Nr_wysw As Byte
Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
Dim Wysw As Word , Wysw1 As Byte , Wysw10 As Byte , Wysw100 As Byte , Wysw1000 As Byte , Wysw10000 As Byte , Wysw100000 As Byte
Dim Wysw_pomoc As Word
Dim Tempa As Word
Dim Tempu As Word
Dim Histereza As Byte
Dim Mux As Byte
Dim Poz_menu As Byte
Dim Sw_licz(3) As Byte
Dim Tempp As Word                                           'zmiena pomocnicza
Dim Autopowrot As Byte
 
Dim Zezw_wysw As Bit , Zezw_przyciski As Bit
Dim Pomiar_odczyt As Bit
Dim Minus As Bit
Dim Ur As Bit
Dim Miganie As Bit
Dim Z As Bit
Dim Stan As Byte
Dim Mig As Byte
'Dim Pk As Bit
Dim Kr5 As Bit                                              ' pomocnicza do migania
Dim P3 As Byte
Dim P1 As Byte
 
Up Alias Pinb.1
Down Alias Pinb.3
Ok Alias Pinb.4
Pk Alias Pinb.5
Reset Pk
 
'****************************
      'Wartosci Poczatkowe
'****************************
P3 = 32
P1 = 0
Reset Z
Set Up
Set Down
Set Ok
Reset Pomiar_odczyt
Reset Ur
Poz_menu = 0
Tempu = 11
Histereza = 1
Wysw1 = 191
Wysw10 = 191
Wysw100 = 191
Wysw1000 = 191
Wysw10000 = 191
Wysw100000 = 191
 
   Stan = 1
 
'****************************
      'Petla glowna
'****************************
Do
 
 
If Zezw_wysw = 1 Then
  Reset Zezw_wysw                                           'co 4ms
 
  Select Case Poz_menu
    Case 0:
      Wysw = Tempa
    Case 1:
      If Miganie = 1 Then Wysw = Tempu Else Wysw = 10000
    Case 2:
       If Miganie = 1 Then Wysw = Histereza Else Wysw = 10000
  End Select
 
  If Ur = 1 Then Gosub Przelicz
  Gosub Wyswietl
End If
 
If Zezw_przyciski = 1 Then
  Reset Zezw_przyciski                                      'co 100ms
 
   If Down = 0 Then                                         'plus
    Incr Sw_licz(1)
      If Sw_licz(1) = 10 Then
        Sw_licz(1) = 5
 
        Select Case Poz_menu
          Case 0:
    Poz_menu = 1
          Case 1:
           If Tempu < 900 Then Incr Tempu
          Case 2:
           If Histereza < 100 Then Incr Histereza
        End Select
 
        Autopowrot = 0
 
      End If
  Else
    Sw_licz(1) = 8
  End If
 
  If Up = 0 Then                                            ' And Down = 0 Then                               'minus
    Incr Sw_licz(2)
      If Sw_licz(2) = 10 Then
        Sw_licz(2) = 5
 
        Select Case Poz_menu
          Case 0:
    Poz_menu = 2
          Case 1:
           If Tempu > 10 Then Decr Tempu
          Case 2:
           If Histereza > 0 Then Decr Histereza
        End Select
 
        Autopowrot = 0
 
      End If
  Else
    Sw_licz(2) = 8
  End If
 
 If Ok = 0 Then                                             'Up = 1 And Down = 1 Then                                'menu
    Incr Sw_licz(3)
      If Sw_licz(3) = 10 Then
        Sw_licz(3) = 5
 
        Incr Poz_menu
        If Poz_menu = 3 Then Poz_menu = 0
 
        Autopowrot = 0
 
      End If
  Else
    Sw_licz(3) = 8
  End If
 
  Gosub Sterowanie
 
  If Poz_menu <> 0 Then                                     'jezeli jest w menu
   Incr Autopowrot
   If Autopowrot = 200 Then Poz_menu = 0                    'wraca do wysw. temperatury po 50* 0,1s (5sekund)
  End If
 
End If
Loop
End
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Incr Co4ms
 If Co4ms = 2 Then
   Co4ms = 0
   '***************************************  co 4ms
   Set Zezw_wysw
   Incr Co100ms
   If Co100ms = 10 Then
     Co100ms = 0
     '*************************************** co 100 ms
     Set Zezw_przyciski                                     'zezwolenie obslugi przyciskow
 
     Incr Mig
     If Mig = 5 Then
     Mig = 0
      Miganie = Not Miganie                                 'umozliwia miganie cyfr podczas wyswietlania menu
 
 
    End If
 
     Incr Co1s
     If Co1s = 5 Then
       Co1s = 0
       '*************************************** co 1s
       Pomiar_odczyt = Not Pomiar_odczyt
 
       Disable Interrupts
       1wreset
 
       If Pomiar_odczyt = 1 Then
        1wwrite &HCC
        1wwrite &H44
       Else
        If Err = 0 Then
 
          1wwrite &HCC
          1wwrite &HBE
          Lsb = 1wread():
          Msb = 1wread():
 
          Minus = Msb.7
 
          Tempa = Msb * 256
          Tempa = Tempa + Lsb
 
            If Minus = 1 Then
            Tempa = Not Tempa
            Tempa = Tempa + 1
          End If
 
          Tempa = Tempa * 10                                'temperatura *10
          Tempa = Tempa / 16                                'wartosc 123 dla 12.3 stopnia itp.
 
 
'   Temp1 = 1wread(1)
'   Temp2 = 1wread(2)
 
'   Temp1 = Temp1 And 240
'   Rotate Temp1 , Right , 4
 
'   Temp2 = Temp2 And 7
'   Rotate Temp2 , Left , 4
 
'   Tempa = Temp1 Or Temp2
 
          If Ur = 0 Then Ur = 1
 
       Else
          Tempa = 10000                                     'Err wyswietli wyswietlacz potem
        End If
      End If
 
 
       Enable Interrupts
       '***************************************
     End If
     '***************************************
   End If
   '***************************************
 End If
 
Return
'****************************
      'Inne Etykiety
'****************************
Przelicz:
 If Wysw < 1000 Then
 
   Wysw_pomoc = Wysw Mod 10
   Wysw1 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw1000 = Wysw1
   Wysw_pomoc = Wysw Mod 10
   Wysw10 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw10000 = Wysw10
   Wysw_pomoc = Wysw Mod 10
   Wysw100 = Wysw_pomoc
   Wysw100000 = Wysw100
 
 
 If Wysw100 = 0 Then Wysw100 = 10                           'wygaszenie zera wiodacego
   If Z = 0 Then
                                                             'wygaszenie zera wiodacego
      Wysw1 = Lookup(wysw1 , Tabela)
      Wysw10 = Lookup(wysw10 , Tabela)
      Wysw100 = Lookup(wysw100 , Tabela)
      Wysw1000 = Lookup(wysw1000 , Tabela)
      Wysw10000 = Lookup(wysw10000 , Tabela)
      Wysw100000 = Lookup(wysw100000 , Tabela)
   Else
   If Wysw = 10000 Then
      Wysw1 = 255                                           'wygaszony
      Wysw10 = 255                                          'wygaszony
      Wysw100 = 255
      Wysw1000 = 255
      Wysw10000 = 255
      Wysw100000 = 255                                      'wygaszony
   Else
      Wysw1 = 147                                           'Error
      Wysw10 = 187                                          '
      Wysw100 = 176                                         '
      Wysw1000 = 147                                        '
      Wysw10000 = 187                                       '
      Wysw100000 = 176                                      '
   End If
   End If
   End If
Return
 
 
Sterowanie:
  If Pk = 0 Then                                            'jezeli jest wlaczony przekaznik
     If Tempa >= Tempu Then Pk = 1                          'jezeli tempa dochodzi do ustawionej to wyl przekaznik
  Else                                                      'jezeli wyl przekaznik
     Tempp = Tempu - Histereza                              'punkt wylaczenia
  If Tempa < Tempp Then Pk = 0                              'jezeli tempa mniejsza niz ustawiona temp. - histereza to wlacz przek.
  End If
Return
 
 
 
Wyswietl:
 
   Select Case Nr_wysw
      Case 0:
            Set W6
               Portd = Wysw100000
               'Portd.4 = Kr1
            Reset W1
      Case 1:
         Set W1
               Portd = Wysw10000
               Portd.4 = Kr5
         Reset W2
      Case 2:
         Set W2
               Portd = Wysw1000
               'Portd.4 = Kr3
         Reset W3
      Case 3:
         Set W3
               Portd = Wysw100
               'Portd.4 = Kr4
         Reset W4
      Case 4:
         Set W4
               Portd = Wysw10
               Portd.4 = Kr5
         Reset W5
      Case 5:
         Set W5
               Portd = Wysw1
               'Portd.4 = Kr6
         Reset W6
   End Select
 
  Incr Nr_wysw
    If Nr_wysw = 6 Then
       Nr_wysw = 0
    End If
Return
 
 
 
 
 
 
 
Tabela:
 
Data 80 , 95 , 49 , 21 , 30 , 148 , 144 , 93 , 16 , 20
'     0    1    2    3    4     5     6    7    8    9
 
Tabela3:
 
Data 176 , 187 , 147 , 93 , 24 , 240
   '   E     r     o    J    A     C
 
 
'Sterowanie:
'If Portb.0 = 0 Then                                         'jezeli jest wlaczony przekaznik
'   If Tempa >= Tempu Then Portb.0 = 1                       'jezeli tempa dochodzi do ustawionej to wyl przekaznik
' Else                                                       'jezeli wyl przekaznik
'  Tempp = Tempu - Histereza                                 'punkt wylaczenia
'   If Tempa < Tempp Then Portb.0 = 0                        'jezeli tempa mniejsza niz ustawiona temp. - histereza to wlacz przek.
' End If
'Return
 
 
'led
' a b c d e f g dp
' 1 7 5 3 2 0 6  4
 
 
 
'Data &B01010000 , &B01011111 , &B00110001 , &B00010101 , &B00011110 ,
'Data &B10010100 , &B10010000 , &B01011101 , &B00010000 , &B0001010




Portret użytkownika mirley

Re: Program do termostatu

Dobra... po pierwsze to na początku napisz dobrą konfiguracje portów. Nie wiem jak jest w najnowszym bascomie ale wcześniejsze wersje bardzo nie lubiły jak się pisło dwa razy konfig na pinie:

Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11111111 : Portb = &B11111111
Config Portc.0 = Output
Config Portc.1 = Output
Config Portc.2 = Output
Config Portc.3 = Output
Config Portc.4 = Output
Config Portc.5 = Output
 
Config 1wire = Pinb.2
 
Config Portb.1 = Input
Config Portb.3 = Input
Config Portb.4 = Input
'Config Portb.0 = Input
'Reset Portb.4
 

To co wyżej napisałeś lepiej zrobić tak (bo napewno działa dobrze, sprawdzałem wiele razy):

Config Portb = &B11100101 : Portb = &B11111111 '1 3 i 4 jako wejście reszta wyjścia
Config Portd = &B11111111 : Portb = &B11111111 'wszystkie wyjścia
Config Portc = &B11111111 : Portc = &B11111111 'wszystkie wyjścia 
 
Config 1wire = Pinb.2
 

Pierwsza cyfra binarna po Config port to ustawienia typu wyprowadzenia(1-wyjście, 0-wejście), druga cyfra po port=&B.... to stan początkowy

Co do dalszej części programu to patrzyłem ale narazie nie jestm wstanie objąć tego co zmodyfikowałeś Skoro program do termometru działa Ci w tym układzie sprzętowym to napisz program jeszcze raz, a w zasadzie powklejaj odpowiednie fragmenty sprawdzając co chwilę czy działa. Najpierw dodaj procedurę do wyświetlania na 6 wyświetlaczy, niech temperatura wyświetla się dwa razy na 6 wyświetlaczach, pozwoli Ci to znaleźć błąd samemu dużo szybciej niż ja to będę chciał zrobić. Jakiś rażących problemów nie zauważyłem, jak dalej nie będzie chciało iść to pisz

-

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 BIGjack

Faktycznie pomogło, przedtem

Faktycznie pomogło, przedtem procek wariował, teraz jest ok. Wyświetlam temperature tak jak pisałeś dwukrotnie 2 x 3 znaki i jest ok ale nie działa menu, brak reakcji na przyciski, mierzyłem stany na pinach procka i po naciśnięciu przycisku jest stan niski czyli jest poprawnie. Więc dlaczego nie raguje na przyciski?

Portret użytkownika mirley

Re: Przyciski

Wynika to prawdopodobnie z czytania ze złego rejestru procesora. Mikrokontroler ma dwa rejestry, jeden w którym ustawia się stany portów i drugi z którego się je czyta. Napisałeś:

Up Alias Portb.1
Down Alias Portb.3
Ok Alias Portb.4

a powinieneś napisać:

Up Alias Pinb.1
Down Alias Pinb.3
Ok Alias Pinb.4

jak chcesz czytać stan z portu to piszesz pinx.y a jek chcesz aby stan był wystawiony to piszesz portx.y. dalszej częsci narazie nie sprawdzałem, jeśli dalej nie będzie działało to dodaj zaraz po ifie od przycisku jakąś komendę co będzie diode zaświecała i sprawdzisz czy przyciski są czytane poprawnie

-

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 BIGjack

Przyciski

Coś sie ruszyło. Zmieniłem port na pin i teraz samo przeskakuje po menu, naprzemian pokazuje temperature potem ero i 05.0 po ułamku sekundy zmienia się na 04.9 i spowrotem na 05.0 . Jest reakcja na przyciski.

Menu zaczęło działać, przyciski były w programie wyzwalane wysokim a ja podaje do masy.
Coś jest nakombinowane z menu ponieważ jest 6 pozycji a wyświetlaja się tylko 3.

Portret użytkownika BIGjack

migotanie

Jak wyliczyć przerwania aby ledy migotały w jak najmniejszym stopniu?
Listing podmieniłem na działający ;)
Dzięki wielkie za pomoc!!!!
Następnym wyzwaniem będzie zapis nastw do pamięci eeprom ;)

Portret użytkownika mirley

Re: Przerwania i migotanie

Po pierwsze w programie wyżej masz tylko 3 pozycje w menu, temp , temp ustawiana i histereza. W kodzie więcej nie widzę. Timer ustaw tak aby cały cykl multipleksowania miał częstotliwość około 60-70Hz czyli niewiele ponad 2ms ma świecić jeden wyświetlacz. Z wstępnych oględzin wynika że timer jest dobrze ustawiony i powinien działać poprawnie, sprawdź fusebity

Zapis do eeprom to jedna linijka, zapoznaj sie w helpie do bascoma z funkcjami readeeprom zmienna, adres i writeeeprom zmienna, adres

-

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 BIGjack

menu

Jak wtedy pisałem to miałem jeszcze 6 pozycji w menu :)
Pewnie źle robię bo jak coś poprawię to edytuje listing zamieszczony w tym poście i z tego wynika to że piszę o kilku pozycjach menu a na listingu są 3, może to wprowadzać w błąd, sorrki.
Czy jest jakiś wzór aby wyliczyć ten cykl?
Na co zwrócić uwage w fusebitach?

Portret użytkownika mirley

Re: Termometr

Zamieść poniżej ten drugi kod o który pytasz z uwzględnionymi poprawkami o których mówiliśmy... Usuń z kodu większe zakomentowane fragmenty aby było go łatwo ogarnąć.

W fusebitach należy zwrócić uwagę na źródło taktowania, tutaj powinien być uC ustawiony na kwarc zewnętrzny. I jeszcze należy zwracać uwagę na dzielnik częstotliwość sprzętowy, niektóre uC mają taki dzielnik, atmega 8 akurat nie ma więc problemu też nie ma

Obliczanie timera: Jeśli fusebity masz ustawione na zewnętrzny kwarc i masz podłaczony 12000000 (12MHz) to ponieważ timer ma preskaler (Prescale = 64), to licznik timera będzie zwiększany z częstotliwośćią:

12000000/64 = 187500Hz

Timer0 jest 8-bitowy czyli liczy od 0 do 255 a 256 impuls zeruje licznik i generuje przerwanie, jeśli nic nie ustawiasz w przerwaniu, żadnych wartości początkowych timera to jego przerwanie wystąpi w takim przypadku z częstotliwością:

187500/256 = 732,421875Hz

Czyli co 1,36533ms,

-

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 BIGjack

kod

'*********************************************************
'***********  Termostat atmega8 6 led  *******************
'*********************************************************
$regfile = "m8def.dat"
$crystal = 12000000
 
Config Portb = &B11100101 : Portb = &B11011111              '1 3 i 4 jako wejście reszta wyjścia
Config Portd = &B11111111 : Portd = &B11111111              'wszystkie wyjścia
Config Portc = &B11111111 : Portc = &B11111111              'wszystkie wyjścia
 
Config 1wire = Pinb.2
' * * * * * * * * * * * * * * * * * * * * * * * * * * *
Config Timer0 = Timer , Prescale = 64
Enable Timer0 : On Timer0 Przerwanie0
Enable Interrupts
 
W1 Alias Portc.0
W2 Alias Portc.1
W3 Alias Portc.2
W4 Alias Portc.3
W5 Alias Portc.4
W6 Alias Portc.5
' ********************************************************************
Dim Lsb As Byte
Dim Msb As Byte
Dim Temp1 As Byte
Dim Nr_wysw As Byte
Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
Dim Wysw As Word , Wysw1 As Byte , Wysw10 As Byte , Wysw100 As Byte , Wysw1000 As Byte , Wysw10000 As Byte , Wysw100000 As Byte
Dim Wysw_pomoc As Word
Dim Tempa As Word , Tempu As Word
Dim Histereza As Byte
Dim Mux As Byte
Dim Poz_menu As Byte
Dim Sw_licz(3) As Byte
Dim Tempp As Word                                           'zmiena pomocnicza
Dim Autopowrot As Byte
Dim Zezw_wysw As Bit , Zezw_przyciski As Bit
Dim Pomiar_odczyt As Bit
Dim Minus As Bit
Dim Ur As Bit
Dim Miganie As Bit
Dim Z As Bit
Dim Stan As Byte
Dim Mig As Byte
Dim Kr5 As Bit                                              ' pomocnicza do migania
Dim P3 As Byte
Dim P1 As Byte
Up Alias Pinb.1
Down Alias Pinb.3
Ok Alias Pinb.4
Pk Alias Portb.5
'****************************
      'Wartosci Poczatkowe
'****************************
Reset Z
Set Up
Set Down
Set Ok
Reset Pomiar_odczyt
Reset Ur
 
P3 = 32
P1 = 0
Poz_menu = 0
Tempu = 200
Histereza = 10
Wysw1 = 191
Wysw10 = 191
Wysw100 = 191
Wysw1000 = 191
Wysw10000 = 191
Wysw100000 = 191
Stan = 1
'****************************
      'Petla glowna
'****************************
Do
 
If Zezw_wysw = 1 Then
  Reset Zezw_wysw                                           'co 4ms
 
  Select Case Poz_menu
    Case 0:
      Wysw = Tempa
    Case 1:
      If Miganie = 1 Then
      Wysw = Tempu
      Wysw1000 = 6
      Wysw10000 = 5
      Wysw100000 = 4
      Else
      Wysw = 10000
      End If
    Case 2:
       If Miganie = 1 Then
       Wysw = Histereza
       Wysw1000 = 3
       Wysw10000 = 2
       Wysw100000 = 1
       Else
       Wysw = 10000
       End If
  End Select
 
  If Ur = 1 Then Gosub Przelicz
  Gosub Wyswietl
End If
If Zezw_przyciski = 1 Then
  Reset Zezw_przyciski
   If Down = 0 Then                                         'minus
    Incr Sw_licz(1)
      If Sw_licz(1) = 10 Then
        Sw_licz(1) = 5
        Select Case Poz_menu
          Case 0:
    Poz_menu = 1
          Case 1:
           If Tempu < 900 Then Incr Tempu
          Case 2:
           If Histereza < 100 Then Incr Histereza
        End Select
        Autopowrot = 0
      End If
  Else
    Sw_licz(1) = 8
  End If
  If Up = 0 Then                                            'plus
    Incr Sw_licz(2)
      If Sw_licz(2) = 10 Then
        Sw_licz(2) = 5
 
        Select Case Poz_menu
          Case 0:
    Poz_menu = 2
          Case 1:
           If Tempu > 10 Then Decr Tempu
          Case 2:
           If Histereza > 0 Then Decr Histereza
        End Select
        Autopowrot = 0
      End If
  Else
    Sw_licz(2) = 8
  End If
 If Ok = 0 Then                                             'menu
    Incr Sw_licz(3)
      If Sw_licz(3) = 10 Then
        Sw_licz(3) = 5
        Incr Poz_menu
        If Poz_menu = 3 Then Poz_menu = 0
        Autopowrot = 0
      End If
  Else
    Sw_licz(3) = 8
  End If
 
   Gosub Sterowanie
 
  If Poz_menu <> 0 Then                                     'jezeli jest w menu
   Incr Autopowrot
   If Autopowrot = 200 Then Poz_menu = 0                    'wraca do wysw. temperatury po 50* 0,1s (5sekund)
  End If
End If
Loop
End
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Load Timer0 , 100
Incr Co4ms
 If Co4ms = 2 Then
   Co4ms = 0
   '***************************************  co 4ms
   Set Zezw_wysw
   Incr Co100ms
   If Co100ms = 18 Then
     Co100ms = 0
     '*************************************** co 100 ms
     Set Zezw_przyciski                                     'zezwolenie obslugi przyciskow
     Incr Mig
     If Mig = 15 Then
     Mig = 0
      Miganie = Not Miganie                                 'umozliwia miganie cyfr podczas wyswietlania menu
    End If
     Incr Co1s
     If Co1s = 20 Then
       Co1s = 0
       '*************************************** co 1s
       Pomiar_odczyt = Not Pomiar_odczyt
       Disable Interrupts
       1wreset
       If Pomiar_odczyt = 1 Then
        1wwrite &HCC
        1wwrite &H44
       Else
        If Err = 0 Then
          1wwrite &HCC
          1wwrite &HBE
          Lsb = 1wread():
          Msb = 1wread():
          Minus = Msb.7
          Tempa = Msb * 256
          Tempa = Tempa + Lsb
            If Minus = 1 Then
            Tempa = Not Tempa
            Tempa = Tempa + 1
          End If
          Tempa = Tempa * 10                                'temperatura *10
          Tempa = Tempa / 16                                'wartosc 123 dla 12.3 stopnia itp.
          If Ur = 0 Then Ur = 1
       Else
          Tempa = 10000                                     'Err wyswietli wyswietlacz potem
        End If
      End If
       Enable Interrupts
     End If
   End If
 End If
Return
'****************************
      'Inne Etykiety
'****************************
Przelicz:
 If Wysw < 1000 Then
   Wysw_pomoc = Wysw Mod 10
   Wysw1 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw10 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw100 = Wysw_pomoc
 If Wysw100 = 0 Then Wysw100 = 10                           'wygaszenie zera wiodacego
   If Z = 0 Then
    If Pk = 0 Then Wysw1000 = 0 Else Wysw1000 = 7
    If Poz_menu = 0 Then Wysw10000 = 7
    If Poz_menu = 0 Then Wysw100000 = 7
      Wysw1 = Lookup(wysw1 , Tabela)
      Wysw10 = Lookup(wysw10 , Tabela)
      Wysw100 = Lookup(wysw100 , Tabela)
      Wysw1000 = Lookup(wysw1000 , Tabela2)
      Wysw10000 = Lookup(wysw10000 , Tabela2)
      Wysw100000 = Lookup(wysw100000 , Tabela2)
   Else
   If Wysw = 10000 Then
      Wysw1 = 255                                           'wygaszony
      Wysw10 = 255                                          'wygaszony
      Wysw100 = 255
      Wysw1000 = 255
      Wysw10000 = 255
      Wysw100000 = 255                                      'wygaszony
   Else
      Wysw1 = 147                                           'Error
      Wysw10 = 187                                          '
      Wysw100 = 176                                         '
      Wysw1000 = 147                                        '
      Wysw10000 = 187                                       '
      Wysw100000 = 176                                      '
   End If
   End If
   End If
Return
 
Sterowanie:
  If Pk = 0 Then                                            'jezeli jest wlaczony przekaznik
     If Tempa >= Tempu Then Pk = 1                          'jezeli tempa dochodzi do ustawionej to wyl przekaznik
       Else                                                 'jezeli wyl przekaznik
       Tempp = Tempu - Histereza                            'punkt wylaczenia
     If Tempa < Tempp Then Pk = 0                           'jezeli tempa mniejsza niz ustawiona temp. - histereza to wlacz przek.
  End If
Return
 
Wyswietl:
   Select Case Nr_wysw
      Case 0:
            Set W6
               Portd = Wysw100000
               'Portd.4 = Kr1
            Reset W1
      Case 1:
         Set W1
               Portd = Wysw10000
               'Portd.4 = Kr5
         Reset W2
      Case 2:
         Set W2
               Portd = Wysw1000
               'Portd.4 = Kr3
         Reset W3
      Case 3:
         Set W3
               Portd = Wysw100
               'Portd.4 = Kr4
         Reset W4
      Case 4:
         Set W4
               Portd = Wysw10
               Portd.4 = Kr5
         Reset W5
      Case 5:
         Set W5
               Portd = Wysw1
               'Portd.4 = Kr6
         Reset W6
   End Select
  Incr Nr_wysw
    If Nr_wysw = 6 Then
       Nr_wysw = 0
    End If
Return
 
Tabela:
Data 80 , 95 , 49 , 21 , 30 , 148 , 144 , 93 , 16 , 20
'     0    1    2    3    4     5     6    7    8    9
Tabela2:
Data 239 , 26 , 95 , 148 , 80 , 82 , 248 , 255
'      .    h    i     s    o    u     t   pusty
Tabela3:
Data 176 , 187 , 147 , 93 , 24 , 240
   '   E     r     o    J    A     C
 
 
 
'led
' a b c d e f g dp
' 1 7 5 3 2 0 6  4

Portret użytkownika BIGjack

Kłopot - zablokowałem procka

Bawiłem się fusse bitam i właśnie zablokowałem procka :( ustawiłem na external rc oscilator 8-12Mhz jak go odblokować bez programatora równoległego?

Portret użytkownika mirley

Re; Rc Oscylator

Mówiłem żeby nie grzebać w ustawieniach zegara jeśli są dobre :) Teraz musisz podłaczyć to na co ustawiłeś, w karcie katalogowej M8 http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf na stronie 28 i 29 jest napisane jak to podłaczyć, częstotliwość ustawiasz dobierając RC równaniem:


[tex]f = \frac{1}{3RC} [/tex]

-

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 BIGjack

Zapis do pamięci

W której linijce kodu powinienem wstawić zapis wartości zmiennych histereza i tempu?
Odczyt wydaje mi sie że powinien byc przy wartościach początkowych.

Portret użytkownika mirley

Zapis do pamięci

Generalnie zapis do pamięci we wszystkich sterownikach robię zawsze w postaci Autozapisu, to znaczy:

If Autosave < 50 Then
      Incr Autosave
      If Autosave = 50 Then
 
      'tutaj zapis do pamięci Writeeeprom .....
 
      End If
End If

powyższy fragment kodu umieść we fladze co 100ms, np bezpośrednio po linijce:

...
Gosub Sterowanie
...

teraz w miejscu gdzie ustawiasz zapisany parametr, czyli nap u ciebie (i jeszcze w miejscu dla drugiego przycisku):

        Case 1:
           If Tempu > 10 Then Decr Tempu
           Autosave = 0
          Case 2:
           If Histereza > 0 Then Decr Histereza
           Autosave = 0
        End Select

dodajesz linijki Autosave = 0, na początku programu Zmienna Autosave musi mieć wartość 50, czyli taką samą jak w warunku If Autosave < 50 Then. Ten sposób zapisze ustawienia jeśli coś zmodyfikowałeś i przez 5 sekund nic nie zmieniałeś, ma to za zadanie zmniejszyć ilość niepotrzebnych zapisów do pamięci.

Odczyt na początku programu tak jak ci się wydawało :)

-

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 BIGjack

Zapis do pamięci

Dzięki za szybka odpowiedz.
Zapis działa ale zawsze jest jakies ale :)
Jest problem z zapisem zmiennej typu word.
Jak zmienna Tempu jest ustawiona na max 90,0 to wyświetla mi jakieś krzaki i nie działa przycisk down
Jak zmienie ją na 255 to wszystko śmiga.
Czy zmienną o wartości 900 muszę jakoś inaczej zapisać.
Nie wiem w czym jest problem.

Portret użytkownika mirley

Re: Zapis eeprom

jeśli dajesz komendy:

Writeeprom zmienna, adres
Writeeprom zmienna2, adres2 

to jeśli zmienna jest typu word i adres np 2 to adres2 nie może być 3 ale musi być 4 ponieważ zapisując word automatycznie zostaną zajęte komórki 2 i 3 dla adresu początkowego 2. Więc daj adres=2 i adres2=4 i będzie bez problemu. te same adresy przy odczycie

Przy odczycie możesz dać jeszcze warunek żeby sprawdzał czy odczytana wartość jest poprawna i jeśli wykracza poza zakres który ma byc w programie to przypisuj jej wartość domyślna. to na wypadek błędów odczytu

-

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 BIGjack

Wszystko działa :)))) Dzięki

Wszystko działa :))))
Dzięki

Portret użytkownika BIGjack

Wyświetlanie

Jeszcze mnie coś denerwuje ;( Wyświetlam na sześciu wyświetlaczach, temperatura wyświetlana jest na wyśw 456 lub gdy temp powyżej 100 to na 3456.
Nastawy zaś histereza (his) i tempu (out) na wyśw 123 i z tym "wspólnym" wyświetlaczem nr 3 jest problem bo albo wyświetla mi napis his i out a jedynki z 100.0 nie albo wyświtla tą jedynkę a nie wyświetla s i t z nastaw.
Pomocy.
Wstawiam aktualny listing;

'*********************************************************
'***********  Termostat atmega8 6 led  *******************
'*********************************************************
$regfile = "m8def.dat"
$crystal = 12000000
 
Config Portb = &B11100101 : Portb = &B11011111              '1 3 i 4 jako wejście reszta wyjścia
Config Portd = &B11111111 : Portd = &B11111111              'wszystkie wyjścia
Config Portc = &B11111111 : Portc = &B11111111              'wszystkie wyjścia
 
Config 1wire = Pinb.2
' * * * * * * * * * * * * * * * * * * * * * * * * * * *
Config Timer0 = Timer , Prescale = 8
Enable Timer0 : On Timer0 Przerwanie0
Enable Interrupts
 
Load Timer0 , 200
 
W1 Alias Portc.0
W2 Alias Portc.1
W3 Alias Portc.2
W4 Alias Portc.3
W5 Alias Portc.4
W6 Alias Portc.5
' ********************************************************************
Dim Lsb As Byte
Dim Msb As Byte
Dim Temp1 As Byte
Dim Nr_wysw As Byte
Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
Dim Wysw As Word , Wysw1 As Byte , Wysw10 As Byte , Wysw100 As Byte , Wysw1000 As Byte , Wysw10000 As Byte , Wysw100000 As Byte
Dim Wysw_pomoc As Word
Dim Tempa As Word
Dim Tempu As Word
Dim Histereza As Byte
Dim Mux As Byte
Dim Poz_menu As Byte
Dim Sw_licz(3) As Byte
Dim Tempp As Word                                           'zmiena pomocnicza
Dim Autopowrot As Byte
Dim Zezw_wysw As Bit , Zezw_przyciski As Bit
Dim Pomiar_odczyt As Bit
Dim Minus As Bit
Dim Ur As Bit
Dim Miganie As Bit
Dim Z As Bit
Dim Stan As Byte
Dim Mig As Byte
Dim Kr5 As Bit                                              ' pomocnicza do migania
Dim P3 As Byte
Dim P1 As Byte
Dim Autosave As Byte
 
Up Alias Pinb.1
Down Alias Pinb.3
Ok Alias Pinb.4
Pk Alias Portb.5
'****************************
      'Wartosci Poczatkowe
'****************************
Reset Z
Set Up
Set Down
Set Ok
Reset Pomiar_odczyt
Reset Ur
 
P3 = 32
P1 = 0
Poz_menu = 0
Tempu = 222
Histereza = 10
Autosave = 50
Wysw1 = 147
Wysw10 = 147
Wysw100 = 147
Wysw1000 = 147
Wysw10000 = 147
Wysw100000 = 147
Stan = 1
 
Readeeprom Histereza , 2
Waitms 100
If Histereza > 10 Then Histereza = 10
Readeeprom Tempu , 4
Waitms 100
If Tempu > 999 Then Tempu = 222
 
'****************************
      'Petla glowna
'****************************
Do
 
If Zezw_wysw = 1 Then
  Reset Zezw_wysw                                           'co 4ms
 
  Select Case Poz_menu
    Case 0:
      Wysw = Tempa
 
    Case 1:
      If Miganie = 1 Then
      Wysw = Tempu
      Wysw1000 = 6
      Wysw10000 = 5
      Wysw100000 = 4
      Else
      Wysw = 10000
      End If
    Case 2:
       If Miganie = 1 Then
       Wysw = Histereza
       Wysw1000 = 3
       Wysw10000 = 3
       Wysw100000 = 8
       Else
       Wysw = 10000
       End If
  End Select
 
  If Ur = 1 Then Gosub Przelicz
  Gosub Wyswietl
End If
If Zezw_przyciski = 1 Then
  Reset Zezw_przyciski                                      'co 100ms
   If Down = 0 Then                                         'plus
    Incr Sw_licz(1)
      If Sw_licz(1) = 10 Then
        Sw_licz(1) = 5
        Select Case Poz_menu
          Case 0:
    Poz_menu = 1
          Case 1:
           If Tempu < 999 Then Incr Tempu
            Autosave = 0
 
          Case 2:
           If Histereza < 50 Then Incr Histereza
           Autosave = 0
 
        End Select
        Autopowrot = 0
      End If
  Else
    Sw_licz(1) = 8
  End If
  If Up = 0 Then                                            ' minus
    Incr Sw_licz(2)
      If Sw_licz(2) = 10 Then
        Sw_licz(2) = 5
 
        Select Case Poz_menu
          Case 0:
    Poz_menu = 2
          Case 1:
           If Tempu > 10 Then Decr Tempu
            Autosave = 0
 
          Case 2:
           If Histereza > 0 Then Decr Histereza
            Autosave = 0
 
        End Select
        Autopowrot = 0
      End If
  Else
    Sw_licz(2) = 8
  End If
 If Ok = 0 Then                                             'menu
    Incr Sw_licz(3)
      If Sw_licz(3) = 10 Then
        Sw_licz(3) = 5
        Incr Poz_menu
        If Poz_menu = 3 Then Poz_menu = 0
        Autopowrot = 0
      End If
  Else
    Sw_licz(3) = 8
  End If
 
   Gosub Sterowanie
 
   If Autosave < 50 Then
      Incr Autosave
      If Autosave = 50 Then
 
     Writeeeprom Histereza , 2
     'Bitwait Eecr.1 , Reset
 
     Writeeeprom Tempu , 4
     ' Bitwait Eecr.1 , Reset
 
 
    End If
End If
 
  If Poz_menu <> 0 Then                                     'jezeli jest w menu
   Incr Autopowrot
   If Autopowrot = 200 Then Poz_menu = 0                    'wraca do wysw. temperatury po 50* 0,1s (5sekund)
  End If
End If
Loop
End
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Incr Co4ms
 If Co4ms = 15 Then
   Co4ms = 0
   '***************************************  co 4ms
   Set Zezw_wysw
   Incr Co100ms
   If Co100ms = 20 Then
     Co100ms = 0
     '*************************************** co 100 ms
     Set Zezw_przyciski                                     'zezwolenie obslugi przyciskow
     Incr Mig
     If Mig = 8 Then
     Mig = 0
      Miganie = Not Miganie                                 'umozliwia miganie cyfr podczas wyswietlania menu
    End If
     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():
          Minus = Msb.7
          Tempa = Msb * 256
          Tempa = Tempa + Lsb
            If Minus = 1 Then
            Tempa = Not Tempa
            Tempa = Tempa + 1
          End If
          Tempa = Tempa * 10                                'temperatura *10
          Tempa = Tempa / 16                                'wartosc 123 dla 12.3 stopnia itp.
          If Ur = 0 Then Ur = 1
       Else
          Tempa = 10000                                     'Err wyswietli wyswietlacz potem
        End If
      End If
       Enable Interrupts
     End If
   End If
 End If
Return
'****************************
      'Inne Etykiety
'****************************
Przelicz:
 If Wysw < 1500 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
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw1000 = Wysw_pomoc
 
    'If Wysw100000 = 0 Then Wysw100000 = 10
    'If Wysw10000 = 0 Then Wysw10000 = 0
    'If Wysw1000 = 0 Then Wysw1000 = 0
    If Wysw100 = 0 And Wysw1000 = 0 Then Wysw100 = 10       'wygaszenie zera wiodacego
    'If Poz_menu = 0 Then Wysw1000 = 0
    If Poz_menu = 0 Then Wysw10000 = 0
    If Poz_menu = 0 Then Wysw100000 = 0
 
     If Z = 0 Then
 
      Wysw1 = Lookup(wysw1 , Tabela)
      Wysw10 = Lookup(wysw10 , Tabela)
      Wysw100 = Lookup(wysw100 , Tabela)
      Wysw1000 = Lookup(wysw1000 , Tabela2)
      Wysw10000 = Lookup(wysw10000 , Tabela2)
      Wysw100000 = Lookup(wysw100000 , Tabela2)
   Else
   If Wysw = 10000 Then
      Wysw1 = 255                                           '
      Wysw10 = 255                                          '
      Wysw100 = 255
      Wysw1000 = 255
      Wysw10000 = 255
      Wysw100000 = 255                                      'wygaszony
   Else
      Wysw1 = 147                                           'Error
      Wysw10 = 187                                          '
      Wysw100 = 176                                         '
      Wysw1000 = 147                                        '
      Wysw10000 = 187                                       '
      Wysw100000 = 176                                      '
   End If
   End If
   End If
Return
 
Sterowanie:
  If Pk = 0 Then                                            'jezeli jest wlaczony przekaznik
     If Tempa >= Tempu Then Pk = 1                          'jezeli tempa dochodzi do ustawionej to wyl przekaznik
       Else                                                 'jezeli wyl przekaznik
       Tempp = Tempu - Histereza                            'punkt wylaczenia
     If Tempa < Tempp Then Pk = 0                           'jezeli tempa mniejsza niz ustawiona temp. - histereza to wlacz przek.
  End If
Return
 
Wyswietl:
   Select Case Nr_wysw
      Case 0:
            Set W6
               Portd = Wysw100000
               'Portd.4 = Kr1
            Reset W1
      Case 1:
         Set W1
               Portd = Wysw10000
               'Portd.4 = Kr5
         Reset W2
      Case 2:
         Set W2
               Portd = Wysw1000
               'Portd.4 = Kr3
         Reset W3
      Case 3:
         Set W3
               Portd = Wysw100
               'Portd.4 = Kr4
         Reset W4
      Case 4:
         Set W4
               Portd = Wysw10
               Portd.4 = Kr5
         Reset W5
      Case 5:
         Set W5
               Portd = Wysw1
               'Portd.4 = Kr6
         Reset W6
   End Select
  Incr Nr_wysw
    If Nr_wysw = 6 Then
       Nr_wysw = 0
    End If
Return
 
Tabela:
Data 80 , 95 , 49 , 21 , 30 , 148 , 144 , 93 , 16 , 20
'     0    1    2    3    4     5     6    7    8    9
Tabela2:
Data 255 , 95 , 95 , 148 , 80 , 82 , 248 , 239 , 26
'      0    1    i     s    o    u     t     .     h
Tabela3:
Data 176 , 187 , 147 , 93 , 24 , 240
   '   E     r     o    J    A     C
 
 
 
'led
' a b c d e f g dp
' 1 7 5 3 2 0 6  4

Portret użytkownika mirley

Re: termostat

Problem jest bo ustawiasz zmienne wysw1..10000 w wielu miejscach na raz i nie panujesz nad tym:

Usuń ustawianie:

Wysw1000 = 6
Wysw10000 = 5
Wysw100000 = 4

tych zmiennych z procedury i zostaw tam tylko:

Case 1:
      If Miganie = 1 Then
      Wysw = Tempu
      Else
      Wysw = 10000
      End If

podobnie z histerezą. Teraz wszystkie modyfikacje zmiennych wysw1...10000 mają być tylko w procedurze przelicz

 If Wysw < 1500 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
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw1000 = Wysw_pomoc
 
   If Wysw1000 = 0 Then Wysw1000 = 10
   If Wysw100 = 0 And Wysw1000 = 0 Then Wysw100 = 10       'wygaszenie zera wiodacego
 
   if Poz_menu = 1 then 'tempu
     Wysw1000 = 248 'tu musisz zmienic wartości na znaki które masz zapisane w tabelce, tabela 2 jest nie potrzebna 
     Wysw10000 = ?
     Wysw100000 = ?
   end if
 
   if Poz_menu = 2 then 'hist
     Wysw1000 = 248
     Wysw10000 = ?
     Wysw100000 = ?
   end if
 
   If Z = 0 Then
 
      Wysw1 = Lookup(wysw1 , Tabela)
      Wysw10 = Lookup(wysw10 , Tabela)
      Wysw100 = Lookup(wysw100 , Tabela)
      if Poz_menu = 0 then Wysw1000 = Lookup(wysw1000 , Tabela) 'tylko jeśli wyświetlana temperatura

Tabele dodatkowe poza tą z liczbami s a niepotrzebne, tylko do wyświetlania liczb wygodnie jest tak zrobić

-

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 BIGjack

re re: Termostat

Wszystko coraz ładniej śmiga.
pozmieniałem soft w/g twoich zaleceń.
Dołożyłem jeden warunek ponieważ zostawały mi na wysw10000 i wysw100000 znaki z ustawień początkowych

  If Poz_menu = 0 Then
     Wysw10000 = 255
     Wysw100000 = 255
     End If

Jeszcze zauważyłem że układ nie reaguje na odłączenie czujnika tzn. pozostawia temperature która była do momentu wyjęcia czujnika
i denerwuje że po naciśnięciu i przytrzymaniu przycisku w celu zmiany nastawy przskakuja z różnej długości zacięciami.

Portret użytkownika mirley

Re: Termometr

Zmień jeszcze w procedurze odczytu temperatury:

............
        End If
          Tempa = Tempa * 10                                'temperatura *10
          Tempa = Tempa / 16                                'wartosc 123 dla 12.3 stopnia itp.
          If Ur = 0 Then Ur = 1
       Else
          Tempa = 10000                                     'Err wyswietli wyswietlacz potem
        End If
      End If
       Enable Interrupts
..........


linijkę:

  Tempa = 10000                                     'Err wyswietli wyswietlacz potem

na

  Tempa = 20000                                     'Err wyswietli wyswietlacz potem

Cos jest nie tak ze zmienna "Z". Nie wiem do czego ona służy bo nigdzie jej nie ustawiasz poza początkiem programu. Myślę że powinno działać jak wykasujesz linijkę if Z=0 then i jeden end if z końca procedury przed "return"

-

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 BIGjack

Termometr

Faktycznie warunek if Z to blokował.
Powiedz mi jeszcze dlaczego jak włożę czujnik to najpierw pojawia sie wynik 85.0 a potem właściwa temperatura?

Portret użytkownika BIGjack

Fotki termostatu

Portret użytkownika BIGjack

Alarm

Próbowałem samodzielnie dorobić Alarm no i się zakręciłem jak słoik na zimę.
W menu dorobiłem pozycję do ustawiania progu zadziałania alarmu i zadziałało.
Jednak jak zabrałem się za wyświetlanie alarmu to narobiłem tylko bałaganu.
Chciałem aby po przkroczeniu progu alarmu zmienił się stan portuB.6 sprawdził czy napewno na wyjsciu portb.5 jest stan niski i na wyswietlaczy naprzemian wyświetlał się napis ALAr. i aktualna temperatura.
Poniżej wklejam kod po modyfikacjach.

'*********************************************************
'***********  Termostat atmega8 6 led  *******************
'*********************************************************
$regfile = "m8def.dat"
$crystal = 12000000
 
Config Portb = &B11100101 : Portb = &B10011111              '1 3 i 4 jako wejście reszta wyjścia
Config Portd = &B11111111 : Portd = &B11111111              'wszystkie wyjścia
Config Portc = &B11111111 : Portc = &B11111111              'wszystkie wyjścia
 
Config 1wire = Pinb.2
 
Config Timer0 = Timer , Prescale = 8
Enable Timer0 : On Timer0 Przerwanie0
Enable Interrupts
Load Timer0 , 200
 
W1 Alias Portc.0
W2 Alias Portc.1
W3 Alias Portc.2
W4 Alias Portc.3
W5 Alias Portc.4
W6 Alias Portc.5
 
 
Dim Lsb As Byte , Msb As Byte
Dim Nr_wysw As Byte
Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
Dim Wysw As Word , Wysw1 As Byte , Wysw10 As Byte , Wysw100 As Byte , Wysw1000 As Byte , Wysw10000 As Byte , Wysw100000 As Byte
Dim Wysw_pomoc As Word
Dim Tempa As Word , Tempu As Word , Tempp As Word , Temp1 As Byte
Dim Histereza As Byte , Alarm As Word
Dim Mux As Byte
Dim Poz_menu As Byte , Mig_al As Word
Dim Sw_licz(3) As Byte
Dim Autopowrot As Byte , Autosave As Byte
Dim Zezw_wysw As Bit , Zezw_przyciski As Bit
Dim Pomiar_odczyt As Bit
Dim Minus As Bit
Dim Ur As Bit
Dim Miganie As Bit , Mig As Byte
Dim Stan As Byte
Dim Kr5 As Bit                                              ' pomocnicza do migania
Dim P3 As Byte , P1 As Byte
 
 
Up Alias Pinb.1
Down Alias Pinb.3
Ok Alias Pinb.4
Pk_out Alias Portb.5
Pk_alarm Alias Portb.6
'****************************
      'Wartosci Poczatkowe
'****************************
 
Set Up
Set Down
Set Ok
Reset Pomiar_odczyt
Reset Ur
 
P3 = 32
P1 = 0
Poz_menu = 0
Tempu = 222
Histereza = 10
Alarm = 250
Autosave = 50
Wysw1 = 147
Wysw10 = 147
Wysw100 = 147
Wysw1000 = 147
Wysw10000 = 147
Wysw100000 = 147
Stan = 1
 
Readeeprom Histereza , 2
Waitms 100
If Histereza > 10 Then Histereza = 10
Readeeprom Tempu , 4
Waitms 100
If Tempu > 999 Then Tempu = 220
Readeeprom Alarm , 6
Waitms 100
If Alarm > 1250 Then Alarm = 250
 
'****************************
      'Petla glowna
'****************************
Do
 
If Zezw_wysw = 1 Then
  Reset Zezw_wysw                                           'co 4ms
 
  Select Case Poz_menu
    Case 0:
      Wysw = Tempa
 
    Case 1:
      If Miganie = 1 Then
      Wysw = Tempu
 
      Else
      Wysw = 10000
      End If
    Case 2:
       If Miganie = 1 Then
       Wysw = Histereza
       Else
       Wysw = 10000
       End If
 
    Case 3:
    If Miganie = 1 Then
    Wysw = Alarm
        Else
       Wysw = 10000
       End If
 
               Case 4:
 
             If Tempa >= Alarm Then
    If Miganie = 1 Then
     Wysw100 = 187
     Wysw1000 = 24
     Wysw10000 = 242
     Wysw100000 = 24
 
 
       Else
      Wysw = 10000
 
        End If
      End If
      Mig_al = 0
  End Select
 
  If Ur = 1 Then Gosub Przelicz
  Gosub Wyswietl
End If
If Zezw_przyciski = 1 Then
  Reset Zezw_przyciski                                      'co 100ms
   If Down = 0 Then                                         'plus
    Incr Sw_licz(1)
      If Sw_licz(1) = 10 Then
        Sw_licz(1) = 5
        Select Case Poz_menu
          Case 0:
    Poz_menu = 1
          Case 1:
           If Tempu < 999 Then Incr Tempu
            Autosave = 0
 
          Case 2:
           If Histereza < 50 Then Incr Histereza
           Autosave = 0
           Case 3:
           If Alarm < 1250 Then Incr Alarm
           Autosave = 0
 
        End Select
        Autopowrot = 0
      End If
  Else
    Sw_licz(1) = 8
  End If
  If Up = 0 Then                                            ' minus
    Incr Sw_licz(2)
      If Sw_licz(2) = 10 Then
        Sw_licz(2) = 5
 
        Select Case Poz_menu
          Case 0:
    Poz_menu = 2
          Case 1:
           If Tempu > 10 Then Decr Tempu
            Autosave = 0
 
          Case 2:
           If Histereza > 0 Then Decr Histereza
            Autosave = 0
 
            Case 3:
            If Alarm > 50 Then Decr Alarm
            Autosave = 0
 
 
 
 
 
        End Select
        Autopowrot = 0
      End If
  Else
    Sw_licz(2) = 8
  End If
 If Ok = 0 Then                                             'menu
    Incr Sw_licz(3)
      If Sw_licz(3) = 10 Then
        Sw_licz(3) = 5
        Incr Poz_menu
        If Poz_menu = 4 Then Poz_menu = 0
        Autopowrot = 0
      End If
  Else
    Sw_licz(3) = 8
  End If
 
 
 
   Gosub Sterowanie
 
   If Autosave < 50 Then
      Incr Autosave
      If Autosave = 50 Then
 
     Writeeeprom Histereza , 2
 
     Writeeeprom Tempu , 4
 
     Writeeeprom Alarm , 6
 
    End If
End If
 
  If Poz_menu <> 0 Then                                     'jezeli jest w menu
   Incr Autopowrot
   If Autopowrot = 200 Then Poz_menu = 0                    'wraca do wysw. temperatury po 50* 0,1s (5sekund)
  End If
  If Tempa >= Alarm Then Poz_menu = 4
    If Poz_menu = 4 Then                                    'jezeli jest w menu
   Incr Mig_al
   If Mig_al = 1000 Then Poz_menu = 0                       'wraca do wysw. temperatury po 50* 0,1s (5sekund)
  End If
End If
 
 
 
 
Loop
End
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Incr Co4ms
 If Co4ms = 15 Then
   Co4ms = 0
   '***************************************  co 4ms
   Set Zezw_wysw
   Incr Co100ms
   If Co100ms = 20 Then
     Co100ms = 0
     '*************************************** co 100 ms
     Set Zezw_przyciski                                     'zezwolenie obslugi przyciskow
     Incr Mig
     If Mig = 12 Then
     Mig = 0
      Miganie = Not Miganie                                 'umozliwia miganie cyfr podczas wyswietlania menu
    End If
     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():
          Minus = Msb.7
          Tempa = Msb * 256
          Tempa = Tempa + Lsb
            If Minus = 1 Then
            Tempa = Not Tempa
            Tempa = Tempa + 1
          End If
          Tempa = Tempa * 10                                'temperatura *10
          Tempa = Tempa / 16                                'wartosc 123 dla 12.3 stopnia itp.
          If Ur = 0 Then Ur = 1
       Else
          Tempa = 20000                                     'Err wyswietli wyswietlacz potem
        End If
      End If
       Enable Interrupts
     End If
   End If
 End If
Return
'****************************
      'Inne Etykiety
'****************************
Przelicz:
 If Wysw < 1500 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
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw1000 = Wysw_pomoc
 
 
    If Poz_menu = 1 Then                                    'tempu
     Wysw1000 = 248
     Wysw10000 = 82
     Wysw100000 = 80
   end if
 
   If Poz_menu = 2 Then                                     'hist
     Wysw1000 = 148
     Wysw10000 = 95
     Wysw100000 = 26
   End If
 
   If Poz_menu = 3 Then                                     'alarm
 
       Wysw10000 = 242
       Wysw100000 = 24
     End If
 
 
   If Poz_menu = 0 Then
     Wysw10000 = 255
     Wysw100000 = 255
     End If
 
     If Wysw1000 = 0 Then Wysw1000 = 10
    If Wysw100 = 0 And Wysw1000 = 0 Then Wysw100 = 10       'wygaszenie zera wiodacego
 
    If Poz_menu = 2 Then
    If Wysw100 = 0 Then Wysw100 = 10
    End If
 
    If Poz_menu = 3 Then
     If Wysw1000 = 0 Then Wysw1000 = 10
    If Wysw100 = 0 And Wysw1000 = 0 Then Wysw100 = 10
         End If
 
      Wysw1 = Lookup(wysw1 , Tabela)
      Wysw10 = Lookup(wysw10 , Tabela)
      Wysw100 = Lookup(wysw100 , Tabela)
      If Poz_menu = 0 Then Wysw1000 = Lookup(wysw1000 , Tabela)       'tylko jeśli wyświetlana temperatura
      If Poz_menu = 3 Then Wysw1000 = Lookup(wysw1000 , Tabela)
   Else
   If Wysw = 10000 Then
      Wysw1 = 255                                           '
      Wysw10 = 255                                          '
      Wysw100 = 255
      Wysw1000 = 255
      Wysw10000 = 255
      Wysw100000 = 255                                      'wygaszony
   Else
      Wysw1 = 255                                           'Error
      Wysw10 = 187                                          '
      Wysw100 = 147                                         '
      Wysw1000 = 187                                        '
      Wysw10000 = 187                                       '
      Wysw100000 = 176                                      '
  ' End If
   End If
   End If
 
Return
 
Sterowanie:
  If Pk_out = 0 Then                                        'jezeli jest wlaczony przekaznik
     If Tempa >= Tempu Then Pk_out = 1                      'jezeli tempa dochodzi do ustawionej to wyl przekaznik
       Else                                                 'jezeli wyl przekaznik
       Tempp = Tempu - Histereza                            'punkt wylaczenia
     If Tempa < Tempp Then Pk_out = 0                       'jezeli tempa mniejsza niz ustawiona temp. - histereza to wlacz przek.
 
 
  End If
 ' If Pk_alarm = 0 Then
  If Tempa => Alarm Then Pk_alarm = 1
  Pk_out = 0
  Poz_menu = 4
   Else
  If Tempa < Alarm Then Pk_alarm = 0
  End If
 
 
 
 
Return
 
Wyswietl:
   Select Case Nr_wysw
      Case 0:
            Set W6
               Portd = Wysw100000
               'Portd.4 = Kr1
            Reset W1
      Case 1:
         Set W1
               Portd = Wysw10000
               'Portd.4 = Kr5
         Reset W2
      Case 2:
         Set W2
               Portd = Wysw1000
               'Portd.4 = Kr3
         Reset W3
      Case 3:
         Set W3
               Portd = Wysw100
               'Portd.4 = Kr4
         Reset W4
      Case 4:
         Set W4
               Portd = Wysw10
               Portd.4 = Kr5
         Reset W5
      Case 5:
         Set W5
               Portd = Wysw1
               'Portd.4 = Kr6
         Reset W6
   End Select
  Incr Nr_wysw
    If Nr_wysw = 6 Then
       Nr_wysw = 0
    End If
Return
 
Tabela:
Data 80 , 95 , 49 , 21 , 30 , 148 , 144 , 93 , 16 , 20
'     0    1    2    3    4     5     6    7    8    9
Tabela2:
Data 255 , 95 , 95 , 148 , 80 , 82 , 248 , 239 , 26
'      0    1    i     s    o    u     t     .     h
Tabela3:
Data 176 , 187 , 147 , 93 , 24 , 240 , 242
   '   E     r     o    J    A     C    L
 
 
 
'led
' a b c d e f g dp
' 1 7 5 3 2 0 6  4

Portret użytkownika mirley

Re: Termostat

Quote:

Powiedz mi jeszcze dlaczego jak włożę czujnik to najpierw pojawia sie wynik 85.0 a potem właściwa temperatura?

To normalne na początku czujnik ma zapisaną temperaturę 85 stopni, jak wykona pierwszy pomiar to pojawi się poprawne wskazanie

Poza tym fragment z case 4:

  Case 4:
 
             If Tempa >= Alarm Then
    If Miganie = 1 Then
     Wysw100 = 187
     Wysw1000 = 24
     Wysw10000 = 242
     Wysw100000 = 24
 .....


nie powinien byc w tym miejscu, wogóle case 4 jest niepotrzebny, pisałem wcześniej że wszystko co bezpośrednio modyfikuje zmienne Wysw1.100000 ma byc w procedurze przelicz.

Aha jeszcze ten warunek jest zły: powinien być znak >= a nie => ale nie wiem czy to ma takie znaczenie, niektóre kompilatory zgłaszają błąd

If Tempa => Alarm Then Pk_alarm = 1

Dalej w tej procedurze ustaw tylko przekaźnik na odpowiedni stan a nie jakieś dodatkowe zmienne. Potem w procedurze "Przelicz" dodaj warunek że jak przekaźnik ustawiony to wyświetlaj coś specjalnego na wyśw, niezależnie co jest aktualnie na nim pokazane. Dodanie poz_wysw 4 jest niepotrzebne, a poza tym ta zmienna służy do robienia pozycji w menu, które coś pokazują. Alarm zrób tak samo jak wyświetlany jest error lub pusty wyświetlacz, przecież nie masz do tego specjalnych Poz_wysw

Ps. jak potem skończysz to możesz te zdjęcia wraz z opisem i całym gotowym kodem zamieścić na forum w dziale realizacje

-

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 BIGjack

Oczywista oczywistość

Oczywista oczywistość zaczęło działać :)
Aktualnie morduję się na wyściem z alarmu gdy zadziała.

re ps. jak się uporam .... to zamieszczę ;)

Portret użytkownika BIGjack

Autopowrot z alarmu

Raczej sobie nie poradzę z tym autopowrotem, Chcę aby wyświetlał się alarm wraz z wyjściem alarm i czekał na skasowanie przyciskiem lub automatycznie po czasie x. Nastepnie alarm załącza się po nastepnym przekroczeniu. Jak to zrobić?

Portret użytkownika BIGjack

Jak wyjść z tego alarmu???

 If Pk_alarm = 1 Then
   If Miganie = 1 Then
      Poz_menu = 0
   Else
      Wysw1 = 255
      Wysw10 = 95
      Wysw100 = 26
      Wysw1000 = 255
      Wysw10000 = 226
      Wysw100000 = 24
 End If

Miga naprzemian AL. HI. z temperaturą. Nie wiem jak ubrać w bascom wyjście automatyczne lub przyciskiem z warunku i aby nie powrócił do alarmu w tym przkroczeniu które zasygnalizowal. HELP ME!!!!!!!!!!!!!!!!!

Portret użytkownika mirley

Re: Alarm

Przecież pisałem wcześniej jak masz to zrobić.... Ustawianie przekaźnika ma być tam gdzie jest ale uzupełnione o zmienną Alarm_en typu bit:

If Tempa >= Alarm and Alarm_en = 1 Then 
   Pk_alarm = 1
   'tutaj dodatkowe rzeczy mogą być
Else
   Pk_alarm = 0
   'tutaj dodatkowe rzeczy mogą być
   if  Tempa < Alarm then Alarm_en = 1
 
End If

W procedurze przelicz możesz coś wyświetlić na warunku:

If Pk_alarm = 1 and Alarm_en = 1 Then

w obsłudze przycisków trzeba dodać: If Pk_alarm = 1 then Alarm_en = 0

-

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

Portret użytkownika BIGjack

re re: Alarm

Ja rozumiem ale problem polega na tym że brak jest możliwości wyjścia z pętli alarmy gdy temperaturaprzekroczy próg alarmu.
Ja chcę aby układ przestał po zadanym odcinku czasu sygnalizować alarm i mieć możliwość wyłączenia go np przyciskiem ok i żeby sygnalizował dopiero następne przekroczenie.
Teraz alarm wyłącza sie tylko jak spadnie temperatura poniżej progu alarmu.

Portret użytkownika mirley

Re: Termostat

po to własnie maż zmienną Alarm_en, jesli w procedurze obsługi przycisku dasz linijkę

If Pk_alarm = 1 then Alarm_en = 0

to wtedy jeśli alarm jest właczony to zostanie on zablokowany. Ponowne odblokowanie alarmu nastąpi jeśli temperatura spadnie poniżej alarmowej, zgodnie z fragmentem który napisałem wcześniej.

Dodatkowo jeśli dołożysz pod flagą Co1s kilka linijek:

...........
If Co1s = 5 Then
       Co1s = 0
       '*************************************** co 1s
 
 
       If Pk_alarm = 1 and Alarm_en = 1 Then
         incr alarm_licz
         if alarm_licz = 60 then Alarm_en = 0
       else 
         alarm_licz = 0
       end if
 
 
 
       Pomiar_odczyt = Not Pomiar_odczyt
...........

to będzie się automatycznie wyłaczał po 30 sekundach

-

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 BIGjack

re Re Termostat

Doszedłem w końcu do ładu z tym dziadostwem.
Niestety działa tylko wtedy gdy usunę linijkę
If Pk_alarm = 1 then Alarm_en = 0 z procedury obsługi przycisków.
Na logikę to ten warunek wyłącza alarm zanim pojawi mi się komunikat na wyświetlaczu.
Układ działa idealnie z automatycznym wyłączaniem ale bez w/w warunku.

Portret użytkownika BIGjack

2 czujniki

Myślałeś już może nad tym jak poskromić dwa czujniki? Jeżeli nie to ja w akcie desperacji zamotuje przekaźniczek zamieniający nogi 1wire czujników.

Portret użytkownika mirley

Re; Alarm termostat

W którym miejscu wstawiłeś ta linijkę:

If Pk_alarm = 1 then Alarm_en = 0 

Przecież procedura nie wywołuje sie jak nie naciśniesz przycisku więc skąd miało by się samo wyłączyć

.........
  If Sw_licz(1) = 10 Then
        Sw_licz(1) = 5
        Select Case Poz_menu
          Case 0:
           Poz_menu = 1
           If Pk_alarm = 1 then Alarm_en = 0   '<<<<<<<<<<<<<<np tutaj może być. 
          Case 1:
.........

nad czujnikami nie myslałem i narazie mam inne zmartwienia niz DSy

-

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 BIGjack

re Re; Alarm termostat

Dzięki wielkie mirley, działa wszystko jak należy.
Oczywiście wstawiłem linijkę nie tam gdzie trzeba no i dostałem za swoje (poleciało trochę słówek na K he he he)
pozdr.