Icecap skrev:Al: om du inte redan använder interrupts är det på mycket hög tid att du börjar.
Men i essens är det att starta en timer och ställa in den så att den - med känd intervall - ger en hårdvaruinterrupt. Detta trigger en körning av den ISR-rutin man skriver för den timer-interrupt och den tar hand om att kolla knappar osv.
Sedan får man ju komma på hur den ISR (Interrupt Service Routine) ska förmedla knapptryckningar till main-loop men det är en annan sak. Jag gör lite olika beroende av vad som behövs i det aktuella projektet men ibland gör jag en buffer på t.ex. 16 steg där jag lägger in knapptryckningarna som sedan avläsas i main-loop.
Jag har tagit beslutet att jag ska lära mig input,output,adc,pwm,uart,spi,i2c,timers och interupt igenom att sätta olika register på en stm32. Jag brukar göra det på söndagar. Men det går frammåt.

Så jag ska använda interupts.
Så om du skulle få visa lite C-kod hur en interupt fungerar igenom att sätta register. Hur skulle den se ut då? Mindre kod än vad jag skrev?
Findecanor skrev:I mitt tangentbords-firmware (för AVR) så har jag ett timer-interrupt som varje millisekund räknar upp en global variabel som agerar klocka. Huvudloopen väntar först på att klockan tickar upp ett steg: sen scannar och debounce:ar den varje kolumn i taget.
Genom att ha det som tar mest tid i huvudloopen (och inte i ett interrupt) så dels blockerar man inte andra interrupt, och dels så är det inte katastrof om det råkar ta mer än ett klock-steg.
Man bör vänta ett par mikrosekunder efter att man börjat strobe:a en kolumn innan man börjar läsa raderna, och jag använder den tiden för debouncing av föregående kolumn.
Raderna för varje kolumn läses in i en int: med en bit per tangentrad. En etta för "tryckt" och en nolla för "ej tryckt".
För varje kolumn finns en cirkulär buffer där de skrivs ner.
Debouncing går ut på loopa igenom de n senaste värdena i buffern och AND:a ihop dem resp. OR:a ihop dem
beroende på om man vill reagera på stigande eller fallande kant eller båda.
Min digital joystick-adapter använder samma mainloop och funkar på samma sätt, bara utan strobing.
Men om man bara har ett par knappar så kan man nog använda ett lågpassfilter, ja.
Sen ska det finnas en enkel krets för brytare med tre poler, har jag för mig.
Har du kod som du kan visa?

Inte för att jag ska förstå direkt eller kommer förstå. Jag är mest bara ute efter hur jobbet ser ut.