Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Timer0 - TIMER0 AVR C - jak ustawić rejestry?

mateusz19955 11 Mar 2014 18:23 3588 39
IGE-XAO
  • #1
    mateusz19955
    Level 13  
    Witam, uczę się programowania w języku c++ na avr i mam problem z timerem0.
    Jak skonfigurować jego rejestry aby timer ten działał?

    Mam coś takiego ale to tryb ctc i nie działa mi na atmedze8
    Code: cpp
    Log in, to see the code


    Chciałbym aby przerwanie było generowane co 2ms.
    Jak to zrobić?
    A i czy ten wektor przerwania będzie dobry:
    Code: cpp
    Log in, to see the code
    Kamery 3D Time of Flight - zastosowania w przemyśle. Darmowe szkolenie 16.12.2021r. g. 10.00 Zarejestruj się
  • IGE-XAO
  • #2
    Freddie Chopin
    MCUs specialist
    mateusz19955 wrote:
    uczę się programowania w języku c++

    Sorry, ale muszę się wtrącić, bo to chyba jakaś plaga zaraz będzie... Wszelkim osobom które chcą użyć skrótu "C++" w tytule proponuję zapoznanie się, czym się różni C od C++ i czym różni się programowanie tzw. proceduralne (C) od obiektowego (C++).

    4\/3!!
  • #4
    gaskoin
    Level 38  
    Pewnie nie umie tylko tak cwaniakuje.

    A powiesz nam jakiego µC używasz, czy mamy zgadywać ?
  • #8
    tadzik85
    Level 38  
    Freddie Chopin wrote:
    mateusz19955 wrote:
    Atmega8 przecież jest napisane.

    Ciekawe gdzie...

    4\/3!!


    Zaraz nad 1 listingiem :idea:
  • IGE-XAO
  • #10
    gaskoin
    Level 38  
    To zajrzyj do manuala, bo nawet nie wiemy co chcesz osiągnąć
  • #11
    mateusz19955
    Level 13  
    chciałbym zrobić przerwanie, które co 2ms będzie mi wywoływało jakąś funkcję

    Dodano po 22 [minuty]:

    Napisze mi ktoś jak ustawić te rejestry?

    Dodano po 25 [minuty]:

    Dobra tak, może być:

    Code: cpp
    Log in, to see the code


    Preskaler: 64
    Częstotliwość kwarcu: 8MHz.

    Nie wiem tylko czy TCNT0 = 6 dobże napisałem.
    Do czego służy to TCNT0?
  • #12
    gaskoin
    Level 38  
    http://www.atmel.com/images/atmel-2486-8-bit-avr-microcontroller-atmega8_l_datasheet.pdf wrote:
    TCNT0 - The Timer/Counter Register gives direct access, both for read and write operations, to the Timer/Counter unit 8-bit counter.
  • #14
    gaskoin
    Level 38  
    Nie ma takiego rejestru w m8. To jest wartość licznika
  • #16
    dondu
    Moderator on vacation ...
    Zacznij od schematu Timer0 w Twoim mikrokontrolerze.
    Następnie zobacz schemat preskalera - jest w innym miejscu datasheet.
    Kolejnym krokiem jest opis rejestrów timer0.
    Dopiero wtedy kombinuj z wyborem trybu i ustawieniami rejestrów.

    Nie pisz programu, tylko napisz jak ustawiłbyś rejestry, by osiągnąć swój cel, a my Ci powiemy, czy dobrze kombinujesz.
  • #18
    mateusz19955
    Level 13  
    Kombinowałem ale nadal nie wiem jak to zrobić.
    Chciałbym aby dioda migała mi co 1s.

    To kod który napisałem, ale nie działa:
    Code: c
    Log in, to see the code


    Co tu jest źle?
  • #19
    gaskoin
    Level 38  
    To, że wpisujesz zawsze za każdym razem stałą wartość do PORTD. Nikt Ci nie powie jak to zrobić bo nikt nie zna taktowania Twojej Atmegi
  • #21
    gaskoin
    Level 38  
    Więc Twój zegar ma 8MHz = 8000khz = 8000000 Hz.
    Ustawiłeś prescaler na 256, więc timer0 jest taktowany zegarem 31250Hz. Oznacza to, że tyle naliczy w ciągu sekundy. Ponieważ Twój timer jest 8 bitowy, jego max wynosi 255. To znaczy, że w ciągu sekundy będziesz miał 122 przerwania. Możesz do tylu inkrementować zmienną, po czym zmieniać stan na PORTD (póki co jest zawsze stały). Prościej ustawić TIMER1 niż tak kombinować (bo jest 16 bitowy). W nocie masz wszystko opisane, nie wiem czemu błądzisz po ciemku, skoro tam jest jak krowie na rowie. Można też ustawić jego wyjście na nóżkę procesora. Wtedy nawet obsługi przerwania nie potrzebujesz.
  • #22
    mateusz19955
    Level 13  
    Czyli tak to ma wyglądać?
    Też nie działa.

    Code: c
    Log in, to see the code


    Dobrze są ustawione te rejestry na początku programu?

    Dodano po 26 [minuty]:

    Niech ktoś napisze mi ten kod, a ja bym sobie go przeanalizował.
    Łatwiej mi będzie się w ten sposób nauczyć.
  • #23
    Wojtek75
    Level 24  
    mateusz19955 wrote:
    Też nie działa.

    Jeszcze pętla główna w funkcji "main" i już jesteś w domu.
  • #25
    tehaceole

    Level 28  
    mateusz19955 za przeproszeniem od zadu strony się za to zabierasz. Najpierw poczytaj trochę o operacjach bitowych w AVR. Pobaw się w miganie diodą z użyciem zwykłego delayms(). Jak będziesz miał pewność co do działania tego fragmentu programu to dopiero idź dalej: dodaj obsługę timera. To co chcesz najprościej jest zrobić ustawiając timer w tryb CTC.

    I przede wszystkim: NOTA KATALOGOWA JEST PO TO, ABY JĄ CZYTAĆ... Nota to absolutna podstawa przy zabawach z peryferiami.

    Chcesz przeanalizować... Więc proszę: taka mała lektura. :)
    Powodzenia
  • #26
    Wojtek75
    Level 24  
    mateusz19955 wrote:
    Kurde, nadal nie działa.

    Daj aktualny kod. Jak masz ustawioną optymalizację?
  • #27
    gaskoin
    Level 38  
    Tam nie ma nic co można by zoptymalizować :)
  • #28
    mateusz19955
    Level 13  
    Z _delay_ms bawiłem się już i wiem jak to działa.
    W języku C pisałem już i operacje bitowe też przerabiałem.
    Mam tylko problem z ustawieniem tego timera.
    Notę katalogową też czytam, ale nic z niej nie rozumiem.
    Piszemy już tyle postów i nikt jak na razie mi nie napisał jak poprawnie to skonfigurować.
    Naprawdę szybciej było by jakby ktoś napisał mi ten kod a ja bym go wtedy na pewno zrozumiał.
    Ja zawsze się tak uczę, i sporo się już w taki sposób nauczyłem.
    Dla was to na pewno proste zadanie a ja chciałbym się nauczyć obsługi przerwań.
    Atmega8 na Timer0 nie ma CTC (chyba?).
    Więc proszę nie złośćcie się że idę na prościznę, prosząc was o napisanie gotowca, ale to na prawdę mi bardziej pomoże.
  • #29
    gaskoin
    Level 38  
    mateusz19955 wrote:
    Atmega8 na Timer0 nie ma CTC (chyba?).


    A czemu nie możesz użyć innego timera?
  • #30
    Wojtek75
    Level 24  
    Co do optymalizacji to w sumie racja nie jest potrzebna.

    Kod z posta nr. 12 jeżeli poprawnie dopisałeś pętle w funkcji main jest poprawny (dioda na PD7 powinna dać oznaki życia). Skoro nie działa to szukaj błędu gdzie indziej.