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 

Tezava z BCF in BSF
Pojdi na stran 1, 2, 3  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
stealth.us
Član
Član



Pridružen-a: Tor 13 Sep 2005 20:06
Prispevkov: 99
Aktiv.: 0.42

PrispevekObjavljeno: Ned Okt 09, 2005 11:22 am    Naslov sporočila:  Tezava z BCF in BSF Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
NeoTO
Član
Član



Pridružen-a: Pon 28 Mar 2005 19:19
Prispevkov: 2752
Aktiv.: 11.62
Kraj: Trzic

PrispevekObjavljeno: Ned Okt 09, 2005 12:14 pm    Naslov sporočila:   Odgovori s citatom

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
Koda:

BCF KODA, STEVEC

prevede v
Koda:

BCF 0x0C, 0x0D

namesto v
Koda:

BCF 0x0C, 5
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
Highlag
Član
Član



Pridružen-a: Pet 23 Jan 2004 20:42
Prispevkov: 4034
Aktiv.: 17.03
Kraj: Črnuče

PrispevekObjavljeno: Ned Okt 09, 2005 12:50 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
NeoTO
Član
Član



Pridružen-a: Pon 28 Mar 2005 19:19
Prispevkov: 2752
Aktiv.: 11.62
Kraj: Trzic

PrispevekObjavljeno: Ned Okt 09, 2005 1:03 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
Sokrat
Član
Član



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

PrispevekObjavljeno: Ned Okt 09, 2005 1:47 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
NeoTO
Član
Član



Pridružen-a: Pon 28 Mar 2005 19:19
Prispevkov: 2752
Aktiv.: 11.62
Kraj: Trzic

PrispevekObjavljeno: Ned Okt 09, 2005 1:59 pm    Naslov sporočila:   Odgovori s citatom

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... Smile ) 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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
Umnik
Član
Član



Pridružen-a: Čet 16 Sep 2004 17:52
Prispevkov: 958
Aktiv.: 4.04
Kraj: Novo mesto

PrispevekObjavljeno: Ned Okt 09, 2005 3:12 pm    Naslov sporočila:   Odgovori s citatom

Č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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
stealth.us
Član
Član



Pridružen-a: Tor 13 Sep 2005 20:06
Prispevkov: 99
Aktiv.: 0.42

PrispevekObjavljeno: Ned Okt 09, 2005 3:28 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Highlag
Član
Član



Pridružen-a: Pet 23 Jan 2004 20:42
Prispevkov: 4034
Aktiv.: 17.03
Kraj: Črnuče

PrispevekObjavljeno: Ned Okt 09, 2005 4:23 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
NeoTO
Član
Član



Pridružen-a: Pon 28 Mar 2005 19:19
Prispevkov: 2752
Aktiv.: 11.62
Kraj: Trzic

PrispevekObjavljeno: Ned Okt 09, 2005 4:51 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
stealth.us
Član
Član



Pridružen-a: Tor 13 Sep 2005 20:06
Prispevkov: 99
Aktiv.: 0.42

PrispevekObjavljeno: Ned Okt 09, 2005 8:03 pm    Naslov sporočila:   Odgovori s citatom

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 Wink
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
stealth.us
Član
Član



Pridružen-a: Tor 13 Sep 2005 20:06
Prispevkov: 99
Aktiv.: 0.42

PrispevekObjavljeno: Sre Okt 12, 2005 10:29 pm    Naslov sporočila:   Odgovori s citatom

Tako, priblizno sem naredil, to kar sem hotel. Izgleda pa nekako takole, če slučajno koga zanima Razz

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
NeoTO
Član
Član



Pridružen-a: Pon 28 Mar 2005 19:19
Prispevkov: 2752
Aktiv.: 11.62
Kraj: Trzic

PrispevekObjavljeno: Sre Okt 12, 2005 11:55 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
stealth.us
Član
Član



Pridružen-a: Tor 13 Sep 2005 20:06
Prispevkov: 99
Aktiv.: 0.42

PrispevekObjavljeno: Čet Okt 13, 2005 9:04 am    Naslov sporočila:   Odgovori s citatom

Bi lahko tudi tako verjetno ja, saj je dosti variant, jaz sem izbral najenostavnejšo Smile
Pa tudi tako bi lahko:

Koda:
   do
   {
      if(input(PIN_A0))
      {
         bit_set(rezultat,stevec);
      }
      stevec++;
   }
   while (stevec<=5);
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
NeoTO
Član
Član



Pridružen-a: Pon 28 Mar 2005 19:19
Prispevkov: 2752
Aktiv.: 11.62
Kraj: Trzic

PrispevekObjavljeno: Čet Okt 13, 2005 9:31 pm    Naslov sporočila:   Odgovori s citatom

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
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 -> Microchip PIC Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran 1, 2, 3  Naslednja
Stran 1 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: 492 dni


Powered by phpBB © 2001, 2005 phpBB Group