Sida 2 av 2

Re: Bra sleepmode kod till UNO?

Postat: 21 maj 2018, 22:55:19
av arvidb
Pin change interrupt verkar ju nästan lämpligare att använda till en kvadraturavkodning eftersom man då kan använda ett och samma interrupt till båda ingångarna? D.v.s. man får ett sådant interrupt om någon ändring har skett på någon av de ingångar som man "bevakar". Sen är det bara att läsa av statusen på ingångarna och hantera ändringen.

Arduino Pin Change Interrupts.

Re: Bra sleepmode kod till UNO?

Postat: 22 maj 2018, 01:32:49
av Findecanor
Man väljer ett viloläge som inte stänger av det som orsakar det interrupt man väntar på, så att AVR:en går ur viloläge när ett interrupt händer.
Sen har man en mainloop i user-mode som sätter µC:n i viloläge i varje varv. Det kommer att väckas upp ur viloläge varje gång en interrupt-handler har körts och därmed kunna sätta sig själv i viloläge igen.

Om det viloläge du väljer är SLEEP_MODE_IDLE (det minst djupa viloläget) så borde det inte finnas någon vits med någon fördröjning innan man går i viloläge för det borde inte kosta något att ta sig ur.
Annars skulle du kunna ha ett timer-interrupt och en global booleansk flagg-variabel. Varje gång en normal interruptthandler körs så resettar den timern för att förlänga tiden tills timerinterruptet triggas. Timer-interrupt:ets handler sätter flagg-variabeln till true.
Eftersom timer-interrupthandlern ju startas av ett interrupt så kommer mainloopen att återuppväckas efterråt.
Mainloopen kollar flaggan. Om flaggan är true så stänger den av timer-interruptet, sätter flaggan till false och sover i ett djupare läge, annars sover den i SLEEP_MODE_IDLE. Sen måste koden förstås sätta på timer-interruptet igen om den går ur ett djupare läge.