» »

for zanka [C] - manjšanje

for zanka [C] - manjšanje

mitchman ::

Živjo. Imam problem s programiranje for zanke. In sicer če odpiram porte od 0 naprej, mi vse deluje kot bi moralo. Če pa hočem uporabiti drugačen vrstni red odpiranja ne deluje. A kdo ve kaj je narobe s kodo?
DELUJOČA:
...
for (t=1; t<=128; t*=2)
		{			
                PORTC = t;
                _delay_ms(1000);
                 }...

NEDELUJOČA:
...
for (t=128; t>0; t/=2)
                {
                PORTC = t;
                _delay_ms(800);
                }...


Sklepam pa, da je nekaj narobe z deljenjem.
  • spremenil: mitchman ()

WarpedGone ::

kakšnega tipa je t?
Zbogom in hvala za vse ribe

mitchman ::

Navaden int.

rasta ::

Ker vidim, da programiraš mikrokrmilnike, ga verjetno biksa compiler. Imaš možnost, da pogledaš kakšno kodo compiler izpljune (v zbirniku)?

Sicer pa zakaj sploh potrebuješ deljenje in množenje? Kaj je pa narobe z operatorji za pomikanje bitov: << in >>?

zdobersek ::

Najhitrejša rešitev bi bila, da spremeniš pogoj 't > 0' v 't > 1'. Tako se zanka zaključi, ko je t enak 2.

rasta ::

Pa lahko podrobneje opišeš, kaj se zgodi, ko poženeš nedelujočo kodo?

gumby ::

Prvi primer ne bi smel delovat, ker je t vedno manjši ali enak 128. V kolikor "navaden int" pomeni 8 bitov...
my brain hurts

mitchman ::

Če priključim na ledice, mi izredno hitro vklaplja in izklaplja eno ledico. Dela isko, kot če bi v for dal: PORTC=128; delay(okrog 10ms);
t je pa takle:
int t;

mitchman ::

shino -> To ne reši zadeve. Še vedno se obnaša nenavadno.

rasta -> Resda so operatorji za pomikanje bitov najelegantnejša rešitev, samo zanima me, zakaj to ne dela. Očitno je res nekaj s compilerjem. Am...katero kodo to misliš?

rasta ::

Kako velik pa je tip int? 8 bitov?
Potem imaš na voljo samo vrednosti od -128 do 127 in se zanka sploh ne izvede, kot je pravilno ugotovil gumby, program se pa znova in znova zaganja - možen vzrok za hitro utripanje LED-ic.

Imaš možnost, da ti kompiler napravi program v zbirniku namesto binarnega imidža?

mitchman ::

Da, 8 bitni je. Vendar tudi če začetno vrednost t-ja nastavim na 64 ali 32 ali karkoli manjšega, mi dela popolnoma enako, le da z drugo LEDico.

Kar se pa kompilerja tiče pa ne vem kako bi to ustvaril. Nisem še nikoli tega počel. Povej kakšen naj bi bil ukaz pa pogledam. Aja, če pomaga: kompiler je pa AVR Studio 4.

gumby ::

F_CPU imaš definiran?

Brez tega bodo delay funkcije počele neumnosti...
my brain hurts

mitchman ::

Imam: #define F_CPU 1000000UL

gumby ::

Clock pa koliko? 4.8MHz mogoče?

Daj malo več informacij, saj ne gre za top-secret zadevo ane?
Drugače bomo lahko samo ugibali...
my brain hurts

mitchman ::

Tu je celotna koda:
#define F_CPU 1000000UL  // 1 MHz CPU clock
#include <util/delay.h>
#include <avr/io.h>
int main (void)
{
int t;
DDRC=0xFF;
PORTC=0x00;
while (1)
{
for (t=64; t>1; t/=2)
	{				
        PORTC = t;
        _delay_ms(800);
	}
}
return 0;
}

Zgodovina sprememb…

  • spremenil: mitchman ()

techfreak :) ::

fuse_l in fuse_h sta pravilno nastavljeni za 1MHz?

gumby ::

Hitro briši tisti "t=t*0.5", preden kdo opazi...
my brain hurts

mitchman ::

Ups :)

Menim, da je z nastavitvami vse OK, ker če for zanko nastavim, da gre od 1 naprej vse dela kot je predvideno.

Torej če je:
for (t=1; t<64; t*=2)

Zgodovina sprememb…

  • spremenil: mitchman ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

java pomoč

Oddelek: Programiranje
211978 (1370) kr?en
»

Programiranje PICa za krmiljenje peči v C

Oddelek: Programiranje
61210 (937) 20sdfj093f
»

PIC18F4550 in ds18s20

Oddelek: Elektrotehnika in elektronika
191999 (1678) snow
»

programiranje procesorja (strani: 1 2 3 48 9 10 11 )

Oddelek: Elektrotehnika in elektronika
50536772 (26173) icek
»

PIC 16f84A - utripanje

Oddelek: Elektrotehnika in elektronika
222240 (2040) ql000

Več podobnih tem