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.

avr asembler, pytanie laika

roar 20 Paź 2005 21:05 3574 15
  • #1 20 Paź 2005 21:05
    roar
    Poziom 10  

    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!

    0 15
  • #2 20 Paź 2005 21:27
    LuznyTomasz
    Poziom 15  

    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

    0
  • #3 20 Paź 2005 22:13
    zumek
    Poziom 39  

    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

    0
  • #4 20 Paź 2005 23:59
    roar
    Poziom 10  

    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.

    0
  • #5 21 Paź 2005 00:53
    LuznyTomasz
    Poziom 15  

    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

    0
  • #6 21 Paź 2005 09:38
    viki
    Poziom 16  

    czy licznik timera jest zmniejszany co 1 takt?

    0
  • #7 21 Paź 2005 10:03
    LuznyTomasz
    Poziom 15  

    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?

    0
  • #8 21 Paź 2005 13:23
    roar
    Poziom 10  

    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?

    0
  • Pomocny post
    #9 21 Paź 2005 13:57
    LuznyTomasz
    Poziom 15  

    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.

    0
  • Pomocny post
    #10 21 Paź 2005 13:59
    zumek
    Poziom 39  

    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

    0
  • #11 21 Paź 2005 14:53
    roar
    Poziom 10  

    Dzieki za pomoc. Sprobuje przetestowac to, co napisaliscie. Powiedzcie mi tylko jeszcze, jesli wiecie, w jaki sposob przetestowac na AVRstudio wartosc opoznienia?

    0
  • #12 21 Paź 2005 15:00
    zumek
    Poziom 39  

    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

    0
  • #14 21 Paź 2005 22:30
    zumek
    Poziom 39  

    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

    0
  • #15 24 Paź 2005 20:06
    genetix
    Poziom 24  

    może powinieneś wrzucić tutaj to, co już napisałeś, będziemy mieli jakiś punk odniesienia. często są to głupie błędy...

    0