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

Dziwne zachowanie timerów

Grzesieq94 14 Lip 2011 17:52 987 14
  • #1 9718046
    Grzesieq94
    Poziom 10  
    Witam

    Piszę właśnie (w C)program mający za zadanie wyświetlanie zegara na 4 wyświetlaczach 7-segmentowych. Chciałem wykorzystać do tego 16 bitowy timer1 w mojej atmedze 8a-pu. Niestety mam pewien problem. Nawet jeśli nie włączę timera WinAVR nie daje błędów przy odczytywaniu z OCR1A czy OCR1B. Jeśli zaś włączę timer to on niestety nic nie zlicza. Poniżej kod mojego programu:


    main.c
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    7seg.c

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    7seg.h

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    [/code]

    Może ktoś pomóc?
  • #3 9718126
    Grzesieq94
    Poziom 10  
    No tutaj go nie włączyłem specjalnie. Ale WinAVR zawsze w takim wypadku rzucał się o to, że nie ma zmiennej OCR1A. A nawet jeśli go uruchomię chociażby wpisując na początku funkcji main TCCR1B |=(1 << CS10); to i tak on nic nie zlicza...
  • #4 9718193
    Freddie Chopin
    Specjalista - Mikrokontrolery
    WinAVR rzucał się, bo nie dołączyłeś nagłówka. Mylisz pojęcia. WinAVR nie ma pojęcia o tym czy ten timer działa, nie ma pojęcia co to jest timer, w sumie nawet nie ma pojęcia po co odczytujesz ten rejestr, bo kompilatorowi nic do tego.

    Timer nie działa, bo go nie włączyłeś. Nie licz na ostrzeżenia kompilatora, bo po prostu ich nie dostaniesz.

    4\/3!!
  • #5 9718199
    Grzesieq94
    Poziom 10  
    No dobra to z innej strony. Dlaczego on nic nie zlicza nawet gdy go włącze?
  • #6 9718220
    Wojtek75
    Poziom 24  
    Grzesieq94 napisał:
    Dlaczego on nic nie zlicza nawet gdy go włącze?

    Pokaż kod, którym uruchamiasz ten timer.
  • #7 9718227
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Bo go jednak nie włączasz... Ewentualnie trafiłeś na złośliwy egzemplarz, możesz spróbować go walnąć, ale nigdy nie wiadomo jak zareaguje na przemoc.

    Skąd mamy wiedzieć, skoro nie pokazałeś kodu który go niby włącza?

    4\/3!!
  • #8 9718233
    Grzesieq94
    Poziom 10  
    Proszę:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Freddie Chopin napisał:
    Ewentualnie trafiłeś na złośliwy egzemplarz, możesz spróbować go walnąć, ale nigdy nie wiadomo jak zareaguje na przemoc.


    Kocham jak tu traktuje się początkujących :) A tak dla informacji to timer działał bo już kiedyś go wykorzystywałem, więc to na pewno wina programu tylko nie wiem gdzie...
  • Pomocny post
    #9 9718286
    xamrex
    Poziom 28  
    Wg. mnie zamiast tego:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Oraz zapomniałeś chyba dodać
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Oraz gdzie ty masz wektor przerwania?
    Bo go nigdzie nie widzę..
  • #10 9718310
    Grzesieq94
    Poziom 10  
    xamrex napisał:
    Wg. mnie zamiast tego:
    Kod C
    #include <7seg.h>
    powinno być "7seg.h"
     


    Tak miałem, ale zmieniłem gdy pojawiły się pewne błędy w obsłudze tych wyświetlaczy.

    xamrex napisał:
    Oraz zapomniałeś chyba dodać
    Kod C
    #include <avr/interrupt.h>


    Oraz gdzie ty masz wektor przerwania?
    Bo go nigdzie nie widzę..


    I tego właśnie brakowało :) tyle, że nie muszę używać wektora przerwań. Ale i tak na nim spróbuje to zrobić ;]
  • #11 9718311
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Fajne porady...

    xamrex napisał:
    Wg. mnie zamiast tego:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Bez znaczenia.

    Cytat:
    Oraz zapomniałeś chyba dodać
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Oraz gdzie ty masz wektor przerwania?
    Bo go nigdzie nie widzę..

    Po co mu ten nagłówek czy "wektor przerwania" skoro... nie używa przerwań?

    Cytat:
    Grzesieq94 napisał:
    Oraz gdzie ty masz wektor przerwania?
    Bo go nigdzie nie widzę..


    I tego właśnie brakowało :) Dzięki

    Brakowało Ci "wektora przerwania" gdy nie używasz przerwań? To chyba jakaś magia w takim razie...

    4\/3!!
  • #12 9718339
    Grzesieq94
    Poziom 10  
    Tzn. jego nie używałem. To w takim razie co może być przyczyną tego, że dalej nic przez timer nie jest zliczane? Chce właśnie spróbować jeszcze z tymi przerwaniami, ale jeśli znajdziesz inne rozwiązanie tego problemu to chętnie posłucham :)
  • #13 9718384
    dondu
    Moderator na urlopie...
    Według WGM13+WGM12+WGM11 ustawiasz Fast PWM - to chciałeś?

    Jeżeli tak to popatrz jaki rejestr używa się jako TOP dla tego mode 14.
    I zastanów się dlaczego nie ma go w Twoim programie?
    Potem przeczytaj fragment dot. Fast PWM gdzie dowiesz się szczegółów, w tym jaka jest minimalna wartość tego rejestru, a potem znajdź fragment gdzie jest opisana jego wartość początkowa.
  • Pomocny post
    #14 9718423
    xamrex
    Poziom 28  
    Tu masz kod który korzysta z przerwań i co 1 sekundę ustawią zmienną
    s1_flag na 1.
    Musisz pamiętać, aby ją w funkcji głównej zerować, bo tak cały czas będzie ona usttawiona na 1.

    Ten kod jest tylko poglądowy, ma ci tylko przybliżyć co i jak z przerwaniami.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #15 9718497
    Grzesieq94
    Poziom 10  
    Już sobie poradziłem. Znalazłem pełną wersje dokumentacji tej atmegi i wszystko działa...
REKLAMA