C Veranderen variabele types K * E * I * L

G

GrandAlf

Guest
Ik heb een int variabele die in bepaalde delen van het programma bevat een aantal minder dan 255.Ik nodig om dit als een byte met de seriële poort (SBUF = xx).Vlak voor het doorgeven kopieer ik de inhoud van een char variabele en zendt die plaats, aan de andere kant de nummers 1,2,3 worden ontvangen ok, maar 4,5,6 etc niet.Ik kan niet direct gebruik maken van een char variabele,
net als in andere delen van het programma behoeft te worden 16bits.Hebben ook geprobeerd verzenden int variabele rechtstreeks.Ook met en met behulp van het laagmasker bovenste byte, en met>> 4 en <<4 tot verschuiving bits.Geen van deze pogingen lijken te werken.Ik zou het meest waardering van een advies.

 
Wat over weten:

unie
(
unsigned char bytevar [2];
char charvar [2];
unsigned int wordvar;
int intvar;
) variabele;

Als u wenst te gebruiken als 16-bits variable.wordvar of variable.intvar
Of als 8 bits varible.bytevar [0] of variable.bytevar [1] of variable.charvar [0] of variable.charvar [1]

Keil plaatst de lowbyte van de 16 bits variabele in bytevar [1] Hi-Tech op de Pic doet de andere kant ...

hoop dat dit helpt

 
Dankzij C-Man,
Om de redding weer!.

Slechts een klein punt, als K * Eil plaatst alleen de het onderste byte wanneer gekopieerd, waarom niet een gewoon het volgende doen?.

unsigned int a;
unsigned char b;
b = a;

 
Gewoon een kleine opmerking: het verschuiven van een byte is>> 8 of <<8, niet>> 4 of <<4.
Misschien verklaart dit ...

FD.

 
Hoi,
deze opmerkingen zijn niet compiler specifieke, maar ze kunnen ook van extra belang voor u als u probeert te verzenden enkele tekens via de seriële poort:
- U kunt uw stem int naar unsigned char bij het toewijzen van de variabele naar SBUF
- Misschien heb je een timing probleem; enkele MCU's hebben fifo gestileerde xmt buffers voor het doorgeven van tekens en waardoor schrijven meerdere tekens in volgorde voordat ze verzonden door uw seriële poort

hoop dat het geholpen,
Maddin

 
Thx FD, gewoon een domme typfout.

Maddin, Denk maar het kan ook een timing problemen als ontvangen gegevens varieert.Misschien omdat het gebruik van directe SBUF?.

 
De interpretatie van int en char, betekende of ze zijn ondertekend of unsiogned is compiler specifieke functie.
Is het de ondertekende int u probeert te verzenden?
Als nummer ondertekend int is possitive proberen te werpen als
(unsigned char) ((unsigned int) tnum) alvorens te verzenden.

Een andere aanpak, maar ik weet niet of de machine is big endian of little endian

unsigned char * pchar = (unsigned char *) (& intnumber);
dan
sendByte (* pchar) - als is het little endian
of
sendByte (*( pchar)) als het is big endian

 
GrandAlf schreef:

Thx FD, gewoon een domme typfout.Maddin, Denk maar het kan ook een timing problemen als ontvangen gegevens varieert.
Misschien omdat het gebruik van directe SBUF?.
 
GrandAlf als je gebruik maakt van de hardware UART van de 8051 kan het zijn dat je te wachten tot een eerdere karakter is verzonden en de transmit buffer leeg is.

Hier is een fragment van de code die ik gebruik:

void serial_out (unsigned char karakter)
(
while (! TI)
blijven;

TI = FALSE;
SBUF = karakter;
)

De routine wacht totdat de TI (zenden onderbreken) vlag krijgt ingesteld die tekenen dat het voorgaande teken is verzonden volledig.

hoop dat je het kan gebruiken, best regards

 
Thx Artem,
Beide char en zijn unsigned int.Hebben geprobeerd putchar (b);, maar het hangt van de CPU.Nog aan het leren C, misschien kan ik gebruiken voor het verzenden printf ruwe gegevens,
in plaats van met behulp van SBUF rechtstreeks.

 
Zoals lasst redmiddel proberen te vangen van de waarde die u verzendt naar de haven en Sese wat is de assembler output.Dit zeker is het laatste redmiddel als er niets mis met de hardware.

 
Bedankt iedereen,
C-Man, ik gebruikt uw routine, maar veranderde FALSE op 0, zoals ik het niet hebt gedefinieerd.Programma blijft in deze routine eeuwig.Dit leidt mij tot de verdenking dat de vlag nooit set / unset.Moet beschikken over een aantal register-instellingen verkeerd.Zal hebben om een beetje meer lezen denk ik.

 
GrandAlf stuur me je code door PM of post het hier, ik zal eens kijken naar het voor u ...

met vriendelijke groet

 
Dat is erg aardig van je C-Man,

Dit is de code die ik gebruik voor het instellen van de seriële poort, ik ben slechts toezendende (blinde) BTW, en niet ontvangt.

/ / FUNCTIES
void serial_init (void) (
SCON = 0x50; / / mode 1: 8-bit UART,
schakelt de ontvanger
TMOD = 0x20; / / timer 1-modus 2: 8-Bit herlaadbeurt
Th1 = 0x98; / / reload waarde 300 baud
TR1 = 1; / / timer 1 run
ES = 0; / / Disable seriële poort onderbreken
EA = 0 / / Disable
RI = 1;
TI = 1;

 
Probeer deze nieuwe initialisatie code in plaats van de gedetacheerde code

TMOD = 0x20; / / timer 1-modus 2: 8-Bit herlaadbeurt
Th1 = 0x98; / / reload waarde 300 baud
SCON = 0x52; / / mode 1: 8-bit UART,
schakelt de ontvanger TI blijft ingesteld
TR1 = 1; / / timer 1 run
ES = 0; / / Disable seriële poort onderbreken
EA = 0 / / Disable

Ik weet dat ik je gaf de oude code in, maar na controle van mijn code die ik zag dat ik een extra vlag die krijgt de status van de TI-vlag in de seriële interrupt routine (en natuurlijk ik deze vlag op POWER ON).

Bij het op de TI-bit is ingesteld, die betekent dat je kunt een nieuwe byte in SBUF maar als de oude initialisatie code wist TI (zij is gevestigd in SCON) zal nooit opnieuw instellen (het zou gaan stellen als je een byte in SBUF zonder te wachten op de TI te krijgen H).

Ik denk dat je kan alleen maar duidelijk (en niet ingesteld) TI en YDQ door software als deze is ingesteld door de hardware.

Hoop dingen zullen werken met deze code ...

met vriendelijke groet

 
C-Man.

Nog vrijwel hetzelfde met deze configuratie.Ik kan sturen 1,2,3 en ontvangen ze correct, maar met 4 naar boven nog niet is ontvangen of fout is.Ik ben er vrij zeker van zijn dat de ontvangende kant is ok, moeilijk te controleren wat er wordt verzonden als ze niet afdrukbare tekens.Ook moeilijk om een simulatie zonder een ingrijpende wijziging van s / w, zoals ik al probs met randapparatuur en eeprom.

Raar ding maar als ik probeer te gebruiken printf of putchar in plaats van SBUF, het prog niet terugkeren van de functie, waardoor een effectieve vergrendeling van de MPU.Ik zou sumise dat deze funcions wachten op een vlag te worden gewijzigd, en dit is het niet gebeurt.

Ik denk dat ik zal moeten opnieuw schrijven van een klein deel van de code die ik kan simuleren, en ga er op uit.

Ik echt waarderen al uw advies, thank you so much.

 
Ik denk dat ik het probleem hebben gevonden, lijkt te zijn met RTOS.Enkele taak is ok.Tenminste heb ik iets om te werken aan nu.Bedankt voor al uw advies kinnebakspek.

 

Welcome to EDABoard.com

Sponsor

Back
Top