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

[attiny2313] [bascom] Przyciski int0 i int1

graffiti333 29 Mar 2009 21:02 4165 7
REKLAMA
  • #1 6350519
    graffiti333
    Poziom 10  
    Witam

    Podlaczylem dwa microswiche do Int0 i int1 i masy i probuje taki programik na zwiekasznie i zmniejszanie zmiennej, lecz procesor nie reaguje na przyciski, dlaczego?

    
    $regfile = "2313def.dat"
    $crystal = 8000000
    
    Dim Z As Byte
    
    Config Int1 = Low Level
    Config Int0 = Low Level
    Config Lcd = 16 * 1a ' konfiguacja wyświetlacza Lcd
    Enable Interrupts
    On Int1 Zmniejsz                                     
    On Int0 Zwieksz    
    Enable Int1
    Enable Int0
    
    Z = 1
    Do
    Locate 1 , 1
    Lcd "ZM:" ; Z
    Loop
    
    Zmniejsz:                                                 
    Disable Interrupts
    Decr Z
    Waitms 50                                
    Enable Interrupts
    Return
                                                          
    Zwieksz:                                                   
    Disable Interrupts
    Incr Z
    Waitms 50
    Enable Interrupts
    Return
    
    
  • REKLAMA
  • #2 6350545
    crazy_phisic
    VIP Zasłużony dla elektroda
    A masz pewność że na tych pinach jest stan wysoki? ;)
    Podciągnij za pomocą rezystorów (zewnętrznych lub wewnętrznych) pony do Vcc.
  • REKLAMA
  • REKLAMA
  • #4 6350798
    mirekk36
    Poziom 42  
    Po pierwsze musisz ustawić piny INT0 oraz INT1 jako wejscia (nie masz tego zrobionego) a samo aktywowanie przerwań nie ustawi tych pinów jako wejść

    czyli
    PIND.2 = Input
    PIND.3 = Input


    druga sprawa - po co włączasz aktywowanie przerwań poziomem niskim (Low level) ??? - wystarczy w zupełności. w takim przypadku, jeśli wyzwalanie przerwań będzie robione zboczem opadającym czyli:

    Config Int1 = Falling
    Config Int0 = Falling


    po trzecie, można nawet obyć się w takim przypadku bez żadnych rezystorów podciągających - wystarczy załączyć wewnętrzne PULL'upy (czyli podciągnięcie wewn rezystorem do VCC) tak:

    SET PORTD.2
    SET PORTD.3


    po czwarte po co w procedurach obsługi przerwań stosujesz globalne włączanie i wyłączanie przerwań Disable i Enable Interrupts ???? (wywal te linijki, one są nie potrzebne bo i tak robione jest to automatycznie)

    po piąte - trzeba by jeszcze zrobić w procedurach przerwań jakąś procedurkę na obsługę drgań styków - ale i bez niej już powinno zacząć ci to wszystko działać. Z drugiej strony robienie w przerwaniach procedury do redukcji drgań styków mogłoby się wiązać dla mniej doświadczonego programisty z wstawieniem tam jakichś małych typowych procedurek opóźniająych - a tego lepiej unikać jak ognia. Więc lepiej by było gdybyś tylko w procedurze obsługi przerwań ustawiał sobie jakieś flagi odnośnie danego klawisza na 1 a już w pętli głównej obsługiwał najspokojniej w świecie te klawisze (kasując po obsłudze odpowiednią flagę) Zresztą można to zrobić jeszcze na milion innych sposobów.

    wader_669 -> a skąd u ciebie takie zdanie o problemach bascoma z przerwaniami ???? moim zdaniem to bardziej te problemy leżą po stronie programisty niż bascoma i to na 99,9% . Ja w bascomie przerwania używałem już na milion różnych sposobów i nigdy mi bascom nie robił żadnych niespodzianek, dlatego nie zgadzam się z takimi stwierdzeniami.

    pozdrawiam
  • REKLAMA
  • #6 6351814
    Konto nie istnieje
    Poziom 1  
  • #7 6351898
    mirekk36
    Poziom 42  
    Witam,

    oczywiście, że literówkę popełniłem jeśli chodzi o piny przerwań INTo oraz INT1 dla tego procka , i że są to piny:

    PORTD.2 - INT0
    PORTD.3 - INT1

    tak więc w powyższych moich przykładach należy tylko to poprawić. Co już zrobiłem w swoim poprzednim poście. (sorki)
  • #8 6351920
    piotr5000
    Poziom 21  
    Przy "zabawie" z przerwaniami trzeba pamiętać , by czas obsługi przerwania był krótszy od czasu pomiędzy przerwaniami. Czyli jeżeli ktoś chce w przerwaniu obsługiwać przeliczenie zmiennej zmiennoprzecinkowej , wyświetlacz itp a następne przerwanie przyjdzie np po 100 mikrosek to niech się nie dziwi , że program "wisi".
    Problem z BASCOM'em jaki miałem to porównanie zmiennych
    A i B typu Long
    nie działało prawidłowo if A<B
    i musiałem zrobić C= A-B
    i dopiero if C<0
    Procesor AT90s8535 i Bascom 1.11.7.3 DEMO
REKLAMA