Varför funkar inte denna simpla pushbutton program?

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
tokfan
Inlägg: 694
Blev medlem: 10 juni 2010, 14:05:13

Varför funkar inte denna simpla pushbutton program?

Inlägg av tokfan »

Tjena!

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?

Kod: Markera allt

int main()
{
	
SYSCTL_RCGCGPIO_R 	= 0x20U;
	GPIO_PORTF_LOCK_R 	= 0x4C4F434B;	
	GPIO_PORTF_CR_R			= 0xFF;
	GPIO_PORTF_DIR_R 		= 0x0E;
	GPIO_PORTF_PUR_R    = 0x11;	
	GPIO_PORTF_DEN_R 		= 0x1F;			
	
	
		while(1){
		GPIO_PORTF_DATA_R &= ~(1<<1);
			
		if(GPIO_PORTF_DATA_R & (0x01))
		{
			GPIO_PORTF_DATA_R = (1<<1);
			
		
		}
		else
		{
			GPIO_PORTF_DATA_R  &= ~(1<<1);
		}
		
			
			
	}
		
}

Användarvisningsbild
Klas-Kenny
Inlägg: 11292
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Varför funkar inte denna simpla pushbutton program?

Inlägg av Klas-Kenny »

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).
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Varför funkar inte denna simpla pushbutton program?

Inlägg av Icecap »

Raden direkt efter if-satsen ("GPIO_PORTF_DATA_R &= ~(1<<1);") släcker ju LED'n hela tiden.

Om den är tänkt som uppstarts-nollning ska sen in innan main-loop.8
Findecanor
Inlägg: 982
Blev medlem: 2 juli 2010, 23:04:07

Re: Varför funkar inte denna simpla pushbutton program?

Inlägg av Findecanor »

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.
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Varför funkar inte denna simpla pushbutton program?

Inlägg av Icecap »

Det är lite delar i det hela.

* 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.
tokfan
Inlägg: 694
Blev medlem: 10 juni 2010, 14:05:13

Re: Varför funkar inte denna simpla pushbutton program?

Inlägg av tokfan »

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.
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Varför funkar inte denna simpla pushbutton program?

Inlägg av Icecap »

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) ...)
tokfan
Inlägg: 694
Blev medlem: 10 juni 2010, 14:05:13

Re: Varför funkar inte denna simpla pushbutton program?

Inlägg av tokfan »

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).
Skriv svar