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

Projekt zegarka z ATmega8535: odliczanie czasu lekcji i przerw

iop_2 12 Lut 2006 09:02 2657 25
REKLAMA
  • #1 2292021
    iop_2
    Poziom 11  
    Posty: 74
    Ocena: 1
    Witam
    Znajomy ma pomysl na projekt zegarka do klasy:) A wiec tak na wyswietlaczach segmentowych duze cztery segmenty na hh : mm a podspodem mnniejsze na ktorych bylby odliczany czas:
    1. podczas lekcji do przerwy (45min, mm:ss)
    2. podczas przerw do lekcji
    I teraz podejzewam ze najwiekszy problem bedzie z tym odliczaniem czasu? Moze sa juz do tego gotowe uklady? Bede wdzieczny za jakiekolwiek informacje
    :)
    Pozdrawiam
  • REKLAMA
  • #2 2292088
    ZbeeGin
    Poziom 39  
    Posty: 4318
    Pomógł: 602
    Ocena: 452
    Do celów wskazania bieżącego czasu najlepiej użyć scalonych układów RTC komunikujących się przez szynę I2C. Dla przykładu popularnego PCF8583 firmy Philips.
    Potrzymanie zasilania tylko układu RTC bateryjką (np. CR2032) lub specjalnym kondensatorem o pojemności kilku faradów będzie gwaranować ciągłość wskazań zegara.

    W kwestii odliczania pkt. 1 i 2, wystarczy znać plan rozkładu zajęć (zapisany albo w pamięci EEPROM, albo w pamięci RTC) i na podstawie wskazań zegara oraz w/w planu obliczać programowo - przez proste odejmowanie liczb BCD - bieżący czas lekcji oraz przerw.
    Zaawansowane funkcje alarmu w PCF 8583 mogą służyć właśnie do inicjowania odliczania - co odciąży procesor od ciągłego sprawdzania planu. Ustawiasz alarm w pn.-pt. na 8:00, a procek czeka na przerwanie z linii INT0 (połączonej z linią INT układu RTC). Pojawia się przerwanie, program rozpoczyna odczytywanie planu, pobiera ramy czasowe lekcji (np. 8:00 - 8:45) z pamięci i co jakiś czas - co 0,25s, 1s... - wskazuje róźnicę pomiędzy czasem bieżącym a czasem zakończenia lekcji. Taki sam mechanizm będzie obowiązywał dla przerw.
    Taki cykl odbywałby się aż do przejścia na koniec planu. Po stwierdzeniu tego faktu program mógłby zająć się tylko wskazywaniem czasu aż... do następnego dnia gdy znów pojawi się sygnał alarmu.

    O dedykowanych układach służących tylko do tego celu nie słyszałem. Może firma Holtek (znana z niecodziennych "chipów-zabawek") wyprodukowała coś takiego? :D
  • REKLAMA
  • #3 2293085
    iop_2
    Poziom 11  
    Posty: 74
    Ocena: 1
    Ok jeszcze musze obczaic co z tymi rejestrami ;) i jak to sie tym poslugiwac ;). Alarmu jako takiego by nie bylo jedunie odliczanie :). i tak wlasnie ze jesli bedzie godzina 15:20 to zeby potem nie odliczal juz az do 08:00 daty nie bede chyba wykorzystywal :). Pozdrawiam

    Dodano po 48 [minuty]:

    Hmm cos mi sie wydaje ze to z tymi rejestrami to za wysokie loty jak na mnie :( chyba ze macie jakis prosty dokument na ten temat :).? (specyfikacje PCF8583 juz mam) i nie bardzo wiem jak go oblsuzyc. :(
    Pozdrawiam

    Dodano po 23 [minuty]:

    Tak czy siak klapa :( poniewz chce wykozystac segmentowe wyswietlacze LED to musze miec 4 porty do obslugi hh : mm no wiec sila zeczy nie mam jak podlaczyc PCF8583. Dlatego myslalem o 2 mikrokontrolerach jeden do wlasnie hh:mm a drugi do tego odliczania ? i jak je polaczyc bo i tak potrzebuje 4 portow na mm:ss:( macie jakies pomysly?
    Pozdrawiam
  • #4 2293469
    jaglarz
    Poziom 23  
    Posty: 480
    Pomógł: 58
    Ocena: 47
    Dlaczego 4 porty??? Wystarczą 2. Poczytaj o multipleksowaniu wyświetlaczy.
    A jakby się uprzeć i dać układ 4543, to starczyłby jeden port.



    Marek Jaglarz
    www./ja/rozdz.htm
  • #5 2293510
    iop_2
    Poziom 11  
    Posty: 74
    Ocena: 1
    Multiplekser to takie cos ze podajemy mu na jakies tam wejscie ciag bitow a on to nam wywala na rozne wyjscia po bicie na kazde tak ? :) I jakos nie moge znalesc takich :( jakie sa najpopularniejsze?
    Pozdrawiam
  • #6 2293580
    ZbeeGin
    Poziom 39  
    Posty: 4318
    Pomógł: 602
    Ocena: 452
    Mało portów? Poczytaj także o ekspanderach PCF8574, PCF8574A.

    Koledze Markowi nie chodziło o scalone multipleksery tylko o multipleksowane sterowanie wyświetlacza. Jeden port steruje katodami a drugi port steruje anodami wyświetlaczy - przez tranzystory!. Da się wtedy bezpośrednio zasterować ośmioma wyświetlaczami 7 segmentowymi. Na "port katod" wystawiasz mapę bitową odzwierciedlającą stan segnemtów pojedyńczego wyświetlacza, a "portem anod" wybierasz który wyświetlacz ma w danej chwili świecić. Jak będziesz przełączał wyświetlacze z częstotliwością ponad 30Hz to oko zobaczy że wszystkie świecą naraz.
    A przy wykorzystaniu scalonego multpileksera w "porcie anod" - choć nie ma takiego scalaka z tyloma wyjściami - aż do 128 wyświetlaczy.
  • #7 2293870
    iop_2
    Poziom 11  
    Posty: 74
    Ocena: 1
    Czyli jest mozliwe przy pomocy jednego ukladu AT89C51 Sterowanie dwoma poczwornymi 7-segmentowymi wyswietlaczami LED?
  • REKLAMA
  • #9 2296043
    iop_2
    Poziom 11  
    Posty: 74
    Ocena: 1
    Tylko jakos nie moge tego pojoc :( jeden port to jeden poczworny wyswietlacz 7 - segmentowy tak? no i jak go oblsuzyc? jak zrboc tak zeby bylo wyswietlane na jednym segmencie? no bo rozumiem ze bede wysylal ze spora czestotliwoscia z jedngo portu do kazdego z wyswietlaczy. Ale to wtedy musze miec te cztery wyswietlacze podlaczone do tego samego portu i jak zrobic zeby np. czworka byla wyswietlona na drugim wyswietlaczu a na pozostalych trzech juz nie ?
    Pozdrawiam i dziekuje za dotychczasowa cierpliwosc.. ;)
  • #10 2296640
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Cała selekcja odbywa się przez wybieranie odpowiedniej anody. Czyli w danej chwili może tylko świecić jedna cyferka i to jest istotą wyświetlanie "multipleksowego".
  • #11 2296666
    iop_2
    Poziom 11  
    Posty: 74
    Ocena: 1
    no tak ale jak np. na jednym wyswietlaczu ma mi swiecic 2 a na drugim 8 ?
  • Pomocny post
    #12 2296749
    Jacu$
    Poziom 27  
    Posty: 730
    Pomógł: 119
    Ocena: 26
    Każdy wyświetlacz ma 8 didek LED (7 segmentów i ósma kropka) połączonych anodami wszystkie razem a katody oznaczone od A do H wyprowadzone osobno.
    Masz np. 4 wyświetlacze (4 pojedyncze cyfry) więc łączysz ze sobą katody segmentów A wszystkich wyświetlaczy, katody segmentów B wszystkich wyświetlaczy itd. aż do G.
    Podłączasz zwarte segmenty kolejno do pinów jednego portu mikrokontrolera.
    Jeśli chcesz zapalić na pierwszym wyśwoetlaczu cyfrę 2 to ustawiasz na porcie kombinację stanów niskich odpowiadającą kształtowi 2. Oczywiście, ta kombinacja pojawi się na wszystkich wyświetlaczach ale one jeszcze się nie palą. Teraz z drugiego portu mikrokontrolera sterujesz (zazwyczaj poprzez tranzystor) zasilaniem anody pierwszego wyświetlacza i wówczas tylko na nim zapali się cyfra 2.
    Po chwili gasisz wyświetlacz pierwszy, ustawiasz na porcie od segmentów ósemkę i włączasz zasilanie anody drugiego wyświetlacza, na którym zapali się 8. I tak kolejno wysyłasz na wszystkie razem wyświetlacze poszczególne "cyferki" ale zapalasz zawsze tylko właściwy wyświetlacz (i tylko jeden w danej chwili).
    Jeśli będziesz to robił odpowiednio szybko to oko nie zdoła zauważyć, że nigdy nie świecą się wszystkie cyfry na raz. Uwaga: taki sposób wyświetlania jest dość czuły na wszelkie zakłócenia czasów zaświecania cyferek, co objawia się wówczas nierównym świeceniem poszczególnych cyfr albo ich migotaniem.
    Jeśli chciałbyś zaświecać jednocześnie wszystkie cyfry i wykorzystać mniej linii portu to polecam rejestry szeregowe z wyjściami równoległymi. Ładujesz kombinację zer i jedynek szeregowo do kilku rejestrów połączonych kaskadowo i przepisujesz do przerzutników wyjściowych. Wszystko trwa baaardzo mały ułamek sekundy.
  • #13 2297034
    iop_2
    Poziom 11  
    Posty: 74
    Ocena: 1
    Juz czaje :) dzieki wielkie :) Teraz zabiore sie za soft :) Jak chce zeby nie swiecil segment to daje stan wysoki na pin, a jak chce, to niski a anode wysoki :) tak jak jest w specyfikacji wyswietlacza ;)
    Pozdrawiam

    P.S.: Jescze musze pomyslec nad ustawieniem godziny ;) mysle o jakims przelaczniku po ktorego przelaczeniu wywolywal bym inna funkcje w ktorej przyznawal bym zmiennej godzin jakas wartosc. i przycisk do dodawania 1 do zmiennej godzin. cos jak
    ...
    #define h P2^6
    #define ustaw P2^7
    int godziny;
    int sekundy;
    
    while(ustaw == 0){
    sekundy = 0;
    if(h == 0){
    godziny++;
    wyswietl(godziny);
    }}
    ...
    
    Taki baaaardzo pogladowy kodzik co wy na to ?
    Pozdrawiam
  • #14 2304125
    iop_2
    Poziom 11  
    Posty: 74
    Ocena: 1
    Jednak Chyba zrobie to prosciej ;) poniewaz doszedlem do wniosku ze bede ustawial ten zegar na godzine 8:00 rowno z dzwonkiem na lekcje to zrobie poprostu jeden switch po wcisnieciu ktorego bede zerowal sekundy i ustawial godziny na 8. Chyba lepsze rozwiazanie?
    Pozdrawiam
  • #15 2306457
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    Jak mam rozumieć zmianę tematu ? Do ATmega8535 nie potrzeba żadnego PCF-a, ten układ samodzielnie obsługuje kwarc zegarkowy na oddzielnych wyprowadzeniach za pomocą licznika asynchronicznego. Proponuję zajrzeć do not katalogowych.
  • #16 2306612
    ZbeeGin
    Poziom 39  
    Posty: 4318
    Pomógł: 602
    Ocena: 452
    Zastosowanie zewnętrznego RTC uprościło by pewne sprawy:
    - Zegar ustawiałoby się tylko raz.
    - Prostsze podtrzymanie bateryjne - dwie diody, rezystor, bateryjka i po sprawie.
    - Przy zastosowaniu opcji alarmu z PCF-a wszystko działoby się automatycznie. Żadnego chodzenia do zegara punkt 8:00 by go "zresetować"
    - Nie trzeba pisać nieco skomplikowanej procedury obłsługi przerwania by mierzyć czas.
    Nic tylko ustawić bieżącą godzinę i datę, powieśić na ścianie... i patrzeć.

    Szkoda, że kol. iop_2 nie chce, lub nie czuje się na siłach by pójść tą drogą.
  • #17 2306777
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    Osobiście wyznaję zasadę, im trudniej, tym ciekawiej i można się więcej nauczyć... Jeśli chodzi o zasilanie awaryjne to ATmega wcale dużo pradu nie pobiera w odpowiednim trybie uśpienia. Można ją wybudzać przerwaniem z licznika, może to byc reset z watchdoga (Źródło resetu jest rozpoznawalne w MCUCSR), obsłużyć co trzeba i znowu uśpić - przeliczanie sekund, minut i godzin to nie jest takie znowu skomplikowane, jezeli znamy co jaki czas licznik się przepełni...
  • #18 2306813
    iop_2
    Poziom 11  
    Posty: 74
    Ocena: 1
    Zmiana tematu jest spowodowana brakiem srodkow pienieznych na programator ;). A co do pradu to to bedzie wisialo w klasie wiec zrobie zasilacz. Bede kozystal z wewnetrznych Timerow i przerwan. A mi chodzi o ustawienie go raz punkt 8:00 zeby dobrze chodzil rowno z dzwonkiem :). Teraz pracuje nad procedurami odliczania czasu:). Jak dojde do czegos konkretnego to dam znac albo wrzuce zrodlo calego programu ;).
    Pozdrawiam
  • #19 2306938
    ZbeeGin
    Poziom 39  
    Posty: 4318
    Pomógł: 602
    Ocena: 452
    Źle nas zrozumiałeś. Mówimy o sytuacji kiedy nagle elektryka zawodzi - zanika zasilanie sieciowe - przykładowo o godzinie 8:12. Co wtedy?
  • #20 2307055
    iop_2
    Poziom 11  
    Posty: 74
    Ocena: 1
    wtedy jest problem ;) bo musze czekac az do 08:00 nastepnego dnia zeby dobrze chodzil ;). tylko ze nie wiem bardzo jak to zrobic ze jesli zniknie zasilanie sieciowe to zeby przeszedl na baterie. Normalnie bateria i dioda ?
    Pozdrawiam
  • #21 2307670
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    Jak bateria bez ładowania to 2 diody, najlepiej Shottky (niski spadek napięcia), żeby układ zasilacza nie pobierał w stanie awaryjnym zbędnych mA. Oczywiście stan zasilania musi być monitorowany, i jeśli jest zasilanie bateryjne, to obsługujesz tylko pomiar czasu i nic wiecej. Czemu sie uparłeś na tą 8:00 ? Myślę, że można by go ustawiać, chociażby z klawiatury PC, albo za pomocą transmisji szeregowej z PC, czy czegokolwiek innego (IRDA; Pilot od telewizora RC5 itp.)...
  • #22 2307695
    iop_2
    Poziom 11  
    Posty: 74
    Ocena: 1
    no ale to jest dodatkowa praca a o 8:00 jest u nas pierwszy dzwonek na pierwsza lekcje :)
    Pozdrawiam
  • REKLAMA
  • #24 2307986
    iop_2
    Poziom 11  
    Posty: 74
    Ocena: 1
    C ;) Bo mi zostalo z programowania pecetow a ze na linuxie siedze to C a nie C++ chociaz to i to :). Glowna funkcje juz mam zrobiona jeszcze obsluga wyswietlaczy :)
    Pozdrawiam
  • #26 2308731
    iop_2
    Poziom 11  
    Posty: 74
    Ocena: 1
    Nom juz po probnej kompilacji i dziala(znaczy sie kompiluje sie )bede programowal przez uisp i stk200 (jeszcze nie zlozylem ;) ). teraz musze zobaczyc jakie mam w miescie wyswietlacze dostepne i do nich dostosowac program ;). Mysle ze nie bedzie tak zle :). Najpierw chce a zeby tylko dzialal ;) potem moge pomyslece nad jakims sterowaniem go :). A z ta klawirka to dobre wyjscie podlaczam przestawiam i odlaczam :)
    Pozdrawiam

Podsumowanie tematu

✨ Dyskusja dotyczy projektu zegarka szkolnego opartego na mikrokontrolerze ATmega8535, który miałby wyświetlać czas lekcji i przerw na segmentowych wyświetlaczach LED (format hh:mm oraz mm:ss). Głównym wyzwaniem jest implementacja odliczania czasu lekcji (45 minut) i przerw oraz sterowanie wyświetlaczami przy ograniczonej liczbie portów mikrokontrolera. Proponowano wykorzystanie układów RTC, takich jak PCF8583 z interfejsem I2C, które oferują funkcje alarmu i podtrzymanie bateryjne, co ułatwia synchronizację i odliczanie czasu. Jednak ze względu na ograniczenia portów i chęć samodzielnej implementacji, zasugerowano sterowanie wyświetlaczami metodą multipleksowania – wykorzystanie dwóch portów mikrokontrolera do sterowania segmentami i anodami wyświetlaczy, co pozwala na obsługę kilku cyfr przy minimalnej liczbie linii. Omówiono także kwestie zasilania awaryjnego (bateryjne podtrzymanie zasilania z diodami Schottky’ego) oraz prostą metodę ustawiania godziny startowej (np. przy pomocy przełącznika i przycisku). Wskazano, że ATmega8535 posiada wbudowany licznik asynchroniczny do obsługi kwarcu zegarkowego, co może wyeliminować potrzebę zewnętrznego RTC. Dyskusja obejmuje również kwestie programistyczne, takie jak obsługa przerwań, timerów, multipleksowanie wyświetlaczy oraz proste interfejsy do ustawiania czasu. Projekt realizowany jest w języku C z wykorzystaniem programatora ISP (np. STK200) i środowiska avr-gcc lub Bascom.
Wygenerowane przez model językowy.
REKLAMA