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][Attiny2313] Nie działa przerwanie zewnętrzne

peter507 04 Gru 2008 17:39 2586 20
REKLAMA
  • #1 5817466
    peter507
    Poziom 16  
    Mam program, tak jak poniżej, nie reaguje na przerwanie z int0 i int1. Program ma sterować silnikami od drzwi garażowych

    
    '--------------------Sterownik bramy by Peter507------------------------------'
    
    Enable Interrupts
    Enable Int0
    Enable Int1
    On Int0 Przerwanie
    On Int1 Przerwanie1
    Dim Licznik As Byte , Licznik1 As Byte , Stan_bramy As Byte , Opcja1 As Byte
    Dim Opcja2 As Byte , Opcja3 As Byte , Stan_bramy1 As Byte , Opcja11 As Byte
    Dim Opcja22 As Byte , Opcja33 As Byte
    Config Pind.0 = Output
    Config Pind.1 = Output
    Config Pinb.0 = Output
    Config Pinb.1 = Output
    
    '----------------------------zerowanie zmiennych-------------------------------'
    
    Licznik = 0
    Licznik1 = 0
    Stan_bramy = 0
    Stan_bramy1 = 0
    Opcja1 = 0
    Opcja2 = 0
    Opcja3 = 0
    Opcja11 = 0
    Opcja22 = 0
    Opcja33 = 0
    
    '---------------------------poczatek pierwszej bramy--------------------------'
    
    Do
    If Opcja1 = 0 Then
    If Licznik = 1 Then
    Portd.0 = 0
    Portd.1 = 1
    Wait 20
    Portd.0 = 1
    Stan_bramy = 1
    Opcja1 = 1
    End If
    End If
    
    If Stan_bramy = 1 Then
    If Opcja2 = 0 Then
    If Licznik = 2 Then
    Portd.0 = 1
    Portd.1 = 1
    Opcja2 = 1
    End If
    End If
    End If
    
    If Opcja3 = 0 Then
    If Licznik = 3 Then
    Portd.0 = 1
    Portd.1 = 0
    Wait 20
    Portd.1 = 1
    Stan_bramy = 1
    Opcja3 = 1
    End If
    End If
    
    '----------------------------poczatek drugiej bramy----------------------------'
    If Opcja11 = 0 Then
    If Licznik1 = 1 Then
    Portb.0 = 0
    Portb.1 = 1
    Wait 20
    Portb.0 = 1
    Stan_bramy1 = 1
    End If
    End If
    
    If Opcja22 = 0 Then
    If Stan_bramy1 = 1 Then
    If Licznik1 = 2 Then
    Portb.0 = 1
    Portb.1 = 1
    End If
    End If
    End If
    
    If Opcja33 = 0 Then
    If Licznik1 = 3 Then
    Portb.0 = 1
    Portb.1 = 0
    Wait 20
    Portb.1 = 1
    Stan_bramy1 = 1
    End If
    End If
    Loop
    End
    
    '------------------------koniec drugiej bramy--------------------------------'
    
    Przerwanie:
    Licznik = Licznik + 1
    If Licznik = 4 Then
    Licznik = 1
    End If
    If Portd.0 = 0 And Portd.1 = 0 Then
    Portd.0 = 1
    Portd.1 = 1
    End If
    Opcja1 = 0
    Opcja2 = 0
    Opcja3 = 0
    Return
    
    Przerwanie1:
    Licznik1 = Licznik1 + 1
    If Licznik1 = 4 Then
    Licznik1 = 1
    End If
    If Portb.0 = 0 And Portb.1 = 0 Then
    Portb.0 = 1
    Portb.1 = 1
    End If
    Opcja11 = 0
    Opcja22 = 0
    Opcja33 = 0
    Return
  • REKLAMA
  • #2 5817503
    K_o_n_r_a_d
    Poziom 23  
    Widzę, że brakuje:
    CONFIG INTx = LOW LEVEL | RISING | FALLING [ | CHANGE ]
    
    (c) Zbigniew Gibek, 2002-2005   (c) MCS Electronics, 1999-2005
  • #4 5818590
    dawid512
    Poziom 32  
    Dla pewności ustaw końcówki INT0 i INT1 jako wejście i włącz wew. pull-up.
  • REKLAMA
  • #5 5821016
    peter507
    Poziom 16  
    nic to nie dało, jakieś inne sugestie ? Jak skonfigurowałem te porty jako zwykłe wejścia to działało, ale to musi być na przerwaniu.
  • #6 5821885
    mirekk36
    Poziom 42  
    peter507 -> coś kolega chyba nie rozumie sugestii a pyta o kolejne.

    Skoro chcesz używać przerwań INTx to musisz! "ręcznie" ustawić kierunek portów na wejściowy a w zależności od tego jak to twoje przerwanie ma być wyzwalane to można jeszcze podciągnąć wewn pull-up'em do jedynki.

    Bez ustawienia pinów jako wejścia przerwania ci nie zadziałają nigdy

    Dodano po 4 [minuty]:

    poza tym kolega K_o_n_r_a_d wspomniał o konfiguracji samych przerwań i też nie wiadomo czy coś z tym zrobiłeś, dajesz tak mało informacji że ciężko coś wróżyć z fusów
  • #7 5822280
    peter507
    Poziom 16  
    Dodałem to co kolega K_O_N_R_A_D napisał i nic to nie dało, skonfigurowałem jako low, ustawiłem też że porty na których są końcówki INT mają pracować jako wejścia, i dalej nic. Jak wewnętrznie podciągnąć do jedynki ??
  • REKLAMA
  • #8 5822514
    Chyllus
    Poziom 17  
    W ostatnim poście z poniższego tematu jest to nieźle opisane:
    Link

    Z jakim kwarcem ma to pracować?
    Spróbuję u siebie to przerobić i uruchomić.
  • #9 5822681
    dawid512
    Poziom 32  
    Cytat:
    Jak wewnętrznie podciągnąć do jedynki ??
    Żartujesz prawda? Wystawić na odpowiednią końcówkę stan wysoki.
  • #10 5822986
    loodvis
    Poziom 14  
    Chyllus napisał:
    Czy to na pewno cały program?
    Jeśli tak to na początek dodaj:
    
    $regfile = "attiny2313.dat"  
    $crystal = xxxxxxx


    Dokładnie, dodaj to i jeszcze ustaw w options>compiler>chip . Sporo czasu nad tym raz spędziłem jak zamieniłem megę 16 na 8 i zapomniałem zmienić procka w ustawianiach a nie działało mi właśnie tylko przerwanie.... ;)
  • #11 5823281
    Balu
    Poziom 38  
    loodvis napisał:
    Chyllus napisał:
    Czy to na pewno cały program?
    Jeśli tak to na początek dodaj:
    
    $regfile = "attiny2313.dat"  
    $crystal = xxxxxxx


    Dokładnie, dodaj to i jeszcze ustaw w options>compiler>chip . Sporo czasu nad tym raz spędziłem jak zamieniłem megę 16 na 8 i zapomniałem zmienić procka w ustawianiach a nie działało mi właśnie tylko przerwanie.... ;)


    Po co grzebać w menusach skoro $cokolwiek ma wyższy priotytet niż menusy?:>
  • #12 5823330
    Konto nie istnieje
    Poziom 1  
  • #13 5823397
    peter507
    Poziom 16  
    emarcus napisał:
    Bardzo bym sie zdziwil gdyby ten program w jego oryginalnej postaci lub nawet z pozniejszymi poprawkami mogl funkcjoniwac!
    Po pierwsze: Jest on nie pelny, nie tylko brak jak juz ktoz zauwazyl, deklaracji rodzaju, typu uC i jego cyklu pracy (czestotliwosci). Pomimo faktu ze nie ma w programie pomiarow czasu to ta informacja nie moze byc pominieta.
    W BASCOM
    $regfile = "attiny2313.dat"
    oznacza adres pliku gdzie sa umieszczone wszelkie informacje z ktorych BASCOM wybiera odpowiednie ustawienia/opcje/funkcje jezeli one wystapia w twoim programie.

    Rozumiem ze program ten (uklad) ma kontrolowac otwieranie i zamykanie bramy. Owszem sa tam elementy konfiguracji portow wyjsciowych (wybrales config pinx.y, - jestem zwolennikiem config portx.y), natomiast komletnie pominieto komunikacje z tym ukladem, mam tu na mysli konfig. wejsc zarowno do obslugi INT0, INT1 jak rowniez brak jest 'sprzezenia zwrotnego' czyli informacji o zmknietej bramie i potrzebie wylaczenia silnika el. Brak rowniez kontrolowania wolnej drogi dla bramy (element bezpieczenswa sprzetu i mienia a takze osob).
    Attiny pomimo ze jest "tiny" ma bardzo duzo dostepnych konfigurowalnych pinow - wykozystaj je.
    Podstawowa zasada dla uC Atmel to: port/pin musi byc odpowiednio do funkcji skonfigurowany - inaczej jest 'trzy stanowy' czyli izolowany.

    Jezeli wlaczanie otwarcia/ zamkniecia odbywa sie z "push button" to nie zapomnij o "Debounce" abo innym sposobem wyeliminuj ten fenomenon wielokrotnego impulsu.

    emarcus


    Co to jest wogóle za wypowiedź ! Czy ja zadałem pytanie o cały program czy tylko przerwania, pozatym bez deklaracji zegara i kontrolera programy działają, bo jest to wybrane w opcjach programu BASCOM. Po drugie kolega nie wie na jakiej zasadzie działa brama więc
    jak można mówić coś na ten temat. Pytanie dotyczy dlaczego nie reaguje zupełnie przerwanie, więc jak kolega nie wie to niech się nie wypowiada.
    Pozatym jakby kolega przeczytał cały temat to zobaczyłby że jest już config końcówek INT0 i INT1
  • #14 5823650
    mirekk36
    Poziom 42  
    peter507 napisał:

    Co to jest wogóle za wypowiedź ! Czy ja zadałem pytanie o cały program czy tylko przerwania, pozatym bez deklaracji zegara i kontrolera programy działają, bo jest to wybrane w opcjach programu BASCOM.


    .... a co to jest za odpowiedź!

    po pierwsze jeśli nie nauczysz się deklarować pewnych rzeczy jak np typ procesora i inne, na które tutaj ludzie zwracają ci uwagę to się jeszcze na tym przejedziesz nie raz. Ale dobrze, widać musisz stracić sporo czasu zanim zaczniesz na dobre programować (nawet help Bascoma zaleca deklarowanie w kodzie takich stałych - ale co tam - ty wiesz lepiej)

    po drugie ludzie starają ci się tu pomóc a ty sadzisz błąd na błędzie i jeszcze sobie pokrzykujesz, że wszystko masz dobrze i ci działa tylko te nieszczęsne przerwania nie chcą. Zdecyduj się więc i zastanów ponownie po co tu zabierasz głos a także cenny czas innym kolegom, skoro sam lepiej wiesz.
  • #15 5823682
    peter507
    Poziom 16  
    Ja się pytam o przerwania, nie o resztę programu, jak nie będzie działać wtedy będe z tamtym walczyć, póki co pierwszy raz robie coś z przerwaniami.
    Poza tym nic takie nie powiedziałem że wszystko jest dobrze w moim programie, na pewno są jakieś błędy ale postaram się sam je wyeliminować
  • REKLAMA
  • #16 5823721
    mirekk36
    Poziom 42  
    no to jeszcze jedną rzecz dorzucę ale też do całości twojego programu, bo ten sam błąd zapewne robisz nie tylko w procedurach obsługi przerwań
    otóż w programie piszesz tak:

    If Portd.0 = 0 And Portd.1 = 0 Then

    tymczasem jeśli chcesz sprawdzić jaki stan jest na którymś z pinów portu to jak sama nazwa wskazuje powinieneś mieć taki warunek:

    If PIND.0 = 0 And PIND.1 = 0 Then

    widzisz różnicę? - na pewno inaczej ci to zadziała
  • #17 5823758
    Balu
    Poziom 38  
    Słuchaj możliwe błędy w przerwaniu:
    1) nie ustawione jako wejście
    2) złe wyzwalanie (w to wlicza się brak podciągania)
    3) brak włączonej obsługi przerwań
    4) jeszcze raz złe wyzwalanie!
    5) źle zrobiony hardware!
    6) Nie krzycz na ludzi mających większe pojęcie niż Ty i wytykających Ci oczywiste oczywistości gdzyż jak już to zadziała, będziesz marudził o tamto:P A tak... 2w1;]
    7) brak procedur obsługi przerwań.
    Ł.
  • #18 5825770
    dawid512
    Poziom 32  
    Obsługa przycisku w przerwaniu jest niezbyt wskazana. Owszem przycisk uruchomi przerwanie ale do tego należy również doliczyć drgania styków. Jak wiadomo opóźnienia w przerwaniu to niepożądane zjawisko. Dobrym sposobem jest dodanie kondensatora który będzie się ładował i rozładowywał tym samym eliminując drgania styków.
  • #19 5825934
    zumek
    Poziom 39  
    mirekk36 napisał:
    ...otóż w programie piszesz tak:

    If Portd.0 = 0 And Portd.1 = 0 Then

    tymczasem jeśli chcesz sprawdzić jaki stan jest na którymś z pinów portu to jak sama nazwa wskazuje powinieneś mieć taki warunek:

    If PIND.0 = 0 And PIND.1 = 0 Then

    widzisz różnicę? - na pewno inaczej ci to zadziała

    Chyba się troszkę zagalopowałeś :D
    W przypadku kiedy PORTD.0 pracuje jako wyjście, nie ma sensu sprawdzać rejestru PIND, żeby przekonać się, jaki stan mamy "zaprogramowany" na danym wyjściu.Sprawdzenie rejestru PORTD wystarczy.
    No chyba, że ...
    
    If DDRD.0=1 And PORTD.0=1 And PIND.0=0 Then
       LCD "ZWARCIE do GND na wyjściu PD0 !!!"
    End If
    

    :-P

    peter507
    To może pokaż, jak wygląda kod w obecnej postaci :?:
    Kawałek schematu - mile widziany.




    Piotrek
  • #20 5826519
    peter507
    Poziom 16  
    Wszytsko wrzuce w poniedziałek po południu bo nie mam dostępu teraz do niego. Ogólnie przerwanie działa ale też nie do końca, bo jak jedno się wykona i stoi na wait'cie w pętli głównej to już na kolejne, nie reaguje

    dawid512 napisał:
    Obsługa przycisku w przerwaniu jest niezbyt wskazana. Owszem przycisk uruchomi przerwanie ale do tego należy również doliczyć drgania styków. Jak wiadomo opóźnienia w przerwaniu to niepożądane zjawisko. Dobrym sposobem jest dodanie kondensatora który będzie się ładował i rozładowywał tym samym eliminując drgania styków.


    Tu nie będzie przycisków tylko przekaźniki. Zmiana tych stanów na portach przełącza styki przekaźnika
  • #21 5827349
    mirekk36
    Poziom 42  
    zumek napisał:
    Chyba się troszkę zagalopowałeś :D
    W przypadku kiedy PORTD.0 pracuje jako wyjście, nie ma sensu sprawdzać rejestru PIND, żeby przekonać się, jaki stan mamy "zaprogramowany" na danym wyjściu.Sprawdzenie rejestru PORTD wystarczy.


    no tak nie zwróciłem może uwagi na to, że portd w tym przypadku jest wyjściem (jeśli chodzi o całość programu)
REKLAMA