Programare

Marius '95

Membru Senior
Sugar daddy
Joined
Nov 13, 2005
Location
Brăila
Am gasit problema. Stupiditatea stupiditatilor posibile! :capu:

Keypad-ul are butoanele conectate intre pinul liniei si pinul coloanei. Am conectat coloanele la pinii cu external interrupt si liniile la niste GPIO ca sursa de curent.
Am o functie care determina care dintre butoane este apasat: intrerupe curentul pe linii, apoi activeaza liniile una cate una si se uita care pin de coloana devine activ. Dar ca sa functioneze, intreruperile externe trebuie dezactivate, pinii lor trebuie comutati pe GPIO-input, scanati, apoi pusi la loc pe functia de intreruperi externe, si in final activate la loc intreruperile externe.
Ca sa nu am erori la apasarea butonului (sa fie numarat de mai multe ori la o singura apasare), am setat un interval minim de 100ms intre eliberarea butonului si o noua apasare, altfel noua apasare "nu se pune".
Intreruperea timer-ului are doua roluri: sa "cante" la beep si sa monitorizeze butoanele apasate. Problema e urmatoarea: ca sa determine daca butonul inca este apasat, trebuie rulata functia aia care determina ce buton e apasat. Acea functie presupune dezactivarea si la final reactivarea intreruperilor. Iar cand intreruperile sunt reactivate... ghici! Se declanseaza din nou. Scurtand intreruperea timer-ului, intreruperea externa (relativ lunga si complexa, ca presupune iarasi scanarea butoanelor) se suprapune acum fix peste urmatoarea intrerupere a timer-ului. => intrerupere ratata => beep la jumatate din frecventa normala.
 

Marius '95

Membru Senior
Sugar daddy
Joined
Nov 13, 2005
Location
Brăila
E din cauza de bug. Dupa functia care gaseste butonul, activez intai intreruperea si apoi curentul pe liniile keypad-ului. Daca butonul e inca apasat (si este, ca nu-s ciocanitoare) => rising edge => intrerupere. Zbang!
Am rezolvat. In timp ce rezolvam am constatat inca un bug: o intrerupere scurta a apasarii unui buton, gen contact imperfect in mijlocul apasarii, face ca butonul sa nu mai fie monitorizat si timer-ul pentru buton ridicat sa masoare de la acea scurta intrerupere pana la urmatoarea apasare. Din cauza asta trebuie acum sa rescriu ambele intreruperi.

Bah, da' ce greu e sa n-ai bug-uri! :fluier:
 

miahi

Wizzard
Sugar daddy
Joined
Aug 1, 2004
Location
Unreal Estate, Ankh-Morpork, Discworld
Poți să blochezi procesoare cu așa ceva (să nu mai poată procesa altceva pentru că stă tot timpul în tratare de întreruperi), de-aia unul din primele lucruri care trebuie învățate când începi să folosești întreruperi e să ai grijă să nu triggerezi întreruperi din rutina de tratare întreruperi :smile:. Întotdeauna enable-ul de întrerupere se face fix înainte să ieși din tratare.
 
Top Bottom