Sida 1 av 2
Dubbelfunktion
Postat: 18 oktober 2003, 23:04:37
av Chrille
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
Postat: 18 oktober 2003, 23:19:05
av Raceman
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
Postat: 18 oktober 2003, 23:41:08
av Raceman
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
Postat: 18 oktober 2003, 23:43:12
av Chrille
Ja det måste vara en knapp.
Sitter precis och knappar lite på min Icom scanner och där är ju denna funktion på knapparna. Där är det ca. 1 sekunds fördröjning men den slipper man vänta på om man gör en snabbtryckning.
Postat: 18 oktober 2003, 23:51:48
av rickeboy
In general, it is easier to simply read the state of the pin in an IF..THEN than to use the BUTTON command
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...
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
Postat: 19 oktober 2003, 02:45:23
av Chrille
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.
Postat: 19 oktober 2003, 12:34:59
av AsmN
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!

Postat: 19 oktober 2003, 17:24:51
av $tiff
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?).
Postat: 19 oktober 2003, 19:46:50
av rickeboy
$tiff>> Du skulle inte vilja ge ett exempel på hur man skulle kunna göra det? Dvs mäta hur länge ingången varit hög. Har för mig att T0CKI(RA4) på 16F84an ska kunna räkna sådana grejor... I vilket fall som helst kanske du kan bistå med lite hjälp (läs: KOD)?
//Rille
Postat: 19 oktober 2003, 22:43:12
av EagleSpirit
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.
Postat: 20 oktober 2003, 15:34:55
av Chrille
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?
Postat: 20 oktober 2003, 15:50:39
av AsmN
rakna VAR BYTE
betyder det att rakna är en byte? En byte är ju max 255 (8 bitar) så det betyder att rakna aldrig kommer upp till 300 utan hoppar tillbaka till 0 efter 255.
Endera måste du ändra pausvärdet eller sätta rakna till word (= 2byte) eller vad de nu kan heta i basic...
Postat: 20 oktober 2003, 16:18:42
av Chrille
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.
Postat: 20 oktober 2003, 16:28:56
av rickeboy
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
Postat: 20 oktober 2003, 16:45:14
av AsmN
Det står ju: "Alternatively, if the pin is already an output,"
Ingenstans i koden finns det nåt som intialiserar den till output (enda skulle vara ifall de är default)...
Tror att du behöver nåt liknande som: "Input PORTA.0" men kanske med Output istället...
