Sida 3 av 3

Postat: 20 maj 2008, 21:17:35
av kebabpizza
Jag skall spara en "bit", om knappen har tryckts på eller inte. Alltså använda switchen som en "toggle", alltså on/off. Hur skall jag åstadkomma detta?
Vill tända LED1 när jag trycker på SW1, och vill släcka den när jag trycker på SW1 igen.
Tänkte att jag behöver en bit som lagrar om knappen är på eller av, för om jag bara läser PORTA,SW1 så får jag ju bara fram om knappen är intryckt just nu...

Läste i PDF-en jag länkade till och kom fram till att General Purpose register finns i 20h - 6Fh...

Postat: 20 maj 2008, 21:28:41
av vfr
Kul och höra att du gjort framsteg!

General Purpuse Registers bli jättebra! Du har väl inget behov av att just denna bit skall sparas när strömmen stängs av, så då funkar det utmärkt. Det minnet avänds till alla "vanliga" variabler. Är det sedan en konstanttabell så gör som Icecap skrev och använd RETLW. Skall det däremot sparas när strömmen försvinner så använder man EEPROM.

Postat: 20 maj 2008, 22:42:04
av kebabpizza
Är detta rätt tänkt?

Kod: Markera allt

MENU		MOVFW	PORTB		; Read LEDs (PORTB) into W

		BTFSC	PORTA,SW1	; If SW1 is pressed
		CALL	TOGGLE_1

		BTFSS	PORTA,SW1
		BCF	LD1ON,0

		BTFSC	PORTA,SW2	; If SW1 is pressed
		CALL	TOGGLE_2

		BTFSS	PORTA,SW2
		BCF	LD2ON,0

		BTFSC	PORTA,SW3	; If SW1 is pressed
		CALL	TOGGLE_3

		BTFSS	PORTA,SW3
		BCF	LD3ON,0

		BTFSC	PORTA,SW4	; If SW1 is pressed
		CALL	TOGGLE_4

		BTFSS	PORTA,SW4
		BCF	LD4ON,0


		MOVWF	PORTB
		GOTO	MENU

TOGGLE_1	BTFSC	LD1ON,0		;
		RETURN	
		BSF	LD1ON,0
		XORLW	B'00000001'	; Toggle LED1
		RETURN

TOGGLE_2	BTFSC	LD2ON,0		;
		RETURN	
		BSF	LD2ON,0
		XORLW	B'00000010'	; Toggle LED2
		RETURN

TOGGLE_3	BTFSC	LD3ON,0		;
		RETURN	
		BSF	LD3ON,0
		XORLW	B'00000100'	; Toggle LED3
		RETURN

TOGGLE_4	BTFSC	LD4ON,0		;
		RETURN	
		BSF	LD4ON,0
		XORLW	B'00001000'	; Toggle LED4
		RETURN
Det verkar funka, men ibland tänds lampan när jag trycker ner knappen, och slocknar när jag släpper knappen. Kanske är glapp i knappen, eller fel i min kod...

Postat: 20 maj 2008, 23:19:08
av BMI
Lite kontaktavstudsning "50ms"kanske skulle kunna hjälpa till här i ditt fall.

Postat: 21 maj 2008, 11:20:25
av vfr
Sant! Problemet låter som kontaktstuds. När du detekterat en förändring på knappen så måste den vara i det läget en viss tid innan den får ändras igen. Alla knappar (mer eller mindre) ger kontaktstuds. Titta t.ex med ett oscilloskåp på hur signalen ser utvid knappen så förstår du.

Härstår lite om kontaktstudsar och n-key rollover.

Postat: 21 maj 2008, 11:45:11
av Icecap
Jag har sett många lösningar för att avstutsa men jag använder en enkel lösning:
När µC'n läser knapparna läsas de enbart 1 gg för varje gång de läsas och det är oftast en 10Hz timerinterrupt som tar hand om det, detta betyder att jag aldrig har någon debounce-funktion.

I detta fall vill jag föreslå att det omedelbart innan "GOTO MENU" placeras en paus på 20ms eller så, det vill få exakt samma funktion.

Och sedan en liten konstighet:
omedelbart före "GOTO MENU" finns det en "MOVWF PORTB" och då denna upprepas som första instruktion vid "MENU" är den ju ganska överflödig.

Postat: 21 maj 2008, 13:23:40
av tompa74
Tjaa.. en konding brukar ju avhjlälpa studs oxå..

/ Tompa

Postat: 21 maj 2008, 13:27:09
av sodjan
> Använder 16F627 alt. 16F628...

De är föråldrade. De aktuella heter 16F627A, 16F628A (eller 16F648A).

Eller ändå hellre någon av de moderna, t.ex 16F88, 16F886 eller
någon de andra i samma serie (d.v.s 16F8..).