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

ATmega32 - Odmierzanie 1 sekundy a zmiana rezonatora

Daniel_GSM 01 Wrz 2013 20:27 2559 17
  • #1 12692791
    Daniel_GSM
    Poziom 25  
    Witam,

    Za nic w świecie nie mogę dojść do tego, więc skorzystam z wiedzy Szanowny Kolegów z forum.
    Otóż mam pewną zabaweczkę zrealizowaną na mega32 (projekt jak ukończę to udostępnię na forum)

    Ustawione mam przerwanie od Timera0, który ładnie odmierza mi 1 sekundę przy zastosowanym kwarcu 8Mhz.
    Wszystko pięknie ładnie, ale chciałbym zastosować "kwarc przyjazny UART" czyli np 7.3728 MHz lub 11.0592 MHz.

    Poniżej fragment kodu w Bascom dla rezonatora 8Mhz i przerwania co 1 sekunde dla Timera0:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Tak mam to zrealizowane teraz a jak przerobić fragmenty tego kodu dla rezonatorów jak powyżej tak aby też uzyskać przerwanie co 1 sekunde?
  • Pomocny post
    #2 12692830
    Konto nie istnieje
    Poziom 1  
  • #3 12692873
    Daniel_GSM
    Poziom 25  
    Czyli jeśli dla kwarcu 7.3728 Mhz napiszę taki kod to będę miał przerwanie co 1 sekundę - o ile dobrze zrozumiałem:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Zgadza się? Dobrze myślę?
  • #4 12693296
    BlueDraco
    Specjalista - Mikrokontrolery
    źle myślisz. Przerwanie masz 7372800 / 256 / 200 razy na sekundę, a w każdym wywołaniu obsługi przerwania odliczasz sobie dodając 1, aż odliczysz do 144, co oznacza, że upłynęła sekunda (mniej więcej, bo nie wiem dokładnie, co w Bascomie robi tajemnicze "Load Timer0 = 200").
  • #5 12693310
    zumek
    Poziom 39  
    Daniel_GSM napisał:
    ...Zgadza się? Dobrze myślę?


    Dobrze myślisz, tylko źle robisz :-P

    Sprawdź składnię instrukcji LOAD TIMER.

    PS
    Co sekundę zerujesz zmienną " Licz_8ms", a przerwanie masz "dużo częściej":)
  • #6 12693471
    Konto nie istnieje
    Poziom 1  
  • #7 14073340
    Daniel_GSM
    Poziom 25  
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Jeśli tak napiszę kod w Bascom przy zastosowaniu kwarcu 7.3728 MHz to przerwanie odmierz_1s będzie faktycznie co 1 jedną sekundę? Tak jak to miało miejsce w przypadku kwarcu 8000000 MHz (patrz mój pierwszy post w temacie)

    Minął ponad rok od założenia tego tematu, ale teraz muszę to już zastosować w praktyce i w końcu zamknąć temat
  • #8 14073639
    Konto nie istnieje
    Poziom 1  
  • #9 14073791
    zumek
    Poziom 39  
    Tak się zastanawiam.
    Męczysz się z timerem zero, a jedynka i/lub dwójka leżą pewnie odłogiem :|
  • #10 14073975
    Daniel_GSM
    Poziom 25  
    emarcus napisał:
    'Minął ponad rok'... i ciągle robisz ten sam błąd(!).


    Ponieważ ciągle mam tę samą książkę - autor - Marcin Wiązana.
    Czyżby autor tej książki się mylił?
    Przecież to z Jego książki zaczerpnięty jest fragment kodu odmierzający 1 sekundę.
    Mało tego - ten fragment kodu funkcjonuje poprawnie!
    A Ty mi piszesz, że LOAD i "=" jest ignorowane przez compiler Bascom...

    Muszę chyba tę książkę spalić w piecu żeby już więcej tych bzdur nie czytać - prawda?

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Powyższy kod rozumiem tak:

    Częstotliwość taktowania mam 7.3728 Mhz (wcześniej 8 MHz)

    Czas taktu przy współczynniku podziału 1 wynosi: 0,1356336 us (dla 8MHz miałem 0,125 us)

    Ustawiam preskaler na 256 a wtedy czas taktu mam: 34,722201 us (dla 8Mhz miałem 32us)

    I teraz tak:
    Dla kwarcu 8Mhz ustawiałem żeby timer odliczył do 250 co dawało mi 32us x 250 = 8ms
    Jeśli chciałem z tych 8ms zrobić 1 sekundę to wystarczyło zliczyć 125 razy.

    Dla kwarcu 7.3728 Mhz zgodnie z tym co wyliczył kolega atom1477 timer musi odliczyć do 200 co daje nam (34,722201 x 200) 6,9444402 ms

    Teraz jeśli zmienną Licz_7ms (w zaokrągleniu) zliczę 144 razy to wyjdzie mi w przybliżeniu 1 sekunda (a dokładnie 999,99938 ms)

    Wszystkie wyliczenia przeprowadziłem na podstawie tego co koledzy napisali i tego co wyczytałem z "Mikroprocesorowej Oślej Łączki" :)


    Czy teraz jest dobrze? Jeśli nie to proszę wprowadź mi poprawki w kodzie i zamieść go tutaj, dziękuję...
  • #11 14074182
    yokoon
    Poziom 29  
    Witam.
    Kolego Daniel_GSM, nie musisz palić tej książki.
    Błąd przy zapisie Load Timer występuje tylko na str. 159.
    Nie wiemy czy to błąd autora czy chochlik drukarski.
  • #12 14074815
    Daniel_GSM
    Poziom 25  
    yokoon napisał:
    Witam.
    Kolego Daniel_GSM, nie musisz palić tej książki.
    Błąd przy zapisie Load Timer występuje tylko na str. 159.
    Nie wiemy czy to błąd autora czy chochlik drukarski.


    No tak, ale jakby nie patrzył wszystko funkcjonowało dobrze - nawet z tym błędem.

    Wynika z tego i z tego co koledzy pisali wcześniej, że było przekłamanie - bo skoro linia:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    i tak się nie kompilowała to timer zliczał do 256 a nie do 250 tak jak powinien.
    W ten sposób zmienna Licz_8ms zamiast 8ms miała 8.192 ms.


    Dlatego teraz po wypowiedziach Kolegi emarcus ten wpis zamienię na:
    Load Timer0 , 144 - czyli tak aby TIMER0 zliczał do 256, ale przy załadowaniu na początku liczby 112.


    I chyba będzie dobrze...
  • #13 14075118
    piotrva
    VIP Zasłużony dla elektroda
    Daniel_GSM napisał:
    Muszę chyba tę książkę spalić w piecu żeby już więcej tych bzdur nie czytać - prawda?


    Ja bym szczerze radził przesiadkę na język C, który jednoznacznie definiuje ci i jak działa, a jak kompilator czegoś nie rozumie to kodu nie skompiluje, a nie tak jak tu - działa albo i nie działa, albo nie wiadomo jak działa.

    Do języka C jest w tej chwili dla osób na różnym stopniu zaawansowania parę dobrych pozycji.
  • #14 14075291
    Konto nie istnieje
    Poziom 1  
  • #15 14075384
    Daniel_GSM
    Poziom 25  
    Dobrze już - może nie zrozumiałem w pełni, ale zapytam ostatecznie:

    Czy poprawiony kod będzie poprawnie funkcjonował z kwarcem 7.3728 MHz i odmierzy mi tą 1 sekundę czy nie?

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #16 14080551
    yokoon
    Poziom 29  
    Witam.
    Kolego źle wpisałeś dane to znaczy odwrotnie.
    A ma być tak:
    Load Timer0,144 (7372800 / 256) = 28800
    28800 / 144 = 200Hz = 5ms
    5ms * 200 = 1sek

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #17 14081486
    Konto nie istnieje
    Poziom 1  
  • #18 14156292
    Daniel_GSM
    Poziom 25  
    Temat zamykam - problem rozwiązany dzięki pomocy dwóch Kolegów - oczywiście klikam pomógł.

    Reszcie za cytowanie książek, wykłady czysto teoretyczne i odsyłanie do zewnętrznych linków (nie) dziękuję.
REKLAMA