Programmera 8048 med JAL
-
- Inlägg: 34
- Blev medlem: 6 maj 2008, 11:25:52
- Ort: Strömstad
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...
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...
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.
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.
-
- Inlägg: 34
- Blev medlem: 6 maj 2008, 11:25:52
- Ort: Strömstad
Är detta rätt tänkt?
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...
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
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.
Härstår lite om kontaktstudsar och n-key rollover.
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.
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.