 |
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: Sre Okt 19, 2005 5:57 pm Naslov sporočila: |
|
|
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 |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.62 Kraj: Trzic
|
Objavljeno: Sre Okt 19, 2005 9:37 pm Naslov sporočila: |
|
|
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 |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.62 Kraj: Trzic
|
Objavljeno: Sre Okt 19, 2005 9:45 pm Naslov sporočila: |
|
|
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 |
|
 |
stealth.us Član


Pridružen-a: Tor 13 Sep 2005 20:06 Prispevkov: 99 Aktiv.: 0.42
|
Objavljeno: Sre Okt 19, 2005 9:56 pm Naslov sporočila: |
|
|
Ne vpisuje mi prav bitov v rc_koda
|
|
Nazaj na vrh |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.62 Kraj: Trzic
|
Objavljeno: Sre Okt 19, 2005 10:23 pm Naslov sporočila: |
|
|
Povej kaj ti vpiše oz. kaj bi ti moralo vpisati!
|
|
Nazaj na vrh |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.62 Kraj: Trzic
|
Objavljeno: Sre Okt 19, 2005 10:31 pm Naslov sporočila: |
|
|
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 |
|
 |
stealth.us Član


Pridružen-a: Tor 13 Sep 2005 20:06 Prispevkov: 99 Aktiv.: 0.42
|
Objavljeno: Sre Okt 19, 2005 10:47 pm Naslov sporočila: |
|
|
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 s spet 0 na drugi bit, cez 1778 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 Upam, da sem sedaj bil bolj natančen.
|
|
Nazaj na vrh |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.62 Kraj: Trzic
|
Objavljeno: Čet Okt 20, 2005 1:07 pm Naslov sporočila: |
|
|
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.
Opis: |
|
 Download |
Ime datoteke: |
IR Receiver.zip |
Velikost datoteke: |
2.86 KB |
Downloadano: |
5 krat |
|
|
Nazaj na vrh |
|
 |
stealth.us Član


Pridružen-a: Tor 13 Sep 2005 20:06 Prispevkov: 99 Aktiv.: 0.42
|
Objavljeno: Čet Okt 20, 2005 4:55 pm Naslov sporočila: |
|
|
Program prebere 1, samo bit_set funkcija ne vpise te enke v spremenljivko. Kaj pa imas za en compiler?
|
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.57
|
Objavljeno: Čet Okt 20, 2005 5:01 pm Naslov sporočila: |
|
|
V kaj se pa prevede tvoja koda (zanka) ? Najbrz ima compiler opcijo, da izpljune vmesni korak (assembly).
|
|
Nazaj na vrh |
|
 |
stealth.us Član


Pridružen-a: Tor 13 Sep 2005 20:06 Prispevkov: 99 Aktiv.: 0.42
|
Objavljeno: Čet Okt 20, 2005 5:16 pm Naslov sporočila: |
|
|
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 |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.62 Kraj: Trzic
|
Objavljeno: Čet Okt 20, 2005 5:51 pm Naslov sporočila: |
|
|
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 |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.62 Kraj: Trzic
|
Objavljeno: Čet Okt 20, 2005 6:00 pm Naslov sporočila: |
|
|
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 |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.57
|
Objavljeno: Čet Okt 20, 2005 6:16 pm Naslov sporočila: |
|
|
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 |
|
 |
stealth.us Član


Pridružen-a: Tor 13 Sep 2005 20:06 Prispevkov: 99 Aktiv.: 0.42
|
Objavljeno: Čet Okt 20, 2005 6:51 pm Naslov sporočila: |
|
|
Kako pa lahko jaz sedaj preverim vsak posamezni bit? Ali kako bi vidva sedaj to preverjala in prizigala ledike?
|
|
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
|