| Naam |
Bericht |
weerstandje
|
hallo
voor een project van me wil ik twee byt's versturen tussen twee pic18f4550 Deze bytes vormen samen een getal.Dit getal zou ik graag in een integer stoppen maar hoe doe ik dit.Ik programmeer in c dus volgens mij zou dat dan wel moeten kunnen.
|
smoerijf
|
code:
word = (HiByte << 8) | LowByte;
Bit shifting, ga je nog véél nodig. Zoek maar eens op bij google...
http://smoerijf.be
|
Robert Evers
|
code: word = (HiByte << 8) | LowByte;
Moet dat niet gecast worden?
code: word = ((unsigned int)HiByte << 8) | LowByte;
Zit daar altijd mee te prullen, maar HiByte<<8 schuift alles uit een byte...
Robert [Bericht gewijzigd door Robert Evers op 17 augustus 2008 15:43:53]
|
weerstandje
|
quote:
wat houd dat in?
code:
templ = 0xff; //255
temph = 0x64; //100
tempt = (temph << 8) | templ;
tempt = tempt - 0xff;
als ik tempt via rs232 naar me comp stuur vind ik ascii waarde 'd' niet terug.hoe kan dit? [Bericht gewijzigd door weerstandje op 17 augustus 2008 16:13:28]
|
Omicron
|
Welke data types zijn templ en templh? Als het chars zijn of unsigned chars dan zijn ze dus 1 byte groot. De operatie:
schuift de inhoud van die byte met 8 plaatsen naar links, gevolg een lege byte (allemaal nullen).
Je moet zorgen dat je er eerst een breder datatype van maakt. Ofwel volg je het advies van Robert en cast je eerst ofwel doe je iets als:
code: unsigned int tempt;
tempt = temph;
tempt = tempt << 8 | templ; [Bericht gewijzigd door Omicron op 17 augustus 2008 16:41:03]
|
weerstandje
|
ik gebruik wel int.
code:
int templ;
tnt temph;
int tempt;
unsigned wat geef je hier mee aan?
|
smoerijf
|
dat je geen negatieve getallen gebruikt.
Bij unsigned int kun je dus dubbel zo grote getallen insteken tov signed
signed byte: -128 .. 127
unsigned: 0 .. 255
Ik "cast" men variablen nooit. Ik programmeer wel in AVR-gcc (avrStudio) ... maarja C == C [Bericht gewijzigd door smoerijf op 17 augustus 2008 17:41:45]
http://smoerijf.be
|
free_electron
|
kloddeprogrammeurs....
Je gaat daar toch geen cpu cycles aan verspelen zeker ...
map die variabelen gewoon boven elkaar.
geen idee hoe het met jouw c compiler moet maar in IAR c
pragma _location_ 0x000100
int x;
pragma _location_ 0x000100
byte a;
pragma _location_ 0x000101
byte b;
voila.
die variabelen nemen nu dezelfde geheugenruimte in beslag ( overlayen noemen ze dat )
bij sommige compilers kan je stomweg een struct maken van 2 bytes en die toekennen aan dezelfde locatie van x.
Professioneel ElectronenTemmer - 8 April 08 : 7.355.303
|
Marco69
Golden Member
|
Blijft natuurlijk de vraag wat je compiler er van bakt als je een (unsigned) int naar buiten jast. Het zou mij niet verbazen als het ding alleen de laagste 8 bits pakt...
Zorg dat je NOOIT, NOOIT, NOOIT wat met Versatel Tele2 te maken krijgt!
|
stecj366
|
Ik doe het zo:
union ADC_U_Type{
int Data32;
short int Data16[2];
};
en dan kan je dit doen:
ADC_U_Type test;
test.Data16[0] = 5;
test.Data32[1] = 10;
maar ook test.Data32 kan je gebruiken, waardoor je de twee variabelen dan in 1 keer gebruikt. Werkt wat mooier dan die location pragma's
|
Daan Timmer
|
Of zo proberen:
zal wel niet compilen wegens naam foutje in de union zelf, dus zie het maar meer als een soort van pseudocode
code:
union mijnInt{
struct {
unsigned byte hiByte;
unsigned byte loByte;
};
unsigned int word; //met een PIC = int 2bytes en een short
//ook 2bytes, maar sommige compilers zien een int als 4bytes....
unsigend byte bytes[2];
}
vervolgens kan je dit doen:
mijnInt.word = 1000;
mijnInt.hiByte = 50;
mijnInt.loByte = 255;
uartTX(mijnint.bytes[0]);
uartTX(mijnInt.bytes[1]);
edit voor leesbaarheid [Bericht gewijzigd door Daan Timmer op 18 augustus 2008 15:15:31]
Eindelijk mijn eigen domein!: http://www.daantimmer.nl/ (nu nog beetje leeg, moet nog ontwerpje komen :P)
|
flipflop
|
quote:
Juist! Een union is precies wat hiervoor bedoeld is. Dat wat FE laat zien is echt GEPRUTS (als we dan toch gaan schelden). Voor geen meter relocatable en zeer afhankelijk van de gebruikte CPU en compiler.
@sitebuilder: dit topic wordt wel heeeeel erg breed. Zijn er al plannen om dit te fixen? [Bericht gewijzigd door flipflop op 18 augustus 2008 10:37:07]
if (rst='1') then d <= '1' elsif (clk'event and clk='1') then d <= data end if;
|
stecj366
|
Komt door Naadje z'n post, met de lange comment achter de code
|
JoWi
|
Bij het gebruik van een union:
Sommige C compilers hebben een #pragma pack(1) regel nodig en denk ook aan
de endianness van je compiler (welk byte het high en welk byte het low byte is) [Bericht gewijzigd door JoWi op 18 augustus 2008 10:57:29]
|
Robert Evers
|
Kort samen gevat, casten die handel  .
Blijft tenminste leesbaar en begrijpbaar
Robert [Bericht gewijzigd door Robert Evers op 18 augustus 2008 20:46:07]
|
bobo1on1
|
quote: Op 18 augustus 2008 10:36:16 schreef flipflop:
[...]
Juist! Een union is precies wat hiervoor bedoeld is. Dat wat FE laat zien is echt GEPRUTS (als we dan toch gaan schelden). Voor geen meter relocatable en zeer afhankelijk van de gebruikte CPU en compiler.
@sitebuilder: dit topic wordt wel heeeeel erg breed. Zijn er al plannen om dit te fixen?
De juiste manier om dat te doen is met bitshifts en and bewerkingen, met een union ben je afhankelijk van de endianness van je systeem, dat probeer je met een hogere taal als C juist te voorkomen.
De C18 compiler van microchip doet naar mijn ervaring nogal raar met bitshifts, als je dat probleem hebt kun je ook delen of vermenigvuldigen met een macht van 2, dat is bijna dezelfde bewerking.
|
free_electron
|
quote:
Dat voorbeeld wat ik gaf was cut en paste uit een stuk code van mij. Ik moet daar harde addressen gebruiken want dat is geen geheugen maar een I/O blok wat daar staat ( een 16 bit DAC in mijn geval. En ik gaf ook op dat het voor een IAR compiler was.
Ik veronderstelde dat de TS iets gelijkaardig wou ( een ADC of DAC van 16 bits waarvan hij aan de twee losse bytes wil kunnen. Dan is hardcoding van de adressen de beste optie. Op die chip zit die a/d of dac immers altijd daar en is relocating niet aan de orde.
@bobo1on1 . jaja bitshifting en and bewerkingen..en dan maar janken over bloatware en slechte performance ...
Stel eens dat je een wavegenerator aan het maken bent. in een grote loop draai je de wave naar of van de dac ... jij gaat 5 of 6 instructies verspelen per dac waarde ....
met een direct map 1 instructie .... groot speed verschil. [Bericht gewijzigd door free_electron op 18 augustus 2008 21:18:58]
Professioneel ElectronenTemmer - 8 April 08 : 7.355.303
|
weerstandje
|
quote: Op 18 augustus 2008 20:53:12 schreef bobo1on1:
[...]
De C18 compiler van microchip doet naar mijn ervaring nogal raar met bitshifts, als je dat probleem hebt kun je ook delen of vermenigvuldigen met een macht van 2, dat is bijna dezelfde bewerking.
Een tijd terug heb ik driver geschenen voor een hd44780 ik wilde hier voor de 4 bit interface gebruiken en toen kwam ik er ook achter dat het bit shiften raar doet, heb dit op gelost met een swapf in asm.
Maar goed hoe kan ik het dan heb best oplossen want ik gebruik wel de c18 compiler.
Dus ik moet de hoge byte vermenigvuldiger met twee.dit nog 7 keer herhalen [Bericht gewijzigd door weerstandje op 20 augustus 2008 21:43:59]
|