logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

(AT89C2051) Sterowanie segmentowymi LED i termometry I2C

sigreg 04 Mar 2004 21:24 5812 13
REKLAMA
  • #1 531698
    sigreg
    Poziom 10  
    Posty: 47
    Czesc,

    Chcialbym "zmontowac" pierwszy uklad ktory mialby jakies praktyczne zastosowanie. Jako ze zarowno w elektronice jak i programowaniu mikroprockow stawiam pierwsze niepewne kroki wiec najprostszy problem jest dla mnie wyzwaniem ;) Ukladem ktory sobie wymyslilem bedzie termometr elektroniczny oparty na AT89C2051 lub 4051. Pojawily sie jednak dwa problemy.
    1) chcialem zeby termometr mial dwa czujniki temperatury - dla temp. wewnatrz i na zewnatrz, ale nie wiem jak rozwiazac sprawe adresowania. Jezeli zakupie dwa czujniki tego samego producenta to beda mialy ten sam adres .. da sie to jakos obejsc i zmienic adres czujnika ? Wiem ze mozna nabyc czujniki dwoch producentow o roznych adresach, ale to za proste rozwiazanie, wolalbym wiedziec jak uporac sie z dublujacym sie adresem
    2) temperatura musi byc na czyms wyswietlana. Szkoda mi wyswietlacza LCD na w miare prosty uklad, zastosowalbym dwa 7-segmentowe LEDy, ale nie wiem jak nimi sterowac. Dwa wyswietlacze segmentowe (lub jeden podwojny) to 14 diod do obslugi, a tyle pinow na to przeznaczyc nie moge. Czy jest jakis, nie wiem, sterownik wyswietlaczy led ? Idealnie byloby gdyby pracowal w oparciu o I2C, chociaz kazde rozwiazanie bedzie dobre.
  • REKLAMA
  • #2 531735
    ghost666
    Tłumacz Redaktor
    Posty: 11961
    Pomógł: 157
    Ocena: 10264
    2 - moze expander I2C na 8bit - układ pcf8574? masz dostatecznei duzo wyjsc aby zrobić dwa wyświetlacze multiplexowane.
  • REKLAMA
  • #3 531746
    yego666
    Poziom 33  
    Posty: 2175
    Pomógł: 239
    Ocena: 564
    Co do wyswietlania, to w takiej sytuacji gdy procek ma malo portow, mozesz wziac uklad n.p. MAX 7221 produkcji MAXIM. Uklad ten jest sterowany ze standardowej szyny SPI ( Microwire ) . Wprawdzie 89c2051 nie ma takiej szyny, ale latwo ja oprogramowac. Specyfikacje tej kostki znajdziesz latwo na stronie producenta. Jednak moim zdaniem do sterowania 2 wyswietlaczy LED troche szkoda takiej kostki. Lepiej zrobic to w ukladzie tradycyjnego sterowania multiplexowanego. Polega ono na tym, ze anody segmentow o jednakowych literkach ze wszystkich wyswietlaczy laczymy razem ( czyli segment a zwyswietlacza 1 z segmentem a wyswietlacza 2, segment b zwyswietlacza 1 z segmentem b wyswietlacza 2, i tak dalej. Otrzymujesz w ten sposob osiem wejsc ( anody od "a" do "h" ) do wysterowania. Katody poszczegolnych wyswietlaczy sterujesz tak by tylko jeden wyswietlacz na raz byl aktywny. I wtedy podajesz na anody tresc do wyswietlenia na tym aktywnym wyswietlaczu. Po jakichs 10 ms przelaczasz katode na kolejny wyswietlacz i podajesz na anody tresc do wyswietlenia na tym wyswietlaczu. Calkiem proste gdy sobie to namalujesz. Rzecz polega na oszukaniu oka, ktore "mysli" ze widzi przez caly czas wszystkie cyfry, tymczasem kazda cyfre widzi tylko co jakis czas. Jesli utrzymasz predkosc przelaczania katod i tresci ( anod, ergo segmentow ) zludzenie ciaglosci bedzie dosc dobre i nie zauwazysz mrugania.
    Co do adresowania kostek termometrow, to zwykle maja one trzy piny, na ktorych ustalasz adres danej kostki na szynie, i jesli kazda kostka bedzie miala inny adres ( w zakresie od 0 do 7 ) bedzie mozna z kazda z nich gadac bez problemow. Oczywiscie konkretna implementacja zalezy od konkretnego ukladu. RTFM dla wybranej kostki, a wszystko bedzie jasne.
    Pozdrawiam, Y E G O
  • #4 531750
    bobeer
    Poziom 28  
    Posty: 1497
    Pomógł: 57
    Ocena: 641
    nie zapominaj o mozliwosci multiplexowania
    dla 3 cyfr masz 10 portow
    i zostaje ci jeszcze mnustwo innych na obsluge i2c i przyciskow
    obsluge led wsadz sobie w przerwanie
    a termometry tylko i2c
    jak uzyjesz 1 wire to musisz wylaczac led na czas pomiaru
    inaczej niewyrobi z czasami
  • #5 531778
    lechoo
    Poziom 39  
    Posty: 5161
    Pomógł: 377
    Ocena: 546
    bobeer napisał:
    jak uzyjesz 1 wire to musisz wylaczac led na czas pomiaru inaczej niewyrobi z czasami

    Nieprawda, wystarczy zsynchronizować odczyt 1-wire z przerwaniami :)
    Więcej info znajdziesz w tym pliku: https://www.elektroda.pl/nauka/dyplomowe/zegar_cyfrowy_termo.zip
    Jest to zegar z termometrem 1-wire, przejrzyj dokładnie zawarty w archiwum program (zegar.c).
  • #6 531940
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    też nie rozumiem Bobeera :)
    proste, jesli chcesz tylko uzyskać temperature z dallasa to na przemian co sekunde wystarczy mu wysłąć rozkazu konwersacji temperaury i jej odczytu. albo odczytywać co sekunde, a zaraz po odczycie dać rozkaz do zmierzenia temperatury.

    co do wyświetlaczy. Szkoda wywalać kase na PCF8574... jeśli już brakuje portów to polecam jakieś rejestry z serii 74, np bardzo lubiany przezemnie układzik z tej rodziny to 74HC595- jest tani a daje tyle radości... :D
  • #7 531950
    oj
    Poziom 42  
    Posty: 6632
    Pomógł: 788
    Ocena: 480
    W EdW 2/2004 ukazał się taki projekt:
    Cytat:
    Dwupunktowy termometr
    Termometr umożliwia pomiar temperatury w dwóch punktach, np. na zewnątrz mieszkania i wewnątrz lub w dowolnych innych miejscach. Zakres mierzonych temperatur zawiera się w przedziale -55 do +99oC, przy czym dokładność ±1oC jest wystarczająca w domowych pomiarach. Wyświetlanie temperatury przez wyświetlacz matrycowy jest miłe dla oka, gdyż nie ma „kwadratowych” cyfr jak w zwykłym wyświetlaczu 7-segmentowym. Termometr umożliwia zapamiętywanie temperatury minimalnej oraz maksymalnej zarówno dla mierzonej temperatury zewnętrznej, jak i wewnętrznej. Temperatury max oraz min są zapamiętywane w pamięci EEPROM, dzięki czemu po włączeniu zasilania mogą być odtworzone.


    Projekt na 89C2051 + dwa czujniki DS.
    Podejrzyj jak autor to zrobił a program napisz sam
  • REKLAMA
  • #8 532115
    bobeer
    Poziom 28  
    Posty: 1497
    Pomógł: 57
    Ocena: 641
    lechoo napisał:
    bobeer napisał:
    jak uzyjesz 1 wire to musisz wylaczac led na czas pomiaru inaczej niewyrobi z czasami

    Nieprawda, wystarczy zsynchronizować odczyt 1-wire z przerwaniami :)
    Więcej info znajdziesz w tym pliku: https://www.elektroda.pl/nauka/dyplomowe/zegar_cyfrowy_termo.zip
    Jest to zegar z termometrem 1-wire, przejrzyj dokładnie zawarty w archiwum program (zegar.c).

    zapomnialem ze chodzilo mi o bascoma
    kiedys probowalem cos takiego wykombinowac, i raczej z marnym skutkiem.
    masz racje ze sie da to zsynchronizowac, ale procek (51) naprawde niemoze miec juz nic wiecej do roboty w czasie rzeczywistym jak obsluga tego led i 1wire
    bo czasu to chyba na styk

    (zamiast podawac linka do 1.5Mwego pliku czabylo wkleic ten kod)
  • #9 532544
    lechoo
    Poziom 39  
    Posty: 5161
    Pomógł: 377
    Ocena: 546
    Cały bajer polega na tym, żeby tuż przed obsługą 1-wire zaczekać na obsłużenie przerwania, po czym mamy wystarczająco sporo czasu aby dokonać odczytu lub zapisu jednego bitu. Przed operacją na kolejnym bicie znowu czekamy na kolejne przerwanie, i tak w kółko aż odczytamy (lub zapiszemy) cały bajt. W baskomie faktycznie to może być mały problem, chyba że sobie sam napiszesz procedurki obsługi 1wire z synchronizacją z przerwaniami. W moim programie do tej synchronizacji użyłem zmiennen bitowej 'przerwanie' która jest zerowana podczas obsługi przerwania. W programie obsługi 1wire w krytycznym miejscu najpierw ustawiam sobie tą zmienną, po czym czekam aż zostanie wyzerowana i wtedy dokonuję operacji odczytu/zapisu bitu. W załączniku zamieszczam sam program z obszernymi komentarzami.
    Załączniki:
    • zegar.c (21.47 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #10 532545
    yego666
    Poziom 33  
    Posty: 2175
    Pomógł: 239
    Ocena: 564
    '51 potrafi duzo wiecej przy uwaznym programowaniu. Obsluga 2 zapchlonych termometrow na pewno nie jest go w stanie zapchac. Spokojnie mozna dolozyc klawiature, wyswietlacz i jeszcze komunikacje szeregowa. To co kolega Sigreg chce obsluzyc obciazy procesor w jakichs 20 do 30 %. Przez reszte czasu procek bedzie sie nudzil :( . Oczywiscie niechlujnym programem mozna zapchac nawet Craya, ale jesli postaramy sie nie pisac bzdur w programie to '51 zupelnie wystarczy do calkiem sporych zadan. problemy z wydajnoscia pojawiaja sie gdy mamy zagadnienie typu real time z dosc ciasnym rezimem czasowym. W tym ten procek nie jest dobry :!: Nie wiem jaki kod produkuje Bascom, bo nigdy go nie uzywalem, ale mysle, ze jesli jest on tak popularny, to nie jest chyba az tak zly zeby procek sie pod nim czolgal. :D

    Pozdrawiam, Y E G O
  • #11 548537
    DmZ
    Poziom 18  
    Posty: 371
    Ocena: 37
    jest oczywiście taki sterownik. nazywa sie to dekoder kodu BCD na kod 7-segmentowy. sluzy właśnie do obsługi wyświetlaczy led. ja sie tym bawie od dawna i zawsze działa. po za tym nie spotkałem jeszcze nikogo kto sam zrobiłby taki dekoder. wszystko mioesci sie w prostym scalaku ul7447.
    pozdr
  • REKLAMA
  • #12 550888
    lechoo
    Poziom 39  
    Posty: 5161
    Pomógł: 377
    Ocena: 546
    Po co jakiś 7447 (który na dodatek źle wyświetla 6 i 9), skoro można to wszystko zrobić programowo?
  • #13 1222385
    kuba989898
    Poziom 19  
    Posty: 258
    Pomógł: 29
    Ocena: 25
    Mam pytanie dotyczące podłączania transkoderów 74LS47 do AT89C2051:
    Czy można je podłączyć (w moim przypadku do portu P1) mikrokontrolera bez dodatkowych rezystorów pull-up/pull-down ?
    Czy też należy jakieś rezystory stosować (ew jakie i na których liniach portu) ?
  • #14 1223903
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    pull-up'y powinne być na portach p1.0, p1.1 (4,7k)
    przy okazji ciekawostka z tym związana. Nie zastosowałem tych rezystorów i do tych portów podpiołem wyświetlacz LCD- o dziwo LCD działał poprawnie. Może przyczyna tkwi w jego wewnętrznej konstrukcji, może sam "podciągł" wejscia

Podsumowanie tematu

✨ Dyskusja dotyczy budowy elektronicznego termometru opartego na mikrokontrolerze AT89C2051 (lub 4051) z dwoma czujnikami temperatury komunikującymi się przez magistralę I2C lub 1-wire oraz wyświetlaniem wyników na segmentowych wyświetlaczach LED. Poruszono problem adresowania dwóch identycznych czujników I2C, gdzie sugerowano stosowanie czujników różnych producentów lub zmianę adresu, choć szczegóły zmiany adresu nie zostały rozwinięte. W kwestii wyświetlania temperatury zaproponowano kilka rozwiązań: użycie ekspandera portów I2C PCF8574 do sterowania wyświetlaczami multiplexowanymi, zastosowanie układu MAX7221 (sterownik LED z interfejsem SPI programowalnym w mikrokontrolerze), a także tradycyjne sterowanie multiplexowane segmentami 7-segmentowych wyświetlaczy poprzez łączenie anod segmentów i przełączanie katod. Wskazano, że multiplexowanie pozwala efektywnie wykorzystać ograniczoną liczbę portów mikrokontrolera. Alternatywnie polecano użycie rejestrów przesuwających 74HC595 do rozszerzenia wyjść. Dyskutowano także synchronizację odczytów czujników 1-wire z obsługą przerwań, aby uniknąć konfliktów czasowych z obsługą LED. Wspomniano projekt z czasopisma EdW 2/2004, który realizuje podobne zadanie z dwoma czujnikami DS. W kwestii dekodowania sygnału do wyświetlaczy LED wymieniono układ UL7447 jako popularny dekoder BCD na 7-segmentowy, choć pojawiła się opinia, że lepiej realizować to programowo. Na koniec poruszono temat rezystorów podciągających (pull-up) na portach mikrokontrolera przy podłączaniu układów 74LS47, zalecając stosowanie rezystorów 4,7 kΩ na liniach P1.0 i P1.1, choć w praktyce LCD czasem działa bez nich dzięki wewnętrznej konstrukcji.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA