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

AVR Asembler: Timer0 Overflow w ATmega128 - Jak uzyskać 1s odstęp?

roar 20 Paź 2005 21:05 3862 15
REKLAMA
  • #1 1914808
    roar
    Poziom 11  
    Posty: 12
    Witam.

    Zadałem już to pytanie w dziale dla początkujących, ale jeden z użytkowników polecił mi zapytać tutaj, co niniejszym czynię.

    Mój problem jest dość prymitywny, jako że dopiero zaczynam swoją przygodę z µC. W Avr studio napisałem sobie program w asemblerze, który ma za zadanie zapalać LED'y na jednym z portów w określonej kombinacji. Tą część już mam.
    Problem pojawia się, kiedy usiłuję, korzystając z timer0 jako podstawy czasu i przerwania oznaczającego Overflow, uzyskać między kolejnymi zapaleniami odstęp równy 1sek. Uzycie przerwania licznika jest rozwiązaniem narzuconym mi z góry. Czy ktoś mógłby mi pomóc?
    używam emulatora ATmega128, to też jest narzucone z góry.

    --
    pozdrawiam!
  • REKLAMA
  • #2 1914885
    LuznyTomasz
    Poziom 15  
    Posty: 204
    Pomógł: 13
    Ocena: 1
    Po pierwsze z jaką częstotliwością taktujesz mikrokontroler? Po drugie to nie jesteś w stanie uzyskać 1s z timera po jednym przepełnieniu (chyba że wykorzystasz kwarc o b.małej częstotliwości). Musisz zliczać kilka (kilkadziesiąt) przepełnień licznika aby uzyskać 1s. Ustaw timer tak, aby przepełniał się po np. 10ms. 100 przepełnień timera to będzie wtedy 1s
  • REKLAMA
  • #3 1915068
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    LuznyTomasz napisał:
    Po pierwsze z jaką częstotliwością taktujesz mikrokontroler? Po drugie to nie jesteś w stanie uzyskać 1s z timera po jednym przepełnieniu (chyba że wykorzystasz kwarc o b.małej częstotliwości). ...

    Jeśli timer ośmiobitowy , to oczywiste , ale szesnastobitowym timerem, spokojnie odliczysz 1 s przy jednokrotnym przebiegu , z dowolnym zegarem(kwarcem).

    Piotrek
  • #4 1915417
    roar
    Poziom 11  
    Posty: 12
    Mikrokontroler jest taktowany 4MHz, czy przy takiej czestotliwosci wystarczy uzyc 1 licznika 16-bitowego zeby otrzymac 1 sekunde?
    Caly problem w tym, ze musze uzyc tylko tego, co jest w samym mikrokontrolerze, bez dodatkowych peryferii.
  • REKLAMA
  • #5 1915505
    LuznyTomasz
    Poziom 15  
    Posty: 204
    Pomógł: 13
    Ocena: 1
    zumek napisał:
    LuznyTomasz napisał:
    Po pierwsze z jaką częstotliwością taktujesz mikrokontroler? Po drugie to nie jesteś w stanie uzyskać 1s z timera po jednym przepełnieniu (chyba że wykorzystasz kwarc o b.małej częstotliwości). ...

    Jeśli timer ośmiobitowy , to oczywiste , ale szesnastobitowym timerem, spokojnie odliczysz 1 s przy jednokrotnym przebiegu , z dowolnym zegarem(kwarcem).

    Piotrek


    Proszę o szczegóły. Dlaczego oczywiste jest, że timer że 16-bitowy odliczy 1s? Zakładamy że taktujemy kwarcem 4MHz. Jeden takt to 1/4 000 000=0,25us. 16 bitów to 65536 cykli. 65536cykli*0,25us=16,384ms
    Proponuję więc zliczyć 100 cykli 10-cio milisekundowych. ilość cykli = 10ms/0,25us=40000 cykli. Wpisujesz więc do timera 40000 i czekasz aż się przepełni 100 razy
  • #6 1915834
    viki
    Poziom 16  
    Posty: 262
    Pomógł: 11
    Ocena: 3
    czy licznik timera jest zmniejszany co 1 takt?
  • #7 1915896
    LuznyTomasz
    Poziom 15  
    Posty: 204
    Pomógł: 13
    Ocena: 1
    Generalnie zwiększany jest co jeden takt. W większości procesorów możesz dokonywać podziału częstotliwości taktowania timera poprzez ustawienie odpowiednich rejestrów. Wtedy timer inkrementowany jest co 2, 4, 8 ...taktów procesora

    Autor wątku programuje jaki procesor?
  • #8 1916329
    roar
    Poziom 11  
    Posty: 12
    Chyba juz wspominalem wczesniej, ale powtorze - programowany przeze mnie procek (tylko na symulatorze) to ATmega128.

    Jesli dobrze zrozumialem, to bede musial wykorzystac rejestr porownujacy, czy jak to sie dokladnie po polsku nazywa, aby otrzymac przerwanie po uplywie 10ms.

    LuznyTomasz: Czy moglbys rozwinac to co powiedziales w konkretny przyklad?

    I od razu kolejne pytanie - Jak przy pomocy AVRstudio sprawdzic, jaka jest wartosc otrzymanego opoznienia? Czy to sie w ogole da zrobic, bez zapisania programu w rzeczywistym urzadzeniu?
  • Pomocny post
    #9 1916397
    LuznyTomasz
    Poziom 15  
    Posty: 204
    Pomógł: 13
    Ocena: 1
    Za pomocą bitów CSn2 CSn1 CSn0 możesz ustalić podział częstotliwości kwarcu przez 1,8,64,256,1024. Aby uzyskać dokłądnie sekundę musisz ustawić podział na 8 lub 64. Wtedy do timera musisz wpisać odpowiednio 65536-62500 lub 65536-15625 (do rejestrów TCNTnH starsze 8 bitów i TCNTnL młodsze osiem bitów).
    Przepełnienie jest sygnalizowane flagą ToVn którą sobie będziesz sprawdał w programie a jeśli masz odblokowaną globalną maskę przerwań i przerwań od timera to zacznie się obsługa przerwania.
  • Pomocny post
    #10 1916401
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    LuznyTomasz napisał:

    ...
    Proszę o szczegóły. Dlaczego oczywiste jest, że timer że 16-bitowy odliczy 1s? Zakładamy że taktujemy kwarcem 4MHz. Jeden takt to 1/4 000 000=0,25us. 16 bitów to 65536 cykli. 65536cykli*0,25us=16,384ms
    Proponuję więc zliczyć 100 cykli 10-cio milisekundowych. ilość cykli = 10ms/0,25us=40000 cykli. Wpisujesz więc do timera 40000 i czekasz aż się przepełni 100 razy

    Zapomniałeś o jednej malutkiej rzeczy , zwanej PRESCALER.
    Dla 1 s można załadować do rejestrów timera np. poniżej wyliczoną wartość
    65536-(4000000/64)=3036(0x0BDC) i ustawiś prescaler na 64.
    Przy taktowaniu proca częstotliwością 4 MHz , można "zatrudnić" szesnastobitowy timer na ponad 16 s.

    Piotrek

    PS
    Oooo właśnie o nim(PRESCALER) wspominasz.To można czy nie :D
  • #11 1916527
    roar
    Poziom 11  
    Posty: 12
    Dzieki za pomoc. Sprobuje przetestowac to, co napisaliscie. Powiedzcie mi tylko jeszcze, jesli wiecie, w jaki sposob przetestowac na AVRstudio wartosc opoznienia?
  • REKLAMA
  • #12 1916550
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    roar napisał:
    Dzieki za pomoc. Sprobuje przetestowac to, co napisaliscie. Powiedzcie mi tylko jeszcze, jesli wiecie, w jaki sposob przetestowac na AVRstudio wartosc opoznienia?

    A której wersji AvrStudio , Waści używasz :?:

    Piotrek
  • #13 1916582
    roar
    Poziom 11  
    Posty: 12
    uzywam wersji 4.12 :)
  • #14 1917640
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Skorzystaj z breakpoint-ów i obserwuj Cycle Counter i Stop Watch.Dowiesz się ile cykli i ile czasu zużywają poszczególne instrukcję czy procedurki.Możliwości jest wiele :D

    Piotrek
  • #15 1925074
    genetix
    Poziom 24  
    Posty: 669
    Pomógł: 42
    może powinieneś wrzucić tutaj to, co już napisałeś, będziemy mieli jakiś punk odniesienia. często są to głupie błędy...
  • #16 1976233
    roar
    Poziom 11  
    Posty: 12
    Wysylam plody mojego wysilku, moze komus sie przyda.
    Załączniki:
    • test2.zip (1.17 KB) Musisz być zalogowany, aby pobrać ten załącznik.

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy problemu uzyskania odstępu 1 sekundy między zapaleniami diod LED za pomocą przerwania przepełnienia timera0 w mikrokontrolerze ATmega128 taktowanym kwarcem 4 MHz. Timer0 jest 8-bitowy, co uniemożliwia uzyskanie 1 sekundy w pojedynczym przepełnieniu przy tej częstotliwości taktowania. Zalecane jest wykorzystanie liczenia wielokrotnych przepełnień (np. 100 przepełnień po 10 ms) lub zastosowanie timera 16-bitowego z prescalerem, który pozwala na odliczenie 1 sekundy w jednym przebiegu. Prescaler można ustawić na wartości 8, 64, 256 lub 1024, co zmienia częstotliwość inkrementacji licznika. Przykładowo, dla 4 MHz i prescalera 64, do rejestru timera należy załadować wartość 65536 - 15625, aby uzyskać przerwanie co 1 sekundę. Wskazano także, że w AVR Studio 4.12 można testować opóźnienia i czas działania programu za pomocą breakpointów, licznika cykli i stopera symulatora. Wskazano konieczność monitorowania flagi przepełnienia (ToVn) oraz obsługi przerwań globalnych i od timera. Autor otrzymał sugestię, aby udostępnić swój kod w celu dalszej analizy i pomocy.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA