Keil c-Problem

O

onde

Guest
γεια σου!

Έχω ένα πρόβλημα με το παρακάτω πρόγραμμα:
/ / Timerinterrupt

# include <reg517a.h>

void INTTIM0 (void) διακόπτουν 1
(If (P4 <0x7f) P4 <<= 1?
εάν (P4> 0x02) P4>> = 1?
TH0 =- 39? / / 10ms
TL0 = 0?
)

main ()
(
P4 = 0x01?
TMOD = 0x01? / / Χρονοδιακόπτη 0 Mode 1 16 Bit
TH0 = -39? / / Κάθε 10ms Int.
TL0 = 0?
ET0 = 1? / / Timer 0 Interrupt άτομα με ειδικές ανάγκες
EAL = 1? / / Ενεργοποίηση όλων

TR0 = 1? / /

while (1)
(
)
)

Το πρόβλημα είναι, P4 μετατοπίζεται μόνο 1 φορά (από 0x01 σε 0x10), μετά από αυτό τίποτα δεν είναι happing.
Κάθε Idea??

 
τι εννοείς ότι οι ανταλλαγές P4 μόνο μία φορά, για να μετατόπιση από 0x01 σε 0x10 θα πρέπει να είναι τέσσερις φορές βάρδια;;;

 
Τοποθετείτε τόσο statments ως εάν, αντί να μπλοκάρει το statments ως [αν]
[άλλο]
μπλοκ.
Θέλω να πω ότι στην επόμενη στροφή, αλλαγή P4 μία φορά προς τα αριστερά: 0x02 -> 0x04,
τότε η επόμενη δήλωση εάν πραγματοποιηθεί: P4 πίσω μετατόπιση προς τα δεξιά: 0x04 -> 0x02.
Η ακολουθία συμβαίνουν κάθε διακοπή του κύκλου.

Αλλάξτε την κατάσταση σε [Αν] [άλλο] μπλοκ!

 
Γεια σου,

thx για answere σας και για σας hint

<img src="http://www.edaboard.com/images/smiles/icon_smile.gif" alt="Χαμόγελο" border="0" />aua, νομίζω ότι δεν είναι μέρα μου.
αντίο

 
ένα άλλο πράγμα:
ακόμη και αν compiler μου δέχεται
while (1)
(
)

Γράφω:
while (1)
(
?
)Επίσης, είχε κακή εμπειρία με:
(
blablabla ...

xyz_label goto?

blablabla ...

xyz_label:
)

ένας από τους συντάκτες Είμαι χρησιμοποιώντας ήθελα να δω το "?" μεταξύ της ετικέτας και του βραχίοναThomaz

 
Γεια onde,

Παρακαλούμε να περιγράψετε το πρόβλημά σας σαφείς, έτσι ώστε άλλοι άνθρωποι μπορούν να σας βοηθήσουν.
Το πρόβλημά σας δεν είναι compiler ή ακόμη ke * l πρόβλημα.
Μάλλον θέλετε να υλοποιήσει μια σταθερή και επανειλημμένα αλλαγή μέσω P4.
Αν ναι, πρέπει να εγγραφείτε καιρό τα δύο γεγονότα βάρδιες bounderies φθάσουν εκεί.Αν ναι, εγγραφείτε και στροφή γύρω από την αλλαγή κατεύθυνσης.

Παρακαλώ θέση για περισσότερες λεπτομέρειες.

Robby

 
Γεια σου,

αν βάλετε th δεύτερη προϋπόθεση, σε μια δήλωση ELSE, θα πάρετε την seceuence: 1, 2, 4, 8, 16, 32, 64, 128, 64, 128, 64, 128 ...και ούτω καθεξής, γιατί πρέπει να σας decideif είναι Up-στροφή ή Down-Shifting.Sometihg likethis wil πάνε καλά,

unsigned char UP = 1?

void timer0 διακοπή () με 1 (

αν (UP)
if ((P4 <<= 1) <0x80) (
UP = 0?
)
άλλος

 
Γεια σου,

αν βάλετε th δεύτερη προϋπόθεση, σε μια δήλωση ELSE, θα πάρετε την seceuence: 1, 2, 4, 8, 16, 32, 64, 128, 64, 128, 64, 128 ...και ούτω καθεξής, γιατί πρέπει να σας decideif είναι Up-στροφή ή Down-Shifting.Sometihg likethis wil πάνε καλά,

unsigned char UP = 1?

void timer0 διακοπή () με 1 (

αν (UP)
εάν (P4 <0x80)
P4 <<= 1?
else (
UP = 0?
P4>> = 1?
)

άλλος
εάν (P4> 0x01)
P4>> = 1?
else (
UP = 1?
P4 <<= 1?
)

...............Υπόλοιπο ρουτίνας
)

 
η Βελτιστοποιημένο κώδικα ως εξής:

# define true 1
# define false 0

typedef bool bit?

bool UP = 1?

void timer0 διακοπή () με χρήση 1
(
εάν (UP & & P4 <0x80)
P4 <<= 1?
else if (UP)
(
UP = 0?
P4>> = 1?
)
else if (P4> 0x01)
P4>> = 1?
άλλος
(
UP = true?
P4 <<= 1?
)
)

 
Γεια onde,

Κατά τη γνώμη μου, το πρόβλημα μπορεί να σας έρχεται κάποια περιορισμό χρήσης.
P4 έχει δηλωθεί reg517a.h από κάτω.
SFR P4 = 0xE8?

Στην περίπτωσή μου, κάθε φορά που θα χρησιμοποιήσετε το ειδικό μητρώο funcion (SFR),
Χρησιμοποιώ την αντικατάσταση της μεταβλητής unsigned char τύπου.

# include <reg517a.h>

void INTTIM0 (void) διακόπτουν 1
(
unsigned char IO = 0?

IO = P4?
αν IO <(0x7f) (
IO <<= 1?
P4 = IO?
)
αν IO> (0x02) (
IO>> = 1?
P4 = IO?
)
TH0 =- 39? / / 10ms
TL0 = 0?
)

main ()
(
P4 = 0x01?
TMOD = 0x01? / / Χρονοδιακόπτη 0 Mode 1 16 Bit
TH0 = -39? / / Κάθε 10ms Int.
TL0 = 0?
ET0 = 1? / / Timer 0 Interrupt άτομα με ειδικές ανάγκες
EAL = 1? / / Ενεργοποίηση όλων

TR0 = 1? / /

while (1)
(
)
)

 

Welcome to EDABoard.com

Sponsor

Back
Top