Sida 1 av 1

pic16f84a - Behöver något exempel [en till fråga]

Postat: 30 maj 2004, 11:50:08
av Selpix
OK nu har jag lärt mig att använda picen för att blinka lite med lysdioder och sånt. :)

Men jag kom att tänka på, hur gör jag om jag tex vill koppla in en knapp till picen och när den sluts så ska en lysdiod tändas i 5 sek och sen slockna?

Och om jag vill göra tvärtom dvs om en anslutning till picen bryts så ska en led tändas i 5sek?
:roll:


Edit: Ny fråga längst ner

Postat: 30 maj 2004, 11:54:46
av Xyzzy
Vilket språk använder du? (asambler, picbasic, C/C++...?

Postat: 30 maj 2004, 12:00:08
av Selpix
Aa det kan vara bra att nämna också :D

Jag använder picbasic

Postat: 30 maj 2004, 12:05:59
av $tiff
Principen är sådan att du alltid har en programloop som ska loopa så ofta som möjligt. I loopen lägger du en if-sats som kollar vilket läge I/O-pinnen knappen är kopplad till står i. Via if-satsen hoppar du sedan till en rutin som utför det du önskar. När den utfört det du önskar hoppar den tillbaks till den eviga loopen...

Glasklart? :D

Kod: Markera allt

       +--[10k]------[5V]
       |
[I/O]--+--[knapp]----[GND]
Så bör du koppla in knappen. När den trycks ner ska den leda jorden till PICens önskade I/O-pinne. När den inte trycks ned ska den dras hög av ett motstånd på några kOhm (ta vad du har så länge det är kOhm :wink: ).

Edit:
Ahh, PICBasic!
kodexempel!

Kod: Markera allt

knapp var portb.0
input knapp

main_loop:

if knapp = 0 then knapp_tryckt

'Fyll ut med annat här vid behov

goto main_loop


knapp_tryckt:

'Hitta på något att göra när knappen trycks ner

goto main_loop

end
Så är det bara att fylla ut...
portb.0 kan naturligtvis bytas mot vilken pinne du vill!

Postat: 30 maj 2004, 12:14:06
av Selpix
Aha ok, jag tror jag fattar vad du menar :)

Men hur ser koden ut för att kolla vilket läge som pinnen är i ?

Är det typ:

Kod: Markera allt

check:

If portb.0 = 1 then
goto blabla..
else 
goto check
end if

EDIT: Okej jag var inte helt borta iaf :D

Ny fråga!

Postat: 3 juni 2004, 13:47:21
av Selpix
Okej här kommer jag med en ny fråga:

Är det möjligt att köra 2st labels samtidigt?

Alltså vi säger att jag vill ha en "timer" som blinkar en led i en viss takt och sen vill jag ha en annan som blinkar en annan led i en helt annan takt. De ska alltså inte bero av varandra.

Går det , eller kan man lösa på något annat sätt?


"ps, ni som använt vb så är det samma funktion som de timers man använder där som jag är ute efter" :)

Postat: 3 juni 2004, 14:57:40
av Pjoms
Det är inte helt enkelt att göra flera saker samtidigt med en PIC, men det går.

Det finns timers man kan använda. Dom funderar så att dom räknar upp ett steg för varje programsteg som körs (eller varannat, var fjärde eller något av de andra fasta valmöjligheter som finns).

Dom är dock inte helt busenkla att använda, så kan man undvika dom så gör man gärna det...

Postat: 3 juni 2004, 15:34:59
av Selpix
Hm okej.

Men det måste ju finnas andra som stött på samma problem, eller de kanske har löst det på det svåra sättet då?

Hur som hellst tack för hjälpen :)

Postat: 3 juni 2004, 15:35:58
av toxic
Nja. Det blir inte så farligt svårt. Det är bara att använda en timer, och i program-loopen kolla hur lång tid sedan det var varje diod släcktes eller tändes(med hjälp av timern). När en viss tid har utlöpt, tänds eller släcks dioden.

Postat: 3 juni 2004, 15:38:21
av zus
Om du inte vill använda timers och interrupt (vilket du egentligen borde) kan du ju ha olika räknare som du räknar upp olika fort och tänder/släcker dioderna då räknarvariabeln slår över/blir full....blir egentligen samma sak som timers och interrupt men ineffektivare och krångligare....

Postat: 3 juni 2004, 15:40:05
av Selpix
Okej :)

Finns det några bra kodexempel på det som man kan studera lite?

Om timers/interrupts alltså

Postat: 3 juni 2004, 20:10:32
av $tiff
Interrupt gör du inte gärna i PICBasic. Då måste nästan använda assembler för att det ska bli bra. Såå, bara att börja läsa asm. Det står hur timers fungerar i databladen för respektive mikrokontroller.

Postat: 3 juni 2004, 21:23:35
av Selpix
Hehe ok, då är det bara att börja lära sig assembler då :D