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

Atmega8 i niezrozumiałe zachowanie rejestru TIFR

25 Cze 2011 19:19 2724 17
  • #1 9649505
    Konto nie istnieje
    Konto nie istnieje  
  • #2 9649673
    gayetan
    Poziom 18  
    Witam i pozdrawiam,
    też zacząłem przygodę z uC dość póżno więc doskonale rozumiem. Polecam przeczytać notę katalogową Atmega8 ( w załączeniu ).

    Na szybko to spróbowałbym przyjrzeć się ustawieniom pinu. Jeśli ustawiony jest jako 'wyjście' to może przybierać stan 1.

    Niestety ( na szczęście ) BASCOM'a porzuciłem jakiś czas temu więc potrzebna chwila na zastanowienie.

    P.S.
    Na C nigdy nie jest za późno -BASCOM - do pewnych rozwiązań bywa zbyt uciążliwy- polecam na początek doskonałą książkę pana Mirka Kardasia - Mikrokontrolery AVR język C podstawy programowania.
    Książka rewelacja!, sam autor przemiły - jest tam dokładnie omówiony projekt podobny do tego nad którym pan pracuje.

    Moderowany przez And!:

    Proszę nie załączać materiałów dostępnych bezpośrednio na stronach producenta.

  • #3 9649684
    piotrva
    VIP Zasłużony dla elektroda
    1. Notę można pobrać za darmo tu: http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf
    2. @autor tematu: załącz kod programu, to porozmawiamy, bo czasem umieszczenie dostępu do rejestru w specyficznych miejscach programu może powodować ich dziwne zachowanie
  • #4 9649698
    Konto nie istnieje
    Konto nie istnieje  
  • #5 9649699
    Andrzej__S
    Poziom 28  
    MARKOPOLO napisał:

    Czy ktoś z kolegów może mi wyjaśnić to zjawisko i dlaczego tak dziwnie to działa.

    Nie wiem, jak to zapisać w Bascomie (używam C), ale flagi przerwań zeruje się poprzez wpisanie 1 do odpowiedniego bitu, czyli w celu wyzerowania flagi TOV0 (który jest na pozycji 0) należy do TIFR wpisać binarnie 00000001.
  • #6 9649702
    gayetan
    Poziom 18  
    tą 'płatną' wersję wstawiłem przez roztargnienie nie z pazerności ale nie mogłem jej usunąć - już umieściłem link - też uważam, że jest to nieuczciwe. Za niechlujstwo przepraszam.
  • #7 9649722
    gaskoin
    Poziom 38  
    Słabo przeglądał Pan tę notę:

    Cytat:
    The bit TOV0 is set (one) when an overflow occurs in Timer/Counter0. TOV0 is cleared by hardware when executing the corresponding interrupt Handling Vector. Alternatively, TOV0 is
    cleared by writing a logic one to the flag. When the SREG I-bit, TOIE0 (Timer/Counter0 Overflow
    Interrupt Enable), and TOV0 are set (one), the Timer/Counter0 Overflow interrupt is executed.
  • #8 9649774
    Andrzej__S
    Poziom 28  
    Cytat:

    W bascomie próbowałem na różne sposoby zmieniać ten rejestr ale tylko
    wpisanie "0" do bitu5 ustawia bit0 w stan "0" pozostawiając bit5 w stanie "1"

    Na pewno tylko to zeruje flagę? Proponowałbym, zamiast wpisywać 0 do jakiegoś bitu (TIFR.5 = 0), wpisać po prostu TIFR = 1. Nie wiem jak działa kompilator Bascoma, ale wpisywanie zera do flagi nie wyzeruje jej. Fakt, że w przypadku TIFR.5 = 0 flaga ICF1 (na bicie 5) nie zostaje wyzerowana, potwierdza chyba to, co Atmel pisze nocie katalogowej.
  • #9 9649778
    Konto nie istnieje
    Konto nie istnieje  
  • #10 9649783
    gayetan
    Poziom 18  
    Innymi słowy "Bit TOV0 rejestru TIFR ustawiany jest ( wart.1 ) gdy pojawia się przepełnienie licznika Timer0 i jest czyszczony przez kontroler gdy odpowiedni wektor przerwania je obsłuży. Alternatywnie można wyczyścić (0) TOV0 przez wpisanie wartości logicznej 1 do tej flagi. Aby w ogóle doszło do przerwania SREG-I, TOIE0 i TOV0 muszą być ustawione na 1.
  • #11 9649802
    gaskoin
    Poziom 38  
    The bit TOV0 is set (one) when an overflow occurs in Timer/Counter0. TOV0 is cleared by hardware when executing the corresponding interrupt Handling Vector. Alternatively, TOV0 is
    cleared by writing a logic one to the flag. When the SREG I-bit, TOIE0 (Timer/Counter0 Overflow
    Interrupt Enable), and TOV0 are set (one), the Timer/Counter0 Overflow interrupt is executed.

    To znaczy mniej więcej tyle:

    Bit TOV0 jest ustawiony kiedy występuje przerwanie w Timer/Counter0. TOV0 jest wyzerowany przez sprzęt kiedy wykonywana jest obsługa przerwania. Alternatywnie TOV0 jest wyzerowany przez wpisanie logicznej jedynki do tej flagi (TOV0). Kiedy bit I rejestru SREG (to jest bit który mówi o tym że globalne przerwania są uruchomione) i bit TOIE0 (ten bit pozwala na przerwania od przepełnienia) i bit TOV0 są ustawione, wykonywane jest przerwanie od przepełnienia Timer/Counter 0.
  • #12 9649808
    Konto nie istnieje
    Konto nie istnieje  
  • #13 9649816
    gayetan
    Poziom 18  
    Jeszcze prościej

    TIFR.0 = 1

    Wiem, że to może wydawać się aintuicyjne - ale proszę tak spróbować.

    Proszę się nie irytować ( też tak miałem ). Elektroda znana jest z tego, że wypowiadają się 'fachowcy' bezlitośni dla 'początkujących' lub 'błądzących'. Tylko potem dziwią się, że jak czegoś nie rozumieją to im ktoś odpowiada "..na drzewo".
    Jeszcze raz pozdrawiam.
  • #14 9649833
    gaskoin
    Poziom 38  
    Nikomu nie napisałem "na drzewo". Przetłumaczyłem tekst z noty, w którym wyraźnie pisze, że bit ten jest kasowany przy obsłudze przerwania (autor robi to chyba manualnie stąd musi kasować go ręcznie), albo wpisując do niego 1.
  • #15 9649835
    Konto nie istnieje
    Konto nie istnieje  
  • #16 9649844
    Andrzej__S
    Poziom 28  
    MARKOPOLO napisał:

    TIFR.5 = 0

    bit TIFR.0 (TOV0) ustawia się na zero(czyli tak jak chcę)
    a ICF1 czyli TIFR.5 pozostaje w stanie 1
    Czyli osiągam zamierzony efekt skasowania flagi TOV0 ale dziwnym sposobem ?

    Generalnie kompilatory zerując jakiś bit w rejestrze robią to w ten sposób:
    # odczytują wartość rejestru,
    # wykonują funkcję AND tej wartości ze stałą, w której tylko odpowiedni bit jest równy zero, pozostałe są jedynkami,
    # zapisują otrzymaną wartość z powrotem do rejestru.

    W przypadku TIFR.5 = 0 scenariusz jest prawdopodobnie taki:
    # TIFR zawiera binarnie 00100001,
    # zostaje wykonana funkcja wartości 00100001 AND ze stałą 11011111, której wynikiem jest 00000001
    # otrzymana wartość zostaje wpisana do rejestru TIFR, a ponieważ bit 0 wpisywanej wartości jest równy jeden, flaga TOV0 zostaje wyzerowana; flaga ICF1 pozostaje ustawiona, ponieważ bit 5 jest równy zero.

    Cytat:

    Tylko dlaczego
    Tifr.0 = 1
    ustawia ten bit w stan 0 ???

    Tak założył producent. Być może dlatego, że dzięki temu nie jest konieczne odczytywanie rejestru TIFR. Wystarczy wpisać do niego wartość z odpowiednim bitem ustawionym na 1 i odpowiadająca temu bitowi flaga zostaje wyzerowana, a reszta pozostanie niezmieniona.
  • #17 9649845
    xury
    Specjalista automatyka domowa
    Do zapisu w rejestrze służy bascomowa instrukcja "Poke" i raczej ją bym używał, ewentualnie wstawek asemblerowych. Też kiedyś coś próbowałem ustawiać prostymi, bezpośrednimi przypisaniami i tak samo mi nie działało. Z tym, że instrukcja Poke i Peek działa na całych bajtach więc by nie namieszać najpierw należy odczytać cały bajt, a następnie zamaskować te których nie chcemy zmieniać, a potem zapisać cały bajt.
  • #18 9649854
    Konto nie istnieje
    Konto nie istnieje  
REKLAMA