Sida 1 av 1
PIC16F690, externt interrupt vs interrupt on change
Postat: 23 januari 2012, 17:49:32
av MrIzoard
Hej igen!
Ja då var det dags för nästa fråga/fundering från min sida.
Jag har lite planer på att göra ett större projekt längre fram i tiden men jag har brutit ner en del av det till att innefattas av avbrottshantering och där det finns två knappar externt som skall trigga avbrottet.
Jag har idag löst problemet så som bifogad bild säger:
RA2 är ansluten med pull-down till jord (även via parallellkopplade motstånd och lysdioder (jag tog lysdioder för det var de enda dioder som jag hade att tillgå här hemma och de fyller funktionen här)).
RA4 är ansluten med pull-down till jord men vid knapptryckning på S1 så blir den hög samtidigt som RA2 (den externa interrupten) triggas, här hindrar den andra lysdioden (den som är kopplad från RA5 så att säga att strömmen går bakvägen till RA5).
RA5 är ansluten med pull-down till jord men vid knapptryckning på S2 så blir den hög samtidigt som RA2 (den externa interrupten) triggas, här hindrar den andra lysdioden (den som är kopplad från RA4 så att säga att strömmen går bakvägen till RA4).
Detta fungerar som tänkt (interruptet triggar på stigande flanken) och jag stegar de lysdioder som sitter på RC0-RC7 men är det en snygg/bra lösning?
Jag har ju sett att det finns "interrupt on change" att använda på PORTA och jag skulle ju kunna se till att knapparna fick varsin pinne, är det bättre?
Alla tankar och funderingar uppskattas, även åsikter på mitt schema

(första gången jag provar att rita schema på datorn men jag tror ni förstår).
M.v.h.
Ulf L.
Re: PIC16F690, externt interrupt vs interrupt on change
Postat: 23 januari 2012, 18:16:31
av sodjan
För att backa lite till kravspecen innan vi hoppar in mitt i med lösningen...
Du vill alltså att två knappar ska hanteras (läsas av) genom att de genererar
ett interrupt (av något slag). Och problemet är ju att det bara finns en INT pinne
(externt interrupt). Och därför "OR" kopplingen med de extra motstånden och dioderna?
Stämmer det ?
IOC ger väl ungefär samma funktion fast utan den extra I/O pinnen, ja
Sen så har Maxim färdiga lösningar för just detta i färdiga kretsar.
http://para.maxim-ic.com/en/search.mvp?fam=sw_deb&hs=1
http://www.maxim-ic.com/datasheet/index.mvp/id/1896
Och angående studsande switchar :
http://pdfserv.maxim-ic.com/en/an/AN287.pdf
"Switch Bounce and Other Dirty Little Secrets"...

Re: PIC16F690, externt interrupt vs interrupt on change
Postat: 23 januari 2012, 19:42:55
av MrIzoard
Ja det stämmer bra, jag har två knappar där det skall ske olika "saker" beroende på vilken knapp som jag har tryckt på så jag måste ha koll på vilken av knapparna.
Först började jag med en knapp och försökte få det externa avbrottet att fungera och det gick bra sedan tänkte jag att det borde gå att implementera det externa avbrottet med två knappar också, därav den lösning som jag har ritat upp (och kopplat och programmerat). Jag vet inte om den lösningen är bra eller inte men som sagt den fungerar.
När jag läser i databladet så verkar det som att IOC kan lösa det jag är ute efter också.
Det brukar ju finnas något som är bättre än den andra, därav min undran.
Intressant att du tog upp debouncingen för där kommer min nästa fundering

Är det bäst att lösa det programmeringsmässigt eller med externa kretsar?
De kretsarna du länkade till kostade ju inte många dollar.
Jag förstår att det inte går att svara på vad som är bäst bara sådär, men om det blir något av mitt stora projekt (jag vill inte nämna vad det är om det bara rinner ut i sanden.....) så kommer det att bli en historia som drivs av batteri och då vill man ju hålla nere förbrukarna även om det är på micro A nivån. Men det är nog några år innan det blir av
//Ulf L.
Re: PIC16F690, externt interrupt vs interrupt on change
Postat: 23 januari 2012, 19:57:10
av MrIzoard
Jag tänkte bara tillägga att jag är med på att med IOC så behöver jag ju inte använda 3 pinnar på PIC'en utan jag klarar mig med 2, jag slipper ju använad dioderna och ett par av resistorerna också.
Men ändå, är den ena lösningen mer rätt än den andra? eller man kanske inte kan säga vad som är rätt och fel utan det är upp till den som implementerar lösningen.....
//Ulf L.
Re: PIC16F690, externt interrupt vs interrupt on change
Postat: 23 januari 2012, 20:06:26
av MrIzoard
Om jag nu skall jaga förbrukare till det stora projektet så borde jag ju såklart inte använda det externa interruptet med dioder, det känns som där bränner jag bort onödig kapacitet på ingenting.
Jag kanske skall klura lite mer på den egna kammaren innan jag skriver
Men kommentera gärna ifall jag är ute och cyklar
//Ulf L.
Re: PIC16F690, externt interrupt vs interrupt on change
Postat: 23 januari 2012, 20:51:36
av Kaggen
Även om IOC vid första anblicken "verkar" smidigt för en sådan här uppgift så tror jag det blir en enklare algoritm att polla ingångarna med ett timerinterrupt var 5e ms eller liknande och uppdatera en räknare för varje "till" och nolla den vid "från". Har du räknat till t.ex 3-4 "till" så kan man anta att brytaren är "till" och sätta en flagga för den brytaren/knappen. Observera "till" kan vara en nolla på ingången eftersom det är vanligare att man jordar ingången när man trycker knappen. Du har då vid "från" Vcc (+5V t.ex) på ingången.
Frågan är hur du fixar kontaktstuts med IOC eftersom vid tillslag/frånslag så kommer du få ett interrupt för varje studs. Hur vet du då när brytaren verkligen är "till" eller om det är en studs vid frånslag? Jag tror att en sådan algoritm blir bökigare. Du kan ju aldrig veta när sista interruptet verkligen är ett "till" eller en studs. Om någon annan har en sådan mjukvarulösning så är jag intresserad att höra (utan externa komponenter då alltså).
Om man inte vill snåla på kretsar/komponenter och inte tänka på avancerade mjukvarulösningar kanske Sodjans förslag är bättre. Kanske till och med funkar med IOC som du tänkt från början (jag har inte kollat hur kretsarna funkar).
Edit: Tänk på att du måste ha ett motstånd mellan Vcc och brytaren i förstnämnda förslag, enligt :
http://www.rentron.com/images/butconfg.gif
Re: PIC16F690, externt interrupt vs interrupt on change
Postat: 23 januari 2012, 21:23:17
av sodjan
Jag tänkte på just detsamma som Kaggen när jag skrev första svaret, men det
föll bort under tiden. Som Kagen säger, man löser ofta detta via en timer,
avstudsningen blir också rellativt enkel att lösa på samma gång. INT och
IOC fungerar bättre där man lite mer "rena" digitala signaler och kanske
inte just tryckknapar.
Nästan alla applikationer har ändå någon sligs timer i botten för andra
rutiner så det brukar gå att komplettera med hantering av knapparna.
Re: PIC16F690, externt interrupt vs interrupt on change
Postat: 23 januari 2012, 21:35:19
av MrIzoard
OK.
Jag hänger med på hur ni menar.
Bra att ni förklarar när det är lämpligare att använda INT och IOC, det skall jag lägga på minnet.
Rörande att lägga ett pull-up motstånd så som du säger Kaggen så borde ju det öka min förbrukning (om man kommer till att driva projektet med batteri, men det går kanske att använda motstånd upp i Mega-området) kontra att köra pull-down men samtidigt har jag läst någonstans, som jag inte minns var, att det är precis som du säger som man brukar lösa det.
Vad är teorin bakom det?
//Ulf L.
Re: PIC16F690, externt interrupt vs interrupt on change
Postat: 23 januari 2012, 21:37:24
av sodjan
Pullup/pulldown ska inte påverka strömförbrukningen alls.
Men det är normalt/vanligare med pullup.
Re: PIC16F690, externt interrupt vs interrupt on change
Postat: 24 januari 2012, 00:22:49
av bos
MrIzoard skrev:Rörande att lägga ett pull-up motstånd så som du säger Kaggen så borde ju det öka min förbrukning (om man kommer till att driva projektet med batteri, men det går kanske att använda motstånd upp i Mega-området)
1. Givet rätt värde så förbrukar pull up/pull down försumbar energi. Duger bra till batteriapplikationer.
2. Du vill oftast inte ha ett pull-motstånd i storleksordningen megaohm. Läs varför här:
http://www.sparkfun.com/tutorials/218
Re: PIC16F690, externt interrupt vs interrupt on change
Postat: 24 januari 2012, 07:16:46
av MrIzoard
Bra artikel du tipsade om bos, tackar!
//Ulf L.
Re: PIC16F690, externt interrupt vs interrupt on change
Postat: 24 januari 2012, 09:53:29
av labmaster
Jag brukar alltid köra med händelsestyrd hantering av switchar via Interrupt. Kontaktstudsar tar jag hand om i mjukvara. Det är inte så knepigt, brukar använda en så kallad State Machine för uppgiften. Det blir smidigare algoritmer med en sådan och upprepade interrupt på grund av kontaktstudsarna är enkla att hantera med en sådan princip.
Fördelen med hädenlsestyrd IO är att man inte låser CPU:n till pollning av IO-enheter även om pollningen går snabbt och är enkel att implementera. Man behöver ju så att säga inte kontrollera något som inte händer.
Re: PIC16F690, externt interrupt vs interrupt on change
Postat: 24 januari 2012, 10:53:36
av SeniorLemuren
Hade inte hört uttrycket State Machine förut, (trots att jag jobbat som datakonsult i många år)

Googlade på uttrycket och hittade en
definition på detta.
In general, a state machine is any device that stores the status of something at a given time and can operate on input to change the status and/or cause an action or output to take place for any given change. A computer is basically a state machine and each machine instruction is input that changes one or more states and may cause other actions to take place. Each computer's data register stores a state......
Om man ska tro att definitionen är korrekt så skulle det alltså betyda att du förklarar att du använder en dator för att ta hand om kontaktstudsarna?

Re: PIC16F690, externt interrupt vs interrupt on change
Postat: 24 januari 2012, 10:56:58
av bos
Förr i tiden när jag inte kände till State Machine så var det en vänlig själ på PIClist som i samma veva publicerade ett dokument som förklarade hur SM fungerade.
http://www.xcprod.com/titan/state_machine_ebook.html