www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

16f877A
Pojdi na stran Prejšnja  1, 2, 3  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja PIC-a v Assembler-ju
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.56

PrispevekObjavljeno: Tor Feb 19, 2008 6:31 pm    Naslov sporočila:   Odgovori s citatom

Tvoj opis je ena huda zmeda (ali je pa tak kar program) Very Happy V prekinitvah preverjas stanja tipk in postavis ustrezne zastavice. Vse, kar je v zvezi z glavnim programom (odvizi na dogodke) pa potem preverjajo te zastavice in jih resetirajo, ko dogodek zaznajo oz. obdelajo, odvisno od tega kaksno delovanje zelis.
_________________
Ka ti bo pa torba ce si kupu kolo ?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
kavelj22
Član
Član



Pridružen-a: Tor 23 Jan 2007 23:56
Prispevkov: 465
Aktiv.: 2.08
Kraj: Ljubljana

PrispevekObjavljeno: Tor Feb 19, 2008 7:15 pm    Naslov sporočila:   Odgovori s citatom

Hvala za tistega smeskota, ampak tudi jaz ne razumem niti besede kar si hotel povedati. Tako pac je ko srecata eden ki ze zna in drug ki se uci.

Takole:

Citiram:
Main
btfss INTCON,TMR0IF
goto Main
bcf INTCON,TMR0IF

call Stop_Mode
call Start_Stop_motor

goto Main

Menu_setings

preverjanje tipk za menu

goto Menu_setings


Ok. V tej prekinitveni rutini oz. kakorkoli ze preverjam tipko za zaustavitev sistema in izvaja se vklop in izklop motorja. Ce je tipka pritisnjena se postavi zastavica ki jo preverjam tudi v Start_Stop_motor. Se pravi ce je postavljena se izvede izklop motorja in se klice Menu_setings. Se pravi z ustavitvijo sistema se postavimo na menu za nastavitev parametrov delovanja motorja. Ta procedura je napisana v zanko, samo za nastavitev parametrov. Ce hocemo ponovno zagnati program ga lahko samo z resetom.
Je to mozno???

Upam da je kaj bolj razumljivo Sad

LP

_________________
Živleje ni potica, življeje je črn kruh. Bul ga šparaš bul je suh. Zato pa kr na mizo žjim.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3641
Aktiv.: 16.00

PrispevekObjavljeno: Tor Feb 19, 2008 9:18 pm    Naslov sporočila:   Odgovori s citatom

Problem je s skladom, zaradi napačne rabe goto, call in return ukazov.
Primer napake:

Delaj
...
call Cyc (ob izpolnjenem pogoju kličeš Cyc)
...
goto Delaj

Cyc
...
goto Go_back
goto Cyc (izbereš med Cyc in Go_back)

Go_back
...
goto Delaj

Manjka VSAJ en return. Ostale kode nisem gledal, ampak program se povsem zacikla.
Delalo bi tole, vendar upoštevaj, da se z return vrneš na naslednji ukaz, takoj za call Cyc:

Delaj
...
call Cyc (ob izpolnjenem pogoju kličeš Cyc)
btfsc Temp_key,Key_F_on
...
goto Delaj

Cyc
...
goto Go_back
goto Cyc (izbereš med Cyc in Go_back)

Go_back
...
return

Nisem gledal naprej, a verjetno se ti na podoben način zaplete še pri call F _on ...

Tudi
movlw Tabela
movwf PCLATH ni najboljše zaporedje ukazov, saj vrednost Tabela ni definirana. Zgolj po naključju je enaka 0.
LP,
Igor

DODANO: Sem bolje pogledal. "return" na koncu Go_back ti bo rešil marsikaj ... kar je okrog call return narobe pri btfsc skeniranju tipk. A pazi - če boš pritisnil več tipk hkrati , bodo izpolnjeni vsi podprogrami, ki jih kličeš za btfsc Temp_key,...

Vsak call MORA imeti nekje return, s katerim skočiš na naslednji ukaz za tistim, s katerim si klical podprogram.

DODANO2: Napaka se ponovi tudi v zaporedju Delaj1 ... Go_back1
Go_back1
...
return ; tole dodaj

In še glavna težava:
call Mode_menu; napaka je v obeh v obeh Delaj zankah

Mode_menu
...
goto Prelubrification
goto Lubrication

Tu se povsem zaciklaš z goto, call, goto, call,... brez return-ov.
Zadevo rešiš z
goto Mode_menu ; v obeh Delaj in Delaj1 zankah

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3641
Aktiv.: 16.00

PrispevekObjavljeno: Tor Feb 19, 2008 11:20 pm    Naslov sporočila:   Odgovori s citatom

Eh, preveč zmede je s temi goto, call, return. Nariši si okrog in okrog na list papirja oblačke z imeni podprogramov.
Nato jih poveži med seboj z barvnimi puščicami. Modra ga goto, rdeča za call, zelena za return.
Ob sedanjem stanju je cela zmeda.
Legenda: kličeš = call, greš=goto, vrneš=return

Sem našel še napačno zaporedje:
Main
... call Stop_mode ; kličeš Stop_mode
goto Main

Stop_mode
... call Mode ; kličeš Mode
return ; do tega returna se nikoli ne vrneš, ker v Mode kličeš Mode_menu, odkoder greš v Lubrification/Prelubrification in naprej greš v Delaj/Delaj1.
Posledično se nikoli več ne vrneš v Main.

Rešitev:
Če upoštevaš, kar sem napisal v prejšnjem sporočilu (return na koncu Go-back in Goback1 ter goto Mode_menu v obeh Delaj in Delaj1), je potrebno še ustrezno predelati Delaj in Delaj1, da bo v njih ukaz return, s katerima se boš vrnil v Mode .
V Mode pa mora biti tudi return, da se boš vrnil v Spuscena1.
Od tam se že vračaš v Main, kjer čakaš na ukaz za novi Stop_Mode.

Zakaj imam občutek, da nikjer ne najdem prekinitvene procedure ??? Jo sploh uporabljaš?
Tudi org 0x005 ti nič ne pomaga, če pa imaš takoj za njim ukaz org 0x100. Daj tiste napise v tabelah, vključno z org 0x100, PRESTAVI povsem na konec programa - tik pred end.

Mode_menu
incf Mode_key_state,f ; Ne vem od kod ti xorwf za prištevanje. Tole je ekvivalent tvoji želji
btfsc Mode_key_state,0
goto Pre
goto Lub
LP,
Igor

p.s.: A to delaš za vijačni kompresor?

DODANO: Z gornjimi popravki boš ob pritisku tipke Temp_key,Key_Mode prišel v Mode_menu, tam pa izbral med goto Pre/Lub. Ta del ti bo torej povsem pravilno deloval.
Sedaj samo še razmisli, pod katerimi pogoji se bi rad iz Delaj in Delaj1 vrnil v Mode. To sta edini mesti, od koder se lahko vrneš v Mode, sicer je potrebna popolna prenovitev call/goto klicev/skokov. Zgoraj omenjaš, da bi rad samo z resetiranjem začel od začetka. Brez return-ov v Delaj, Delaj1 in Mode je to dejansko res edina možnost za vrnitev v Main.
Imaš Main, kličeš Stop_mode, kličeš Mode, kličeš Mode_menu, greš Pre/Lub in se vrtiš najdlje do Mode_menu.
Potrebno je paziti še na globino sklada, saj je Mode_menu že na tretji globini od osmih - vmes pa še kup klicev pavz, LCD rutin, EEprom rutin, ... . Vsak klic je skok v eno globino nižje, z vrnitvijo skočiš eno globino višje. Pri skokih z goto pa ostajaš na trenutni globini sklada.

Zato predlagam še združitev Main, Stop_mode in Mode v eno veliko zanko, od koder kličeš Mode_menu. Naprej pa že dela z gornjimi popravki.

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
kavelj22
Član
Član



Pridružen-a: Tor 23 Jan 2007 23:56
Prispevkov: 465
Aktiv.: 2.08
Kraj: Ljubljana

PrispevekObjavljeno: Sre Feb 20, 2008 4:03 pm    Naslov sporočila:   Odgovori s citatom

Igo najprej en velik hvala pa se nekrat hvala. Zdaj bom tole do dobra prestudiral in se lotil zadeve.

Ja drugace pa se trudim nardit krmilje za mazalni sistem za mazanje vreten od enega stroja v sluzbi. Crpalka dva tlacna stikala ter plovec za nivo olja. V bistvu je cisto samostojna enota, z strojem povezana samo z Enable signalom ki ga vklopi po preteku predmazanja. Po vklopu Enable signala ima samo krmilje stroja se dodatno zascito tako da lahko vretena vklopis sele po desetih minutah. Po vsaki napaki ali spremembi parametrov bi rad krozil samo v meniju za nastavljanje parametrov ( se pravi v Mode_menu), ker je po vsaki prekinitvi Enable signala tako ali tako potrebno zaceti cikelj od zacetka. Zato bi kar reset izvedel. Se pravi ce zelimo se kar spremenimo kaksne parametre in lepo reset in gremo od zacetka.

Mogoce sem si kar velik zalogaj zastavil za prvi projekt ampak se mi zdi da vseeno ni tako napacno.

Bomo videli mogoce kaj rata Smile

Hvala,LP

_________________
Živleje ni potica, življeje je črn kruh. Bul ga šparaš bul je suh. Zato pa kr na mizo žjim.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
kavelj22
Član
Član



Pridružen-a: Tor 23 Jan 2007 23:56
Prispevkov: 465
Aktiv.: 2.08
Kraj: Ljubljana

PrispevekObjavljeno: Pet Feb 22, 2008 7:46 pm    Naslov sporočila:   Odgovori s citatom

Citiram:
Mode_menu
incf Mode_key_state,f ; Ne vem od kod ti xorwf za prištevanje. Tole je ekvivalent tvoji želji
btfsc Mode_key_state,0
goto Pre
goto Lub


Tisti xorwf je bil misljen za preklaplanje bitov!


Citiram:
Tudi org 0x005 ti nič ne pomaga, če pa imaš takoj za njim ukaz org 0x100. Daj tiste napise v tabelah, vključno z org 0x100, PRESTAVI povsem na konec programa - tik pred end.

Upam da ne bom rekel prevec. Prestavil sem tole na konec ampak sedaj mi sploh ni jasno kaj v moji proceduri narediti da bo to ponovno delovalo Wink
Zmeraj ko pridem do addwf PCL,f me potem vrze na neko lokacijo sredi programa!

Hvala,LP

_________________
Živleje ni potica, življeje je črn kruh. Bul ga šparaš bul je suh. Zato pa kr na mizo žjim.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3641
Aktiv.: 16.00

PrispevekObjavljeno: Pet Feb 22, 2008 8:54 pm    Naslov sporočila:   Odgovori s citatom

kavelj22 je napisal/a:
Tisti xorwf je bil misljen za preklaplanje bitov!
Delovalo bo tudi z incf, saj se pri tem spremeni stanje bita,0 v Modekeystate. Pa še ena vrstica manj je.
Citiram:
Tudi org 0x005 ti nič ne pomaga, če pa imaš takoj za njim ukaz org 0x100. Daj tiste napise v tabelah, vključno z org 0x100, PRESTAVI povsem na konec programa - tik pred end.
------------------------
Upam da ne bom rekel prevec. Prestavil sem tole na konec ampak sedaj mi sploh ni jasno kaj v moji proceduri narediti da bo to ponovno delovalo Wink
Zmeraj ko pridem do addwf PCL,f me potem vrze na neko lokacijo sredi programa!
Hmmm,... potem pa tisto prestavi nazaj na prvotno mesto. Preveri stanje v PCLATH registru. Jaz nisem v Mplab-u preverjal delovanja, sem se samo v tisto goto, call, return poglobil.
Pri tabeli sta me zmotila samo ukaza
org 0x005
org 0x100 , ki sta eden za drugim. Ukaza povesta prevajalniku v .hex (Mplab-u) na kateri lokaciji naj začne pisati program v PIC-a. Prestavi Tabelo na začetek in izbriši org 0x100. Simulacijo opazuj v View-->Program Memory in se potem igraj z org 0x100. Ti bo vse jasno.

Original imaš k sreči tule na forumu. Upam, da po vsaki večji spremembi shraniš prejšnjo različico.
LP,
Igor

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
kavelj22
Član
Član



Pridružen-a: Tor 23 Jan 2007 23:56
Prispevkov: 465
Aktiv.: 2.08
Kraj: Ljubljana

PrispevekObjavljeno: Pet Feb 22, 2008 9:01 pm    Naslov sporočila:   Odgovori s citatom

Ze sam Build ni sel skozi ce sem dal tabele na konec. To bom ze porihtal.

Ja to sem pripel samo del programa za Menu. Doma imam celotnega kjer je se delovanje crpalke in tlacnih stikal ampak bi rad zdaj najprej tole porihtal. Drugace je pa nastalo ze kar nekaj razlicic.
Smile Nekaj stvari sem ze resil...pocasi bo!

Hvala,LP

_________________
Živleje ni potica, življeje je črn kruh. Bul ga šparaš bul je suh. Zato pa kr na mizo žjim.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
kavelj22
Član
Član



Pridružen-a: Tor 23 Jan 2007 23:56
Prispevkov: 465
Aktiv.: 2.08
Kraj: Ljubljana

PrispevekObjavljeno: Sob Feb 23, 2008 8:39 pm    Naslov sporočila:   Odgovori s citatom

Ok, resil sem call - return zadeve, imam pa drug problem. Sklad je 8 globinski meni pa se ugrezne za 9 in mi povozi prvo lokacijo sklada.
Ampak!!! jaz se na to lokacijo sploh ne vrnem vec-namenoma ker program restartam z reset-om. A bi to delovalo! Pac uporabljam potem globino od 3 do 9, ce me razumete!

Hvala,LP

_________________
Živleje ni potica, življeje je črn kruh. Bul ga šparaš bul je suh. Zato pa kr na mizo žjim.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3641
Aktiv.: 16.00

PrispevekObjavljeno: Sob Feb 23, 2008 8:52 pm    Naslov sporočila:   Odgovori s citatom

kavelj22 je napisal/a:
Pac uporabljam potem globino od 3 do 9, ce me razumete!
Seveda razumem, saj sem ti napisal, da združi Main, Stop_mode in Mode v ENO zanko, po kateri skačeš z goto. Tako ostaneš ves čas v ničelni globini.
Saj ne potrebiješ call-return tam notri, ker ves čas veš, kje se nahajaš. goto povsem zadostuje za začetno kroženje.

Lahko pa samo v Mode namesto call Mode_menu, napišeš goto Mode_menu , pa boš prihranil še eno globino Wink .
LP,
Igor

DODANO:
Main:
call Stop_Menu ---> goto StopMenu

Stop_menu:
namesto return-ov, povsod napiši goto Main
call Mode ---> goto Mode

Mode:
call Mode_menu --> goto Mode_menu

To je vse, da prihraniš tri globine sklada.

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14673
Aktiv.: 61.91
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Sob Feb 23, 2008 9:06 pm    Naslov sporočila:   Odgovori s citatom

Očitno si nekaj hudo zavozlal oz se pisanja programa nisi lotil na pravi način. Pisal sem kar zahtevne aplikacije kjer sem porabil do 90% pomnilnika a sklada ni bilo nikoli premalo. Rabil sem ga do globine max 5 nivojev.

PS.
Kako bi napisal program za recimo kaj iz serije 16C5x kjer je sklad le dvonivojski. Confused
Tukaj recimo imaš en moj primer, kjer je uporablljen mikorokontroler z le dvonivojskem skladom, a je kar precej dejaven. (multipreksira displej, bere 1Wire vodilo) Kot zanimivost - mikrokontroler je brez prekinitev.

_________________
lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
kavelj22
Član
Član



Pridružen-a: Tor 23 Jan 2007 23:56
Prispevkov: 465
Aktiv.: 2.08
Kraj: Ljubljana

PrispevekObjavljeno: Sob Feb 23, 2008 9:49 pm    Naslov sporočila:   Odgovori s citatom

Silvo je napisal/a:
Očitno si nekaj hudo zavozlal oz se pisanja programa nisi lotil na pravi način. Pisal sem kar zahtevne aplikacije kjer sem porabil do 90% pomnilnika a sklada ni bilo nikoli premalo. Rabil sem ga do globine max 5 nivojev.

PS.
Kako bi napisal program za recimo kaj iz serije 16C5x kjer je sklad le dvonivojski. Confused
Tukaj recimo imaš en moj primer, kjer je uporablljen mikorokontroler z le dvonivojskem skladom, a je kar precej dejaven. (multipreksira displej, bere 1Wire vodilo) Kot zanimivost - mikrokontroler je brez prekinitev.


Ja vem da je to verjetno res. Ampak je to moj prvi projekt in je kar zahteven. Uporabil sem tudi sedem tipk, kjer z tremi nastavljam vrednosti in z vsako najprej izberem in nato potrdim vrednost. Mogoce bi moral drugace potem zastaviti shranjevanjevrednosti v EEPROM in izpise na LCD. Nevem Wink

Igo sem takoj ko sem oddal sporocilo tudi naredil z goto, mal se prehitim vcasih.
Sem pa ugotovil drug problem. Meni zanka Mode ne dela vredu. Vcasih tipka prime in vcasih ne. Sem testiral z ledico do kod pride normalno, in gre prvo skeniranje (Key_test) normalno, drugo skeniranje tudi potem pa ko gre v Wait_for_release pa se zgubi, oz. kot sem rekel vcasih prime vecinoma pa ne. Simulacija pa dela vredu.

Hvala,LP

Hvala,LP

_________________
Živleje ni potica, življeje je črn kruh. Bul ga šparaš bul je suh. Zato pa kr na mizo žjim.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3641
Aktiv.: 16.00

PrispevekObjavljeno: Ned Feb 24, 2008 12:17 am    Naslov sporočila:   Odgovori s citatom

Key_scan
Wait_for_rls
Wait_key_loop
Key_test ; vse to za branje tipk, nikjer pa nimaš debounce Rolling Eyes .

V Stop_Mode portD shraniš v spremenljivko Vhod, tukaj pa v Temp_key Rolling Eyes .
movf PORTD,w v Stop_mode nadomesti s call Key_scan. Nato preverjaj btfsc/s Temp_key .

Pazi, kateri bit od PORTD,x, je kateri bit v Temp_key,y !!! x Mora biti enako y !

Key_scan:
clrf Temp_key
movlw b'00111111'
andwf PORTD,w ; preberi D,0...D,5 --> rezultat v W
btfsc STATUS,Z
return ; Če ni nič, ni treba čakati 15ms za izhod iz podprograma
movwf Temp_key ; Če pa je kaj pritisnjeno, shrani v Temp_key
call Debounce ; čakaj vsaj 15 ms
movlw b'00111111' , Tipke PortD,0...5
andwf PORTD,w ; še enkrat preberi D,0...D,5 --> rezultat v W
andwf Temp_key,f ; rezultat prejšnji D "AND" sedanji D shraniš v Temp_key
call Key_test ; Če je hkrati pritisnjenih več tipk, upošteva samo prvo
movwf Temp_key ; Temp_key z največ enim aktivnim bitom - TA JE TISTI PRAVI
Key_scan1:
btfsc STATUS,Z ; Je kaj pritisnjeno?
return ; NE Nobena tipka ni (več) pritisnjena
; Nekaj je bilo pritisnjeno, zato čaka, da spustim tipko
call Debounce ; čakaj vsaj 15 ms
movlw b'00111111' , Tipke PortD,0...5
andwf PORTD,w ; še enkrat preberi D --> rezultat v W
movwf Key_temp
goto Key_scan1 ; Je (še) kaj pritisnjeno?

Key_test:
btfsc STATUS,Z
retlw b'00000000' ; Če ni nobene tipke, se vrni z 0
btfss Temp_key,0
retlw b'00000001'
btfss Temp_key,1
retlw b'00000010'
btfss Temp_key,2
retlw b'00000100'
btfss Temp_key,3
retlw b'00001000'
btfss Temp_key,4
retlw b'00010000'
;btfss Temp_key,5
retlw b'00100000' ; nekaj je bilo zagotovo pritisnjeno, torej ostane le Temp_key,5
; Z vrstnim redom je možno nastaviti prioriteto tipk

To bi moralo delovati.
Možno je tudi kaj poenostaviti, a sem gradil iz tvojega primera, ker ne poznam pomembnosti tipk.
LP,
Igor

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3641
Aktiv.: 16.00

PrispevekObjavljeno: Ned Feb 24, 2008 12:58 am    Naslov sporočila:   Odgovori s citatom

Sem komaj zdaj opazil, da zaznavaš tipke, ki so ob pritisku vezane na GND.
Gornji program sem popravil.

Key_scan:
clrf Key_scan
call NegirajD
movlw b'00111111'
andwf Vhod,w ; preberi D,0...D,5 --> rezultat v W
btfsc STATUS,Z
return ; Če ni nič, ni treba čakati 15ms za izhod iz podprograma
movwf Temp_key ; Če pa je kaj pritisnjeno, shrani v Temp_key
call Debounce ; čakaj vsaj 15 ms
call NegirajD
movlw b'00111111' , Tipke PortD,0...5
andwf Vhod,w ; še enkrat preberi D,0...D,5 --> rezultat v W
andwf Temp_key,f ; rezultat prejšnji D "AND" sedanji D shraniš v Temp_key
call Key_test ; Če je hkrati pritisnjenih več tipk, upošteva samo prvo
movwf Temp_key ; Temp_key z največ enim aktivnim bitom - TA JE TISTI PRAVI
Key_scan1:
btfsc STATUS,Z ; Je kaj pritisnjeno?
return ; NE Nobena tipka ni (več) pritisnjena
; Nekaj je bilo pritisnjeno, zato čaka, da spustim tipko
call Debounce ; čakaj vsaj 15 ms
call NegirajD
movlw b'00111111' , Tipke PortD,0...5
andwf Vhod,w ; še enkrat preberi D --> rezultat v W
movwf Key_temp
goto Key_scan1 ; Je (še) kaj pritisnjeno?

Key_test:
btfsc STATUS,Z
retlw b'00000000' ; Če ni nobene tipke, se vrni z 0
btfss Temp_key,0
retlw b'00000001'
btfss Temp_key,1
retlw b'00000010'
btfss Temp_key,2
retlw b'00000100'
btfss Temp_key,3
retlw b'00001000'
btfss Temp_key,4
retlw b'00010000'
;btfss Temp_key,5
retlw b'00100000' ; nekaj je bilo zagotovo pritisnjeno, torej ostane le Temp_key,5
; Z vrstnim redom je možno nastaviti prioriteto tipk

NegirajD:
movlw b'11111111'
xorwf PORTD,w
movwf Vhod
return

LP,
Igor

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
kavelj22
Član
Član



Pridružen-a: Tor 23 Jan 2007 23:56
Prispevkov: 465
Aktiv.: 2.08
Kraj: Ljubljana

PrispevekObjavljeno: Ned Feb 24, 2008 4:20 pm    Naslov sporočila:   Odgovori s citatom

Igor zelo cenim tvojo pomoc ampak mi vseeno ne da miru kar sem napisal jaz. Sem pac trmast in hocem priti zadevi do dna.

Citiram:
V Stop_Mode portD shraniš v spremenljivko Vhod, tukaj pa v Temp_key .

V Stop_mode jaz preverjam tipko samo zato da grem v Mode, in od tu naprej se sucem samo se v Mode preverjanju tipk, se pravi kolikor jaz razumem tukaj ni pomembno sedaj katere spremenljivke uporabim za preverjanje. Ali je to Vhod ali Temp_key, saj sta zadevi popolnoma loceni, in pred preverjanjem zmeraj pobrisem spremenljivke.

Je pa res da ni bilo debounca Brick wall , ki sem ga sedaj dodal ampak moja varijanta se vedno ne deluje. In enostavno mi ni jasno kaj manjka in zakaj tole nebi delovalo.
Citiram:
Mode
call Key_scan
movwf Temp_key
btfsc Temp_key,0
goto Mode_menu
goto Mode

Key_scan
call Key_test
movwf Temp_key
btfsc Temp_key,7
return
call Debounce
goto Wait_for_rls


Wait_for_rls
movf Temp_key,w
movwf Key_temp
Wait_key_loop
call Key_test
movwf Temp_key
btfss Temp_key,7
goto Wait_key_loop
call Debounce
movf Key_temp,w
clrf Key_temp
return

Key_test
clrf Temp_key
clrf PORTD
movlw b'10000000'
btfss PORTD,0
movlw b'00000001'
btfss PORTD,1
movlw b'00000010'
btfss PORTD,2
movlw b'00000100'
btfss PORTD,3
movlw b'00001000'
btfss PORTD,4
movlw b'00010000'
btfss PORTD,5
movlw b'00100000'
return


Hvala,LP

_________________
Živleje ni potica, življeje je črn kruh. Bul ga šparaš bul je suh. Zato pa kr na mizo žjim.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja PIC-a v Assembler-ju Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran Prejšnja  1, 2, 3  Naslednja
Stran 2 od 3

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 496 dni


Powered by phpBB © 2001, 2005 phpBB Group