Hej.
Har precis kommit igång med GPIO på Raspberry - har kopplat in sju brytare till GPIO och försökt "vara duktig" genom att använda både extern pullup och skyddsmotstånd (ifall man "råkar" sätta en ingång till att vara utgång).
Ingångarna dras normalt upp till 3.3 volt via separata 10 kohm:s motstånd och kan "dras ned" via diverse brytare som jag lagt i serie med ett 1 khom:s motstånd (ett per kanal). Spänningsnivåerna på GPIO pinnarna borde vara c:a 0.3 volt vid sluten brytare och c:a 3 volt vid öppen brytare, dvs väl inom normerna för säker detektering av 0 respektive 1.
Tester med pollande läsning fungerar perfekt!
So far so good...
Men då jag vill slippa polla och använda effektivare interrupt så har jag gjort ett python-script som gör följande (har uteslutit alla databasanrop, trådlåsningar, spårutskrifter, etc i pseudokoden nedan):
1. Definiera alla pinnar som ingångar (utan intern pullup)
2. Läs & lagra befintligt tillstånd på alla pinnar
3. Sätt upp interruptrutin för callbacks
4. Vänta på callbacks för evigt.
Problemen är följande:
a) Jag får ofta flera callbacks med samma värde utan mellanliggande invertering, dvs "0" och sen "0" igen utan en etta "1" imellan.
b) Någon gång då o då får jag ett annnat värde när jag som första rad i callbacken "läser om" för att vara riktigt riktigt säker på att jag fått rätt värde i callbacken.
c) Ibland får jag inget callback alls (o ligger kvar på gammalt värde)
Exempel på problem c):
2014-09-26 19:40:33.690594 PollRead(): Verify failed for Pin #15 (Brevlådeinkast) last known state: 1 new state: 0
2014-09-26 20:02:34.660755 PollRead(): Verify failed for Pin #15 (Brevlådeinkast) last known state: 1 new state: 0
För att motverka problemen har jag:
a) Adderat kod att lagra föregående värde och inte reagera om samma värde läses igen
b) Aktiverat debounce (200 ms)
c) Adderat kod som på en minuts intervall läser alla pinnarna s.k. poll
d) Testat att köra med både intern o extern pullup
e) Adderat "lock" för att undvika att i interrupt för pinne x avbrytas av interrupt från pinne y (vilket hände titt som tätt innan jag började låsa).
Här är skriptet i sin helhet (har tyvärr "förfallit" till globala variabler troligen till min gamla programmeringslärare Susannas stora besvikelse)
Har läst lite på forum o insett att fler råkat ut för problem a men inte hittat något riktig lösning...
Finns det någon som råkat ut för liknande problem o har något tips att ge?
/f