Labbar med knapp och diod.
Problemet är att dioden lyser när programmet startar och slocknar när jag trycker på knappen.
Jag vill att det ska vara tvärtom. (tända dioden med knappen)
Hur får jag ordning på det?
Vad är det för mikrokontroller?
Hur är saker kopplade?
Men det enkla svaret utan mer info är ju helt enkelt ändra till
if( !(GPIO_PORTF_DATA_R & (0x01)) )
För övrigt, att i varje varv i loopen släcka lysdioden är ju inge bra om du inte vill att den ska blinka (eller bara lysa på halvfart om loopen går fort som i detta fall).
Har du en krets på knappen som gör debouncing?
Om inte, så behöver du ha det i programvaran. Sampla data kontinuerligt och när den är stabil efter ett visst antal millisekunder (se brytarens datablad!) så kan du vara säker på att den är tryckt eller inte tryckt.
* Just som Findecanor skriver har mekaniska brytare en tid där de bouncer (studsar). Metall slår alltså mot metall och det hoppar några gångar innan det är stabil kontakt. Detta kan avkopplas med kondensatorer eller vid att ha fler avläsningar med en viss tid mellan, när 2 eller fler på varandra följande lika finns är det ett stabilt signal.
Jag brukar sampla med 20-30Hz (timer interrupt) och spara sista mätningen. Är den lika med "denna" mätning är det OK.
* I detta fall kollar du NIVÅN varför debounce (avstudsning) är av mindre betydelse - men i framtiden KOMMER det att få stor betydelse så lär dig det gärna nu, det blir VÄLDIGT bra att veta till senare. Men din kod-loop startar ju med att slå av utgången, kolla om knappen är i ett visst läge och är den det slår du på utgången - för att sedan börja om direkt med att slå av den.
Kollade på schema nu.
fwitcharna är kopplade direkt till jord (via motstånd).
Det måste väl vara därför det sket sig med den här raden?: if(GPIO_PORTF_DATA_R & (0x01))
(att ledden ska tändas när 0x01 är nollad istället för hög)
tankevurpa med nollningen I while loopen. Tack för hjälpen.
debouncing hade jag faktiskt lite koll på vad det var innan men jag är på sån Basic nivå nu så jag lattjar utan nu tills jag får något att funka över huvud taget.
Sen ska jag fixa allt sånt så saker blir att funka säkert och ordentligt.
Ja, har du aktiv nollning med knappen är (GPIO_PORTF_DATA_R & (0x01)) ju sann när du släpper och falsk när du aktiverar knappen.
Men !(GPIO_PORTF_DATA_R & (0x01)) gör exakt motsatsen.
Jag brukar definiera lite istället:
#define Button_1 (GPIO_PORTF_DATA_R & (0x01))
Men detta betyder att Button_1 är positivt aktiverat.
Men då den ju är "negativt" aktiverat ville jag istället skriva:
#define Button_1 (!(GPIO_PORTF_DATA_R & (0x01)))
Då är den definierat till NOT.
Enda skillnaden är det lilla NOT-tecken i början ('!').
I programmet ville jag sedan skriva:
if(Button_1) ... bla bla bla.
Det vill då reagerar när man trycker på knappen, oavsett vilken typ aktivering som sker då det väljs i definitionen vilket nivå som är det aktiva. Programmet blir även mycket mer läsbart på det vis, man namnger input tydligt och klart och det blir enkel match att följa vad som händer.
Bygger man om så att aktiveringsnivån växlas letar man upp definitionen och ändrar där, sedan följer ALLA andra ställen man använder definitionen med, även om de kollar om den INTE är aktiverat. (if(!Button_1) ...)
Fy fasen va bra och pedagogiskt förklarat!
Det rensade upp frågetecken i huvudet och hjälpte mig även att få lite bättre struktur i allt. (min absolut svagaste sida).