Czy da się przerobić ten układ??

Dyskusje ogólne na temat "cyfrówki" czyli wszystko o TTL/CMOS, językach VHDL i VERILOG, bramkach, rejestrach, przerzutnikach... Dobre miejsce na pytania odnośnie uniwersalnych programatorów (np. Willem) a także podłączania własnych peryferiów do komputera PC.
Awatar użytkownika
lutownik
Użytkownik
Posty: 517
Rejestracja: 01 paź 2006, 12:37
Lokalizacja: z planety Zi Emia
Kontakt:

Czy da się przerobić ten układ??

Post autor: lutownik » 05 gru 2010, 16:58

Witam.
Potrzebny mi jest prosty termometr do auta który mierzyłby temperaturę silnika. W moim aucie jest dziwnie rozwiązane więc wolę zrobic to na wyświetlaczach typu LED.

Znalazłem cosik takiego: http://www.elektroda.pl/rtvforum/topic334889.html
Termometr oparty na DS18B20 oraz na AT90S2313 z kwarcem 4 MHz. Program napisany jest w bascomie. niestety wada jest taka że ten termometr mierzy temperaturę w zakresie 0-99°C
Mi przydałby się zakres ok -15 do 125°C. Z tego co wyczytałem Dallas to wytrzyma więc nie widzę problemu.

Kod: Zaznacz cały

Config Portb = Output
Config Portd = Output
Portb = 255
Portd = 127
Dim Zmienna As Byte
Dim Liczba As Byte
Dim Jednosci As Byte
Dim Dziesiatki As Byte
Dim Temp As Byte
Dim 1cyfra As Byte
Dim 2cyfra As Byte
Dim A As Byte
Dim Odczyt(2) As Byte
Dim T As Integer
Portd.0 = 1
Portd.1 = 0

Config 1wire = Portd.0
Liczba = 77

Do
   1wreset : 1wwrite &HCC : 1wwrite &HBE                      'polecenie odczytu DS18x20
   Odczyt(1) = 1wread(2)                                      'odczytaj dwa pierwsze bajty - temperaturę
   T = Odczyt(2)                                              '          starszy bajt temperatury
   Shift T , Left , 8                                         'przesuń w lewo o 8 miejsc
   T = T + Odczyt(1)                                          'w zmiennej Integer jest dziwna "ułamkowa" wartość
   Shift T , Right , 4                                        'zamiast dzielić przez 16 przesuń w prawo
 '   Shift T , Right , 1       'dla kostek DS18S20, DS1820 przesuń o 1 bit



     1wreset                                                  '   dopiero teraz daj polecenie konwersji:
     1wwrite &HCC                                             'polecenie SKIP ROM, bo pojedyncza kostka
     1wwrite &H44                                             '   dokonaj konwersji - zmierz temperaturę
                                                 'po cyklu pracy poczekaj
                                                 Liczba = T
                                                 Gosub Wyswietlanie
Loop

Wyswietlanie:
Portd.1 = 1
Gosub Oblicz
For A = 0 To 125
Dziesiatki:
If Dziesiatki = 0 Then
Portd.6 = 1
Goto Jednosci
End If
Portb = 1cyfra
Portd.6 = 0
Waitms 3
Jednosci:
Portb = 2cyfra
Portd.6 = 1
Portb.0 = 0
Waitms 3
Next A
A = 0
Portd.1 = 0
Return


Oblicz:
Temp = Makebcd(liczba)
Jednosci = Temp And &B00001111
Shift Temp , Right , 4
Dziesiatki = Temp

1cyfra = Lookup(dziesiatki , Tabela)
2cyfra = Lookup(jednosci , Tabela)

'Dziesiatki = Liczba / 10
'Jednosci = Dziesiatki * 10
'Jednosci = Liczba - jednosci

Return


End
Tabela:
Data 3 , 111 , 133 , 37 , 105 , 49 , 17 , 99 , 1 , 33
Moglibyście dla mnie przerobić ten program tak aby mierzył w tym zakresie temperaturę??
Wiem że to dla połowy z was banalne zadanie ale ja niestety ni w ząb nie umiem pisać tak zaawansowanych programów w BASCOM'ie

Za pomoc oczywiscie się odwzajemnie jeśli tylko będę mógł :wink:

P.S Fajnie by było jakby dało radę to przerobic tak aby mierzyło jeszcze napięcie na akumulatorze w samochodzie. Ale to już nie jest konieczne :) Ale jakby bez problemu dało to upchnąć do AT89C2051 będe niezmiernie wdzięczny :grin:
Załączniki
Schemat.gif
(36.24 KiB) Pobrany 587 razy
Schemat.jpg
Termometr3.jpg
Termometr3.jpg (65.39 KiB) Przejrzano 18519 razy
Termometr6.jpg

keruseykaryu

Post autor: keruseykaryu » 05 gru 2010, 17:45

Proste jak drut kolczasty. DS koduje temperaturę w kodzie binarnym U2. Jak ostatni bit jest 1 to liczba jest ujemna. Ustawiasz flagę, że ujemna. Potem zamieniasz kod U2 na NKB dodatni (negacja i dodanie jedynki) i resztę operacji robisz tak samo. Wyświetlanie widząc flagę UJEMNA, dodaje na wyświetlaczu minus. Wot wpieriot.
Załączniki
Bez tytułu.png

Awatar użytkownika
lutownik
Użytkownik
Posty: 517
Rejestracja: 01 paź 2006, 12:37
Lokalizacja: z planety Zi Emia
Kontakt:

Post autor: lutownik » 05 gru 2010, 18:38

Tylko wiesz kolego, co prawda wiem o co chodzi z tym kodowaniem i zamianą z U2 na NKB ale dalej to ni w ząb..... :wink: Nie bardzo wiem co to jest ta flaga, jak zrealizować konwersję w bascom'ie itd.

Co do minusa to wystarczy jakby dać zamiast wyswietlacza jedną prostokątną diodę :wink:

Wiem ze to przypomina jakbym chciał gotowca, ale naprawdę chłopaki ja ni w ząb nie znam bascoma, to tak jakbym teraz miał coś powiedzieć po peruwiańsku :wink:

Jeśli mozecie to nanieście te komendy w kod w/w albo chociaz powiedzcie gdzie uzyc jakiej funkcji to postaram się coś zdziałać :wink:

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 07 gru 2010, 14:38

Zmodyfikowałem załączony przez pana program.
Program był testowany na ZL2AVR (Mega8) po zmianie konfiguracji portów.
Zamiana portów z MEGA8 na 2313 w poniższym kodzie pod poszła dość sprawnie choć mogłem się pomylić. Wydaje mi się ze stałych data jest błąd i dla cyfry 7 powinno być nie 99 a 47.
W celu poprawnego odczytu magistrali 1Wire przy wygaszonym nieznaczącym zerze
zwiększyłem opóźnienie w podprogramie jedności (dla kwarcu 8MHz).
Ujemna temperatura była testowana w zamrażalniku lodówkowym. niestety temperatura nie była niższa niż -9 stopni Celsiusza.

Kod: Zaznacz cały

'$sim
$regfile = "2313def.dat"
$crystal = 8000000
Config Portb = Output
Config Portd = Output
Portd = 255
Portb = 127
Dim Liczba As Byte
Dim Jednosci As Byte
Dim Dziesiatki As Byte
Dim Temp As Byte
Dim 1cyfra As Byte
Dim 2cyfra As Byte
Dim A As Byte
Dim Odczyt(2) As Byte
Portb.0 = 1
Portd.6 = 0
Portd.2 = 1                                                 'wygaszenie LED minus
Config 1wire = Portd.0
Do
  1wreset
  1wwrite &HCC
  1wwrite &H44
    Liczba = Odczyt(1)
    Shift Liczba , Right , 1
    If Odczyt(2).7 = 1 Then
      Liczba = Not Liczba
      Reset Liczba.7
      Reset Portd.2                                         'zaœwiecenie LED minus
      Incr Liczba
    Else
      Set Portd.2                                           'wygaszenie LED minus
    End If
Gosub Wyswietlanie
  1wreset
  1wwrite &HCC
  1wwrite &HBE
  Odczyt(1) = 1wread(2)
Loop

Wyswietlanie:
'Portd.1 = 1
Gosub Oblicz
For A = 0 To 125

Dziesiatki:
If Dziesiatki = 0 Then
  Portd.6 = 1
  Goto Jednosci
End If
Portb = 1cyfra
Portd.6 = 0
Waitms 3

Jednosci:
Portb = 2cyfra
Portd.6 = 1
Portb.0 = 0
Waitms 6
Next A
A = 0
'Portd.6 = 0
Return

Oblicz:
Temp = Makebcd(liczba)
Jednosci = Temp And &B00001111
Shift Temp , Right , 4
Dziesiatki = Temp
1cyfra = Lookup(dziesiatki , Tabela)
2cyfra = Lookup(jednosci , Tabela)
Return

End

Tabela:
'Data 3 , 111 , 133 , 37 , 105 , 49 , 17 , 99 , 1 , 33
  Data 3 , 111 , 133 , 37 , 105 , 49 , 17 , 47 , 1 , 33
'C A E B D F G ""
Aby program mierzył temperaturę wyższą od 99 stopni należy dokonać modyfikacji części sprzętowej jak i programowej (trzeci wyświetlać lub LED'y imitujące jedynkę),

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 07 gru 2010, 19:17

A po co modyfikować sprzętowo układ ? To nie można przesuwać wyniku pomiaru po ekranie z prawej do lewej ?

Awatar użytkownika
lutownik
Użytkownik
Posty: 517
Rejestracja: 01 paź 2006, 12:37
Lokalizacja: z planety Zi Emia
Kontakt:

Post autor: lutownik » 07 gru 2010, 19:19

Wielkie dzięki :smile:
Czyli ten kod mogę wkleić bez niczego odrazu do bascoma i skompilować a potem wgrać przez programator do AT90S2313??

Co z tym kwarcem?? Mam dać kwarc na 8mhz??

Pod który pin mam podłaczyć tą diodę imitująca minus??

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 07 gru 2010, 19:30

Tzn. jak masz ATTiny2313 to możesz kwarc wywalić całkiem, bo skorzystasz z wewnętrznego oscylatora RC. Jak wywalisz kwarc to zwolnią ci się 2 linie procesora, a to daje 2 możliwości:
1. zbudować nową płytkę w wyświetlaczami LED, 2 tranzystorami i mieć możliwość wyświetlania na wszystkich 4 wyświetlaczach.
2. wykorzystać te 2 linie do zapalania minusa i 1, jak chcesz dodawać dwie dodatkowe LEDy.
Ogólnie grzechem głównym tego układu jest ustalenie na stałe znaku °C

Awatar użytkownika
lutownik
Użytkownik
Posty: 517
Rejestracja: 01 paź 2006, 12:37
Lokalizacja: z planety Zi Emia
Kontakt:

Post autor: lutownik » 07 gru 2010, 19:35

AT90S2313 to to samo co attiny 2313??

W moim przypadku planuję zamienić dwa wyświetlacze wyświetlające °C na zwyczajny napis na obudowie. Przeprojektowanie płytki to nie problem.

Tak więc jeśli to nie problem dla kolegi który pisał program aby przerobić tą diodę na dodatkowy wyświetlacz LED to możemy tak zrobić, ponieważ nie lubię wędrowania wyniku na ekranie LED, co innego na LCD, ale LCD tu to kompletnie nie pasuje.
Wyświetlacze są w multipleksie więc podłączmy ten przewód "sygnałowy" pod ten port który był przewidziany dla diody imitujacej minus :wink:

skoro mamy wyświetlacz dodatkowy to dodaj możliwosc pomiaru tak do 115 stopni chociaż :wink:

Zastanawiam sie czy ten procek przy załozeniu ze ten AT90S2313 = ATTINY2313 podoła pamięciowo.....
Ostatnio zmieniony 07 gru 2010, 19:48 przez lutownik, łącznie zmieniany 1 raz.

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 07 gru 2010, 19:44

Nie ATTiny2313 to wersja rozwojowa At90S2313 wyposażona w dodatkowe możliwości w tym możliwość używania końcówek RESET, XTAL1, XTAL2, jako portów I/0 czego nie ma AT90S2313, posiada także kilka dodatkowych funkcji jak wewnętrzny oscylator RC, i sprzętowy port USI którego 90S2313 nie ma.
Zresztą jak sam robisz PCB to nie żaden problem użyć wyświetlacz 3,5 cyfry który ma i minus i 1.

Awatar użytkownika
lutownik
Użytkownik
Posty: 517
Rejestracja: 01 paź 2006, 12:37
Lokalizacja: z planety Zi Emia
Kontakt:

Post autor: lutownik » 07 gru 2010, 19:55

Dzięki za rozwianie wątpliwości :wink: Widzę że jeśli chodzi o problemy z dziedziny mikroprocesorów to na Ciebie kolego Kayron mogę liczyć :wink:

Także jeżeli kolega c4v2 podoła dokończeniu dzieła to moze to zrobić odrazu pod attiny 2313.

Także możesz użyć wewnętrznego oscylatora RC o którym wspomniał kolega Kayron
Zyskamy w ten sposób dodatkowe porty I/O które możesz wykorzystać pod ten 3 wyświetlacz.

Widzę że sam będę musiał wziąść się za bascoma bo inaczej daleko nie zajadę..... :oops:

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 07 gru 2010, 20:12

Mogę się podjąć napisania programu pod termometr bo ten to nie jest mojego autorstwa. to tylko modyfikacja.
Lecz wolał bym pisać całkowicie od początku tzn. mam trochę inną manierę obsługi multipleksowanych wyświetlaczy 7seg. Obsługa w przerwaniu od przepełnienia licznika, jest wtedy prostu jest mniej zależności czasowych a program jest łatwiejszy do późniejszych modyfikacji.

Czekam zatem na hardware... :smile:

Awatar użytkownika
lutownik
Użytkownik
Posty: 517
Rejestracja: 01 paź 2006, 12:37
Lokalizacja: z planety Zi Emia
Kontakt:

Post autor: lutownik » 07 gru 2010, 20:32

Jeżeli tylko możesz uprościć ten program to pisz tak jak chcesz byle by działało :wink: i najlepiej jakby sie zmieściło pod attiny 2313.

Domyślam się że jeżeli chodzi o hardware masz na myśli schemat urządzonka ??

Schemat narysuje dostaniesz go jutro, najwyżej pojutrze, mam trochę spraw na głowie więc nie gniewaj się jeśli obsunie się to wczasie tak jak zapowiadam. Postaram się to narysować najszybciej jak się da :wink:

Taka mała prośba z mojej stron. Jeśli możesz to dopisz trochę komentarzy to i się poduczę zawsze coś jesli chodzi o bascoma :smile:

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 07 gru 2010, 21:19

Tak chodzi mi o schemat, żebym ponownie nie musiał dekodować przypisań Port<>Segment :wink:
Program będzie miał stosowne komentarze.

Awatar użytkownika
lutownik
Użytkownik
Posty: 517
Rejestracja: 01 paź 2006, 12:37
Lokalizacja: z planety Zi Emia
Kontakt:

Post autor: lutownik » 09 gru 2010, 19:17

Ok zrobiłem schemacik :wink:

Mam taką małą prośbę, jeśli dało by radę i starczyło by pamięci to można by zrobić żeby ta dioda ( narysowana na czerwono) migała tak z częstotliwością ok 1,5Hz ( tak jak kierunkowskazy w normalnym aucie) wtedy gdy temperatura mierzona jest < 30°C. Chodzi o to żebym nie przełączał na LPG wtedy gdy silnik nie jest rozgrzany do tych 30 stopni.
Załączniki
Schemat'.gif
(30.42 KiB) Pobrany 579 razy
Ostatnio zmieniony 10 gru 2010, 12:07 przez lutownik, łącznie zmieniany 3 razy.

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 09 gru 2010, 23:40

Ok może pamięci wystarczy :wink:
Tyle że polaryzacja tego LED jest nieprawidłowa, chyba że zamiast anodą do masy będzie podpięta do +5V
przez rezystor oczywiście?
Ewentualnie zamiast oddzielnego LED wyjście mikroprocesora podpiąć do segmentu dp?
Czy LED ma być wygaszona gdy mierzona temperatura jest większa od 30°C?
Odchyłka od częstotliwości 1.5Hz +/-?
I jeszcze jedno: Proszę o przypisania pinów PortuB do segmentów wyświetlacza.
Czy też zmianie uległa tylko płytka wyświetlaczy?
Nie chce mi się "zgadywać" drugi raz tych przypisań :wink:
Ale tego to już nie mogę odgadnąć w jakim celu jest D1?

[ Dodano: 2010-12-10, 00:15 ]
Proszę zwrócić uwagę na niedostateczne filtrowanie napięcia zasilającego.
Na stole warsztatowym układ zasilany z zasilacza laboratoryjnego będzie działać, ale w warunkach docelowych mogą być problemy.
Układy elektroniczne zasilane z instalacji pojazdu narażone są na zakłócenia.
Proponuję elektrolit na VCC o wartości 100uF/16V oraz dodatkowy ceramik (100nF) przy PIN'e zasilania mikroprocesora.
Można również zabezpieczyć układ przed zmianą polaryzacji oraz szpilkami których amplituda
znacznie przewyższa "samochodowe 12V".

[ Dodano: 2010-12-10, 00:24 ]
Jaka ma być docelowa wersja czujnika: DS1820, DS18B20, DS18x20?

ODPOWIEDZ