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

Czemu w bascomie przerwanie resetuje uC?

crooveck 02 Sty 2010 21:04 1214 9
REKLAMA
  • #1 7474495
    crooveck
    Poziom 10  
    Cześć.
    Napotkałem ostatnio na pewien problem, mianowicie w momencie gdy wywołuję przerwanie w swoim układzie, to po jego obsłudze główny blok programu nie jest kontynuowany, tylko wszystko zaczyna się od początku (albo resetuje procek).

    W załączniku schemat urządzenia.
    Załącznik usunąłem.
    [zumek]

    Czemu w bascomie przerwanie resetuje uC?


    Przerwanie jest wyzwalane jednym z 9 przycisków, następnie bramka "wysyła" na INT0 sygnał o wciśniętym przycisku, a z wyjść dekodera odczytuję numer wciśniętego przycisku.

    Będę wdzięczny za wszelkie porady, które spowodują, że program będzie kontynuowany od miejsca w którym się przerwał.


    
    $regfile = "m32def.dat"
    $crystal = 11059200
    
    'stany portow
    Config Portd = &B11000000
    
    'przerwania
    Config Int0 = Low Level
    Enable Interrupts
    Enable Int0
    On Int0 Przerwanie
    
    '$$$$$$$$
    Do
       'tu cos sie dzieje
       'waitms 10
    Loop
    
    '########
    
    
    'odebranie przerwania i przekazanie go dalej
    'debounce eliminuje drganie stykow tych 9 przyciskow
    Przerwanie:
      Debounce Pind.2 , 0 , Obslugaprzerwania , Sub
    Return
    
    Obslugaprzerwania:
    
       'tu sobie robimy to co ma byc w przerwaniu
       Waitms 100
    
    Return
    


    Z góry dzięki za pomoc.
  • REKLAMA
  • REKLAMA
  • #3 7474607
    gothye
    Poziom 33  
    w przerwaniu nigdy nie wykonuje się funkcji wait itp. :!:
  • REKLAMA
  • #4 7474777
    crooveck
    Poziom 10  
    Niestety, to nie pomogło, usunąłem wszystkie wait'y które tam były i dalej jest to samo.
    Może macie jakieś inne pomysły?
  • REKLAMA
  • Pomocny post
    #5 7475138
    Konto nie istnieje
    Poziom 1  
  • #6 7475515
    crooveck
    Poziom 10  
    Wszystkie wartości mam domyślne dla atmega32: hwstack=32, softstack=8, framesize=24, itp
  • Pomocny post
    #7 7475526
    xury
    Specjalista automatyka domowa
    crooveck napisał:
    Niestety, to nie pomogło, usunąłem wszystkie wait'y które tam były i dalej jest to samo.
    Może macie jakieś inne pomysły?

    Wszystkich nie usnąłeś - zostało 25ms z debounce.
    Poza tym konfiguracja przerwania jako Low level powoduje, że jest ono generowane raz za razem dopóki jest stan niski na pinie. Przerwanie nie zdąży się obsłużyć, bo debounce potrzebuje kosmicznie długiego czasu 25 ms. W dodatku Debounce używa skoku Go Sub i stan rejestrów zapisywany jest na stosie Następuje zapętlenie przerwań, no i co za tym idzie nadpisanie stosu. Nie ma prawa to działać.
    Zrezygnuj z debounce i przekonstruuj przerwanie na rising lub falling.
  • #8 7475737
    crooveck
    Poziom 10  
    Teraz już wszystko działa, zmieniłem trochę obsługę przerwania, zwiększyłem rozmiar hwstack na 64 i hula jak ta lala :)

    Dzięki i pozdrawiam.
  • #9 7483661
    jarobo
    Poziom 12  
    A ja tu widzę jeden problem

    'odebranie przerwania i przekazanie go dalej
    'debounce eliminuje drganie stykow tych 9 przyciskow
    Przerwanie:
    Debounce Pind.2 , 0 , Obslugaprzerwania , Sub
    Return to nie zostanie wykonane

    Obslugaprzerwania:
    'tu sobie robimy to co ma byc w przerwaniu
    Waitms 100

    Return reti zakonczenie przerwania

    gdy w przerwaniu wykonasz skok do podprogramu "obslugaprzerwania:" wykonasz podprogram "obslugaprzerwania:" i zamiast powrotu z podprogramu masz Return tłumaczone na "reti" czyli powrót z przerwania
  • #10 7483965
    Konto nie istnieje
    Poziom 1  
REKLAMA