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 koleś

Ustawiłem. Teraz wlutowałem

Ustawiłem. Teraz wlutowałem 20su i nadal bez zmian :(

Portret użytkownika koleś

iu

Ustawiłem. Teraz mam wlutowane 20su i na wyświetlaczu mruga U.U

Portret użytkownika mirley

Re: Miganie 0

dobra.... co to znaczy że 0 miga. Tak jakby częstotliwość odświeżania była za wolna i widać szybkie miganie czy miga np z częstotliwością 1Hz czy coś podobnego.

-

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 koleś

Poprostu niezależnie do tego

Poprostu niezależnie do tego co zrobię na wyświetlaczu migota napis U.U Tak jakby zaświecać i gasić go z pewną częstotliwością

Portret użytkownika mirley

Re: Czujnik

Rozumiem żeby było 0.0 jak nie ma czujnika ale U.U świadczy o błędnym montażu. Może nie ma przewodzenia między prockiem a jednym z segmentów. Podłącz tez czujnik i zobacz czy wskazanie się nie zmieni

-

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 tyktyk

Jak zmienić program by

Jak zmienić program by działał poprawnie z DS1820 bez B. Po podpieciu pokazuje mi 3 stopnie w temp pokojowej. Udało mi sie zdobyć 6 szt. I szkoda by było mi ich nie wykorzystać.

Portret użytkownika mirley

Re: ds

Zamień T = T / 16 na T = T / 2 i powinno być dobrze

-

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 koleś

Podłączyłem czujnik i na

Podłączyłem czujnik i na wyświetlaczu nadal świeci 0.0
O co w tym chodzi?

Przepraszam że tak długo nie odpisywałem ale byłem na wczasach.

Portret użytkownika mirley

Re: Minitermometr

A na pewno dobrze podłączyłeś czujnik? rezystory 4,7k są wlutowane?

-

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 koleś

Rezystory oczywiście

Rezystory oczywiście wlutowane.

Portret użytkownika koleś

Najbardziej zastanawia mnie

Najbardziej zastanawia mnie to, że ten napis 0.0 nie świeci ciągle, tylko miga.

Portret użytkownika mirley

Re: fusy

Jak dla mnie to na pewno fusy w dalszym ciągu są źle... może klikasz read fuses zamiast write fuses jak już ustawisz?

-

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 koleś

Działa!!!! Ale ja głupi...

Działa!!!! Ale ja głupi... Myślałem że fusy zapisują się do procka jak wgrywam program... Teraz dopiero to zauważyłem ;)

Portret użytkownika tyktyk

Witam mam problem z wiodoncym

Witam mam problem z wiodoncym zerem. Gdy temperatura jest 100 do 110 oC to wyświetla bez tego środkowego zera np " 1 2 "

If W(4) = 65 Then 
    W(4) = 255 
    If W(3) = 65 Then W(3) = 255                              'wygaszenie zera wiodącego
  end if

jak pisałem wyżej musiałem usunąć end if bo program się nie kompilował.

Portret użytkownika mirley

Re: Termometr

Nie możesz usuwać tego end if. Ten fragment programu jest dobry.... gdzieś indziej masz namieszane i masz a dużo end if, temu się nie kompiluje. Fragment od wygaszenia masz mieć dokładnie taki jak wkleiłeś wyżej. Wklej całą procedurę wyświetlania dla 4 wyświetlaczy

-

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 tyktyk

'****************************

          '****************************
           'Konfiguracja
'****************************
$regfile = "attiny2313.dat"
$crystal = 8000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11111111 : Portd = &B11111111
Config Porta = &B00000000 : 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(4) 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
'****************************
      'Wartosci Poczatkowe
'****************************
'Kanal = 0
'****************************
      '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 Pina.1 = 0 Then Kanal = 0
  'If Pina.0 = 0 Then Kanal = 0
 
 
'End If
   'tu dopisz alarm
  If T >= 900 Then Pina.1 = 0
    'ustaw jakiś port lub inna akcja dla alarmu
  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 Pind , 0
   1wwrite &HCC , 1 , Pind , 0
   1wwrite &HBE , 1 , Pind , 0
   T = 1wread(2 , Pind , 0):
   Minus = T.15
   T = Abs(t)
   T = T * 10
   T = T / 16
   1wreset Pind , 0
   1wwrite &HCC , 1 , Pind , 0
   1wwrite &H44 , 1 , Pind , 0
  End If
Return
 
 
 
'****************************
      'wyswietlanie i wywolywanie pomiaru
'****************************
Wyswietl_zmierz:
  Incr Mux
  If Mux = 6 Then Mux = 0
 
  Portd.2 = 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(4) = 65 Then W(4) = 255
  If W(3) = 65 Then W(3) = 255
                                                     'wygaszenie zera wiodącego
 
  End If
 
  Select Case Mux
    Case 0:
      Portb = W(3)                                          ' And &B11111110
      Reset Portd.5
 
    Case 1:
     Set Portd.5
     Portb = W(2)                                           ' And &B11111110
     Reset Portd.4
 
    Case 2:
     Set Portd.4
     Portb = W(1) And &B11111110
     Reset Portd.6
 
    Case 3:
     Set Portd.6
     Portb = W(4)
     Reset Portd.1                                          'kreska pozioma
     If Minus = 0 Then Reset Portd.2                        'kreska pionowa
     Reset Portd.3
 
    Case 4:
     Set Portd.3
     Portb = 255
     Gosub Temp
 
    'Case 5:  'pusty
  End Select
 
Return
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 65 , 231 , 137 , 131 , 39 , 19 , 17 , 199 , 1 , 3
'znak:    0     1     2     3     4     5     6     7     8     9

Portret użytkownika mirley

Re: Termometr

jasne ze sie nie kompilowało..... bo masz złe zagniezdzenie if:

  If W(4) = 65 Then W(4) = 255
  If W(3) = 65 Then W(3) = 255
                                                     'wygaszenie zera wiodącego
 
  End If       'to wywal

wywal ten end if, nie powinno się z nim kompilowac. Zamiast:

  If W(4) = 65 Then W(4) = 255
  If W(3) = 65 Then W(3) = 255
                                                     'wygaszenie zera wiodącego
 
  End If       'to wywal

wstaw to co napisałem wczesniej. Kombinując z end ifami zmieniłeś logikę instrukcji warunkowych i temu nie działa tak jak miał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 IMEX2

Ustawienia "Tu"

Cześć - dlaczego ustawienia Tu są tylko do 53 - w kodzie nie takich ustawień maksymalnych

-

Grzesiek - miasto Ostróda

GG 12372371 dom
tel 502812675 SMS

Portret użytkownika mirley

Re: Tu

A gdzie napisałem że 53 ? napisz dokładniej o co chodzi

-

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 encik

Wyświetlacze 7-segmentowe

Witam mam kilka wyświetlaczy 7-segmentowych po kilka cyfr np 4 , 3, 2 i szukałem schematów gdzie na nich znajdują się piny a,b,c,d,e,f,g,h aby nimi sterować lecz nigdzie nie mogę znaleźć takich informacji, wyświetlacze pochodzą z demontażu i pytanie jak nimi sterować.
Numery to
"LTC 561 G-RC
106THAILAND J"- wyświetlacz 3-cyfrowy z kropkami
"HGC4033HRK-1"-także 3-cyfrowy z kropkami
Jeśli ma pan lub userzy jakieś dane o tych wyświetlaczach lub wskazówki jak sprawdzić piny to proszę o ich udostępnienie/podanie w tym temacie lub wysłanie na maila do mnie.
Jeszcze jedno programuje w C i czytałem kody do Bascoma ale nic nie rozumiem z nich.
Pozdrawiam.

Portret użytkownika Piotr

Do postu powyżej

Portret użytkownika mirley

RE: Wyświetlacze

Jak masz problem z wyświetlaczami to zawsze pozostaje identyfikacja wyprowadzeń za pomocą rezystora np 330R i zasilacza 5V. %minut roboty i wyprowadzenia spisane.

-

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 encik

Dzięki za wskazówki i jeszcze

Dzięki za wskazówki i jeszcze jedno są tam piny a,b,c,d...
Wyświetlacze mają razem spięte aa, b, c,d więc wydaje mi się ,że jeśli podam mu aby podświetlił on 2 na 3 wyświetlaczu to podświetli na wszystkich 2. Jak sterować takim czymś w C czytałem kilka programów lecz nic nie rozumiem. Jeśli jest ktoś kto umiałby mi to wytłumaczyć lub zna link do tagiego poradnika proszę o odpowiedź. Jeszcze jedno jestem początkujący i nie rozumiem zbytnio niektórych pojęć.
Pozdrawiam

Portret użytkownika mirley

Re: Wyswietlacz

U mnie na stronie jest artykuł o multipleksowaniu wyświetlacza LED.... poczytaj (w kodach źródłowych). Mimo tego że segmenty są wspólne to każdy wyświetlacz ma inną wspólną anodę (lub katodę). Np co 4ms zaświecasz inny wyświetlacz. Oko i tak nie widzi różnicy

-

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 encik

multipleksacja

Skorzystałem z tego zdania
CYTAT

Quote:
"Mimo tego że segmenty są wspólne to każdy wyświetlacz ma inną wspólną anodę (lub katodę). Np co 4ms zaświecasz inny wyświetlacz. Oko i tak nie widzi różnicy"

Więc napisałem obsługę w c oto kod
#define F_CPU 1000000L 
#include <avr/io.h>
#include <util/delay.h>        
 
//   -- A --
//  |       |
//  F       B
//  |       |
//   -- G --
//  |       |
//  E       C
//  |       | 
//   -- D --  
 
#define LED_0 	0x3F; // 0011 1111
#define LED_1   0x06; // 0000 0110
#define LED_2   0x5b; // 0101 1011
#define LED_3   0x4f; // 0100 1111
#define LED_4   0x66; // 0110 0110
#define LED_5   0x6d; // 0110 1101
#define LED_6   0x7d; // 0111 1101
#define LED_7	0x07; // 0000 0111
#define LED_8	0x7f; // 0111 1111
#define LED_9   0x6F; // 0110 1111
 
int main(void)
{
  unsigned char cyfra1;
  unsigned char cyfra2;
 
  /* Port d - wyjścia */
  DDRD  = 0xFF;  
  PORTD = 0xFF;
  DDRB = 0xFF;//wyświetlacz anody
  PORTB = 0x00;//w.w
 
	//zmienne 
//   -- A --   //   -- A --
//  |       |  //  |       |
//  F       B  //  F       B
//  |       |  //  |       |
//   -- G --   //   -- G --
//  |       |  //  |       |
//  E       C  //  E       C
//  |       |  //  |       |
//   -- D --   //   -- D --  
//   CYFRA2    //   CYFRA1	
 
        cyfra1 = 0;//CO NA POCZĄTKU MA BYC WYSWIETLONE CZYLI 0
	cyfra2 = 0;//CO NA POCZĄTKU MA BYC WYSWIETLONE CZYLI 0
/* Główna pętla programu*/
  while(1)
  {
//wyswietlacz
		PORTB = 0x02;//CYFRA1
		switch(cyfra1)
		{
		  case 0:
		  PORTD = ~LED_0;
		  break;
		  case 1:
		  PORTD = ~LED_1;
		  break;
		  case 2:
		  PORTD = ~LED_2;
		  break;
		  case 3:
		  PORTD = ~LED_3;
		  break;
		  case 4:
		  PORTD = ~LED_4;
		  break;
		  case 5:
		  PORTD = ~LED_5;
		  break;
		  case 6:
		  PORTD = ~LED_6;
		  break;
		  case 7:
		  PORTD = ~LED_7;
		  break;
		  case 8:
		  PORTD = ~LED_8;
 
		  break;
		  case 9:
		  PORTD = ~LED_9;
 
		  case 10:
		  PORTD = ~LED_0;
		  cyfra2 += 1;
 
		  break;
	    }
		_delay_ms(4);
	PORTB = 0x04; //CYFRA2
	switch(cyfra2)
 
		{
		case 0:
		PORTD = ~LED_0;
		break;
		case 1:
		PORTD = ~LED_1;
		break;
		case 2:
		PORTD = ~LED_2;
		break;
		case 3:
		PORTD = ~LED_3;
		break;
		case 4:
		PORTD = ~LED_4;
		break;
		case 5:
		PORTD = ~LED_5;
		break;
		case 6:
	    PORTD = ~LED_6;
	    break;
	    case 7:
		PORTD = ~LED_7;
		break;
		case 8:
		PORTD = ~LED_8;
		break;
		case 9:
		PORTD = ~LED_9;
		break;
		}
	_delay_ms(4);
   }	
}

Wszystko działa jak ustawie mu zmienne tak pokazuje lecz problem zaczyna się przy obsłudze klawiatury:
#define F_CPU 1000000L 
#include <avr/io.h>
#include <util/delay.h>        
 
//   -- A --
//  |       |
//  F       B
//  |       |
//   -- G --
//  |       |
//  E       C
//  |       | 
//   -- D --  
 
#define LED_0 	0x3F; // 0011 1111
#define LED_1   0x06; // 0000 0110
#define LED_2   0x5b; // 0101 1011
#define LED_3   0x4f; // 0100 1111
#define LED_4   0x66; // 0110 0110
#define LED_5   0x6d; // 0110 1101
#define LED_6   0x7d; // 0111 1101
#define LED_7	0x07; // 0000 0111
#define LED_8	0x7f; // 0111 1111
#define LED_9   0x6F; // 0110 1111
#define LED_KRESKA   0x40; // 0100 0000
#define LED_NIC 0x00; // 0000 0000
#define LED_E   0x79; // 0111 1001
#define LED_n   0x54; // 0101 0100
#define LED_c   0x58; // 0101 1000
#define LED_i   0x10; // 0001 0000
#define LED_k   0x76; // 0111 0110
 
 
 
int main(void)
{
  /* Definicja zmiennych */
  unsigned char cyfra1;
  unsigned char cyfra2;
 
  /* Port A - wyjścia */
  DDRD  = 0xFF;  
  PORTD = 0xFF;
  DDRB = 0xFF;//wyświetlacz anody
  PORTB = 0x00;//w.w
 
  /* PC0 - wejście z podciągnięciem do VCC */
  DDRC  = 0x00; 
  PORTC = 0X06;  
 
	//zmienne
	cyfra1 = 0;
	cyfra2 = 0;
 
 
 
  /* Główna pętla programu*/
 
  while(1)
  {
  if(!(PINC & 0x01))
    {
 
	 /* Zwiększenie stanu licznika o 1 */
      cyfra1 ++;
      /* opóżnienie aż drgania na stykach ustaną */
       _delay_ms(80);
      /* oczekiwanie na zwolnienie przycisku */
      while(!(PINC & 0x01)) {}
      /* opóżnienie aż drgania na stykach ustaną */
       _delay_ms(80);
    }
	if(!(PINC & 0x02))
    {
 
	 /* Zwiększenie stanu licznika o 1 */
      cyfra2 ++;
      /* opóżnienie aż drgania na stykach ustaną */
       _delay_ms(80);
      /* oczekiwanie na zwolnienie przycisku */
      while(!(PINC & 0x02)) {}
      /* opóżnienie aż drgania na stykach ustaną */
       _delay_ms(80);
    }
 
 
//wyswietlacz
		PORTB = 0x02;
		switch(cyfra1)
		{
		  case 0:
		  PORTD = ~LED_0;
		  break;
		  case 1:
		  PORTD = ~LED_1;
		  break;
		  case 2:
		  PORTD = ~LED_2;
		  break;
		  case 3:
		  PORTD = ~LED_3;
		  break;
		  case 4:
		  PORTD = ~LED_4;
		  break;
		  case 5:
		  PORTD = ~LED_5;
		  break;
		  case 6:
		  PORTD = ~LED_6;
		  break;
		  case 7:
		  PORTD = ~LED_7;
		  break;
		  case 8:
		  PORTD = ~LED_8;
 
		  break;
		  case 9:
		  PORTD = ~LED_9;
 
		  case 10:
		  PORTD = ~LED_0;
		  cyfra2 += 1;
 
		  break;
	    }
		_delay_ms(4);
	PORTB = 0x04;
	switch(cyfra2)
 
		{
		case 0:
		PORTD = ~LED_0;
		break;
		case 1:
		PORTD = ~LED_1;
		break;
		case 2:
		PORTD = ~LED_2;
		break;
		case 3:
		PORTD = ~LED_3;
		break;
		case 4:
		PORTD = ~LED_4;
		break;
		case 5:
		PORTD = ~LED_5;
		break;
		case 6:
	    PORTD = ~LED_6;
	    break;
	    case 7:
		PORTD = ~LED_7;
		break;
		case 8:
		PORTD = ~LED_8;
		break;
		case 9:
		PORTD = ~LED_9;
		break;
		}
	_delay_ms(4); 	
   }		
}

Problemy : np. klikam cyfra przełącza się od zera do i znów zero, to pomyślałem o drganiach styków wiec ustawiłem mu 80ms aż drgania zgasną to gdy naciskam znika 0 i znów się pojawia, jednym słowem robi co chce.
Jak temu zaradzić?

Portret użytkownika mirley

Re: LED

Nie masz prawa dawać żadnych opóźnień w programie za pomocą delay, wait czy czegokolwiek innego co zatrzymuje program w miejscu. CO prawda nie piszę programów w C na mikrokontrolery ale zasada jest taka sama. Uzyj timera do odliczania 4ms i ustawiaj co 4ms flagę. W pętli głównej sprawdzaj czy jest flaga ustawiona i jeśli tak to wykonuj odczyt klawiatury. Styki obsługuje się poprzez liczenie np 20 cykli po 4ms i jeśli stan się nie zmienił i za każdym razem co 4ms jest taki sam to znaczy że to nie jest drganie styku a przyciśnięcie.

-

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 jaro

zamiennik bc857

Czy tranzystor bc557 może być zamiennikiem tranzystora bc857? Nie mam komponentów smd, a chcę zbudować termostat. Drugie pytanie. Zaprogramowałem at2313, podłączyłem tylko czujnik DS, ale na wszystkich nogach uC mam stan wysoki (nie licząc GND) niezależnie, czy jest czujnik, czy go nie ma. Czy to jest poprawnie? Fusebity mam ustawione dobrze, zaprogramować się zaprogramował. Na początek wrzuciłem program zwykłego termometru.

Portret użytkownika mirley

Re: Termometr

Tak bc557 możesz bez kłopotu zastosować do sterowania anod wyświetlaczy... Czym zmierzyłeś stan wysoki na wszystkich nóżkach? masz oscyloskop? miernikiem DC nic nie zmierzysz bo przebiegi wychodzące z procka w tym projekcie są przebiegami prostokątnymi o częstotliwości rzędu 100Hz. Podłącz układ według schematu wyżej i wtedy zobaczysz czy działa

-

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 jaro

Re: termometr

Dzięki za szybką odpowiedź. Dopiero później doszedłem do tego, że nie zmierzę tego miernikiem. Znalazłem fajny kod programu na Twojej stronie (napisany w poście przez marekszy) z obsługą przycisków na bazie schematu termometru uniwersalnego. Zbudowałem wczoraj prototyp i wszystko działa. Dzisiaj biorę się za robienie płytki.
Ps. Bardzo fajna i przydatna strona.

Portret użytkownika gosc16

Takie pytanie, jak zwolnic

Takie pytanie, jak zwolnic multipleksowanie tak, aby wysietlacze załączały się co np 1s? Chcę to zrobić aby coś sprawdzić, a nie na stałe:-).

Portret użytkownika oldname

termometr i termostat

To mój pierwszy post więc Wszystkich pozdrawiam. Moja wiedza na temat programowania to ?tabula rasa, terra incognita". Pewno za kilka miesięcy,napisze samodzielnie jakiś prosty program. Póki co skorzystam z gotowców. Bardzo mi się spodobał projekt mini termometru a zwłaszcza jego wersja z termostatem. Ponieważ na już, potrzebne mi są dwa termostaty z pomiarem temperatury i histerezą, jeden do lodówki ,(uszkodzony termostat mechaniczny, marchewka zamarza) a drugi do bojlera CWU do załączenia pompy. Pozwoliłem sobie na zastosowanie zmian w kodzie źródłowym, przedstawionych w tym wątku przez kilku kolegów. Kompilację przeprowadziłem ustawiając w opcjach ?optymalizację? kodu. Zostało tylko 15% może da się coś poprawić. Program wypróbowany i działa. W zasadzie w tej postaci, by mi wystarczył. Pomyślałem jednak że warto by było bardziej ten projekt zuniwersalizować. Prosił bym kolegów o poprawki oraz jeśli to możliwe dopisanie ustawiania histerezy za pomocą przycisku z zapisem do eeprom. Brakuje też możliwości zapisu w eeprom temperatur Tu ujemnych (pokazuje 53,5 stopni C). Schemat w Eaglu na razie jako PDF. Starałem się w miarę poznawania bascoma wpisać jak najwięcej komentarzy w kodzie. Jeśli ktoś z kolegów mógłby co nieco dopisać pewno szybciej bym zrozumiał ja i pewno wielu początkujących. Temperaturę jako termometr pokazuje prawidłowo w zakresie dodatnim jak i ujemnym.

[/'****************************
           'Konfiguracja
'****************************
 
$regfile = "attiny2313.dat"                                 'informuje kompilator o pliku dyrektyw wykorzystywanego mikroprocesora
$crystal = 8000000                                          'informuje kompilator o częstotliwości oscylatora taktującego (obojetne czy jest on wewnętrzny czy  zewnętrzny)
 
Config Portb = &B11111111 : Portb = &B11111111              'cały port b jako wyjścia, stan spoczynkowy:1(rezystory wewnętrzne  podciagnięte do VCC)
Config Portd = &B11111111 : Portd = &B11111111              'cały port d  jako wyjścia, stan spoczynkowy:1
Config Porta = &B00000000 : Porta = &B11111111              'cały port a jako wejścia, stan spoczynkowy:1
 
Config Timer0 = Timer , Prescale = 256                      'konfiguracja Timera0 jako licznika impulsów wewnętrznych przy preskalerze 256 i 8mhz częstotliwość wyniesie 31250 Hz
Enable Timer0 : On Timer0 Przerwanie0                       'odblokowanie (zezwolenie na) przerwania od przepełnienia licznika Timer0
                                                                 'deklaracja procedury obsługi przerwania
 
 
Enable Interrupts                                           'odblokowanie globalnego systemu przerwań
'****************************
      'Zmienne                                                 'poniższe zmienne (zawierają dane) zdefiniowane instrukcją DIM (deklaracja zmiennej)
                                                               ' Bascom przydziela odpowiednie komórki pamięci RAM
'****************************
Dim Dziel(2) As Byte                                        'As określa typ zmiennej bajt 0-255                        '
Dim Wysw As Word , Ww As Byte , W(4) As Byte                'Word 0-65535 dwa bajty
Dim Wysw_pomoc As Word
Dim T As Integer , Tu As Integer                            'integer -32767do +32768 dwa bajty
Dim H As Integer , L As Integer
Dim Mux As Byte , I As Byte
Dim Ust As Bit                                              'bit może mieć wartość 0 lub 1
Dim Autoret As Byte
 
Dim F1s As Bit , F4ms As Bit , F100ms As Bit
Dim Minus As Bit
Dim Kanal As Byte
'****************************
      'Wartosci Poczatkowe
'****************************
 Kanal = 1
 
'****************************
      'Petla glowna
'********                                            'opcjonalnie można ustawić zakres od 0 do 125 stopni C
 
 
 
Readeeprom Tu , 1
 
                                         'odczyt z pamięci eeprom temperatury ustawionej z komórki o adresie 1, za pomocą S1 i S2
                                            'i temperaturę ustawioną np. 90 stopni C
Do
 
If F4ms = 1 Then
  Reset F4ms
  If Ust = 0 Then Wysw = T Else Wysw = Tu
  Gosub Wyswietl_zmierz                                     'skocz do etykiety
End If
 
If F100ms = 1 Then
  Reset F100ms
  If Pina.1 = 0 Then                                        'jeżeli za pomocą przycisku S1 podamy stan 0 (GND)na pin1 portu A każde przyciśnięcie
    Incr Tu                                                 'spowoduje że  wartość temperatury ustawianej wzrośnie  o jeden a przytrzymanie  stały wzrost
    Autoret = 20
  End If
  If Pina.0 = 0 Then                                        'jeżeli za pomocą przycisku S2 podamy stan 0 (GND)na pin0 portu A każde przyciśnięcie
    Decr Tu                                                 'spowoduje że  wartość temperatury ustawianej zmaleje o jeden a przytrzymanie  stały spadek
    Autoret = 20
  End If
  If Autoret > 0 Then
    Ust = 1
    Decr Autoret
  If Autoret = 0 Then
    Gosub Zapis                                             'skocz do etykiety
  End If
  Else
    Ust = 0
  End If
 
  H = Tu + 50                                               'histereza powyżej temperatury ustawionej
  L = Tu - 50                                               'histereza poniżej temperatury ustawionej
 
  If T > H Then Reset Portd.0                               'jeżeli temperatura zmierzona jest większa od ustawionej plus histereza to na porcied pin0 stan wysoki czyli 1
  If T < L Then Set Portd.0                                 'jeżeli temperatura zmierzona jest mniejsza od ustawionej plus histereza to na porcied pin0 stan niski czyli 0
 
  End If
 
Loop
 
  Zapis:                                                    'etykieta skok z pętli głównej
 
  Disable Interrupts                                        'blokuje globalny system przerwań
  Writeeeprom Tu , 1                                        'zapisuje w pamięci eeprom temperaturę ustawianą w komórce o adresie 1
  'Portd = &B11111111
  'Waitms 200                                                ' czeka 200ms, mrugnięcie wyświetlacza
  Enable Interrupts                                         'odblokowuje globalny system przerwań
 Return                                                     'powrót z podprogramu
End                                                         'kończy działanie programu i wyłącza przerwania
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:                                                'etykieta  odblokowanie przerwania od przepełnienia licznika Timer0
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:                                                       'etykieta skok z Select Case
 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
'****************************
      'wyswietlanie i wywolywanie pomiaru
'****************************
Wyswietl_zmierz:                                            'etykieta  skok z pętli głównej
   Incr Mux
  If Mux = 6 Then Mux = 0
 
  Portd.2 = 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(4) = 40 Then W(4) = 255                             'wygaszenie zera wiodącego
 
    If W(3) = 40 Then W(3) = 255                            'wygaszenie zera wiodącego (ewentualnie wykasować)
 
 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 = W(4)
     Reset Portd.3
 
    Case 4:
     Set Portd.3
     Portb = 255
     Gosub Temp                                             'skocz do etykiety
 
    '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     9qb]

-

oldname

Portret użytkownika oldname

usunięto

usunięto

-

oldname

Portret użytkownika marcinwrc2

termometr

Witam. mam problem z tym termometrem. Wgrałem program fuse bity ustawiłem i migoczą mi na zmianę cyfry. czy rezystory na tranzystorach mogą być 3.9k czy muszą być 3.3k? czy to od tego jet migotanie?
pozdr

Portret użytkownika marcinwrc2

To wina złych ustawień fuse

To wina złych ustawień fuse bitów. już działa.

Portret użytkownika oldname

termometr i termostat

Korzystając z kodów źródłowych z tej strony trochę posklejałem i w termostacie można ustawić temperaturę od 0 do 99 stopni C oraz histerezę w zakresie temperatur dodatnich. Ustawienia te są zapisywane do pamięci eeprom przez co nie tracimy ich po zaniku zasilania. Termometr mierzy od -53 do 99(sprawdzone od -22 do +60 stopni). Na płytce stykowej wszystkie te funkcje działały. Zostało 7% kodu do zagospodarowania, przy wyłączonych wartościach początkowych oraz braku mignięć wyświetlacza podczas zapisu do eeprom.
Proszę o sprawdzenie kodu . Mam jeszcze pytanie dlaczego przy próbie ustawienia Tu lub Th poniżej ?0? wyskakuje cyfra 53,5 oraz jak utworzyć trzecie menu aby można było włączać drugi czujnik.

'****************************
           '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 As Integer , Tu As Integer
Dim H As Integer , L As Integer , Th As Integer
Dim Mux As Byte , I As Byte
Dim Ustu As Bit , Usth As Bit
Dim Autoret As Byte
Dim Menu As Byte
Dim F1s As Bit , F4ms As Bit , F100ms As Bit
Dim Minus As Bit
Dim Kanal As Byte
 
 
'****************************
      'Wartosci Poczatkowe
'****************************
 Kanal = 1
 Menu = 0
'****************************
      'Petla glowna
'****************************
 
Readeeprom Tu , 1
Readeeprom Th , 10
 'Tu = 550
' Th = 10
Do
 
If F4ms = 1 Then
  Reset F4ms
    Select Case Menu
      Case 0:
      Wysw = T
      Gosub Wyswietl_zmierz
      Case 1:
      Wysw = Tu
      Gosub Wyswietl_zmierz
      Case 2:
      Wysw = Th
      Gosub Wyswietl_zmierz
 
   End Select
 
End If
 
   If F100ms = 1 Then
   Reset F100ms
 
   If Autoret = 0 Then
      If Pind.2 = 0 Then
       Menu = 1
      End If
      If Pina.0 = 0 Then
       Menu = 2
      End If
 
End If
 
   Select Case Menu
 
     Case 1:
      If Pind.2 = 0 Then
       Incr Tu
       Autoret = 30
      End If
 
      If Pina.0 = 0 Then
       Decr Tu
       Autoret = 30
      End If
 
      If Autoret > 0 Then
       Ustu = 1
       Decr Autoret
      If Autoret = 0 Then
       Gosub Zapistu
       Menu = 0
      End If
       Else
       Ustu = 0
      End If
 
     Case 2:
      If Pind.2 = 0 Then
       Incr Th
       Autoret = 30
      End If
 
      If Pina.0 = 0 Then
       Decr Th
       Autoret = 30
      End If
 
      If Autoret > 0 Then
       Usth = 1
       Decr Autoret
      If Autoret = 0 Then
       Gosub Zapishi
       Menu = 0
      End If
       Else
       Usth = 0
      End If
 
 
   End Select
 
 
  H = Tu + Th
  L = Tu - Th
 
  If T > H Then Reset Portd.3
  If T < L Then Set Portd.3
   End If
 
Loop
End
 
'****************************
   'zapis
'****************************
 
Zapistu:
 
   Disable Interrupts
   Writeeeprom Tu , 1
'  ' Portd = &B11111111
'  ' Waitms 200
   Enable Interrupts
 
Return
 
Zapishi:
 
   Disable Interrupts
   Writeeeprom Th , 10
   'Portd = &B11111111
'  ' Waitms 200
   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 , 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
 
  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: Temperatura ujemna

Nie ma temperatur ujemnych bo po pierwsze wpisujesz wartość Tu integer do Wysw który jest Word.... Po drugie procedura przeliczania nie uwzględnia ujemnego wyniku:

 For I = 1 To 3
    Wysw_pomoc = Wysw Mod 10
    Ww = Wysw_pomoc
    W(i) = Lookup(ww , Tabela)
    Wysw = Wysw / 10
  Next I

Temperatury zrób zawsze + w momencie gdy wpisujesz do wysw i ustaw poprostu flagę minus która powie Ci potem na potrzeby wyświetlania że jest to -

Co do menu to poprostu trzeba zrobić większy zakres zmiennej Menu i zamiast klikać jednym przyciskiem na wejście do Tu a drugim na wejście do histerezy, trzeba dodać kolejny przycisk, który robi incr Menu. Wtedy we fragmencie:

Select Case Menu
      Case 0:
      Wysw = T
      Gosub Wyswietl_zmierz
      Case 1:
      Wysw = Tu
      Gosub Wyswietl_zmierz
      Case 2:
      Wysw = Th
      Gosub Wyswietl_zmierz

Dopiszesz case 3: który wpisze do Wysw kolejny ustawiany parametr itd. Tak samo trzeba potem dopisać case do obsługi przyciskó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 Badyl

Pytanie

czy da się tak przerobić program aby wyświetlacz wygaszał się po np. 15s a po naciśnięciu klawisza włączał się zpowrotem?? Jeśli tak to co jaki fragment ?

Portret użytkownika oldname

termometr i termostat

Wpisałem incrementację, dorobiłem dodatkowy przycisk podając GND przez diody. Menu działa ale przestał zapisywać w eepromie.Co do ustawiania wartości Tu i Th by przedstawiały wartości bezwzględne temperatury ujemnej to nie bardzo rozumiem, bo to dla mnie jeszcze za wysokie progi. Czy można bardziej łopatologicznie? Poniżej kod z menu

'****************************
      'Petla glowna
'****************************
 
Readeeprom Tu , 1
Readeeprom Th , 30
 'Tu = 550
' Th = 10
Do
 
If F4ms = 1 Then
  Reset F4ms
    Select Case Menu
      Case 0:
      Wysw = T
      Gosub Wyswietl_zmierz
      Case 1:
      Wysw = Tu
      Gosub Wyswietl_zmierz
      Case 2:
      Wysw = Th
      Gosub Wyswietl_zmierz
 
 
   End Select
 
End If
 
   If F100ms = 1 Then
   Reset F100ms
 
     If Pina.0 = 0 And Pind.2 = 0 Then
       Incr Menu
         Autoret = 20
     End If
 
 
   Select Case Menu
 
      Case 0:
      If Pina.0 = 0 Then
       Kanal = 0
      Autoret = 20
      End If
 
      If Pind.2 = 0 Then
       Kanal = 1
      Autoret = 20
      End If
 
     Case 1:
 
      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
       Ustu = 1
       Decr Autoret
      If Autoret = 0 Then
       Gosub Zapistu
       Menu = 0
      End If
       Else
       Ustu = 0
      End If
 
     Case 2:
 
      If Pind.2 = 0 Then
       Incr Th
       Autoret = 20
      End If
 
      If Pina.0 = 0 Then
       Decr Th
       Autoret = 20
      End If
 
      If Autoret > 0 Then
       Usth = 1
       Decr Autoret
      If Autoret = 0 Then
       Gosub Zapishi
       Menu = 0
      End If
       Else
       Usth = 0
      End If
       Case 3:
          Menu = 0
   End Select
 
 
  H = Tu + Th
  L = Tu - Th
 
  If T > H Then Reset Portd.3
  If T < L Then Set Portd.3
         End If
 
Loop
End
 
'****************************
   'zapis
'****************************
 
Zapistu:
 
   Disable Interrupts
   Writeeeprom Tu , 1
'  ' Portd = &B11111111
'  ' Waitms 200
   Enable Interrupts
 
Return
 
Zapishi:
 
   Disable Interrupts
   Writeeeprom Th , 30
   'Portd = &B11111111
'  ' Waitms 200
   Enable Interrupts
 
Return

-

oldname

Portret użytkownika mirley

Re: termostat

Osobiście zrobił bym cały zapis parametrów w momencie jak pojawia się case 3 od menu, wtedy jest zapis i powrót do menu = 0.... program będzie prostszy. Teraz jak przełączysz menu z 1 na 2 to parametry które miały się zapisać w autoret nie zapiszą się bo case jest już 2

-

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 i termostat

Zrezygnowałem z automatycznego powrotu z menu 1 i 2 (na razie), dopisałem korzystając z porad w dziale pytania, funkcję dowolnie długiego trzymania wciśniętego przycisku menu i dla mnie jest super. Podsumowując minitermometr uniwersalny mierzy dwoma czujnikami temperatury oraz spełnia funkcję termostatu z możliwością ustawienia histerezy oraz temperatury załączenia lub wyłączenia dowolnego urządzenia. Wartości ustawiane zapisuje do pamięci eeprom. Dobrze by było aby dało się przypisać tylko jeden czujnik do termostatu albo mieć wybór. Zostało 8% kodu.

 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 0:
      If Pina.0 = 0 Then
       Kanal = 0
        Autoret = 20
      End If
 
      If Pind.2 = 0 Then
       Kanal = 1
      Autoret = 20
      End If
 
     Case 1:
 
      If Pind.2 = 0 Then
       Incr Tu
       Autoret = 20
      End If
 
      If Pina.0 = 0 Then
       Decr Tu
       Autoret = 20
      End If
 
 
     Case 2:
 
      If Pind.2 = 0 Then
       Incr Th
       Autoret = 20
      End If
 
      If Pina.0 = 0 Then
       Decr Th
       Autoret = 20
      End If
 
     Case 3:
 
       Menu = 0
      Gosub Zapistu
      Gosub Zapishi
 
   End Select

-

oldname

Portret użytkownika oldname

Blokada ustawienia

Wpisałem taki warunek:

 If Kanal = 0 Then
     Th = 0
     Tu = 0
    End If

Działa ale pewno można lepiej? Myślałem o wprowadzeniu menu 4 ale narazie dopuki problem ustawiania poniżej zera nierozwiazany , poczekam.
Zostało 6% kodu. Przeorałem google i na temat sposobu ustawiania w termostatach temperatur z zakresu poniżej zera znalazłem zero.Kolega Mirley naprowadza ale dla mnie to zbyt trudne (mam nadzięję że nie na zawsze). Mam problem ze zrozumieniem wszystkich instrukcji i procedur.

-

oldname

Portret użytkownika mirley

Re: Temperatura

Można na wiele sposobów obsłużyć ujemne temperatury.... W procedurze odczytu temperatury od razu zmieniam odczytaną wartość zawsze na + i ustawiam zmienną Minus jeśli temp jest < 0.

   T = 1wread(2 , Pind , Kanal):
   Minus = T.15
   T = Abs(t)

Można zostawić tu tylko pierwszą linię a zamieniać temperaturę na + tylko na potrzeby wyświetlania. Wtedy bezpośrednio odczytana zmienna T jest typu integer i przyjmuje wartości + i - Ustawianie wartości też musisz zrobić na integerach i powinno działać.

-

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

Ustawianie poniżej zera

Jak skasowałem te dwie linie to jak minie zero wyskakuje 53,5 i zmniejsza się w miare spadku temperatury. Tu i Th są zadeklarowane jako integer a po wejściu w menu także po przejściu poniżej zera wyskakuje 53,5 a następnie zmniejsza się. Zmienna T = Abs(t) zostaje zamieniona na wartość bezwzględną wtedy gdy 16 Bit starszego Bajtu równy jest 1 ale jak to wstawic do wyświetlania?

-

oldname

Portret użytkownika mirley

Re: Termostat

Tam gdzie masz wpisywanie wartości do zmiennej Wysw wstaw Wysw = ABS(T) i tak dla reszty temperatur które wyświetlasz

-

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

Ujemne temperatury

Dopisałem i działa. Przy okazji dotarło do mnie że zmienna Integer zapisywana jest przez Baskom w kodzie U2. Dopisałem dodatkowo zmienną Minus w wyświetlaniu zmiennej Tu przez co w czasie ustawiania temperatur ujemnych wyświetla się dioda minus. Teraz pętla główna wygląda tak:

'****************************
      '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
 
End If
 
   If F100ms = 1 Then
   Reset F100ms
 
    If Kanal = 0 Then
     Th = 0
     Tu = 0
    End If
 
   If Pina.0 = 0 And Pind.2 = 0 Then
      If Ust = 0 Then
       Ust = 1
       Incr Menu
       Autoret = 20
      End If
       Else
       Ust = 0
   End If
 
   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:
 
       Menu = 0
      Gosub Zapistu
      Gosub Zapishi
 
   End Select
 
    H = Tu + Th
    L = Tu - Th
 
  If T > H Then Reset Portd.3
  If T < L Then Set Portd.3
End If
 
Loop
End

Nie wiem jak do tego napisać zabezpieczenie od drgań styków. Czy do każdego Case? A z kolei ten fragment, wiem co wykonuje ale potrzebuję łopatologicznego komentarza.

 If Pina.0 = 0 And Pind.2 = 0 Then
      If Ust = 0 Then
       Ust = 1
       Incr Menu
       Autoret = 20
      End If
       Else
       Ust = 0
   End If

Zaobserwowałem ciekawą właściwość Baskoma co do optymalizacji kodu. Caly kod tego termometru z termostatem, Bascom 1.11.9.5 skompilował na 100% bez włączonej optymalizacji, zaś z włączoną optymalizacją 93% pamięci . Po kompilacji w Bascom 2.07.1 (najnowszy) skompilował na 88% pamięci z włączoną jak i z wyłączoną optymalizacją.

-

oldname

Portret użytkownika mirley

Re: Minitermometr

Czym nowszy bascom tym zakłądam że lepiej zostały przemyślane niektóre polecenia i zajmują mniej rozkazów asemblera.

Odnośnie styków, to przeważnie robię to za pomocą licznika:

if pinx.y = 0 then
  incr licznik
  if licznik = 102 then
    licznik = 0 
 
    'tutaj reakcja na przycisk
 
  end if 
else
  licznik = 100
end if

Wartości licznika zależą od tego jak często wywołuje się procedura powyżej. Teraz ustawiłęm różnicę 102 -100 = 2 czyli po 2 wywołaiach nastąpi reakcja i po 102 wywołaniach w przypadku trzymania cały czas

-

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 IMEX2

Ustawialna Histereza

Witam

Czy ktoś z kolegów dopisał może ustawialną za pomocą przycisków Histerezę

Wciśnięcie jednocześnie dwóch przycisków - zwolnienie i ustawiamy Histerezę

Mile widziany Gotowy dodatek do kodu

pozdrawiam
Grzesiek

-

Grzesiek - miasto Ostróda

GG 12372371 dom
tel 502812675 SMS

Portret użytkownika oldname

Histereza

Popatrz post #38 #42i #45 i usuń

 If Kanal = 0 Then
     Th = 0
     Tu = 0
    End If
oraz
 Minus = T.15
   T = Abs(t)
Narazie trzeba zrezygnowac z wyświetlania jednego z Ds ponieważ oba zapisy trafiają do jednej zmiennej T. Brak także zabezpieczenia przed drganiami styków. Na płytce stykowej działa dobrze ale nie wiem czy bez tego zabezpieczenia może być. Moja wiedza jest dosyć nikła przez co proszę nie traktować tej wypowiedzi jako niepodważalnej.

-

oldname

Portret użytkownika oldname

Eliminacja drgań styków

usunięto

-

oldname

Portret użytkownika oldname

Pomyłka !

Przepraszam ale źle skopiowalem .Ta część kodu miala być taka

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
        Licznik = 20
       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

-

oldname