Programmera 8048 med JAL

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
kebabpizza
Inlägg: 34
Blev medlem: 6 maj 2008, 11:25:52
Ort: Strömstad

Inlägg 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...
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Inlägg 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.
kebabpizza
Inlägg: 34
Blev medlem: 6 maj 2008, 11:25:52
Ort: Strömstad

Inlägg 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...
BMI
Gått bort
Inlägg: 496
Blev medlem: 31 juli 2006, 22:29:08
Ort: Halmstad

Inlägg av BMI »

Lite kontaktavstudsning "50ms"kanske skulle kunna hjälpa till här i ditt fall.
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

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

Inlägg 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.
Användarvisningsbild
tompa74
EF Sponsor
Inlägg: 2502
Blev medlem: 29 oktober 2007, 15:25:17
Ort: Kristinehamn

Inlägg av tompa74 »

Tjaa.. en konding brukar ju avhjlälpa studs oxå..

/ Tompa
sodjan
EF Sponsor
Inlägg: 43243
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

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