Keil c-Problem

O

onde

Guest
ahoj!

Mám problém s tímto programem:
/ / Timerinterrupt

# include <reg517a.h>

void INTTIM0 (void) přerušení 1
(If (P4 <0x7f) P4 <<= 1;
if (P4> 0x02) P4>> = 1;
Th0 =- 39; / / 10ms
TL0 = 0;
)

main ()
(
P4 = 0x01;
TMOD = 0x01, / / Časovač 0 Mode 1 16 Bit
Th0 = -39; / / každých 10ms Int.
TL0 = 0;
ET0 = 1; / / Časovač 0 Přerušení zdravotně postižené
EAL = 1, / / aby se všechny

TR0 = 1; / /

while (1)
(
)
)

Problém je, že P4 je posunut až 1 time (od 0x01 až 0x10), po tomto se nic Happing.
Any Idea??

 
co máte na mysli, že P4 swapy pouze jednou, k tomu, aby přechod od 0x01 až 0x10 to musí být posun čtyřikrát??

 
Vložíte i statments jako kdyby místo blokování statments jako [-li]
[ostatní]
bloky.
Myslím, že v příštím posun, P4 posun jeden čas LEFT: 0x02 -> 0x04,
pak příští if konat: P4 přejít zpět na RIGHT: 0x04 -> 0x02.
Posloupnost jednotlivých nastat přerušení cyklu.

Změnit prohlášení [*] [ostatní] blok!

 
Nazdar,

thx for your answere a pro vás tip

<img src="http://www.edaboard.com/images/smiles/icon_smile.gif" alt="Úsměv" border="0" />AUA, myslím, že to není můj den.
nashledanou

 
Další věc:
i když můj kompilátor akceptuje
while (1)
(
)

Píšu:
while (1)
(
;
)také měli špatné zkušenosti s:
(
blablabla ...

goto xyz_label;

blablabla ...

xyz_label:
)

jeden z překladačů I'm using chtěl vidět "," mezi etiketu a držákThomaz

 
Dobrý den, onde,

Popište prosím Váš problém jasný, aby ostatní lidé vám mohou pomoci.
Váš problém není kompilátor, nebo dokonce ke * l problém.
Myslím, že si přejete realizovat konstantní a opakovaně posun až P4.
Pokud ano, musíte se zaregistrovat počasí dvousměnném události dostat tam bounderies.Pokud ano, zaregistrujte se a otoč se posun směrem.

Prosím, místo pro bližší informace.

Robby

 
Nazdar,

Pokud dáte th druhá podmínka v prohlášení ELSE, dostanete seceuence: 1, 2, 4, 8, 16, 32, 64, 128, 64, 128, 64, 128 ...a tak dále, protože jste se decideif jste-posun nahoru nebo dolů-Shifting.Sometihg likethis Wil dobře,

unsigned char UP = 1;

void timer0 přerušení () (1 pomocí

if (UP)
if ((P4 <<= 1) <0x80) (
UP = 0;
)
jiné

 
Nazdar,

Pokud dáte th druhá podmínka v prohlášení ELSE, dostanete seceuence: 1, 2, 4, 8, 16, 32, 64, 128, 64, 128, 64, 128 ...a tak dále, protože jste se decideif jste-posun nahoru nebo dolů-Shifting.Sometihg likethis Wil dobře,

unsigned char UP = 1;

void timer0 přerušení () (1 pomocí

if (UP)
if (P4 <0x80)
P4 <<= 1;
else (
UP = 0;
P4>> = 1;
)

jiné
if (P4> 0x01)
P4>> = 1;
else (
UP = 1;
P4 <<= 1;
)

...............Zbytek rutinní
)

 
Optimalizovaný kód takto:

# define pravda 1
# define falešné 0

typedef trochu bool;

bool UP = 1;

void timer0 přerušení () pomocí 1
(
if (UP & & P4 <0x80)
P4 <<= 1;
else if (UP)
(
UP = 0;
P4>> = 1;
)
else if (P4> 0x01)
P4>> = 1;
jiné
(
UP = true;
P4 <<= 1;
)
)

 
Dobrý den, onde,

Podle mého názoru, může váš problém přijde nějaké omezení použití.
P4 je deklarován v reg517a.h k níže.
SFR P4 = 0xE8;

V mém případě, pokud mohu použít speciální Funcion registr (SFR),
Používám nahradit proměnnou typu unsigned char.

# include <reg517a.h>

void INTTIM0 (void) přerušení 1
(
unsigned char IO = 0;

IO = P4;
if (IO <0x7f) (
IO <<= 1;
P4 = IO;
)
if (IO> 0x02) (
IO>> = 1;
P4 = IO;
)
Th0 =- 39; / / 10ms
TL0 = 0;
)

main ()
(
P4 = 0x01;
TMOD = 0x01, / / Časovač 0 Mode 1 16 Bit
Th0 = -39; / / každých 10ms Int.
TL0 = 0;
ET0 = 1; / / Časovač 0 Přerušení zdravotně postižené
EAL = 1, / / aby se všechny

TR0 = 1; / /

while (1)
(
)
)

 

Welcome to EDABoard.com

Sponsor

Back
Top