 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
stealth.us Član


Pridružen-a: Tor 13 Sep 2005 20:06 Prispevkov: 99 Aktiv.: 0.42
|
Objavljeno: Ned Okt 09, 2005 11:22 am Naslov sporočila: Tezava z BCF in BSF |
|
|
Rad bi napisal kodo pri kateri bi PIC16F84 čakal, da je PORTA,0 visok. Ko je visok začne v zanki vpisovati v neko spremenljivko posamezne bite. V spremenljivko (sesti bit) se postavi na 1, ce je vhod visok, ce je nizek se vpise 0. Potem bi v naslednjem koraku zanke nastavil peti bit na 1, ce je visok, ce je nizek pa na 0. To bi se potem ponavljalo dokler je stevec enak 0, se pravi, da se nastavi prvi bit.
Nekaj sem ze preizkusal in prisel do te kode:
KODA equ 0x0c
STEVEC equ 0x0d //Stevec nastavim na 6 v funkciji NASTAVI_STEVEC
...
BEREM
BTFSS PORTA,0
BCF KODA, STEVEC
BTFSC PORTA,0
BSF KODA, STEVEC
DECFSZ STEVEC,1
GOTO BEREM
RETURN
...
Problem se pojavi, ker mi v vsakem koraku izvedbe zanke spreminja samo 5. bit. Ce pa namesto STEVEC vpisujem cifre pa deluje normalno. |
|
Nazaj na vrh |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.62 Kraj: Trzic
|
Objavljeno: Ned Okt 09, 2005 12:14 pm Naslov sporočila: |
|
|
BSF in BCF zahtevata naslov in !!konstantno!! vrednost za bit!! V tvojem primeru je STEVEC enak 0x0d, kar naj bi bil 13 bit, kar ne obstaja...
V tvojem primeru se
prevede v
namesto v
|
|
Nazaj na vrh |
|
 |
Highlag Član


Pridružen-a: Pet 23 Jan 2004 20:42 Prispevkov: 4034 Aktiv.: 17.03 Kraj: Črnuče
|
Objavljeno: Ned Okt 09, 2005 12:50 pm Naslov sporočila: |
|
|
Ni tako enostavno. Če sem prav razumel mogoče takole:
Koda: |
Zacetek
BTFSC PortA, 0
GOTO Stej_gor
GOTO Stej_dol
Stej_gor
BTFSS Stevec, 0
GOTO Bit0
BTFSS Stevec, 1
GOTO Bit1
BTFSS Stevec, 2
GOTO Bit2
BTFSS Stevec, 3
GOTO Bit3
BTFSS Stevec, 4
GOTO Bit4
BTFSS Stevec, 5
GOTO Bit5
BTFSS Stevec, 6
GOTO Bit6
GOTO Zacetek
Bit0
BSF Stevec, 0
GOTO Zacetek
Bit1
BSF Stevec, 1
GOTO Zacetek
Bit2
BSF Stevec, 2
GOTO Zacetek
Bit3
BSF Stevec, 3
GOTO Zacetek
Bit4
BSF Stevec, 4
GOTO Zacetek
Bit5
BSF Stevec, 5
GOTO Zacetek
Bit6
BSF Stevec, 6
GOTO Zacetek
Stej_dol
BTFSC Stevec, 0
GOTO Bit0A
BTFSC Stevec, 1
GOTO Bit1A
BTFSC Stevec, 2
GOTO Bit2A
BTFSC Stevec, 3
GOTO Bit3A
BTFSC Stevec, 4
GOTO Bit4A
BTFSC Stevec, 5
GOTO Bit5A
BTFSC Stevec, 6
GOTO Bit6A
GOTO Zacetek
Bit0A
BCF Stevec, 0
GOTO Zacetek
Bit1A
BCF Stevec, 1
GOTO Zacetek
Bit2A
BCF Stevec, 2
GOTO Zacetek
Bit3A
BCF Stevec, 3
GOTO Zacetek
Bit4A
BCF Stevec, 4
GOTO Zacetek
Bit5A
BCF Stevec, 5
GOTO Zacetek
Bit6A
BCF Stevec, 6
GOTO Zacetek
|
_________________ If at first you don't succeed, destroy all evidence that you tried. |
|
Nazaj na vrh |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.62 Kraj: Trzic
|
Objavljeno: Ned Okt 09, 2005 1:03 pm Naslov sporočila: |
|
|
To je zelo neprofesionalen pristop...
Za vklop/izklop poljubnega bita se uporablja raje maske (OR, AND, XOR)
1. narediš masko s shiftanjem (za 5. bit, 5x shiftaš vrednost 1 v levo) in jo shraniš v W (working register)
0b00000001 > 5x shiftaš v levo > 0b00100000 > W
2. če želiš na tistem mestu imeti 0, masko najprej negiraš, zatem uporabiš AND
0b00100000 > negiraš > 0b11011111 > AND z KODA > ANDWF KODA, F
3. če želiš imeti 1, enostavno narediš OR operacijo
0b00100000 OR KODA > IORWF KODA, F |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.57
|
Objavljeno: Ned Okt 09, 2005 1:47 pm Naslov sporočila: |
|
|
NeoTO, ce prav razumem nalogo in tvoj komentar, bi bilo najbrz se bolj ucinkovito (= profesionalno ?) uporabiti 5 * 2 (v parih za vklop in izklop bita) predpripravljenih mask in v zanki samo preveriti stanje vhoda in na podlagi tega izvesti AND ali OR operacijo nad trenutno vrednostjo na podlagi vnaprej pripravljene maske, s stevcem kot indeksom v polje prej pripravljenih mask. AND in OR se najbrz izvajata enako (ali zelo podobno) stevilo ciklov ?
Na PICe se namrec ne spoznam, ampak rotiranje/pomik in morebitna negacija bo najbrz zahtevala vsaj en in pol ukaz vec v povprecju, zanka se bo pa izvajala bolj nesimetricno glede na to, ali bo 0 ali 1 na vhodu (ne vem ali je to problem pri tej nalogi ali ne). Zrtev je 10 pomnilniskih lokacij, prihranek pa nekaj manj (ukaza za pomik in komplement). |
|
Nazaj na vrh |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.62 Kraj: Trzic
|
Objavljeno: Ned Okt 09, 2005 1:59 pm Naslov sporočila: |
|
|
Odvisno od tega, kaj on želi s tem programom narediti. Sam ne vidim nekega namena vsakih 1us preveriti stanje na vhodu (še sploh, ker je spremenljivko poimenoval KODA, kar me asociira na komunikacijo z uporabnikom...).
Simetričnost lahko dosežeš s tem, da pri postavljanju na 1 enostavno dodaš en NOP ukaz.
Koda, ki jo je predlagal Highlag je dolga in nepregledna, v primeru napak pa moraš popravljati vsak del zase. Assembler za takšne primere pozna makroje (sam jih ne znam uporabljati... ) ki kodo naredijo veliko preglednejšo.
stealth.us naj raje pove, čemu bo ta koda služila, potem mu lahko svetujemo, kaj narediti. Koda, ki sem jo napisal, lahko služi kot nadgradnja za BCF in BSF (ne samo da podamo naslovno celico kot spremenljivko, podamo lahko tudi bit kot spremenljivko). |
|
Nazaj na vrh |
|
 |
Umnik Član

Pridružen-a: Čet 16 Sep 2004 17:52 Prispevkov: 958 Aktiv.: 4.04 Kraj: Novo mesto
|
Objavljeno: Ned Okt 09, 2005 3:12 pm Naslov sporočila: |
|
|
Če recimo čakaš, da bo en bit visok (pa naj bo to PA,0) in potem želiš "zafilat" en bajt z določenimi vrednostmi (glede na neke dogodke), kar ponavadi služi kot en statusni register lahko uporabiš tudi for zanko (v asm kodi), in se sprehodiš skozi cel bajt.
V zanki povecujes neko vrednost za 1 in pri vsaki vrednosti še pregledaš podatke od katerih je odvisna vrednost nekega bita.
Koda: |
; for zanka v asemblerju
clrf i
zacni
movfw i
sublw .8
skpnz
goto nadaljuj
skpc
goto nadaljuj
;ostala koda tukaj, kjer vpisuješ podatke ponavadi "call rutina"
incf i,f
goto zacni
nadaljuj ;konec zanke
|
V rutini lahko uporabiš statične maske za posamezen bit.
Taki "statusni" registri se dosti uporabljajo (vsaj jaz jih), bite pa se vpisuje tako kot je že NeoTO napisal. Makrojev pa sam tudi ne uporabljam, vkolikor rabim neko zadevo več kot 1x raje napišem rutino. _________________ If in doubt about performance disassemble your code and try to follow it. If you get bored then the CPU probably will too... |
|
Nazaj na vrh |
|
 |
stealth.us Član


Pridružen-a: Tor 13 Sep 2005 20:06 Prispevkov: 99 Aktiv.: 0.42
|
Objavljeno: Ned Okt 09, 2005 3:28 pm Naslov sporočila: |
|
|
Najlepša hvala vsem za odgovore.
NeoTO: V bistvu bi rad naredil, da PIC prepozna RC5 kodo, s tem, da bi najprej prepoznal le klikanje (ON/OFF) v PIC Simulatorju, potem pa bi to poskusil nadgraditi v RC5 razpoznavo. Sicer vem, da je Silvo ze izdelal taksen projekt, vendar sem hotel poskusit na svoj nacin. |
|
Nazaj na vrh |
|
 |
Highlag Član


Pridružen-a: Pet 23 Jan 2004 20:42 Prispevkov: 4034 Aktiv.: 17.03 Kraj: Črnuče
|
Objavljeno: Ned Okt 09, 2005 4:23 pm Naslov sporočila: |
|
|
V bistvu bi rad da preko enega vhoda serijsko vpišeš vrednost v register.
To pa moja uboga koda ne bo naredila.
Mogoče bi jo lahko uporabil za nekakšen VU meter, ki bi glede na dolžino impulza prižgal več ali manj diod. (Če seveda deluje )
Za serijsko vpisovanje bi mogoče lahko uporabil ukaza RLF ali RRF? _________________ If at first you don't succeed, destroy all evidence that you tried. |
|
Nazaj na vrh |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.62 Kraj: Trzic
|
Objavljeno: Ned Okt 09, 2005 4:51 pm Naslov sporočila: |
|
|
Pa če serijske podatke sprejemaš, se pač glede na mesto LSB/MSB bita odločiš, kje boš postavljal oz. brisal bite (0. ali 7.) potem pa to vrednost samo shiftaš (kot že omenjeno). Nič kompliciranja.
Me pa zanima, glede na to, da stealth dela sprejemnik za RC-5, če je že kdo naletel na takega, ki bi imel malo drugačne čase posameznih polbitov? Doma imam dva daljinca, na katera se TV odziva, njuni časi posameznih polbitov so pa precej različni!? |
|
Nazaj na vrh |
|
 |
stealth.us Član


Pridružen-a: Tor 13 Sep 2005 20:06 Prispevkov: 99 Aktiv.: 0.42
|
Objavljeno: Ned Okt 09, 2005 8:03 pm Naslov sporočila: |
|
|
Sem razmisljal kaj pa ce bi naredil, da bi kar sestevalo vhod v eno spremenljivko, recimo vhod bi bil 110100=32+16+0+4+0+0 = 52. Bom pa poskusil se s C-jem, tam sem bolj domac  |
|
Nazaj na vrh |
|
 |
stealth.us Član


Pridružen-a: Tor 13 Sep 2005 20:06 Prispevkov: 99 Aktiv.: 0.42
|
Objavljeno: Sre Okt 12, 2005 10:29 pm Naslov sporočila: |
|
|
Tako, priblizno sem naredil, to kar sem hotel. Izgleda pa nekako takole, če slučajno koga zanima
Koda: |
#include <16F84.H>
#use delay(clock=4000000) // 4 MHz OSC
void Test_vhoda();
int Pristej_vhod_vrni_rezultat(stevec, rezultat);
void Postavi_izhode(rezultat);
main()
{
set_tris_a(1);
set_tris_b(0);
Test_vhoda();
}
Test_vhoda()
{
int stevec = 0;
int vhod = 0;
int rezultat = 0;
do
{
if(input(PIN_A0))
{
rezultat = Pristej_vhod_vrni_rezultat(stevec, rezultat);
}
stevec++;
}
while (stevec<=5);
Postavi_izhode(rezultat);
}
int Pristej_vhod_vrni_rezultat(int stevec, int rezultat)
{
if (stevec == 0)
rezultat = rezultat + 32;
else if (stevec == 1)
rezultat = rezultat + 16;
else if (stevec == 2)
rezultat = rezultat + 8;
else if (stevec == 3)
rezultat = rezultat + 4;
else if (stevec == 4)
rezultat = rezultat + 2;
else if (stevec == 5)
rezultat = rezultat + 1;
else {}
return rezultat;
}
void Postavi_izhode(rezultat)
{
/*
Samo za max in min.
*/
if (rezultat==64) //max
output_high(PIN_B0);
else if (rezultat==0)
output_high(PIN_B1); //min
} |
|
|
Nazaj na vrh |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.62 Kraj: Trzic
|
Objavljeno: Sre Okt 12, 2005 11:55 pm Naslov sporočila: |
|
|
zakaj pa ne kar tako:
Koda: |
int rezultat = 0;
int stevec = 0;
while(stevec++<=5)
{
rezultat <<= 1;
if input(PIN_A0) bit_set(rezultat, 0);
}
return rezultat;
|
?? |
|
Nazaj na vrh |
|
 |
stealth.us Član


Pridružen-a: Tor 13 Sep 2005 20:06 Prispevkov: 99 Aktiv.: 0.42
|
Objavljeno: Čet Okt 13, 2005 9:04 am Naslov sporočila: |
|
|
Bi lahko tudi tako verjetno ja, saj je dosti variant, jaz sem izbral najenostavnejšo
Pa tudi tako bi lahko:
Koda: |
do
{
if(input(PIN_A0))
{
bit_set(rezultat,stevec);
}
stevec++;
}
while (stevec<=5); |
|
|
Nazaj na vrh |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.62 Kraj: Trzic
|
Objavljeno: Čet Okt 13, 2005 9:31 pm Naslov sporočila: |
|
|
Lahko tudi tako, moraš pa vedeti, da če pri bit_set podaš tudi spremenljivko za bit, se ukaz prevede v lep kupček kode, ki žere procesorski čas. Jaz sem ti podal eno hitrejših metod... |
|
Nazaj na vrh |
|
 |
|
|
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: 492 dni
Powered by phpBB © 2001, 2005 phpBB Group
|