Dubbelfunktion

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Chrille
Inlägg: 523
Blev medlem: 24 september 2003, 23:54:12
Ort: Torekov
Kontakt:

Dubbelfunktion

Inlägg 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
Användarvisningsbild
Raceman
Inlägg: 122
Blev medlem: 30 augusti 2003, 15:16:09

Inlägg 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
Användarvisningsbild
Raceman
Inlägg: 122
Blev medlem: 30 augusti 2003, 15:16:09

Inlägg 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
Chrille
Inlägg: 523
Blev medlem: 24 september 2003, 23:54:12
Ort: Torekov
Kontakt:

Inlägg 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.
Användarvisningsbild
rickeboy
Inlägg: 678
Blev medlem: 13 augusti 2003, 09:12:17
Ort: Göteborg / Karlskrona
Kontakt:

Inlägg 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
Chrille
Inlägg: 523
Blev medlem: 24 september 2003, 23:54:12
Ort: Torekov
Kontakt:

Inlägg 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.
AsmN
Inlägg: 76
Blev medlem: 10 juni 2003, 17:39:16
Ort: Pedersöre, Finland
Kontakt:

Inlägg 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! ;)
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg 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?).
Användarvisningsbild
rickeboy
Inlägg: 678
Blev medlem: 13 augusti 2003, 09:12:17
Ort: Göteborg / Karlskrona
Kontakt:

Inlägg 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
Användarvisningsbild
EagleSpirit
Inlägg: 1288
Blev medlem: 27 maj 2003, 23:15:48
Ort: Västerås
Kontakt:

Inlägg 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.
Chrille
Inlägg: 523
Blev medlem: 24 september 2003, 23:54:12
Ort: Torekov
Kontakt:

Inlägg 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?
AsmN
Inlägg: 76
Blev medlem: 10 juni 2003, 17:39:16
Ort: Pedersöre, Finland
Kontakt:

Inlägg 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...
Chrille
Inlägg: 523
Blev medlem: 24 september 2003, 23:54:12
Ort: Torekov
Kontakt:

Inlägg 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.
Användarvisningsbild
rickeboy
Inlägg: 678
Blev medlem: 13 augusti 2003, 09:12:17
Ort: Göteborg / Karlskrona
Kontakt:

Inlägg 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
AsmN
Inlägg: 76
Blev medlem: 10 juni 2003, 17:39:16
Ort: Pedersöre, Finland
Kontakt:

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