Dubbelfunktion
Dubbelfunktion
Skulle vilja ha en knapp som har två funktioner. Om man bara klickar till kort på knappen så utförs en sak om man där emot håller in knappen tre sekunder händer något annat.
Använder nu PicBasic Pro koden nedan till en 16f84 och det fungerar fint men problemet är att man måste vänta dom där tre sekunderna även om man bara klickar till snabbt på knappen.
Så jag undrar om någon har en bättre lösning så man slipper vänta tre sekunder även om man bara klickar till kort på knappen?
Input PORTA.0
loop:
IF PORTA.0 = 1 Then
Pause 3000
IF PORTA.0 = 1 Then
PORTB.0 = 1
EndIF
PORTB.7 = 1
EndIF
GoTo loop
End
Använder nu PicBasic Pro koden nedan till en 16f84 och det fungerar fint men problemet är att man måste vänta dom där tre sekunderna även om man bara klickar till snabbt på knappen.
Så jag undrar om någon har en bättre lösning så man slipper vänta tre sekunder även om man bara klickar till kort på knappen?
Input PORTA.0
loop:
IF PORTA.0 = 1 Then
Pause 3000
IF PORTA.0 = 1 Then
PORTB.0 = 1
EndIF
PORTB.7 = 1
EndIF
GoTo loop
End
Vill du ha så lång knapptryckning så lär du nog hålla in den så länge.
Eller minska tiden till 1sekund.
Ett snabbtyck kan ju vara mer eller mindre än 1millisekund.
Eller så trycker du 1gång för ena grejen och två för andra grejen.
Måste du ha en knapp då?
En vippströmställare som är återfjädrande åt båda hållen skulle väl vara bra.
Mvh tony
Eller minska tiden till 1sekund.
Ett snabbtyck kan ju vara mer eller mindre än 1millisekund.
Eller så trycker du 1gång för ena grejen och två för andra grejen.
Måste du ha en knapp då?
En vippströmställare som är återfjädrande åt båda hållen skulle väl vara bra.
Mvh tony
Kolla här så hittar du säkert något angående buttons som går att använda.
http://microengineeringlabs.com/resourc ... _4-5_6.htm
http://microengineeringlabs.com/resourc ... _4-5_6.htm
Taget från sidan Raceman tipsade om... jag har själv testat Button kommandot (dock med en BS2:a) och det är inte jätte smidigt att använda... kan inte mer än hålla med citatet ovan...In general, it is easier to simply read the state of the pin in an IF..THEN than to use the BUTTON command
Problemet som jag ser att är att du måste vänta 3 sekunder för att veta om knappen har varit nedtryckt så länge (eller om den åtminstone är det då) det du skulle kunna göra är att helt enkelt kolla den redan efter några ms för att se om det är en snabbtryckning...
Input PORTA.0
loop:
IF PORTA.0 = 1 Then
Pause 500
IF PORTA.0 = 1 Then
PAUSE 2500
IF PORTA.0 = 1 Then
PORTB.0 = 1
EndIF
PORTB.7 = 1
EndIF
GoTo loop
End
Eftersom jag la in en till IF sats måste du ha en till EndIF... orkar inte lista ut var den ska vara...
//Rille
Jo jag har läst om Button kommandot innan och såg då också att dom inte rekommenderade att använda det.
Det blir ju lite bättre i alla fall när man lägger in den där kollen efter en lite kortare tid. Jag får väl ha det så tills vidare.
Om någon kommer på en bättre lösning senare så blir jag glad om ni hör av er.
Tackar för hjälpen.
Det blir ju lite bättre i alla fall när man lägger in den där kollen efter en lite kortare tid. Jag får väl ha det så tills vidare.
Om någon kommer på en bättre lösning senare så blir jag glad om ni hör av er.
Tackar för hjälpen.
Jag har aldrig använt basic till pic, så jag vet inte om detta funkkar där...
Ifall det går att använda interrupts skulle det vara effektivast att ha en interrupt för change on portb (ifall det finns på 16F84??)...
Annars skulle jag göra så här (pseudokod):
CNT = 60
LOOP
IF PORTA.0 = 1
PAUSE 50
IF PORTA.0 = 1
GOTO STILLHI
ELSE
GOTO SET1
STILLHI
CNT--
IF CNT = 0
GOTO SET2
ELSE
GOTO LOOP
SET1
PORTB.7 = 1
GOTO CONTINUE
SET2
PORTB.0 = 1
GOTO CONTINUE
CONTINUE
....
Detta fungerar på så sätt att det är en loop som kollar ifall inputen ändrats varje 50ms... Ifall den ändrats före 3s så hoppar det till SET1 och ifall knappen varit intryck längre än 3s hoppar det till SET2. Vid behov kan man ändra värdet på PAUSE och CNT. Detta borde gå att göra i Basic på nåt enkelt sätt, om inte tycker jag du ska skippa Basic!
Ifall det går att använda interrupts skulle det vara effektivast att ha en interrupt för change on portb (ifall det finns på 16F84??)...
Annars skulle jag göra så här (pseudokod):
CNT = 60
LOOP
IF PORTA.0 = 1
PAUSE 50
IF PORTA.0 = 1
GOTO STILLHI
ELSE
GOTO SET1
STILLHI
CNT--
IF CNT = 0
GOTO SET2
ELSE
GOTO LOOP
SET1
PORTB.7 = 1
GOTO CONTINUE
SET2
PORTB.0 = 1
GOTO CONTINUE
CONTINUE
....
Detta fungerar på så sätt att det är en loop som kollar ifall inputen ändrats varje 50ms... Ifall den ändrats före 3s så hoppar det till SET1 och ifall knappen varit intryck längre än 3s hoppar det till SET2. Vid behov kan man ändra värdet på PAUSE och CNT. Detta borde gå att göra i Basic på nåt enkelt sätt, om inte tycker jag du ska skippa Basic!

Ett alternativ är att mäta hur lång tid knappen varit nedtryckt (d.v.s. hur länge ingången varit hög, om du har knappen som pull-high). Så fort du släpper knappen har PICen ett värde som den sedan kan jämföra med ditt önskade max-värde. Är det mindre än dina 3 önskade sekunder, gör den en sak, om inte, en annan.
För övrigt så är "button"-kommandot i PICBasic ingen höjdare, det är mycket bättre att skriva egna debounce (för det är ju därför man använder det?).
För övrigt så är "button"-kommandot i PICBasic ingen höjdare, det är mycket bättre att skriva egna debounce (för det är ju därför man använder det?).
- EagleSpirit
- Inlägg: 1288
- Blev medlem: 27 maj 2003, 23:15:48
- Ort: Västerås
- Kontakt:
AsmNs exempel funkar nog. I det här fallet är det ju lite enklare att använda ren assembler eftersom man då kollar typ var 10:e instruktion. Det blir bara nån µs. Man startar en loop som går i 3s. Varje gång den gör loopen så kollar man porten om den ändrats. Om den gjort det så hopper man till det ställe man vill.
Jag tackar så mycket för hjälpen.
Det blev jätte bra att göra en loop med en liten fördröjning i som sedan också ökar ett värde som jag kollar efter varje varv.
rakna VAR BYTE
rakna = 0
Input PORTA.0
loop:
rakna = 0
IF PORTA.0 = 1 Then
lokal_loop:
Pause 10
rakna = rakna + 1
IF rakna > 300 Then
GoTo lang
EndIF
IF PORTA.0 = 0 Then
GoTo kort
EndIF
GoTo lokal_loop
EndIF
GoTo loop
lang:
High 0
GoTo loop
kort:
High 7
GoTo loop
End
Dock så fungerar det inte riktigt bra än. Om jag håller in knappen och väntar och väntar så händer det aldrig något men så fort jag släpper upp knappen så hoppar den till kort:.
Verkar som om if satsen där den kollar om rakna variabeln har blivigt 300 inte fungerar som den ska man jag kan inte se något fel. Kanske någon annan hittar något som skulle kunna vara fel?
Det blev jätte bra att göra en loop med en liten fördröjning i som sedan också ökar ett värde som jag kollar efter varje varv.
rakna VAR BYTE
rakna = 0
Input PORTA.0
loop:
rakna = 0
IF PORTA.0 = 1 Then
lokal_loop:
Pause 10
rakna = rakna + 1
IF rakna > 300 Then
GoTo lang
EndIF
IF PORTA.0 = 0 Then
GoTo kort
EndIF
GoTo lokal_loop
EndIF
GoTo loop
lang:
High 0
GoTo loop
kort:
High 7
GoTo loop
End
Dock så fungerar det inte riktigt bra än. Om jag håller in knappen och väntar och väntar så händer det aldrig något men så fort jag släpper upp knappen så hoppar den till kort:.
Verkar som om if satsen där den kollar om rakna variabeln har blivigt 300 inte fungerar som den ska man jag kan inte se något fel. Kanske någon annan hittar något som skulle kunna vara fel?
Tackar! Nu fungerar det, ändrade till word istället för byte. 
Har dock en liten undran. Om jag vill få pinne B0 hög så skriver jag bara High 0 men borde man inte lika väl kunna skriva PORTB.0 = 1? Får dock inte det sista att fungera, gör i och för sig inget efter som det fungerar med High 0 men det skulle vara roligt och veta vad jag missat.

Har dock en liten undran. Om jag vill få pinne B0 hög så skriver jag bara High 0 men borde man inte lika väl kunna skriva PORTB.0 = 1? Får dock inte det sista att fungera, gör i och för sig inget efter som det fungerar med High 0 men det skulle vara roligt och veta vad jag missat.
Märkligt... det ska nämligen funka... kolla på sidan 82 i PicBasic manualen... (om du inte har den finns den här: http://www.devinc.sytes.net/~rikard/pdf/pbpm502a.pdf
//Rille
//Rille