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