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

Atmega8 assembler - Zerowanie bitu I w SREG podczas symulacji w AVR Studio

kulpina 19 Gru 2013 22:21 1500 5
REKLAMA
  • #1 13079665
    kulpina
    Poziom 14  
    Zanotowałem bardzo dziwne dla mnie zachowanie Avr Studio.

    Otóż mam następujący program:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Wszystko wydaje się całkowicie prawidłowo.
    Przeprowadzam symulacje krok po kroku i:
    1. Kod działa jeśli cały czas wymuszam stan wysoki na fladze I w rejestrze SREG (polecenie SEI).
    2. Kod przestaje działać jeśli z pętli usuniemy polecenie sei. Po kilku taktach, z nieznanych mi przyczyn, bit I w SREG jest zerowany - co umożliwia obsługę przerwania.

    Czy mógłby mnie ktoś naprowadzić? Tym razem jest to dla mnie tak dziwne, że nie mam nawet pomysłu z której strony podejść do rozwiązania...
  • REKLAMA
  • #2 13079761
    dreamy
    Poziom 12  
    Kiedy zdarza się przerwanie, bit I w SREG zostaje wyczyszczony, podczas powrotu z przerwania RETI ustawia bit I z powrotem na 1.

    Zapobiega to kolejnemu wywołaniu tego samego przerwania dopóki jego obsługa nie zostanie zakończona, jak i zagnieżdżonym przerwaniom.
  • REKLAMA
  • #3 13079763
    2rs232
    Poziom 18  
    W przypadku wystąpienia aktywnego przerwania w momencie skoku do jego obsługi bit I w SREG jest zerowany, instrukcja RETI kończąca kod dla przerwania ustawia go ponownie.
  • REKLAMA
  • #4 13079786
    dondu
    Moderator na urlopie...
    kulpina napisał:
    Zanotowałem bardzo dziwne dla mnie zachowanie Avr Studio.

    Czyli symulator AVR Studio działa prawidłowo, a problem wynika z nie czytania datasheet:

    Cytat:
    SREG - Status Register

    Bit 7 – I: Global Interrupt Enable
    The Global Interrupt Enable bit must be set for the interrupts to be enabled. The individual interrupt
    enable control is then performed in separate control registers. If the Global Interrupt Enable
    Register is cleared, none of the interrupts are enabled independent of the individual interrupt
    enable settings. The I-bit is cleared by hardware after an interrupt has occurred, and is set by
    the RETI instruction to enable subsequent interrupts.
    The I-bit can also be set and cleared by
    the application with the SEI and CLI instructions, as described in the Instruction Set Reference.
  • REKLAMA
  • Pomocny post
    #5 13079831
    Konto nie istnieje
    Poziom 1  
  • #6 13079944
    kulpina
    Poziom 14  
    Rozwiązane :)

    Koledzy dreamy, 2rs232 i dondu oczywiście mają rację - jednak nie to było źródłem problemu. Nie zostałem zrozumiany.

    Problem polegał na tym, że symulowałem program, klikając sobie kilkanaście razy "Step Into" - pojedynczy skok do następnej instrukcji. Jednak podczas wykonywania tych kilku obrotów w nieskończonej pętli, kiedy T0 zliczał i zbliżał się do przepełnienia, bit I był zerowany - zanim jeszcze doszło do wywołania przerwania. W wyniku tego wyłączane bylo globalne zezwolenie na przerwania, gdzieś nagle, w pustej, nieskończonej pętli, co wprowadzało mnie w głęboką konsternację.

    Faktycznie rozwiązaniem okazało się jednak to co podesłał Marek_Skalski. Okazuje się, że symulator jednak nie jest prawdziwym mikroprocesorem i ma jeszcze swoje zakamarki, które muszą utrudniać życie w swoim podstawowym ustawieniu - bo jakże by inaczej.

    Dziękuję serdecznie koledze Marek_Skalski, bo gdyby nie ta rada, to w życiu, nie było najmniejszej szansy, abym wpadł na coś tak dziwnego.

    W moim wypadku pomaga zmiana ustawienia "Mask Interrupts while stepping" ze standardowego True na False, jak na załączonym zdjęciu.

    Jeszcze raz serdecznie dziękuję.
REKLAMA