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

[Atmega2560] [BASCOM] . Jak uzyskać wykrycie przerwania.

adambehnke 08 Cze 2010 21:09 2757 8
  • #1 8170050
    adambehnke
    Poziom 24  
    Witam

    Mam mały problem z wykryciem przerwania na jednym z pinów A2560. Otóż jest tak:

    normalnie przerwania konfiguruję i wykrywam tak:

    On Int7 Readir
    Config Int7 = Low Level
    Enable Int7


    Ale teraz muszę wykryć przerwanie na pinie z opisem:

    Pod ten pin mam podłączone wyjście INT z PCF8583P i przerwanie powinno następować dokładnie co 1 sekundę.I rzeczywiście PCF daje impuls na ten pin ale nie wykrywam go.

    [Atmega2560] [BASCOM] . Jak uzyskać wykrycie przerwania.

    Oczywiście Pin ustawiony jest jako wejście :
    Config Portb.4 = Input


    Z datasheet-a widzę że na tym pinie także możliwe jest wykrywanie przerwań ale nie działa mi taka np. konfiguracja:

    On PCINT4 Test
    Config PCINT4 = Low Level
    Enable PCINT4


    Zapewne zabieram się za to jak za jeża ale nie mam pojęcia jak to ustawić. Proszę o jakieś rady.
  • Pomocny post
    #2 8172593
    OlekM
    Poziom 17  
    Szukając w dokumentacji frazy PCINT, znalazłem przykład czytnika tagów HITAG. Jest tam interesujący... komentarz :-)

    
    'you need to use a pin that can detect a pin level change
    'most INT pins have this option
    'OR , you can use the PCINT interrupt that is available on some chips
    
    'In case you want PCINT option
    ' Pcmsk2 = &B0000_0100        'set the mask to ONLY use the pin connected to DOUT
    ' On Pcint2 Checkints         'label to be called
    ' Enable Pcint2               'enable this interrupt
    
    'In case you want to use INT option
    On Int0 Checkints                                           ' PIND.2 is INT0
    Config Int0 = Change                                        'you must configure the pin to work in pin change intertupt mode
    
    Enable Interrupts                                           ' enable global interrupts
    


    Zatem należy jeszcze przyjrzeć się rejestrom PCMSK w dokumentacji procesora.
  • Pomocny post
    #3 8172965
    archanoid
    Poziom 26  
    Witam.Osobiście nie piszę w bascomie ale przerwanie (przerwania) PCINT wyzwalane są zmianą stanu na pinie a ty natomiast próbujesz konfigurować aby wyzwalane było niskim poziomem.
  • Pomocny post
    #5 8173811
    OlekM
    Poziom 17  
    Cytat:
    Niestety jak używam w konfiguracji słowa PCINT4 to kompilator generuje błąd i twierdzi że to nieznane źródło przerwania.


    To dlatego, że w tym procesorze są tylko 3 przerwania tego typu (w innych raczej nie będzie lepiej). Piny oznaczone PCINT0...PCINT7 mogą ustawić tylko pierwszą z wspomnianych 3 flag przerwań (o numerze 0). Kolejne osiem pinów PCINT8...PCINT15 ustawiają drugą z flag i ostatecznie PCINT16...PCINT23 ustawiają trzecią flagę.

    Rejestry PCMSKn pozwalają na poinformowanie procesora, na których pinach ma wykrywać zmiany (i ustawiać flagę), a które ma ignorować. Domyślnie ignorowane są wszystkie z pinów, więc z pewnością należy dokonać modyfikacji tego rejestru.

    Dokładniejszy opis znaleźć można w dokumentacji procesora, w sekcji 1.5.2 (strona 115).
  • Pomocny post
    #7 8173953
    utak3r
    Poziom 25  
    A zajrzyj do pliku *.dat swojego procka - może ma inną nazwę nadaną.
  • Pomocny post
    #8 8173996
    OlekM
    Poziom 17  
    Jeden przykład pewnie będzie tu wart więcej niż tysiąc słów :-)

    Pisałeś, że chcesz skonfigurować przerwanie PCINT4. Uważam, że powinno to wyglądać tak:

    
    Pcmsk0 = &B0001_0000    'odblokuj PCINT4
    On Pcint0 Test    'przerwanie ==> skocz do procedury test
    Enable Pcint0   'włącz przerwanie od PCINT0...PCINT7
    Enable Interrupts
    


    Okazało się, że powyższy kod działa dla procesora MEGA88, ale dla MEGA2560 już nie. Przejrzałem stosowne pliki .dat, i znalazłem, że zmieniono tam nazwy rejestrów (czemu?).

    W każdym razie, proszę spróbować tak:

    
    Pcmsk0 = &B0001_0000    'odblokuj PCINT4
    On Pci0 Test    'przerwanie ==> skocz do procedury test
    Enable Pci0   'włącz przerwanie od PCINT0...PCINT7
    Enable Interrupts
    


    Oczywiście, zgodnie z nazwą "pin change interrupt" możemy tylko wykryć zmianę stanu pinu - a nie wybrane zbocze, czy poziom. Zatem po wykryciu przerwania, sugeruję sprawdzić czy wybrana linia ma właściwy stan logiczny.
REKLAMA