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

AT89CX051 - Jak zmieniać czas migania diod za pomocą przerwań?

sigreg 29 Lut 2004 09:38 1272 8
REKLAMA
  • #1 524477
    sigreg
    Poziom 10  
    Posty: 47
    Witam,

    Od jakiegos czasu ucze sie programowac procki AT89CX051, oczywiscie pierwszym ukladem byl prosty projekt plytki z diodami ktorymi procek migal zgodnie z wpisanym programem. Teraz chcialbym program rozbudowac o "ingerencje" uzytkownika. Dodalem dwa mikrostyki ktorymi chcialbym zmniejszac i zwiekszac czas "migniec". Styki podlaczone sa do pinow 6 (3.2) - wydluzenie czasu, i 7 (3.3) - skrocenie czasu. Stworzylem nastepujacy programik :

    $regfile = "89C2051.DAT"
    $crystal = 12000000

    Dim Op As Byte

    Led_1 Alias P1.7
    Led_2 Alias P1.6
    Led_3 Alias P1.5
    Led_4 Alias P1.4
    Led_5 Alias P1.3
    Led_6 Alias P1.2

    P1 = 255
    Op = 1
    Enable Interrupts
    Enable Int0
    Enable Int1

    On Int0 Szybciej
    On Int1 Wolniej

    Do
    Reset Led_1
    Wait Op
    Set Led_1
    Reset Led_2
    Wait Op
    Set Led_2
    Reset Led_3
    Wait Op
    Set Led_3
    Reset Led_4
    Wait Op
    Set Led_4
    Reset Led_5
    Wait Op
    Set Led_5
    Reset Led_6
    Wait Op
    Set Led_6
    Loop

    Szybciej:
    If Op = 1 Then
    Op = 2
    End If
    Decr Op
    Return

    Wolniej:
    Incr Op
    Return

    Po uruchomieniu ukladu dioda swieci sekunde i wlaczana jest nastepna. Teoretycznie po zwarciu styku 6 i wywolaniu procedury "wolniej" czas powinien byc zwiekszony o 1, czyli dioda powinna swiecic 2 sekundy, a tymczasem okazuje sie ze swieci prawie 2 minuty. Podejrzewam ze inkrementacja dokonywana jest kilkadziesiat razy - tak dlugo jak wcisniety jest mikrostyk. Jak w takim razie zrobic aby jedno nacisniecie styku - nie wazne jak dlugie, powodowalo inkrementacje zmiennej dokladnie o 1 ?

    Grzesiek
  • REKLAMA
  • REKLAMA
  • #3 524534
    nojmi
    Poziom 20  
    Posty: 473
    Pomógł: 9
    Ocena: 18
    W programie nie napisales czy przerwania maja byc wywolane stanem niskim czy opadajacym zboczem. Zgloszenie poziomem niskim powoduje wykonywanie podprogramu tak dlugo jak dlugo na wejsciu INT bedzie 0. Oznacza to, ze przed zakonczeniem procedury obslugi przerwania stan na wej INT musi zmienic sie na 1. Natomiast zgloszenie zboczem opadajacym powoduje jednorazowe wykonanie procedury.

    Przerwanie INT0:
    reset Tcon.0 - wywolanie poziomem niskim
    set Tcon.0 - opadajacym zboczem
    Przerwanie INT1:
    reset Tcon.2 - poziomem niskim
    set Tcon.2 - opadajacym zboczem
  • REKLAMA
  • #4 524817
    nojmi
    Poziom 20  
    Posty: 473
    Pomógł: 9
    Ocena: 18
    kozak_sc zamiast stosowania takich warunkow mozna bezposrednio uzyc polecenie
    Bitwait P3.3 , set
  • #6 525337
    sigreg
    Poziom 10  
    Posty: 47
    Czesc,

    Czyli w takim ukladzie wzyzwolenie przerwania powinno wystepowac przy pojawieniu sie opadajacego zbocza. Pytanie jednak w ktorym miejscu swojego programu powinienem umiescic :

    set Tcon.0
    set Tcon.2

    ?

    Czyzby zamiast :

    Enable Int0
    Enable Int1

    ?

    Grzesiek
  • #7 525412
    nojmi
    Poziom 20  
    Posty: 473
    Pomógł: 9
    Ocena: 18
    Enable zostawiasz w spokoju. Poprostu dopisujesz swoje set Tcon.0 i Tcon.2. Tak sie zastanawiam, ale chyba nie ma znaczenia gdzie to wpisujesz. Wazne zeby gylo.
  • #8 534260
    sigreg
    Poziom 10  
    Posty: 47
    Witam,

    Po poprawce program wyglada tak :

    $regfile = "89C2051.DAT"
    $crystal = 12000000

    Dim Op As Byte

    Led_1 Alias P1.7
    Led_2 Alias P1.6
    Led_3 Alias P1.5
    Led_4 Alias P1.4
    Led_5 Alias P1.3
    Led_6 Alias P1.2

    P1 = 255
    Op = 1
    Set Tcon.0
    Set Tcon.2
    Enable Interrupts
    Enable Int0
    Enable Int1

    On Int0 Szybciej
    On Int1 Wolniej

    Do
    Reset Led_1
    Wait Op
    Set Led_1
    Reset Led_2
    Wait Op
    Set Led_2
    Reset Led_3
    Wait Op
    Set Led_3
    Reset Led_4
    Wait Op
    Set Led_4
    Reset Led_5
    Wait Op
    Set Led_5
    Reset Led_6
    Wait Op
    Set Led_6
    Loop

    Szybciej:
    If Op = 1 Then
    Op = 2
    End If
    Decr Op
    Return

    Wolniej:
    Incr Op
    Return

    Niestety problem pozostal. Po zwarciu Int1 i wywolaniu procedury "Wolniej" dioda zamiast swiecic sekunde dluzej, swieci kilkadziesiat sekund dluzej. Czy mozliwe zeby tak prosty program wciaz zawieral bledy ? Coraz bardziej brakuje mi porzadnych materialow do Bascoma, nie mam po prostu skad sie tego porzadnie nauczyc.

    Grzesiek
  • REKLAMA
  • #9 534777
    radek.kaba
    Poziom 15  
    Posty: 120
    Pomógł: 1
    Zewrzyj przycisk kondensatorkiem np. 10nF.

Podsumowanie tematu

✨ Dyskusja dotyczy programowania mikrokontrolera AT89CX051 w celu zmiany czasu migania diod LED za pomocą przerwań zewnętrznych INT0 i INT1, sterowanych dwoma mikrostykami podłączonymi do pinów P3.2 i P3.3. Autor implementuje program w Bascom, gdzie przerwania mają zmieniać wartość opóźnienia (zmienna Op) sterującego czasem świecenia diod. Poruszono kwestię konfiguracji przerwań – czy mają być wywoływane poziomem niskim czy opadającym zboczem, z zaleceniem ustawienia bitów TCON.0 i TCON.2 na zbocze opadające, co zapewnia jednorazowe wywołanie procedury obsługi przerwania. Zaproponowano także metody eliminacji drgań styków, np. przez dodanie opóźnienia waitms 100 oraz kondensatora 10nF do przycisku. Wskazano, że w Bascom można użyć instrukcji Bitwait lub jnb do sprawdzania stanu pinu. Pomimo poprawek, autor zgłasza problem z nadmiernym wydłużeniem czasu świecenia diody po wywołaniu przerwania "Wolniej", co może wynikać z drgań styków lub błędów w logice programu.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA