Minitermometr Uniwersalny


9.6
Ocena: None Średnia: 9.6 (10 głosujących)

Opisywany tutaj układ jest uniwersalnym termometrem dwukanałowym. Pracuje on w zakresie temperatur od -50.0 do +99.9 stopni. Układ został zaprojektowany do mierzenia temperatury w domu i na dworze ale z powodzeniem można dla niego znaleźć wiele innych zastosowań. Po zmianie oprogramowania urządzenie może pełnić funkcję prostego termostatu, lub bardziej złożonego regulatora temperatury. Układ został zbudowany w oparciu o popularny, często stosowany czujnik/czujniki DS18B20 i mikrokontroler ATTiny2313 co znacznie uprościło jego konstrukcję i zmniejszyło wymiary. Termometr udało się tak skompresować, że prawie wszystkie elementy mieszczą się pod typowym wyświetlaczem 3-cyfry o wysokości rzędu 15mm. Projekt jest rozwinięciem układu dostępnego tutaj z tym że prawie wszystkie elementy zostały zmienione na komponenty SMD. Oczywiście można by było upakować bardziej elementy przewlekane jednak w dobie miniaturyzacji lepiej zrobić jeden krok dalej, budując układ o możliwie najmniejszych wymiarach. Daje to możliwość zamontowania gotowego modułu termometru lub prostego termostatu w już istniejące urządzenie lub zastosowanie obudowy niewiele większej od wyświetlacza. W wersji podstawowej termometr potrafi mierzyć dwie temperatury, wykorzystując dwa czujniki podłączone na niezależnych magistralach. Zmiany wyświetlanej aktualnie temperatury dokonuje się za pomocą dwóch przycisków.

Projekt został opublikowany w Elektronice dla Wszystkich 08/2011 i jest dostępny w postaci kitu AVT2985

Działanie:


Schemat ideowy układu znajduje się na rysunku poniżej:

Sercem urządzenia jest mikrokontroler U1 (ATTINY2313), który pracuje na wewnętrznym oscylatorze, bez dzielnika częstotliwości. Daje to w efekcie taktowanie 8MHz. Brak rezonatora kwarcowego pozwolił zmniejszyć płytkę a dodatkowo umożliwił wykorzystanie wolnego pinu XTAL jako portu wejściowego PA0, do którego obecnie dołączony jest przycisk S2. Zadaniem mikrokontrolera jest odczyt pomiaru temperatury z dwóch czujników, przeliczanie wskazań do postaci dogodnej dla wyświetlania i obsługa przycisków S1 i S2. Kondensator C1 (100nF), umieszczony blisko mikrokontrolera filtruje jego napięcie zasilania podobnie jak kondensatory C2 (10uF) i C3 (10uF), które są konieczne do prawidłowej pracy stabilizatora U3 (78L05).

Prostota układu wynika z zastosowanego czujnika temperatury, którym tym przypadku jest Ds18B20. Stanowi on w typowym ustawieniu 12-bitowy termometr cyfrowy mogący pracować w zakresie -55 do +125 stopni. Czas przetwarzania (konwersji) temperatury do wartości binarnej (liczby) trwa nie dłużej niż 750ms. Odczyt temperatury jest w pełni cyfrowy, a łączność z mikrokontrolerem zapewnia popularna magistrala 1-Wire.

Do prezentacji temperatury wykorzystywany jest trój-cyfrowy wyświetlacz LED (AT5636BMR-B) z wewnętrznie połączonymi segmentami, przystosowanymi do multipleksowania. Znakomicie ułatwia to proces projektowania płytki. W tym przypadku zastosowanie trzech pojedynczych wyświetlaczy uniemożliwiło by wykonanie taniej jednostronnej płytki drukowanej. Rezystory R4-R11 ograniczają prąd wyświetlacza LED do wartości maksymalnej rzędu 10-12mA (na segment). Średni prąd będzie jednak mniejszy ze względu na multipleksowanie. Do sterowania anodami wyświetlacza wykorzystywane są trzy popularne tranzystory T1-T3 (BC857). Ich prądy baz ograniczane są przez rezystory R1-R3 (3,3k). Zaświecanie cyfr na kolejnych wyświetlaczach odbywa się poprzez cykliczne podawanie stanu niskiego na bazę jednego z tranzystorów T1-T3. W tej same chwili na porcie B mikrokontrolera powinna pojawić się zakodowana wartość odzwierciedlająca wyświetlany znak.

Ważnym komponentem jest tutaj złącze GP1, które stanowi jednocześnie miejsce podłączenia czujników oraz wyjście sterowania (w przypadku budowy termostatu). Nie trzeba tutaj montować złącza goldpin, jak w projekcie modelowym, wystarczy wlutować przewody bezpośrednio w płytkę. W programie termometru stan niski na wyjściu sterowania pojawia się gdy temperatura jest ujemna. Wystarczy dołączyć diodę LED z szeregowym rezystorem 470R między to wyjście a +5V aby mieć sygnalizację znaku "-".

Budowa:


Układ z powodzeniem można zbudować w oparciu o płytkę drukowaną dostępną tutaj. Rysunek w odbiciu lustrzanym dostępny jest tutaj. Pomocą w konstrukcji będzie schemat montażowy termometru znajdujący się tutaj, natomiast elementy SMD można z łatwością zamontować posługując się rysunkiem dostępnym tutaj. Płytka została zaprojektowana jako jednostronna, a prawie wszystkie elementy są typu SMD. Wyjątek stanowią tu wyświetlacz, przyciski i złącza. Montaż nie jest skomplikowany ale wymaga niewielkiej wprawy w lutowaniu SMD. Na samym początku dobrze jest przylutować właśnie te elementy, ponieważ brak wystających części z drugiej strony ułatwi montaż. Należy zwrócić uwagę że obwód masy przechodzi w jednym miejscu przez zworkę jaką tworzy przycisk (przycisk ma 4 wyprowadzenia parami zwarte). Gdyby zaszła konieczność rezygnacji z przycisków to zamiast S1 należy wlutować zworkę po stronie masy (kolor czerwony). Wadą małej płytki jest brak wyprowadzonego złącza programującego procesora, więc gdyby zaszła konieczność zmiany programu będzie trzeba przylutować kabelek programujący do pinów mikrokontrolera. W roli złącza zasilania podobnie jak w przypadku GP1 dobrze sprawdzają się kabelki przylutowane bezpośrednio do płytki.

Opis pinów złącza GP1 przedstawiony jest na rysunku poniżej:

Wyprowadzenia 1 i 2 tego złącza to odpowiednio: zasilanie i masa. Wyjście sterowania (OUT) jest tutaj dostępne na pinie 3. Czujniki należy podłączyć trój-przewodowo wykorzystując wyprowadzone zasilanie, masę i linie sygnałowe 5 i 6. Linia danych czujnika pierwszego ma zostać podłączona do pinu 5, a z czujnika drugiego do pinu 6 złącza GP1. Układ termometru zasilany jest napięciem z przedziału 7-12V dzięki obecności stabilizatora 78L05. Nic nie stoi na przeszkodzie aby pominąć stabilizator a napięcie zasilania 5V podać bezpośrednio na termometr.

Wykaz Elementów:

2x uSwitch

3x 3,3k SMD/0805
2x 4,7k SMD/0805
8x 330R SMD/0805

2x 10uF SMD/3216A Tantalowy
1x 100nF SMD/0805

3x BC857
1x 78L05 SMD/SOT89
1x ATTINY2313 SMD/SO20
1x LED-AT5636BMR (Wyświetlacz potrójny)

Programowanie:


Program sterujący pracą termometru został napisany w dobrze znanym programie BASCOM AVR . Zajmuje on około 70% dostępnej pamięci mikrokontrolera i może być z powodzeniem kompilowany w wersji demo BASCOM'a. Działanie programu nie jest skomplikowane i w skrócie wygląda to następująco: cały czas procesor kręci się w nieskończonej pętli Do Loop, czekając na ustawienie jednej z flag taktujących w przerwaniu. Za odpowiednie taktowanie odpowiada Timer0. Co około 4ms wywoływana jest procedura multipleksowania wyświetlacza, z której w odpowiednim momencie następuje skok do odczytu temperatury.

Procedura obsługi przerwania Timera0 widoczna jest poniżej:

Przerwanie0:
Timer0 = 131
   Set F4ms
   Incr Dziel(1)
   If Dziel(1) = 25 Then
     Dziel(1) = 0
     Set F100ms
     Incr Dziel(2)
     If Dziel(2) = 10 Then
       Dziel(2) = 0
       Set F1s
     End If
   End If
Return

Na początku do licznika timera ładowana jest wartość 131, daje to przerwanie po odliczeniu 125 impulsów (256-131). Timer pracuje z dzielnikiem sprzętowym przez 256 co przy częstotliwości taktowania 8MHz daje przerwanie co 4ms. Bezpośrednio po wystąpieniu przerwania ustawiana jest flaga F4ms. Zmienne Dziel(1) i Dziel(2) stanowią dzielnik częstotliwości. Pierwsza odpowiada za podział przez 25 i po przepełnieniu licznika ustawiana jest flaga F100ms (następuje to co 100ms). Druga zmienna jest licznikiem do 10 i zapewnia ustawianie flagi F1s co 1s.

Pętla główna widoczna jest poniżej:

Do
 
If F4ms = 1 Then
  Reset F4ms                                                'co 4ms
  Wysw = T
  Gosub Wyswietl_zmierz
End If
 
If F100ms = 1 Then
  Reset F100ms                                              'co 100ms
  If Pind.2 = 0 Then Kanal = 1
  If Pina.0 = 0 Then Kanal = 0
End If
 
Loop
End

Działanie jest bardzo proste i zależne tylko od flag: F4ms i F100ms. Przez większość czasu procesor kręci się w nieskończonej pętli Do Loop czekając na ustawienie jednej z flag. Co 4ms wywoływana jest procedura obsługująca wyświetlacz i pomiar temperatury, natomiast co 100ms odczytywane są stany klawiszy. W podstawowej wersji programu wystarczy prosta obsługa klawiatury poprzez bezpośredni odczyt stanu pinów wejściowych. Naciśnięcie S1 powoduje przejście do odczytu drugiego czujnika, natomiast naciśnięcie S2 przechodzi do czytania czujnika pierwszego.

Procedura obsługi wyświetlacza i pomiaru temperatury widoczna jest poniżej:

Wyswietl_zmierz:
  Incr Mux
  If Mux = 5 Then Mux = 0
 
  Portd.3 = Not Minus
 
  For I = 1 To 3
    Wysw_pomoc = Wysw Mod 10
    Ww = Wysw_pomoc
    W(i) = Lookup(ww , Tabela)
    Wysw = Wysw / 10
  Next I
  If W(3) = 40 Then W(3) = 255           'wygaszenie zera wiodącego
 
  Select Case Mux
    Case 0:
      Portb = W(3)
      Reset Portd.6
    Case 1:
     Set Portd.6
     Portb = W(2) And &B11011111
     Reset Portd.5
    Case 2:
     Set Portd.5
     Portb = W(1)
     Reset Portd.4
    Case 3:
     Set Portd.4
     Portb = 255
     Gosub Temp
    'Case 4:  
  End Select
Return
 
Tabela:
    Data 40 , 235 , 50 , 162 , 225 , 164 , 36 , 234 , 32 , 160

Działanie składa się z 5 kroków zależnych od stanu zmiennej pomocniczej Mux. Przyjmuje ona wartości od 0 do 4 i zmienia się cyklicznie z kolejnym wywołaniem procedury. Na wyjście sterowania (Portd.3) przepisywana jest zanegowana wartość zmiennej Minus. Odpowiada ona za wyświetlanie ujemnych temperatur i tym samym na porcie d.3 mikrokontrolera pojawia się stan niski gdy mierzona temperatura jest ujemna. W dalszej kolejności dzięki pętli for, zmienna Wysw, zawierająca wartość do wyświetlenia, dzielona jest na trzy pojedyncze cyfry. Następnie są one zamieniane na kody wyświetlacza LED za pomocą polecenia Lookup (z wykorzystaniem tabeli przeliczeniowej). Po wyjściu z pętli for uzyskuje się tablicę W(n) z zakodowanymi wartościami, gdzie n=1...3 indeksuje kolejne znaki wyświetlacza.

Dalsza część procedury zależy od zmiennej Mux. Dla wartości 0 do 2 zaświecane są kolejne cyfry poprzez wyłączenie poprzedniej anody, wystawienie na Portb wartości kolejnego znaku i włączenie odpowiadającej mu anody. Wyjątkiem jest tutaj znak W(2) gdzie dodatkowa operacja (And &B11011111) zapewnia dodanie kropki dziesiętnej po drugim znaku. Dla wartości Mux=3 wywoływana jest procedura pomiaru temperatury, a stan Mux=4 jest fazą oczekiwania na spokojne zakończenie pomiaru temperatury.

Procedura pomiaru temperatury widoczna jest poniżej:

Temp:
 If F1s = 1 Then
   Reset F1s
   1wreset Pind , Kanal
   1wwrite &HCC , 1 , Pind , Kanal
   1wwrite &HBE , 1 , Pind , Kanal
   T = 1wread(2 , Pind , Kanal):
   Minus = T.15
   T = Abs(t)
   T = T * 10
   T = T / 16
   1wreset Pind , Kanal
   1wwrite &HCC , 1 , Pind , Kanal
   1wwrite &H44 , 1 , Pind , Kanal
  End If
Return  

Procedura ta wywoływana jest co okoł0 20ms, jednak wykonywanie pomiaru odbywa się co 1s dzięki sprawdzaniu stanu flagi F1s. Występuje tutaj typowa obsługa magistrali 1-Wire dla przypadku obecności tylko jednego układu na magistrali. Wszystkie rozkazy 1-Wire wywoływane są z parametrem Kanal, który odpowiada za to z której magistrali temperatura ma być odczytana (pind.0 czy pind.1). Po wykonaniu resetu następuje wysłanie rozkazu pominięcia sprawdzania ROM oraz wysłanie rozkazu odczytu rejestru DS18B20. Następnie odczytywane są dwa bajty temperatury do zmiennej T (integer), określany jest znak temperatury i wykonywane są proste przeliczenia. W efekcie zmienna T przyjmuje postać temperatury w stopniach pomnożonej przez 10 (np. 13 to 1.3 stopnia). Na samym końcu wysyłany jest rozkaz konwersji temperatury aby w kolejnym odczycie uzyskać aktualną jej wartość.

Fusebity mikrokontrolera powinny być ustawione na pracę z wewnętrznym oscylatorem RC o częstotliwości 8MHz, co w praktyce sprowadzi się do wyłączenia jedynie dzielnika sprzętowego (Bit CKDIV). Ustawienia fusebitów, zrzut z programu burn-o-mat znajduje się poniżej:

Układ da się przerobić na termostat niewielkim nakładem pracy. Rezygnujemy wtedy z dwukanałowego pomiaru temperatury oraz ujemnych temperatur na koszt sterowania wyjściem. Do wyjścia sterowania (Portd.3) można dołączyć optotriaka i triaka sterującego dowolnym odbiornikiem prądu przemiennego lub można dołączyć tranzystor MOSFET sterujący odbiornikiem prądu stałego. W pętli głównej trzeba będzie wprowadzić modyfikacje widoczne poniżej:

If F4ms = 1 Then
  Reset F4ms
  If Ust = 0 Then Wysw = T Else Wysw = Tu
  Gosub Wyswietl_zmierz
End If
 
If F100ms = 1 Then
  Reset F100ms
  If Pind.2 = 0 Then
    Incr Tu
    Autoret = 20
  End If
  If Pina.0 = 0 Then
    Decr Tu
    Autoret = 20
  End If
 
  If Autoret > 0 Then
    Ust = 1
    Decr Autoret
  Else
    Ust = 0
  End If
 
  H = Tu + 10
  L =  Tu - 10
 
  If T > H Then Set Portd.3
  If T < L Then Reset Portd.3
End If

Taki kod wymaga zadeklarowania zmiennych Tu, H oraz L jako Integer oraz Ust jako Bit i Autoret jako Byte, na początku programu. Dodatkowo zmienna Tu powinna mieć wartość początkową, gdyż stanowi wartość temperatury ustawianej. W procedurze wyświetlania i mierzenia należy usunąć linijkę odpowiedzialna za sygnalizację ujemnych temperatur, gdyż portd.3 służy teraz jako wyjście sterowania. Przedstawione rozwiązanie nie jest idealne, nie ma żadnego ograniczenia na ustawiane wartości ani nie potrafi zapisywać ustawień do pamięci EEPROM ale w wielu sytuacjach znakomicie się sprawdzi. Może działać z powodzeniem jako termostat do trawiarki po ustawieniu domyślnej wartości Tu na 40 stopni.

Zdjęcia Projektu:

ZałącznikWielkość
Schemat61.36 KB
Płytka10.73 KB
Płytka (odbicie lustrzane)10.7 KB
Płytka (24 na stronie)157.02 KB
Montowanie (warstwa elementów)8.66 KB
Montowanie (warstwa druku)13.73 KB
Opis (warstwa elementów)53.3 KB
Opis (warstwa druku)100.45 KB
Soldermaska96.35 KB
Kod Źródłowy (termometr)3.11 KB
Program po kompilacji (bin) (termometr)1.44 KB
Program po kompilacji (hex) (termometr)4.06 KB
Kod Źródłowy (termostat)3.37 KB
Program po kompilacji (bin) (termostat)1.63 KB
Program po kompilacji (hex) (termostat)4.6 KB



Portret użytkownika mirley

Re: Termometr

Edytuj swój post 49 aby kod był prawidłowy, resztę skasuje jak to zrobisz i nie będzie to nikogo wprowadzać w błąd

-

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 oldname

Eliminacja drgan styków

Zgodnie z sugestią z postu #46 po deklaracji zmiennej Licznik jako Byte, wkleiłem do kodu taki warunek:

      'Petla glowna
'****************************
 
Readeeprom Tu , 1
Readeeprom Th , 10
 
Do
 
If F4ms = 1 Then
  Reset F4ms
 
    Select Case Menu
 
      Case 0:
      Minus = T.15
      Wysw = Abs(t)
      Gosub Wyswietl_zmierz
      Case 1:
      Minus = Tu.15
      Wysw = Abs(tu)
      Gosub Wyswietl_zmierz
      Case 2:
      Wysw = Abs(th)
      Gosub Wyswietl_zmierz
 
   End Select
 
      If Pina.0 = 0 And Pind.2 = 0 Then
       If Ust = 0 Then
        Ust = 1
        Incr Menu
       End If
        Else
        Ust = 0
      End If
 
     If Pina.0 = 0 Or Pind.2 = 0 Then
       Incr Licznik
      If Licznik = 100 Then
       Licznik = 0
End If
 
   If F100ms = 1 Then
   Reset F100ms
 
   Select Case Menu
 
      Case 0:
 
      If Pina.0 = 0 Then
        Kanal = 0
      End If
 
      If Pind.2 = 0 Then
        Kanal = 1
      End If
 
     Case 1:
 
      If Pind.2 = 0 Then
        Incr Tu
      End If
 
      If Pina.0 = 0 Then
        Decr Tu
      End If
 
     Case 2:
 
      If Pind.2 = 0 Then
       Incr Th
      End If
 
      If Pina.0 = 0 Then
       Decr Th
      End If
 
     Case 3:
 
      Gosub Zapistu
      Gosub Zapishi
        Menu = 0
 
   End Select
 
  End If
   Else
   Licznik = 80
 End If
 
    H = Tu + Th
    L = Tu - Th
 
  If T > H Then Reset Portd.3
  If T < L Then Set Portd.3
End If
 
Loop
End

Niby działa ale czasami się zawiesza czego wcześniej nie zauważyłem.
Nie wiem czy ta eliminacja drgań jest konieczna jeżeli bez niej działało.
Chciałbym jeszcze mieć możliwośc blokady ustawiania termostatycznego jednej z temperatur. Jak to zrobić? Zostało 10% flesha.

-

oldname

Portret użytkownika oldname

Minitermometr z termostatem

Czas urlopowy ale przedstawię całościowo jak problem wygląda i czy da się coś jeszcze zrobić z tym kodem.
Tak jak ?minitermometr? mierzy i pokazuje dwie temperatury .Dodatkowo trzeba zamontować przycisk S3 podający GND przez diody na piny A0 i D2 czyli tam gdzie podłączone są przyciski S1 i S2 a to umożliwia przełączanie ?Menu?.
Menu 0: pierwszy termometr jako termostat
Menu 1: drugi termometr
Menu 2: ustawienia temperatury termostatu
Menu 3: ustawienie histerezy termostatu
Ustawienia Menu 2 i 3 zapisywane są w pamięci eeprom
Zakres wyświetlanej temperatury to -55 do+99stopni C
Dioda przed wyświetlaczem pokazuje czy temperatura mierzona jest ujemna oraz czy temperatura ustawiana w termostacie jest ujemna.
Niestety ale program czasami się zawiesza a wyświetlacze leciutko mrugają co sekundę. Brak eliminacji drgań styków. Zostało 7% flesha.
Sporo się nauczyłem analizując ten kod ale teraz jedyny ratunek to pomoc forumowiczów a szczególnie twórcy tego projektu kolegi Mirka. Poniżej kod w całości:

     '****************************
           'Konfiguracja
'****************************
 
$regfile = "attiny2313.dat"
$crystal = 8000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11111011 : Portd = &B11111111
Config Porta = &B00000010 : Porta = &B11111111
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Przerwanie0
 
Enable Interrupts
'****************************
      'Zmienne
 
'****************************
Dim Dziel(2) As Byte
Dim Wysw As Word , Ww As Byte , W(3) As Byte
Dim Wysw_pomoc As Word
Dim Tt As Integer , Tu As Integer , Tm As Integer
Dim H As Integer , L As Integer , Th As Integer
Dim Mux As Byte , I As Byte
Dim Ust As Bit
Dim Menu As Byte
Dim F1s As Bit , F4ms As Bit , F100ms As Bit
Dim Minus As Bit
'****************************
      'Wartosci Poczatkowe
'****************************
 Menu = 0
'****************************
      'Petla glowna
'****************************
 
Readeeprom Tu , 1
Readeeprom Th , 10
 
Do
 
If F4ms = 1 Then
  Reset F4ms
 
    Select Case Menu
 
      Case 0:
      Minus = Tt.15
      Wysw = Abs(tt)
      Gosub Wyswietl_zmierz
      Case 1:
       Minus = Tm.15
      Wysw = Abs(tm)
      Gosub Wyswietl_zmierz
      Case 2:
      Minus = Tu.15
      Wysw = Abs(tu)
      Gosub Wyswietl_zmierz
      Case 3:
      Wysw = Abs(th)
      Gosub Wyswietl_zmierz
 
   End Select
 
    If Pina.0 = 0 And Pind.2 = 0 Then                       '
       If Ust = 0 Then
          Ust = 1
         Incr Menu
       End If
         Else
          Ust = 0
    End If
 
End If
 
   If F100ms = 1 Then
   Reset F100ms
 
   Select Case Menu
 
     Case 2:
 
      If Pind.2 = 0 Then
        Incr Tu
      End If
 
      If Pina.0 = 0 Then
        Decr Tu
      End If
 
     Case 3:
 
      If Pind.2 = 0 Then
       Incr Th
      End If
 
      If Pina.0 = 0 Then
       Decr Th
      End If
 
     Case 4:
 
      Gosub Zapistu
      Gosub Zapishi
        Menu = 0
 
   End Select
 
    H = Tu + Th
    L = Tu - Th
 
  If Tt > H Then Reset Portd.3
  If Tt < L Then Set Portd.3
End If
 
Loop
End
 
'****************************
   'zapis
'****************************
 
Zapistu:
 
   Disable Interrupts
   Writeeeprom Tu , 1
   Enable Interrupts
 
Return
 
Zapishi:
 
   Disable Interrupts
   Writeeeprom Th , 10
   Enable Interrupts
 
Return
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 131
   Set F4ms
   Incr Dziel(1)
   If Dziel(1) = 25 Then
     Dziel(1) = 0
     Set F100ms
     Incr Dziel(2)
     If Dziel(2) = 10 Then
       Dziel(2) = 0
       Set F1s
     End If
   End If
Return
'****************************
      'pomiar temp
'****************************
Temp:
 If F1s = 1 Then
   Reset F1s
   1wreset Pind , 0
   1wwrite &HCC , 1 , Pind , 0
   1wwrite &HBE , 1 , Pind , 0
   Tt = 1wread(2 , Pind , 0):
   Tt = Tt * 10
   Tt = Tt / 16
   1wreset Pind , 0
   1wwrite &HCC , 1 , Pind , 0
   1wwrite &H44 , 1 , Pind , 0
 
   1wreset Pind , 1
   1wwrite &HCC , 1 , Pind , 1
   1wwrite &HBE , 1 , Pind , 1
   Tm = 1wread(2 , Pind , 1):
   Tm = Tm * 10
   Tm = Tm / 16
   1wreset Pind , 1
   1wwrite &HCC , 1 , Pind , 1
   1wwrite &H44 , 1 , Pind , 1
  End If
Return
'****************************
      'wyswietlanie i wywolywanie pomiaru
'****************************
Wyswietl_zmierz:
   Incr Mux
  If Mux = 5 Then Mux = 0
 
  Porta.1 = Not Minus
 
  For I = 1 To 3
    Wysw_pomoc = Wysw Mod 10
    Ww = Wysw_pomoc
    W(i) = Lookup(ww , Tabela)
    Wysw = Wysw / 10
  Next I
 
    If W(3) = 40 Then W(3) = 255
 
 Select Case Mux
 
    Case 0:
      Portb = W(3)
      Reset Portd.6
 
    Case 1:
     Set Portd.6
     Portb = W(2) And &B11011111
     Reset Portd.5
 
    Case 2:
     Set Portd.5
     Portb = W(1)
     Reset Portd.4
 
    Case 3:
     Set Portd.4
     Portb = 255
     Gosub Temp
 
    'Case 5:                                                 'opoznienie na odczyt temp, jeśli nie ma to miga wyswietlacz
 
  End Select
Return
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 40 , 235 , 50 , 162 , 225 , 164 , 36 , 234 , 32 , 160
'Znak : 0 1 2 3 4 5 6 7 8 9

-

oldname

Portret użytkownika mirley

Re: Termometr

Twoja procedura pomiaru temperatury jest dwa razy dłuższa niż moja..... spróbuj wywalić na czas testów pomiar jednego czujnika i zobacz czy też się zawiesza program

-

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 oldname

Zawieszanie

Sam z siebie się nie zawiesza tylko wtedy jak intensywnie gmeram po klawiaturze a szczególnie po S3. Co do pomiaru temperatury to jak masz jakiś prosty sposób na uniknięcie wpływu jednego z Ds na termostat to byłbym bardzo wdzięczny za podpowiedzi.Po wykasowaniu z kodu jednego z Ds jest lepiej , zawiesił się tylko raz przy bardzo intensywnych zmianach "Menu".

-

oldname

Portret użytkownika mirley

Re: Program

Po pierwsze wywal Gosub Wyswietl_zmierz poza case z menu, po co w każdym z przypadków wywoływać to polecenie jak i tak za każdym razem się wykonuje. Obsługa jednoczesnego kliknięcia obu klawiszy też powinna byc tam gdzie pozostałe klawisze ale poza case z menu.

Co do pomiaru temperatur to dał bym tak jak w programie oryginalnym zmienna kanal i mierzył raz jeden raz drugi kanal. Nie potrzeba aż tak częstego pomiaru

-

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 oldname

Pomiar temperatury

Zrobiłem tak

If F4ms = 1 Then
  Reset F4ms
 
    Select Case Menu
 
      Case 0:
      Minus = Tt.15
      Wysw = Abs(tt)
 
     ' Case 1:
'       Minus = Tm.15
'      Wysw = Abs(tm)
 
      Case 1:
      Minus = Tu.15
      Wysw = Abs(tu)
 
      Case 2:
      Wysw = Abs(th)
 
 
   End Select
 
    Gosub Wyswietl_zmierz
 
End If
 
   If F100ms = 1 Then
   Reset F100ms
 
    If Pina.0 = 0 And Pind.2 = 0 Then                       '
       If Ust = 0 Then
          Ust = 1
         Incr Menu
       End If
         Else
          Ust = 0
    End If
 
   Select Case Menu
i działa.
Przy pomiarze temperatury z zmienną Kanal temperatura zapisywana jest w zmiennej T z obu Ds, przez co jak ustawię jakąś temperaturę zadaną w termostacie np.z Ds bojlera to jak zmienię odczyt, na Ds pieca to termostat włączy lub wyłączy pompkę nie według temperatury bojlera ale według temperatury pieca.

-

oldname

Portret użytkownika oldname

Zmienna Kanal

Popełniłem coś takiego

 If Kanal = 0 Then
   Tt = T
   End If
 
  If Tt > H Then Reset Portd.3
  If Tt < L Then Set Portd.3

Wygląda na to że działa . Dokładnie posprawdzam wieczorem.

-

oldname

Portret użytkownika oldname

Zmienna Kanal

Niestety tak to też nie działa. Chyba jednak trzeba, by każdy z Ds zapisywał do osobnych zmiennych.

-

oldname

Portret użytkownika mirley

Re: Termometr

Zrób ze zmiennej T tablicę i zapisuj wynik do T(Kanal+1), tablice są niestety indeksowane od 1 więc Kanal+1 trzeba dać

-

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 oldname

Minitermometr z termostatem

Zazdroszczę

Quote:
Taaakich
umiejętności programowania. Wpisałem jak poradziłeś i działa. Zapisałem to tak:
Temp:
 If F1s = 1 Then
   Reset F1s
 
   1wreset Pind , Kanal
   1wwrite &HCC , 1 , Pind , Kanal
   1wwrite &HBE , 1 , Pind , Kanal
   T(kanal + 1) = 1wread(2 , Pind , Kanal):
   T(kanal + 1) = T(kanal + 1) * 10
   T(kanal + 1) = T(kanal + 1) / 16
   1wreset Pind , Kanal
   1wwrite &HCC , 1 , Pind , Kanal
   1wwrite &H44 , 1 , Pind , Kanal
 
 End If
 Return

Zostało 138 bajtów. Chciałbym jeszcze zabezpieczyć termostat przed uszkodzeniem czujnika czyli by na PORTD.3 wystąpił reset. Wpisałem If-a po 1wreset
 If  Err = 1 Then
   Reset Portd.3
    End If

i resetuje ale co sekundę ( flaga co 1s) a przy Kanal = 1 nie wyświetla temperatury (chyba traktuje jak błąd czujnika). Czy jest na to jakiś sposób?

-

oldname

Portret użytkownika mirley

Re: Err

Daj Sprawdzanie Err po odczycie z czujnika a nie po resecie 1 wire.... po resecie nie wiem co się ustawia w tej zmiennej.

-

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 oldname

Err

Bardzo mało informacji w pomocy i necie na temat zmiennej Err czy znaczniku błędu. Po sporej gimnastyce zmiennymi napisałem coś takiego i na razie działa.

Temp:
 
 If F1s = 1 Then
   Reset F1s
 
   1wreset Pind , Kanal
   Brakds(kanal + 1) = Err
   1wwrite &HCC , 1 , Pind , Kanal
   1wwrite &HBE , 1 , Pind , Kanal
   T(kanal + 1) = 1wread(2 , Pind , Kanal):
   T(kanal + 1) = T(kanal + 1) * 10
   T(kanal + 1) = T(kanal + 1) / 16
   1wreset Pind , Kanal
   1wwrite &HCC , 1 , Pind , Kanal
   1wwrite &H44 , 1 , Pind , Kanal
 
 End If
 Return

oraz
   If F100ms = 1 Then
   Reset F100ms
 
    If Pina.0 = 0 And Pind.2 = 0 Then                       '
       If Ust = 0 Then
          Ust = 1
         Incr Menu
       End If
         Else
          Ust = 0
    End If
 
   Select Case Menu
 
     Case 2:
 
      If Pind.2 = 0 Then
        Incr Tu
      End If
 
      If Pina.0 = 0 Then
        Decr Tu
      End If
 
     Case 3:
 
      If Pind.2 = 0 Then
       Incr Th
      End If
 
      If Pina.0 = 0 Then
       Decr Th
      End If
 
     Case 4:
 
      Gosub Zapistu
      Gosub Zapishi
        Menu = 0
 
   End Select
 
    H = Tu + Th
    L = Tu - Th
 
  If T(1) > H Then Reset Portd.3
  If T(1) < L Then Set Portd.3
  If Brakds(1) = 1 Then Reset Portd.3
End If
 
Loop
End

Zostało 100 bajtów flesha. Chciałbym w jakiś sposób odróżnić od siebie wskazania DS. Ponieważ wolnych wyjść już nie ma pomyślałem by zaświecić ostatnią kropkę przy jednej z temperatur. Czy istnieje taka możliwość a jeżeli tak to jak to zrobić?

-

oldname

Portret użytkownika mirley

Re: Minitermometr

...
  Select Case Mux
    Case 0:
      Portb = W(3)
      Reset Portd.6
    Case 1:
     Set Portd.6
     Portb = W(2) And &B11011111
     Reset Portd.5
    Case 2:
     Set Portd.5
     Portb = W(1)
     Portb.5 = Kanal     '<<<<<<<<<dopisać
     Reset Portd.4
    Case 3:
     Set Portd.4
     Portb = 255
     Gosub Temp
    'Case 4:  
  End Select
...

-

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 oldname

Mini termostat z dwoma termometrami

Ponieważ po przestawieniu na menu1 czyli odczyt z drugiego Ds nie działał termostat, dopisałem kawałek kodu w odczycie Temp:. Skorzystałem z kodu który Mirley zaprezentował na tym forum.Teraz odczyt następuje co dwie sekundy co chyba zbyt wielkim problemem nie jest. Właściwie wszystko działa włącznie z ostatnią kropką określającą który termometr jest od termostatu a nawet pojawił się nieoczekiwany efekt migania kropki(zmienna Kanal) podczas ustawiania temperatury ustawianej i histerezy.Wstawiam cały kod z prośbą o ewentualne poprawki i sugestie. Zostało 68 bajtów flesha.

'****************************
           'Konfiguracja
'****************************
 
$regfile = "attiny2313.dat"
$crystal = 8000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11111011 : Portd = &B11111111
Config Porta = &B00000010 : Porta = &B11111111
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Przerwanie0
Enable Interrupts
'****************************
      'Zmienne
 
'****************************
Dim Dziel(2) As Byte ,
Dim Wysw As Word , Ww As Byte , W(3) As Byte
Dim Wysw_pomoc As Word
Dim T(2) As Integer , Tu As Integer
Dim H As Integer , L As Integer , Th As Integer
Dim Mux As Byte , I As Byte , Kanal As Byte
Dim Ust As Bit
Dim Menu As Byte , Brakds(2) As Byte , Autokanal As Byte
Dim F1s As Bit , F1sm As Bit , F4ms As Bit , F100ms As Bit
Dim Minus As Bit
 
'****************************
      'Petla glowna
'****************************
 
Readeeprom Tu , 1
Readeeprom Th , 10
 
Do
 
If F4ms = 1 Then
  Reset F4ms
 
    Select Case Menu
 
      Case 0:
      Kanal = 0
      Minus = T(1).15
      Wysw = Abs(t(1))
 
      Case 1:
      Kanal = 1
      Minus = T(2).15
      Wysw = Abs(t(2))
 
      Case 2:
      Minus = Tu.15
      Wysw = Abs(tu)
 
      Case 3:
      Wysw = Abs(th)
 
   End Select
 
    Gosub Wyswietl_zmierz
 
End If
 
   If F100ms = 1 Then
    Reset F100ms
 
    If Pina.0 = 0 And Pind.2 = 0 Then                       '
       If Ust = 0 Then
          Ust = 1
         Incr Menu
       End If
         Else
          Ust = 0
    End If
 
   Select Case Menu
 
     Case 2:
 
      If Pind.2 = 0 Then
        Incr Tu
      End If
 
      If Pina.0 = 0 Then
        Decr Tu
      End If
 
     Case 3:
 
      If Pind.2 = 0 Then
       Incr Th
      End If
 
      If Pina.0 = 0 Then
       Decr Th
      End If
 
     Case 4:
 
      Gosub Zapistu
      Gosub Zapishi
        Menu = 0
 
   End Select
 
    H = Tu + Th
    L = Tu - Th
 
  If T(1) > H Then Reset Portd.3
  If T(1) < L Then Set Portd.3
  If Brakds(1) = 1 Then Reset Portd.3
 
End If
 
Loop
End
'****************************
   'zapis
'****************************
 
Zapistu:
 
   Disable Interrupts
   Writeeeprom Tu , 1
   Enable Interrupts
 
Return
 
Zapishi:
 
   Disable Interrupts
   Writeeeprom Th , 10
   Enable Interrupts
 
Return
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 131
   Set F4ms
   Incr Dziel(1)
   If Dziel(1) = 25 Then
     Dziel(1) = 0
     Set F100ms
     Incr Dziel(2)
     If Dziel(2) = 10 Then
       Dziel(2) = 0
       Set F1s
       Set F1sm
     End If
   End If
Return
'****************************
      'pomiar temp
'****************************
 
Temp:
 
 If F1s = 1 Then
   Reset F1s
 
   Incr Autokanal
  If Autokanal = 2 Then
   Autokanal = 0
   Toggle Kanal.0
  End If
 
   1wreset Pind , Kanal
   Brakds(kanal + 1) = Err
   1wwrite &HCC , 1 , Pind , Kanal
   1wwrite &HBE , 1 , Pind , Kanal
   T(kanal + 1) = 1wread(2 , Pind , Kanal):
   T(kanal + 1) = T(kanal + 1) * 10
   T(kanal + 1) = T(kanal + 1) / 16
   1wreset Pind , Kanal
   1wwrite &HCC , 1 , Pind , Kanal
   1wwrite &H44 , 1 , Pind , Kanal
 
 End If
 Return
'****************************
      'wyswietlanie i wywolywanie pomiaru
'****************************
 
Wyswietl_zmierz:
   Incr Mux
  If Mux = 6 Then Mux = 0
 
  Porta.1 = Not Minus
 
  For I = 1 To 4
    Wysw_pomoc = Wysw Mod 10
    Ww = Wysw_pomoc
    W(i) = Lookup(ww , Tabela)
    Wysw = Wysw / 10
  Next I
 
    If W(3) = 40 Then W(3) = 255
 
 Select Case Mux
 
    Case 0:
      Portb = W(3)
      Reset Portd.6
 
    Case 1:
     Set Portd.6
     Portb = W(2) And &B11011111
     Reset Portd.5
 
    Case 2:
     Set Portd.5
     Portb = W(1)
     Portb.5 = Kanal.0
     Reset Portd.4
 
    Case 3:
     Set Portd.4
     Portb = 255
     Gosub Temp
 
  End Select
Return
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 40 , 235 , 50 , 162 , 225 , 164 , 36 , 234 , 32 , 160
'Znak : 0 1 2 3 4 5 6 7 8 9

-

oldname

Portret użytkownika oldname

Dodatkowy wyświetlacz

Żeby wyświetlać temperaturę powyżej 100stopni C dołożyłem wyświetlacz pojedyńczy z cyfrą jeden i symbolami "-" i "+" oraz zmieniłem ten kawałek kodu:

Wyswietl_zmierz:
   Incr Mux
  If Mux = 6 Then Mux = 0
 
  For I = 1 To 4
    Wysw_pomoc = Wysw Mod 10
    Ww = Wysw_pomoc
    W(i) = Lookup(ww , Tabela)
    Wysw = Wysw / 10
  Next I
 
   If W(4) = 40 Then W(4) = 255
 
 Select Case Mux
    Case 0:
      Portb = W(3)
      Reset Portd.6
 
    Case 1:
     Set Portd.6
     Portb = W(2) And &B11011111
     Reset Portd.5
 
    Case 2:
     Set Portd.5
     Portb = W(1)
     Portb.5 = Kanal.0
     Reset Portd.4
 
    Case 3:
     Set Portd.4
     Portb = W(4)
     Portb.7 = Not Minus
     Portb.1 = Minus
     Reset Porta.1
 
    Case 4:
     Set Porta.1
     Portb = 255
     Gosub Temp
 
  End Select
Return

Jeżeli można coś poprawić w kodach z postu #15 i #16 proszę o sugestie. Projekt płytki z dodatkową cyfrą trzeba będzie powiększyć o około 10mm. Jak opracuję płytki obwodów drukowanych to je zamieszczę na forum ale dopiero jak program będzie dopracowany, co chyba niedługo się spełni. Zostało 36 bajtów pamięci flash.

-

oldname

Portret użytkownika oldname

Brak histerezy

Nikt tu chyba nie zagląda! Liczę jednak na wypowiedź kolegi Mirka. Dużo się nauczyłem korzystając z podpowiedzi kolegi Mirka przy zmianach w kodzie mini termometru.
Zbudowałem układ i z wsadem z postu #15 sterowałem zamrażarką tak by jej temperatura wynosiła 9 stopni C "+" "-" 1 stopień C. Niestety ale w piątym dniu przestała działać histereza. Po ponownym załadowaniu programu znowu działa prawidłowo. Czy takie zachowanie układu wynika z nieoptymalnego lub błędnego kodu?

-

oldname

Portret użytkownika mirley

Re: Termometr

Co najmniej ciekawy efekt, reset procesora nie pomógł nic? Jeśli program byłby źle napisany i po pewnym czasie np zatkała by się pamięć to reset powinien pomóc i układ powinien działać znowu dobrze. Jesli nie pomaga nic tylko przeprogramowanie to zastanowił bym się czy mikrokontroler nie jest uszkodzony.

----

Chyba że wartość zmiennej histerezy ustwiła by się na 0 lub małą wartość i zapisała się taka do pamięci, ale w twoim kodzie nie widzę nigdzie zapisu do eeprom poza tym jednym miejscem.

Możesz spróbować ustawić w kodzie na stałe wartość histerezy i nie zapisywać tego do eeprom ani nie wczytywać i wtedy wytestowąć czy robi się tak samo po pewnym czasie.

Czy jak zabrakło histerezy to w menu była ustawiona dalej poprawna wartość czy nie?

-

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 oldname

Termometr

Reset nie pomógł! Ustawienia histerezy były poprawne. Po przeprogramowaniu następne cztery dni chodziło wszystko dobrze a potem wyłączyłem bo trzeba wędzić. Zastanawiam się czy jakieś chwilowe zakłócenia typu iskrzenie nie narobiły kłopotów. Z tą histerezą w kodzie jeszcze popróbuję i załączę na kilka dni.

-

oldname

Portret użytkownika mirley

Re: uC

Zakłócenia typu przekaźnik silnik w okolicy jak najbardziej mogły narobić kłopotów

-

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 dam23

Pamięć Eeprom

Witam
mam problem z pamięciom eeprom mianowicie przerobiłem kod tak aby sterował pompom ogrzewania.Dorobiłem zapisywanie do eepromu ustawien Tu i funkcję zał.wył całego sterownika wszystko chodzi znakomicie ale niewiem jak zapisać zmienną" Dim on_Off as bit " do eepromu by po zaniku napięcia sterownik pamiętał czy był zał. czy wył. bardzo proszę o pomoc Pozdrawiam . Sterownik pracuje z atmega8

KOD Programu

'****************************
'Konfiguracja
'****************************
$regfile = "m8def.dat "
$crystal = 8000000

Config Portd = &B11111111 : Portd = &B11111111
Config Portb = &B11111111 : Portb = &B11111111
Config Portc = &B00000000 : Portc = &B11111111
Config 1wire = Portc.2

Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Przerwanie0

Enable Interrupts
'****************************
'Zmienne
'****************************
Dim Dziel(2) As Byte
Dim Wysw As Word , Ww As Byte , W(3) As Byte
Dim Wysw_pomoc As Word
Dim T As Integer , Tu As Integer
Dim H As Integer , L As Integer
Dim Mux As Byte , I As Byte
Dim Ust As Bit
Dim Autoret As Byte
Dim Minus As Bit

Dim F1s As Bit , F4ms As Bit , F100ms As Bit

Dim On_off As Bit

'****************************
'Wartosci Poczatkowe
'****************************
On_off = 1

Readeeprom Tu , 20

'****************************
'Petla glowna
'****************************
Do

If F4ms = 1 Then
Reset F4ms
If Ust = 0 Then Wysw = T Else Wysw = Tu
Gosub Wyswietl_zmierz
End If

If F100ms = 1 Then
Reset F100ms
If Pinc.5 = 0 And On_off = 1 Then
Incr Tu
Autoret = 20
If Tu = 501 Then Tu = 500

End If
If Pinc.3 = 0 And On_off = 1 Then
Decr Tu
Autoret = 20
If Tu = 49 Then Tu = 50

End If

If Autoret > 0 Then

Ust = 1
Decr Autoret
Else
Ust = 0

End If

H = Tu
L = Tu - 10

If T => H And On_off = 1 Then Set Portb.3
If T < L And On_off = 1 Then Reset Portb.3
End If
If Autoret = 10 Then
Portd = 255
Writeeeprom Tu , 20
End If

Loop
End
'****************************
'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 131
Set F4ms
Incr Dziel(1)
If Dziel(1) = 25 Then
Dziel(1) = 0
Set F100ms
Incr Dziel(2)
If Dziel(2) = 10 Then
Dziel(2) = 0
Set F1s
End If
End If
Return
'****************************
'pomiar temp
'****************************
Temp:
If F1s = 1 Then
Reset F1s
1wreset
1wwrite &HCC
1wwrite &HBE
T = 1wread(2 )
Minus = T.15
T = Abs(t)
T = T * 10
T = T / 16
1wreset
1wwrite &HCC
1wwrite &H44
End If

If Pinc.4 = 0 Then
Bitwait Pinc.4 , Set
Toggle On_off
Waitms 500
Portd = 255
End If

If On_off = 0 Then
Reset Portb.3
End If
Return

'****************************
'wyswietlanie i wywolywanie pomiaru
'****************************
Wyswietl_zmierz:
Incr Mux
If Mux = 5 Then Mux = 0

'Portd.3 = Not Minus

For I = 1 To 3
Wysw_pomoc = Wysw Mod 10
Ww = Wysw_pomoc
W(i) = Lookup(ww , Tabela)
Wysw = Wysw / 10
Next I
If W(3) = 40 Then W(3) = 255 'wygaszenie zera wiodącego

Select Case Mux
Case 0:
If On_off = 1 Then
Portd = W(3)
Else
Portd = &B00100111
End If

Reset Portb.0

Case 1:
Set Portb.0
If On_off = 1 Then
Portd = W(2) And &B11011111
Else
Portd = &B001110100
End If

Reset Portb.1

Case 2:
Set Portb.1
If On_off = 1 Then
Portd = W(1)
Else
Portd = &B001110100
End If

Reset Portb.2

Case 3:
Set Portb.2
Portd = 255
Gosub Temp

'Case 4: 'opoznienie na odczyt temp, jeśli nie ma to miga wyswietlacz

End Select

Return

'*******************************************************************************
'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
Data 40 , 235 , 50 , 162 , 225 , 164 , 36 , 234 , 32 , 160
'znak: 0 1 2 3 4 5 6 7 8 9

Portret użytkownika oldname

Eeprom

Niezbyt dobrze znam Bascoma ale jeśli dobrze pamiętam to zmienna zapisywana w eeprom nie może być zadeklarowana jako Bitowa. Zapis eeprom w pętli głównej z flagą 4ms chyba ci na długo nie starczy. Parę postów wyżej masz kod z przykładowym zapisem. Sposobów zapisu pewno jest więcej i może lepszych ale sprawdziłem ten z #15.

-

oldname

Portret użytkownika damian1984

eeprom

Witam ja też niejestem fachowcem w bascomie dużo piszę PLC i panele operatorskie.Ale nie zapisuje Tu co 4ms bo jest warunek

If Autoret = 10 Then
Portd = 255
Writeeeprom Tu , 20
End If

i gdy autoret = 10 to wtedy migne wyświetlacz i zapiszę Tu w eepromie,oczywiście nieupieram się przy tym jeśli się mylę to bardzo proszę o poprawienie mnie.Ale wracając do pytania jeśli nieidzie zapisać bitu do eepromu to może ktoś wie jak zrobić zapamiętanie stanu "0" lub "1"
Pozdrawiam

Portret użytkownika oldname

Eeprom

Chyba masz rację.Ja ci raczej nie pomogę bo nie jestem pewny niektórych rozwiązań. Zajrzyj do pomocy baskoma tam pod readeeprom i writeeeprom jest sporo opisane.

-

oldname

Portret użytkownika mirley

Re: EEprom

Sprawa jest prosta, Zapisz poprostu cały bajt. Ustaw np w najmłodszym bicie zmiennej pomocniczej wartość twojej flagi bitowej: zmienna.0 = zmienna_bit, potem normalnie zapisz cały bajt za pomocą writeeeprom. Odczyt podobnie, czytasz cały bajt i przepisujesz tylko interesujący cię bit

-

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 damian1984

eeprom

mirley czy ma wyglądać to tak dodałem flage Dim on_off_pomoc as byte
Pozdrawiam
kod

'****************************
           'Konfiguracja
'****************************
$regfile = "m8def.dat "
$crystal = 8000000
 
Config Portd = &B11111111 : Portd = &B11111111
Config Portb = &B11111111 : Portb = &B11111111
Config Portc = &B00000000 : Portc = &B11111111
Config 1wire = Portc.2
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Przerwanie0
 
 
Enable Interrupts
'****************************
      'Zmienne
'****************************
Dim Dziel(2) As Byte
Dim Wysw As Word , Ww As Byte , W(3) As Byte
Dim Wysw_pomoc As Word
Dim T As Integer , Tu As Integer
Dim H As Integer , L As Integer
Dim Mux As Byte , I As Byte
Dim Ust As Bit
Dim Autoret As Byte
Dim Minus As Bit
Dim On_off_pomoc As Byte
 
Dim F1s As Bit , F4ms As Bit , F100ms As Bit
 
Dim On_off As Bit
 
'****************************
      'Wartosci Poczatkowe
'****************************
On_off = 1
 
 
Readeeprom Tu , 20
Readeeprom On_off_pomoc , 511
 
 
 
'****************************
      'Petla glowna
'****************************
Do
On_off = On_off_pomoc
If F4ms = 1 Then
  Reset F4ms
  If Ust = 0 Then Wysw = T Else Wysw = Tu
  Gosub Wyswietl_zmierz
End If
 
If F100ms = 1 Then
  Reset F100ms
  If Pinc.5 = 0 And On_off = 1 Then
    Incr Tu
    Autoret = 20
    If Tu = 501 Then Tu = 500
 
  End If
  If Pinc.3 = 0 And On_off = 1 Then
    Decr Tu
    Autoret = 20
  If Tu = 49 Then Tu = 50
 
  End If
 
  If Autoret > 0 Then
 
 
    Ust = 1
    Decr Autoret
  Else
    Ust = 0
 
  End If
 
 H = Tu
 L = Tu - 10
 
 
 
  If T => H And On_off = 1 Then Set Portb.3
  If T < L And On_off = 1 Then Reset Portb.3
End If
If Autoret = 10 Then
Portd = 255
Writeeeprom Tu , 20
End If
 
 
Loop
End
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 131
   Set F4ms
   Incr Dziel(1)
   If Dziel(1) = 25 Then
     Dziel(1) = 0
     Set F100ms
     Incr Dziel(2)
     If Dziel(2) = 10 Then
       Dziel(2) = 0
       Set F1s
     End If
   End If
Return
'****************************
      'pomiar temp
'****************************
Temp:
 If F1s = 1 Then
   Reset F1s
   1wreset
   1wwrite &HCC
   1wwrite &HBE
   T = 1wread(2 )
   Minus = T.15
   T = Abs(t)
   T = T * 10
   T = T / 16
   1wreset
   1wwrite &HCC
   1wwrite &H44
  End If
 
 
 
  If Pinc.4 = 0 Then
  Bitwait Pinc.4 , Set
  Toggle On_off
  Waitms 500
  Writeeeprom On_off_pomoc , 511
  On_off_pomoc = On_off
 
  Portd = 255
  End If
 
  If On_off = 0 Then
  Reset Portb.3
  End If
Return
 
 
 
'****************************
      'wyswietlanie i wywolywanie pomiaru
'****************************
Wyswietl_zmierz:
  Incr Mux
  If Mux = 5 Then Mux = 0
 
  'Portd.3 = Not Minus
 
  For I = 1 To 3
    Wysw_pomoc = Wysw Mod 10
    Ww = Wysw_pomoc
    W(i) = Lookup(ww , Tabela)
    Wysw = Wysw / 10
  Next I
  If W(3) = 40 Then W(3) = 255                              'wygaszenie zera wiodącego
 
  Select Case Mux
    Case 0:
    If On_off = 1 Then
      Portd = W(3)
      Else
      Portd = &B00100111
      End If
 
      Reset Portb.0
 
    Case 1:
     Set Portb.0
     If On_off = 1 Then
     Portd = W(2) And &B11011111
     Else
     Portd = &B001110100
     End If
 
     Reset Portb.1
 
    Case 2:
     Set Portb.1
     If On_off = 1 Then
     Portd = W(1)
     Else
     Portd = &B001110100
     End If
 
     Reset Portb.2
 
    Case 3:
     Set Portb.2
     Portd = 255
     Gosub Temp
 
    'Case 4:                                                 'opoznienie na odczyt temp, jeśli nie ma to miga wyswietlacz
 
  End Select
 
Return
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 40 , 235 , 50 , 162 , 225 , 164 , 36 , 234 , 32 , 160
'znak:    0     1     2     3     4     5     6     7     8     9

Portret użytkownika mirley

Re Zapis bit

Z do loop wywal On_off = On_off_pomoc i wstaw zaraz po.... + drobna modyfikacja

Readeeprom On_off_pomoc , 511
On_off = On_off_pomoc.0

na poczatku On_off = 1 jest nie potrzebne

Przy zapisie:

On_off_pomoc.0 = On_off
Writeeeprom On_off_pomoc , 511

a nie na odwrót

Ps. Kody bascoma wstawia się w znaczniku Bas

-

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 damian1984

zapis bit

witam
Dziękuje za szybką odpowieć jutro przetestuję kod
pozdrawiam

Portret użytkownika damian1984

zapis bit

Witam
Mirley wszystko działa świetnie bardzo dziękuje za pomoc jestem zobowiązany
poprostu świetna strona i supr fachowiec z ciebie
jeszcze raz wielkie dzięki i Powodzenia

Portret użytkownika max

Potrzebna pomoc

Witam, Mirley.
Przepraszam za mój hiszpański, jestem z Rosji.
Zbierz termometr, wszystko działa prawidłowo. Dodano informację, przełączania kanałów:

'****************************
           'Konfiguracja
'****************************
$regfile = "attiny2313.dat"
$crystal = 8000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11111011 : Portd = &B11111111
'Config Porta = &B00000000 : Porta = &B11111111
Config Porta = &B00000010 : Porta = &B11111111              '????????? ??????? ?? ????? Porta.1 
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Przerwanie0
 
 
Enable Interrupts
'****************************
      'Zmienne
'****************************
Dim Dziel(2) As Byte
Dim Wysw As Word , Ww As Byte , W(3) As Byte
Dim Wysw_pomoc As Word
Dim T As Integer
Dim Mux As Byte , I As Byte
 
Dim F1s As Bit , F4ms As Bit , F100ms As Bit
Dim Minus As Bit
Dim Kanal As Byte
 
Dim Auto_sw As Byte                                         ' ?????????????? ???????????? ??????? 
'****************************
      'Wartosci Poczatkowe
'****************************
Kanal = 1
'****************************
      'Petla glowna
'****************************
Do
 
If F4ms = 1 Then
  Reset F4ms                                                'co 4ms
  Wysw = T
  Gosub Wyswietl_zmierz
End If
 
If F100ms = 1 Then
  Reset F100ms                                              'co 100ms
  If Pind.2 = 0 Then Kanal = 1
  If Pina.0 = 0 Then Kanal = 0
End If
 
 
Loop
End
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 131
   Set F4ms
   Incr Dziel(1)
   If Dziel(1) = 25 Then
     Dziel(1) = 0
     Set F100ms
     Incr Dziel(2)
     If Dziel(2) = 10 Then
       Dziel(2) = 0
       Set F1s
     End If
   End If
Return
'****************************
      'pomiar temp
'****************************
Temp:
 If F1s = 1 Then
   Reset F1s
   Incr Auto_sw
   If Auto_sw = 5 Then
     Auto_sw = 0
     Toggle Kanal.0
   End If
   1wreset Pind , Kanal
   1wwrite &HCC , 1 , Pind , Kanal
   1wwrite &HBE , 1 , Pind , Kanal
   T = 1wread(2 , Pind , Kanal):
   Minus = T.15
   T = Abs(t)
   T = T * 10
   T = T / 16
   1wreset Pind , Kanal
   1wwrite &HCC , 1 , Pind , Kanal
   1wwrite &H44 , 1 , Pind , Kanal
  End If
Return
'****************************
      'wyswietlanie i wywolywanie pomiaru
'****************************
Wyswietl_zmierz:
  Incr Mux
  If Mux = 5 Then Mux = 0
 
  Portd.3 = Not Minus
'
  If Kanal = 0 Then Porta.1 = 0 Else Porta.1 = 1            '????????? ???????
'
  For I = 1 To 3
    Wysw_pomoc = Wysw Mod 10
    Ww = Wysw_pomoc
    W(i) = Lookup(ww , Tabela)
    Wysw = Wysw / 10
  Next I
  If W(3) = 40 Then W(3) = 255                              'wygaszenie zera wiod?cego
 
  Select Case Mux
    Case 0:
      Portb = W(3)
      Reset Portd.6
 
    Case 1:
     Set Portd.6
     Portb = W(2) And &B11011111
     Reset Portd.5
 
    Case 2:
     Set Portd.5
     Portb = W(1)
     Reset Portd.4
 
    Case 3:
     Set Portd.4
     Portb = 255
     Gosub Temp
 
    'Case 4:                                                 'opoznienie na odczyt temp, je?li nie ma to miga wyswietlacz
 
  End Select
 
Return
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 40 , 235 , 50 , 162 , 225 , 164 , 36 , 234 , 32 , 160 , 247
'znak:    0     1    2    3     4     5     6     7    8    9     -

W temperaturze "0,0" stopniach trzeba zapłacić mniej (Portd.3) i począwszy od temperatury minus "9,9" stopniach trzeba zapłacić mniej (Portd.3) i lekki minus pierwsza cyfra, więc wygląda to tak: "-9,9" stopni (tabela jest dodane). Czy mógłbyś mi pomóc w realizacji?
Z góry dziękuję.

Portret użytkownika max

Część z kluczowych problemów rozwiązanych.

Witam?
I przyniósł jeszcze jedną cyfrę i stały problem z wyświetlaczem na "0,0" stopniach "negatywną":

'****************************
      'wyswietlanie i wywolywanie pomiaru
'****************************
Wyswietl_zmierz:
  Incr Mux
'  If Mux = 5 Then Mux = 0
 
  If Mux = 6 Then Mux = 0
  'Portd.3 = Not Minus
'
  If Kanal = 0 Then Porta.1 = 0 Else Porta.1 = 1            '?íä???ö?? ??í?ëîâ
'
  For I = 1 To 3
    Wysw_pomoc = Wysw Mod 10
    Ww = Wysw_pomoc
    W(i) = Lookup(ww , Tabela)
    Wysw = Wysw / 10
  Next I
 
  If Minus = 0 Then W(4) = 255 Else W(4) = 247
  If W(2) = 40 And W(1) = 40 Then                           '??? ????????ó?? 0.0 ????? "??íó?"(Portd.3)
  W(4) = 255
  W(3) = 255
  End If
  If W(3) = 40 Then W(3) = 255                              'wygaszenie zera wiod?cego
 
  Select Case Mux
 
    Case 0:
      Portb = W(4)
      Reset Portd.3
 
    Case 1:
      Set Portd.3
      Portb = W(3)
      Reset Portd.6
 
    Case 2:
     Set Portd.6
     Portb = W(2) And &B11011111
     Reset Portd.5
 
    Case 3:
     Set Portd.5
     Portb = W(1)
     Reset Portd.4
 
    Case 4:
     Set Portd.4
     Portb = 255
     Gosub Temp
 
    'Case 5:                                                 'opoznienie na odczyt temp, je?li nie ma to miga wyswietlacz
 
 
'    Case 0:
'      Portb = W(3)
'      Reset Portd.6
'
'    Case 1:
'     Set Portd.6
'     Portb = W(2) And &B11011111
'     Reset Portd.5
'
'    Case 2:
'     Set Portd.5
'     Portb = W(1)
'     Reset Portd.4
'
'    Case 3:
'     Set Portd.4
'     Portb = 255
'     Gosub Temp
'
'    'Case 4:                                                 'opoznienie na odczyt temp, je?li nie ma to miga wyswietlacz
 
  End Select
 
Return

Pozostaje do rozwiązania problemów z przekazaniem "negatywne" od pierwszej do drugiej cyfry na mniej niż "-9,9" stopni.

Portret użytkownika mirley

Re: termometr

Spróbuj to:

  If Minus = 0 Then W(4) = 255 Else W(4) = 247
  If W(2) = 40 And W(1) = 40 Then                          
  W(4) = 255
  If Minus = 0 Then W(3) = 255 Else W(3) = 247
  End If
  If W(3) = 40 Then W(3) = 255    

-

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 max

Re: termometr

Dziękuję. Zrobiłem tak:

  If Minus = 0 Then W(4) = 255 Else W(4) = 247 
  If Minus = 1 And W(3) = 40 Then  
  W(3) = 247
  W(4) = 255
  End If
  If W(2) = 40 And W(1) = 40 Then    
  W(4) = 255
  W(3) = 255
  End If
  If W(3) = 40 Then W(3) = 255 

Przy okazji: ujemne temperatury są 1 stopień nie jest prawidłowe, dodał to:
   Minus = T.15
   If Minus = 1 Then T = T + 1  
   T = Abs(t)

Portret użytkownika mirley

Re: Termometr

Na jakiej podstawie sądzisz że temperatura jest zaniżona? Porównałeś wskazania z miernikiem fabrycznym?

-

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 max

Re: Termometr

Przepraszam, wszystko w porządku. Miałem problem z wyjściem powyżej 100 stopni. A więc:

Wyswietl_zmierz:
  Incr Mux
  If Mux = 5 Then Mux = 0
 
  If Kanal = 0 Then Porta.1 = 0 Else Porta.1 = 1            '?íä???ö?? ??í?ëîâ
 
  For I = 1 To 4
    Wysw_pomoc = Wysw Mod 10
    Ww = Wysw_pomoc
    W(i) = Lookup(ww , Tabela)
    Wysw = Wysw / 10
  Next I
 
  If Minus = 0 Then W(4) = 255 Else W(4) = 247    
  If Minus = 1 And W(3) = 40 Then                 
  W(3) = 247
  W(4) = 255
  End If
  If W(3) = 40 And W(2) = 40 And W(1) = 40 Then  
  W(4) = 255
  W(3) = 255
  End If
  If W(3) = 40 Then W(3) = 255                              'wygaszenie zera wiod?cego
 
  Select Case Mux
 
    Case 0:
      Portb = W(4)
      Reset Portd.6
 
    Case 1:
      Set Portd.6
      Portb = W(3)
      Reset Portd.4
 
    Case 2:
     Set Portd.4
     Portb = W(2) And &B11011111
     Reset Portd.3
 
    Case 3:
     Set Portd.3
     Portb = W(1)
     Reset Portd.5
 
    Case 4:
     Set Portd.5
     Portb = 255
     Gosub Temp
 
  End Select
 
Return

ale w temperaturze powyżej 100 stopni, wyświetlacz 1,6 stopni. Nie mów mi, co się stało? Jeśli dobrze rozumiem, to w 125 stopniach Wysw równa 1250?
Z góry dziękuję.

Portret użytkownika max

Re: Termometr

Daje to deska przeznaczona jest termometr:

Portret użytkownika mirley

RE: Temperatura

Spróbuj usunąć na razie cały fragment:

If Minus = 0 Then W(4) = 255 Else W(4) = 247    
  If Minus = 1 And W(3) = 40 Then                 
  W(3) = 247
  W(4) = 255
  End If
  If W(3) = 40 And W(2) = 40 And W(1) = 40 Then  
  W(4) = 255
  W(3) = 255
  End If
  If W(3) = 40 Then W(3) = 255                              'wygaszenie zera wiod?cego

i zobacz czy zadziała wskazanie.

-

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 max

RE: Temperatura

Tak, to działa, dzięki. I jeszcze jedno. Jeśli tak:

Wyswietl_zmierz:
  Incr Mux
  If Mux = 5 Then Mux = 0
 
  If Kanal = 0 Then Porta.1 = 0 Else Porta.1 = 1 
 
  For I = 1 To 4
    Wysw_pomoc = Wysw Mod 10
    Ww = Wysw_pomoc
    W(i) = Lookup(ww , Tabela)
    Wysw = Wysw / 10
  Next I

Pierwsza cyfra (W (4)) podmargivaet, a jeśli tak, to:
Wyswietl_zmierz:
Incr Mux
If Mux = 6 Then Mux = 0

If Kanal = 0 Then Porta.1 = 0 Else Porta.1 = 1

For I = 1 To 4
Wysw_pomoc = Wysw Mod 10
Ww = Wysw_pomoc
W(i) = Lookup(ww , Tabela)
Wysw = Wysw / 10
Next I
widać migotanie czterech liczb.

Próbował zawrzeć błąd przy minimalnej i maksymalnej temperatury w następujący sposób:

  If Wysw >= 550 And Minus = 1 Or Wysw >= 1250 Then
  Set Portd.2
  W(4) = 52
  W(3) = 119
  W(2) = 119 And &B11111111
  End If

Maksymalna temperatura termometru nadal pokazhivat temperaturę do 127 stopni. Nie mów mi, co jest nie tak?
Z góry dziękuję.

Portret użytkownika max

RE: Temperatura

Tabela brzmieniu:

Tabela:
    Data 40 , 235 , 50 , 162 , 225 , 164 , 36 , 234 , 32 , 160 , 247 , 52 , 119
'znak:    0     1    2    3     4     5     6     7    8    9     -     E     r

Portret użytkownika karol

Witam, czy mogłbyś mi wyslać

Witam, czy mogłbyś mi wyslać na maila zrzut fusebitów lub jak zmienić fusebity w Bascomie do termometru?

Portret użytkownika max

fusebity

Portret użytkownika karol

Witam a nie powinno być clk

Witam a nie powinno być clk na 010010 na screenie jest 100100 więc nie wiem czy jest poprawnie prosze o odp.

Portret użytkownika max

fusebity

To jest z screenie termometr roboczego.

Portret użytkownika karol

witam, po zaprogramowaniu

witam, po zaprogramowaniu procka swiecą mi tylko druga i trzecia cyfra i kropki w posctani: u.u. Co mogłem zrobic nie tak?

Portret użytkownika karol

i po podłączeniu czujnika

i po podłączeniu czujnika widac ze temp się zmienia lecz działa tylko dolna połówka wyswietlacza. Gdzie może być błąd?

Portret użytkownika damian1984

kolego sprawdź dokładnie

kolego sprawdź dokładnie wszystkie połączenia omomierzem miałem podobny przypadek było zwarcie miedzy lutowaniem rezystorów a ścieżkami
pozdrawiam

Portret użytkownika karol

tak miałem zwarcie lecz nie

tak miałem zwarcie lecz nie swieci dalej górny segment tylko. Wszystko sprawdzałem jeszcze raz i jest ok. Da sie sprawdzic jakos czy wgl on działa? Który pin odpowiada za gorny segment?

Portret użytkownika mirley

Re: LED

Górny segment to segment a. Zewrzyj go do masy przez rezystor 330R-1k tuż przy wyświetlaczu (pin 11 wyświetlacza) za rezystorem ograniczającym prąd (żeby nie ubić portu w mikrokontrolerze)

-

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 damian1984

witam sprawdź też procesor

witam sprawdź też procesor czy port PB0 jest dobrze polutowany do ścieżki pozdrawiam

Portret użytkownika krzysiek

wyświetlacz led

Witam: ma Pan jeszcze ten wyświetlacz HGC4033HRK-1,pilnie potrzebuję a nigdzie nie moge kupic,Pozdrawiam.