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 Prejšnja  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: Sre Okt 19, 2005 5:57 pm    Naslov sporočila:   Odgovori s citatom

Mi lahko kdo pove, zakaj to ne dela tako kot bi moralo?
Koda:

int rc_koda, stevec=0;   
    do
    {
     if(!input(PIN_A0))
      bit_set(rc_koda, stevec);
     else {}
     stevec++;
     delay_us(1778);
    }
    while(stevec<6);


Se pravi problem je pri tem, ker ne zapise enic v rc_koda. Ce pa naredim tako pa normalno deluje, meni ni najbolj jasno:

Koda:

     if(!input(PIN_A0))
     bit_set(rc_koda, 0);
     delay_us(1778);
     if(!input(PIN_A0))
     bit_set(rc_koda, 1);
     delay_us(1778);
     if(!input(PIN_A0))
     bit_set(rc_koda,2);
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 19, 2005 9:37 pm    Naslov sporočila:   Odgovori s citatom

Kot sem že prej omenil, se ti bit_set brez konstante za bit prevede v lep kupček kode, ki ti lahko prinese kar nekaj dodatnih us!!!
Tistih tvojih 1778 je čisto brez veze, saj ne upoštevaš časov, ki so potrebni za samo izvajanje ostale kode v zanki!
Lahko pa kodo malo urediš, skrajšaš,...:

Koda:

int rc_koda = 0, stevec = 0;

do
{
   if (!input(PIN_A0)) bit_set(rc_koda, stevec++);
   delay_us(1770);
}
while (stevec<6);
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
NeoTO
Član
Član



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

PrispevekObjavljeno: Sre Okt 19, 2005 9:45 pm    Naslov sporočila:   Odgovori s citatom

Svetoval bi ti pa tudi, da gledaš posamezne polbite in s tem ugotavljaš tudi če je prišlo do kakšne napake pri prenosu.

Še zdaj pa ne razumem, kaj misliš s tistim, da ti ne dela... Malo bolj razloži
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: Sre Okt 19, 2005 9:56 pm    Naslov sporočila:   Odgovori s citatom

Ne vpisuje mi prav bitov v rc_koda
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 19, 2005 10:23 pm    Naslov sporočila:   Odgovori s citatom

Povej kaj ti vpiše oz. kaj bi ti moralo vpisati!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
NeoTO
Član
Član



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

PrispevekObjavljeno: Sre Okt 19, 2005 10:31 pm    Naslov sporočila:   Odgovori s citatom

Ali pa uporabiš kaj takega:

Koda:

int rc_koda = 0, stevec = 0, maska = 1;

do
{
   if (!input(PIN_A0)) rc_koda |= maska;
   maska <<= 1;
   delay_us(1770);
}
while (++stevec<6);


kar ti omogoča, da se ti procedura vedno izvaja enako dolgo.
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: Sre Okt 19, 2005 10:47 pm    Naslov sporočila:   Odgovori s citatom

Vpisati bi mi moralo RC5 kod. Tale daljinec, ki ga imam je sprogramiran tako, da ce pritisnes 1 odda kodo (zadnjih sest bitov) 100000, ce pritisnes 2 = 010000 in tako naprej. Sedaj pa bi jaz rad z detekcijo te bite vpisal v neko spremenljivko. Recimo, da pritisnem stevilko 4 bi mi to moralo vpisati v rc_koda spremenljivko najprej 0 v prvi bit, cez 1778 mi s spet 0 na drugi bit, cez 1778 mi s pa 1 v tretji bit. No vsaj tako si jaz predstavljam, da bi moralo biti. Sicer sem ze nardil, ampak tako, da sem za vsaki bit novo spremenljivko definiral, kar je pa dosti pozresno, pa lepo dela, samo ni pa koda lepo za videt Smile Upam, da sem sedaj bil bolj natančen.
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 20, 2005 1:07 pm    Naslov sporočila:   Odgovori s citatom

Vem, kako deluje RC-5.... Zanima me le, kaj ti program prebere v odvisnosti od tega, kar bi ti moralo.
Dal si primer za tipko 2: ti program ne prebere nobene enke, ali je ta na napačnem mestu?

Drugače pa ti prilagam moj program, ki sem ga napisal za sprejemanje RC-5 in NEC kod in je za PIC 12F683 (da se enostavno prilagodit na druge PIC-e/prevajalnike). Komentarji so v angleščini.



IR Receiver.zip
 Opis:

Download
 Ime datoteke:  IR Receiver.zip
 Velikost datoteke:  2.86 KB
 Downloadano:  5 krat

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 20, 2005 4:55 pm    Naslov sporočila:   Odgovori s citatom

Program prebere 1, samo bit_set funkcija ne vpise te enke v spremenljivko. Kaj pa imas za en compiler?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Sokrat
Član
Član



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

PrispevekObjavljeno: Čet Okt 20, 2005 5:01 pm    Naslov sporočila:   Odgovori s citatom

V kaj se pa prevede tvoja koda (zanka) ? Najbrz ima compiler opcijo, da izpljune vmesni korak (assembly).
Nazaj na vrh
Skrit 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: Čet Okt 20, 2005 5:16 pm    Naslov sporočila:   Odgovori s citatom

Tako izgleda koda v assemblerju:
Koda:
....................    do
....................    {
....................       if(!input(PIN_A0))
0035:  BSF    03.5
0036:  BSF    05.0
0037:  BCF    03.5
0038:  BTFSC  05.0
0039:  GOTO   052
....................       {
....................          bit_set(koda, stevec);
003A:  MOVLW  01
003B:  MOVWF  0C
003C:  MOVF   15,W
003D:  MOVWF  0D
003E:  BTFSC  03.2
003F:  GOTO   044
0040:  BCF    03.0
0041:  RLF    0C,F
0042:  DECFSZ 0D,F
0043:  GOTO   040
0044:  MOVF   0C,W
0045:  IORWF  16,F
....................          delay_us(1778);
0046:  MOVLW  01
0047:  MOVWF  17
0048:  CALL   004
0049:  MOVLW  07
004A:  MOVWF  17
004B:  MOVLW  61
004C:  MOVWF  18
004D:  CALL   019
004E:  DECFSZ 17,F
004F:  GOTO   04B
0050:  NOP
....................          stevec++;
0051:  INCF   15,F
....................       }
....................    }
....................    while (stevec<6);


Tako pa v C-ju:

Koda:
   do
   {
      if(!input(PIN_A0))
      {
         bit_set(koda, stevec);
         delay_us(1778);
         stevec++;
      }
   }
   while (stevec<6);
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 20, 2005 5:51 pm    Naslov sporočila:   Odgovori s citatom

Jaz, kakor tudi ti, uporabljam CCS C compiler. Kako ti pa tale koda deluje:

Koda:
   int rc_koda = 0, stevec = 0, maska = 1;
   
   do
   {
      if (!input(PIN_A0)) rc_koda |= maska;
      maska <<= 1;
      delay_us(1770);
   }
   while (++stevec<6);


ali v assemblerju:

Koda:
....................    do
....................    {
....................       if (!input(PIN_A0)) rc_koda |= maska;
0040:  BSF    03.5
0041:  BSF    05.0
0042:  BCF    03.5
0043:  BTFSC  05.0
0044:  GOTO   047
0045:  MOVF   25,W
0046:  IORWF  23,F
....................       maska <<= 1;
0047:  BCF    03.0
0048:  RLF    25,F
....................       delay_us(1770);
0049:  MOVLW  01
004A:  MOVWF  26
004B:  GOTO   004
004C:  MOVLW  05
004D:  MOVWF  26
004E:  MOVLW  98
004F:  MOVWF  27
0050:  GOTO   018
0051:  DECFSZ 26,F
0052:  GOTO   04E
....................    }
....................    while (++stevec<6);
0053:  INCF   24,F
0054:  MOVF   24,W
0055:  SUBLW  05
0056:  BTFSC  03.0
0057:  GOTO   040
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
NeoTO
Član
Član



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

PrispevekObjavljeno: Čet Okt 20, 2005 6:00 pm    Naslov sporočila:   Odgovori s citatom

Ups. Ja saj ni čudno, da ti ne dela....

Če je na vhodu 1 (oz. podatek 0), pogoj v stavku if ni izpolnjen in zanka se ti bo izvajala dokler bo na vhodu 1 (delay-i in povečevanje števca se ne bodo izvedli). V tvojem primeru, bi moral vedno dobiti ven same enke!!!
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: Čet Okt 20, 2005 6:16 pm    Naslov sporočila:   Odgovori s citatom

stealth.us je napisal/a:
Tako izgleda koda v assemblerju:
Koda:

003A:  MOVLW  01
003B:  MOVWF  0C
003C:  MOVF   15,W
003D:  MOVWF  0D
003E:  BTFSC  03.2
003F:  GOTO   044
0040:  BCF    03.0
0041:  RLF    0C,F
0042:  DECFSZ 0D,F
0043:  GOTO   040
0044:  MOVF   0C,W
0045:  IORWF  16,F


Tale creva zgledajo ogabno (neucinkovito in neenakomerno), kot je NeoTO predvideval. Zakaj ne bi uporabil njegovega predloga in v zacasni spremenljivki (konec konec je to lahko tudi stevec in sploh ne potrebujes dodatne spremenljivke, le mejni pogoj spremeni iz 6 na 2^6) samo pomikal en bit v levo in ga vsakic - glede na stanje vhoda pac - ali logicno OR-al s spremenljivko za kodo ali pa pac ne ?

Danes prvic vidim ukazni nabor PICov in se morda motim, ampak to zgleda kot 5 ukazov v assemblerju namesto tistega zankastega skropucala zgoraj, ki ga izpljune prevajalnik (za katerega pa si kriv sam), torej nekaj v stilu:

Koda:

int rc_koda = 0, stevec = 1
   do
   {
      if (!input(PIN_A0)) rc_koda |= stevec;
      stevec <<= 1;
      delay_us(1770); // prilagodi vrednost ustrezno casu izvajanja ostalih ukazov v zanki
   }
   while (stevec < 64); // 2^6 = 64


To bi moralo delati in biti krajse (in hitrejse).
Nazaj na vrh
Skrit 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: Čet Okt 20, 2005 6:51 pm    Naslov sporočila:   Odgovori s citatom

Kako pa lahko jaz sedaj preverim vsak posamezni bit? Ali kako bi vidva sedaj to preverjala in prizigala ledike?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
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 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: 492 dni


Powered by phpBB © 2001, 2005 phpBB Group