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

Atmega 16 timer2 i 0 nie działają razem.

matigi12 30 Sie 2011 16:34 1417 11
  • #1 9878402
    matigi12
    Poziom 12  
    Witam mam problem z uruchomieniem Timera 2, chcę go wykorzystać do wyświetlenia cyfr na 4 wyświetlaczach 7 segmentowych. Timer0 jako licznik czasu sprawuje się. Jest taki myk, że jeśli zrobię Timer2Init(); po Timer0Init(); to gra drugi timer a 0 stoi.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #2 9878424
    tadzik85
    Poziom 38  
    "=" a "|=" zastanów się
  • #3 9878429
    matigi12
    Poziom 12  
    Zapomniałem dodać, że dopiero uczę się programowania i mi to co napisałeś dużo nie mówi, bo nie wiem gdzie podmienić ;/ Jakieś 2 tygodnie temu wziąłem w rękę dopiero uC Mege16
  • #4 9878431
    tadzik85
    Poziom 38  
    W funkcjach, które wymieniłeś obie korzystają z tych samych rejestrów. Pomyśl.
  • #5 9878440
    matigi12
    Poziom 12  
    Dzięki, już działa. Wiedziałem, że mogę liczyć na forumowiczów :]



    ...
    Chociaż może nie do końca, bo teraz tylko timer 2 działa ;/ a 0 stoi.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #6 9878574
    gaskoin
    Poziom 38  
    Cały ten program można skrócić o jakieś 50%. Wyświetlanie można zrobić wiele bardziej czytelnie niż switche na 700 linijek. Jakbyś wrzucił wszystkie LEDx do tablicy to wszystkie te switche można wpakować w 4 linijki kodu... Nie mówiąc już o Twoim debouncingu ani uporządkowaniu kodu...
  • #7 9878676
    dondu
    Moderator na urlopie...
    matigi12 napisał:
    Zapomniałem dodać, że dopiero uczę się programowania i mi to co napisałeś dużo nie mówi, bo nie wiem gdzie podmienić ;/ Jakieś 2 tygodnie temu wziąłem w rękę dopiero uC Mege16

    Ucz się C stąd:
    http://www.java2s.com/Tutorial/C/CatalogC.htm
    http://visualcplus.blogspot.com/2006/02/lesson-1-transforming-numerical.html
    lub zainwestuj w dobrą książkę: http://mikrokontrolery.blogspot.com/p/ksiazki-dla-ciebie.html
  • #8 9878727
    matigi12
    Poziom 12  
    Pojutrze rok szkolny się zacznie to ze szkoły coś wypożyczę, więc nauka pójdzie od przodu, a co może być nie tak, że nadal timer nie działa? Jak zrobiłem tak jak mi tadzik kazał to działał drugi a 0 już nie ;/
  • #9 9879302
    maly_elektronik
    Poziom 23  
    Kompilator nie wywala Ci warninga :?:
    Zamiast stosować:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    powinno się stosować:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    a tak poza tym jak chcesz inkrementować zmienną utworzoną wewnątrz timera która nie ma operatora volatile :?:

    a tak już ostatecznie jak to ma działać :?:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    TUTAJ -> po wywołaniu przerwania zmienna Tczas jest zerowana więc max wartość jaką ona osiągnie po inkrementacji wynosi 1 po czym po kolejnym wywołaniu się wyzeruje :)

    Pozdrawiam
  • #10 9880200
    matigi12
    Poziom 12  
    o dziwo ten timer dziala tak jak powinien w sensie dobrze zlicza bo inaczej by mi zle czas liczylo tzn by nie liczylo.
    A waringów nie ma zadnych.
  • #11 9880235
    dondu
    Moderator na urlopie...
    maly_elektronik napisał:
    a tak poza tym jak chcesz inkrementować zmienną utworzoną wewnątrz timera która nie ma operatora volatile :?:

    O której zmiennej piszesz? O zmiennych:

    Tczas ? - nie ma takiej potrzeby, bo jest to zmienna używana tylko w przerwaniu dlatego deklaracja Static jest prawidłowa?

    i ? - w pierwszym kodzie wklejonym w tym temacie jest deklaracja volatile.

    Ale mogę się mylić.
  • #12 9880250
    gaskoin
    Poziom 38  
    maly_elektronik napisał:

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


    TUTAJ -> po wywołaniu przerwania zmienna Tczas jest zerowana więc max wartość jaką ona osiągnie po inkrementacji wynosi 1 po czym po kolejnym wywołaniu się wyzeruje :)

    Pozdrawiam


    Nie prawda. Taka zmienna statyczna jest tworzona i inicjowana tylko RAZ. działa to tak samo jak:

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


    Z tą tylko różnicą, że zasięg zmiennej Tczas ogranicza się tylko do funkcji (w deklaracji tej zmiennej w funkcji). I ponieważ Tczas jest używany tylko w przerwaniu to nie musi być on zadeklarowany jako ulotny ! (w tym przypadku)

    Tak na marginesie - jeżeli chcecie otrzymać dokładny czas, to timer należy uruchomić po ludzku w trybie ctc a nie pajacować z overflowem i ustawiać po chamsku licznik na jakieś magiczne wartości.
REKLAMA