Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Generacja 1Hz na atmega16 [C]

Pi0trek121 15 Sty 2012 21:54 1721 14
  • #1 15 Sty 2012 21:54
    Pi0trek121
    Poziom 23  

    Witam! ostatnio udało mi się napisać program zegarka z budzikiem na atmedze16, wszystko działa jak należy jednak pojawił się problem przy generacji 1Hz... teraz używam układu PCF8583 a dokładniej tylko jego generatora, jednak jest możliwe generowania tego 1Hz na samym uC jednak jako początkujący nie mam pojęcia jak obsłużyć timery (język C) czytałem wiele poradników, jednak w zdanym nie ma dokładnie opisanego co do czego służy. Jest możliwość użycia komendy delay jednak w moim wypadku to nie pomoże, ze względu na multipleksacje wyświetlaczy led i konieczność odświeżania wyświetlaczy. Jeżeli jednak i to nie pomoże, to jakie układy polecacie do generowanie równego 1Hz? najlepiej jak najmniejsze :)

    0 14
  • #2 15 Sty 2012 22:13
    mirekk36
    Poziom 42  

    Korzystanie ze sprzętowych timerów do generowania taaaak długaśnego odcinka czasu 1Hz to po prostu istne marnotrawstwo by było niestety. Sam sobie podpowiadasz i dobrze, że masz na wyjściu PCF8583 generowany 1Hz - nic tylko podłączyć go pod jakieś przerwanie INTx i masz w procku 1Hz a jeszcze możesz go pięknie wykorzystać do odczytu czasu z PCF'a i wielu innych rzeczy.

    0
  • #3 15 Sty 2012 22:17
    Pi0trek121
    Poziom 23  

    W sumie mam jeszcze do wykorzystania 6kb a raczej niczego więcej nie będę dokładał do programu, tak wiec miejsca mam dużo, a pozbyłbym się jednego układu.

    0
  • #4 15 Sty 2012 22:25
    mirekk36
    Poziom 42  

    Aaaa to ty tego PCF'a tylko dla tego 1Hz chciałeś ? - pewnie że to przesada. No ale nie ze względu na to że masz ileś tam wolnej pamięci Flash, bo to jest argument który ma się jak pięść do oka niestety.

    Pomyśl o czymś takim co się nazywa "timery programowe" to będziesz mógł mieć nie tylko 1Hz ale i inne dowolne częstotliwości dla wykonywania różnych zadań. Zobacz jak może wyglądać praca układu korzystającego z takich technik, gdzie mamy do czynienia i z multipleksowaniem, i z LCD, ale nawet obsługą 1wire:

    http://mirekk36.blogspot.com/2011/09/fakty-i-mity-nt-rzekomych-problemow-z.html

    0
  • #5 15 Sty 2012 22:28
    gaskoin
    Poziom 38  

    Jeżeli Ci PCF niepotrzebny/oszczędzasz na płytce to zerknij do DSa zamiast do poradników. Tam jest to logicznie wszystko wytłumaczone.

    Ja podpowiem, że możesz uruchomić timer w trybie CTC z preskalerem np 8, który będzie generował przerwania gdy doliczy do 10 000. To da odcinek czasu 10ms. W przerwaniu możesz inkrementować zmienną odpowiedzialną za takie odcinki czasu. Gdy zmienna będzie równa 100 tzn że doliczyłeś do sekundy.

    Wzory i wyjaśnienia są w nocie. Ja dałem tylko przykład, na pewno można dać większy preskaler i do mniej liczyć. Niestety marnuje to jeden timer.

    Możesz też użyć już istniejącego przerwania (np tego w którym coś multipleksujesz) i tam inkrementować jakąś zmienną aż doliczysz do 1 sekundy.

    Generalnie pomysłów na to mogą być miliony o ile nie setki :)

    0
  • #6 15 Sty 2012 22:40
    Pi0trek121
    Poziom 23  

    Tak PCF służył jako generator 1Hz.
    A mógłbym prosić przykład takiego programu z opisem? Czytałem ale ni w ząb nie mogę pojąc :(
    A co do timera to mam wszystkie wolne i przy tym nie będę żadnego używał, tak więc mogę go użyć.

    0
  • #7 15 Sty 2012 22:49
    tmf
    Moderator Mikrokontrolery Projektowanie

    To chyba najrozsądniej jest zastosować kwarc zegarkowy i RTC procesora. Sam procesor może być taktowany z wewnętrznego generatora, co zaoszczędzi kolejnego kwarcu. Przykładów wykorzystania RTC (w tym przypadku real time counter) znajdziesz wiele.

    0
  • #8 15 Sty 2012 23:23
    Pi0trek121
    Poziom 23  

    To może teraz ja zapodam przykład... oscylator wewnetrzny 1MHz i chce uzyskac 1s tak więc:
    1000000/64=15625 później 15625/125=125 no i reszta trzeba programowo zbić...
    No dobra i mam program:

    na pewno jest to dla was banalne, jednak dla mnie, kogoś kto ma styczność z avr-ami około tygodnia nie jest to łatwe

    moje pytania są zaznaczone strzalkami <--

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #9 15 Sty 2012 23:36
    gaskoin
    Poziom 38  

    Widzę, że zacząłeś programowanie uC nie od tej strony co trzeba :)

    0
  • #10 15 Sty 2012 23:47
    Pi0trek121
    Poziom 23  

    Co rozumiesz przez pojecie "nie od tej strony co trzeba"?
    używajac funkcji define przypisywałem wartość do np. wyjscia typu:
    #define PORTD 0xff; ale do czego jest to PORTD2? i po co ta 2?

    0
  • #11 15 Sty 2012 23:58
    gaskoin
    Poziom 38  

    Chodziło mi o to, że nie potrafisz pisać w języku C i chyba od kursu tegoż języka powinieneś zacząć. Można też kupić sobie książkę np "kernighan ritchie ansi c" albo coś od razu pod kątem mikrokontrolerów czyli książkę pana Mirosława Kardasia lub pana Tomasza Francuza, ponieważ są dość świeże i profesjonalne wydania (tak myślę, nie czytałem :P)

    bo definy nic nie ustawiają a jedynie definiują stałe

    0
  • #12 16 Sty 2012 00:03
    Pi0trek121
    Poziom 23  

    gaskoin napisał:
    bo definy nic nie ustawiają a jedynie definiują stałe


    ehhh zle napisałem wyzej... na przykladzie zegarka:

    #define jeden 0xF9;
    #define dwa 0xA4;
    #define trzy 0xB0;
    #define cztery 0x99;
    #define piec 0x92;
    #define szesc 0x82;
    #define siedem 0xF8;
    #define osiem 0x80;
    #define dziewiec 0x90;
    #define zero 0xC0;

    no ale mniejsza z tym...
    rozumiem, ze te PORTD2 chodzi o 2 pin portu D?

    0
  • Pomocny post
    #13 16 Sty 2012 00:15
    gaskoin
    Poziom 38  

    Nie wiem o co chodzi, przecież Ty napisałeś ten program :)

    generalnie to masz zdefiniowaną w programie stałą o nazwie PORTD2 która ma wartość 2 i tyleż o niej wiadomo. Nigdzie jej nie używasz w tym pliku więc nie da się stwierdzić do czego służy.

    Pusta pętla while jest dlatego, że cały program wykonuje się w przerwaniach. "Normalnie" to pętla while jest zapełniona programem.

    Nie wiem czy pozostawienie pustej pętli jest koniecznie. Jawnie tego nie widać, ale w rzeczywistości kompilator generuje kod rozbiegowy dla procesora. Inicjalizowane są w nim zmienne globalne, statyczne, ustawiany jest stos, wywoływane są funkcje inicjalizujące przed wywołaniem maina (można ich użyć) a potem jest wywoływany sam main. Być może po wywołaniu maina jest w tej rozbiegówce jeszcze jakaś pętla nieskończona żeby procesor 'zawisł' po nieoczekiwanym returnie z maina, tego nie wiem.

    0
  • Pomocny post
    #14 16 Sty 2012 11:42
    tmf
    Moderator Mikrokontrolery Projektowanie

    Pętla jest, ale zanim w nią wejdziesz blokowane są przerwania :( To while(1) z tego powodu jest niezbędne.

    0
  • #15 16 Sty 2012 13:09
    Pi0trek121
    Poziom 23  

    Dzięki wszystkim za pomoc, myślę ze już dam sobie rade :)

    0