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

[bascom][atmega8] problem z przerwaniem zewnetrznym

mpo 17 Sty 2010 13:21 1755 10
REKLAMA
  • #1 7548698
    mpo
    Poziom 12  
    Taki fragment schematu:

    [bascom][atmega8] problem z przerwaniem zewnetrznym

    Koncepcja jest taka:
    mega8 pracuje i w momencie gdy zaniknie zasilanie, to dostanie sygnał (opadające zbocze) na INT1 i w przerwaniu zapisze kilka bajtów do eeprom (bo ma jeszcze zasilanie z kondensatora za diodą).

    Kod do tego:

    
    dim e_impulsy as eram word
    dim impulsy as word
    
    Config Int1 = Falling
    On Int1 Brak_zasilania
    enable interrupts
    Enable Int1
    
    do
    'kod programu zmieniajacy zmienna impulsy
    loop
    end
    
    Brak_zasilania:
    E_impulsy = Impulsy
    Stop
    Return
    


    No i po zaprogramowaniu z tymi fragmentami urządzenie jak martwe. Bez obslugi tego przerwania wszystko jest ok.
    Jakieś pomysły?
  • REKLAMA
  • #2 7548778
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #3 7548908
    mpo
    Poziom 12  
    atom1477 napisał:
    C2 musi mieć małą pojemność. Ale bez przesady. Daj 10uF. I musi być zwarty rezystorem o małej wartości aby szubko sie rozładowywał. Z 1k...330R. Tak samo przydał by się rezystor rozładowujący na wejściu stabilizatora a jeszcze lepiej było by ten czujnik zaniku zasilania podłączyć do szyny 12V. Choć oczywiście nie bezpośrednio tylko przez jakieś diody, rezystory itp.
    C1 ma mieć dużą wartość. Ze 100uF co najmniej.
    Podłączyłeś pozostałe piny zasilania?


    C2 ma 1uF plus równolegle jakieś 100n przeciw zakłóceniom.
    C2 nie trzeba na siłę rozładowywać, bo z tego punktu jest zasilanie płytki z wyświetlaczami led - ciągną ze 400mA aż LM317 parzy w palce...
    C1 ma 330uF.
    Pozostałe zasilania podłączone - tak jak pisałem, urządzenie pracuje dopóki nie odkomentuję fragmentu obsługi INT1.
    W symulatorze wszystko ok :|

    Jednak nie ok.
    Po założeniu breakpointa na poleceniu return, po uruchomieniu symulatora od razu program tam wchodzi i się zatrzymuje.
    Tak jakby pojawiało się "na dzień dobry" przerwanie INT1. Ale dlaczego???
    D3 (INT1) jest skonfigurowany jako wejście z pullup.
  • #4 7549478
    Konto nie istnieje
    Poziom 1  
  • #5 7550790
    mpo
    Poziom 12  
    atom1477 napisał:
    Po uruchomieniu zasilania najpierw odczekaj chwilkę, później skasuj flagę przerwania INT1 i dopiero zezwój na obsługę przerwania INT1.

    Nic to niestety nie daje...
    Przerwanie od timer0 i INT0 obsługiwane są bezbłędnie, a jak dodam enable INT1, to już nie.
    Coś ze stosem?
    $hwstack = 64
    $swstack = 16
    $framesize = 16
  • REKLAMA
  • #6 7550987
    Konto nie istnieje
    Poziom 1  
  • #7 7551171
    mpo
    Poziom 12  
    atom1477 napisał:
    Stos OK.
    Mówię Ci. Skasuj flagę przed "Enable INT1".


    Generalnie kolejność mam w kodzie taką:


    
    Config Int0 = Falling                                       'opadajace zbocze wywoluje przerwanie
    Config Int1 = Falling                                       'opadajace zbocze wywoluje przerwanie
    Config Timer0 = Timer , Prescale = 8                        'konfiguracja Timer0 jako timera z preskalerem przez 8
           'Przerwanie od przepelnienia Timer0 jest generowane co 0,25 ms
           '8MHz/8/250 = 4000, a 1/4000 = 0,25ms
           'Zliczenie 2000 odcinkow da pol sekundy, 4000 odcinkow 0,25 ms da 1 sekunde
    Load Timer0 , 250                                           'wartosc poczatkowa Timer0 dla 0,25ms
    On Timer0 Odmierz_ms                                        'przerwanie do zliczania czasu
    On Int0 Licz_impulsy                                        'przerwanie po pojawieniu sie zewnetrznego impulsu
    On Int1 Brak_zasilania                                      'przerwanie po zaniku zasilania
    Enable Timer0                                               'odblokowanie przerwania od przepelnienia Timer0
    Enable Int0                                                 'odblokowanie przerwania zewnetrznego od impulsu
    'Enable Int1
    Enable Interrupts                                           'odblokowanie globalnego systemu przerwan
    Kal_temp = Kalibrator                                       'odczyt kalibracji z EEPROM
    Impulsy = E_impulsy                                         'odczyt liczby impulsow z EEPROM
    Nr_wyswietlacza = 2                                         'segment jednostek na poczatek
    Sciemniacz_ind = 3                                          'max jasnosc
    


    ...więc flaga jest ustawiana na samym końcu po definicjach co jest dozwolone.
  • REKLAMA
  • #8 7551294
    Konto nie istnieje
    Poziom 1  
  • #9 7551374
    janbernat
    Poziom 38  
    wpisz set GIFR.INTF1
    Z kondensatora C1 330uF napięcie będzie spadać do 3V przez 100ms
    Zakładając z DS pobór prądu 15mA.
    Wystarczy?
    A z C2 znacznie dłużej.
    P.S.
    A nie, z C2 bierzesz kilkaset mA
  • #10 7551630
    mpo
    Poziom 12  
    atom1477 napisał:
    No i gdzie ta flaga?


    Flaga jest ustawiana dopiero przez 'enable interrupts'?
    Chyba że jestem w tzw. mylnym błędzie (zieloniutki jestem w te klocki).

    Ale...
    Rozwiązałem problem - może komuś się przyda morał :!:
    Problem nie był w software, tylko hardware.
    Podłączyłem oscyloskop na C2 i zobaczyłem cudną półsinusoidę o amplitudzie 5V...
    Okazało się, że w chińskim zasilaczu dali jedną diodę do prostowania (nawet bez kondensatora) i dumnie napisali 12V DC.
    Ponieważ z C2 są zasilane tylko wyświetlacze a mega8 ma już duży kondensator, to wszystko działało.
    Dopiero jak włączyłem detekcję spadku napięcia na INT0, to pierwsza obcięta połówka generowała przerwanie i stop w procedurze obsługi przerwania.

    No cóż, niedziela z głowy, ale jest sukces :D
    Tak czy owak dziękuję za błyskawiczne porady.
    Można chyba zamknąć wątek.

    Acha:
    330uF wystarcza, żeby zapisać 10bajtów do eeprom.
    Pewnie wystarczy dużo mniejszy kondensator (zwłaszcza jak się da jakieś idle), ale nie chce mi się już lutować.
  • #11 7552109
    Konto nie istnieje
    Poziom 1  
REKLAMA