Zapis długiej liczby ze znakiem do EEPROM w '8252' - problem z operatorem >>
8051, Keil C i dlugie liczby
From: "Artur Miller" <armi_at_nospam_poczta.onet.pl>
Subject: 8051, Keil C i dlugie liczby
Date: Wed, 18 Apr 2001 12:13:23 +0200
7 :)
Probuje zapisac dluga liczbe ze znakiem do eeproma w '8252. Robie to tak:
adres = (...);
for (i = 1; i <= 4; i++)
{
c = liczba & 0xFF;
zapisz_eeprom(adres, c);
adres++;
liczba = liczba >> 8;
}
Problem w tym, ze w czterech kolejnych komorkach eeproma znajduje sie ta
sama wartosc i jest to najmlodszy bajt zapisywanej liczby. Czy operator ">>"
dziala tylko w obrebie jednego bajtu ? Jesli tak, to jak zapisac dluga
liczbe do eeproma ?
_at_nospam_
From: "peters" <peters_at_nospam_poczta.onet.pl>
Subject: Re: 8051, Keil C i dlugie liczby
Date: Wed, 18 Apr 2001 12:18:26 +0200
adres = (...);
for (i = 1; i <= 4; i++)
{
c = liczba & 0xFF;
zapisz_eeprom(adres, c);
adres++;
liczba = liczba >> 8;
}
Nie podoba mi sie: c = liczba & 0xFF. Uzyles typu char i long.
Zrob to inaczej. Wiesz co to sa unie? Zadeklaruj unie zmiennej long i
czterobajtowej tablicy char
--
pozdrawiam, peters
peters_at_nospam_poczta.onet.pl
http://peters.republika.pl (strona Petersa dla elektroników)
From: "Artur Miller" <armi_at_nospam_poczta.onet.pl>
Subject: Re: 8051, Keil C i dlugie liczby
Date: Wed, 18 Apr 2001 12:27:21 +0200
Użytkownik "peters" <peters_at_nospam_poczta.onet.pl> napisał w wiadomości
news:9bjpvb$fdj$1_at_nospam_news.tpi.pl...
adres = (...);
for (i = 1; i <= 4; i++)
{
c = liczba & 0xFF;
zapisz_eeprom(adres, c);
adres++;
liczba = liczba >> 8;
}
Nie podoba mi sie: c = liczba & 0xFF. Uzyles typu char i long.
Zrob to inaczej. Wiesz co to sa unie?
Jeszcze nie wiem ale pewnie zaraz sie dowiem :) Ale nawet jak zrobie c =
liczba & 0xFFL; to tez nic z tego :(
_at_nospam_
From: "Andy" <anok_at_nospam_ceti.pl>
Subject: Re: 8051, Keil C i dlugie liczby
Date: Wed, 18 Apr 2001 12:34:01 +0200
Artur Miller napisał(a) w wiadomości: <9bjq5m$ghg$1_at_nospam_news.onet.pl>...
...
Jeszcze nie wiem ale pewnie zaraz sie dowiem :) Ale nawet jak zrobie c =
liczba & 0xFFL; to tez nic z tego :(
zrob "c" takiego typu jak "liczba" powiedzmy long
i "cc" typu char
c = liczba;
c &= 0xffL;
cc = c;
oczywiscie unie sa rozwazaniem eleganckim
ale ciekaw jestem czy to pomoze ???
Andrzej
From: "Artur Miller" <armi_at_nospam_poczta.onet.pl>
Subject: Re: 8051, Keil C i dlugie liczby
Date: Wed, 18 Apr 2001 12:52:53 +0200
Użytkownik "Andy" <anok_at_nospam_ceti.pl> napisał w wiadomości
news:9bjqn2$ik4$1_at_nospam_news.tpi.pl...
Artur Miller napisał(a) w wiadomości: <9bjq5m$ghg$1_at_nospam_news.onet.pl>...
...
Jeszcze nie wiem ale pewnie zaraz sie dowiem :) Ale nawet jak zrobie c =
liczba & 0xFFL; to tez nic z tego :(
zrob "c" takiego typu jak "liczba" powiedzmy long
i "cc" typu char
c = liczba;
c &= 0xffL;
cc = c;
oczywiscie unie sa rozwazaniem eleganckim
ale ciekaw jestem czy to pomoze ???
Wyglada na to, ze pomoglo ... :D
_at_nospam_
From: "peters" <peters_at_nospam_poczta.onet.pl>
Subject: Re: 8051, Keil C i dlugie liczby
Date: Wed, 18 Apr 2001 12:54:18 +0200
Wyglada na to, ze pomoglo ... :D
A nie mowilem, ze C jest trudnym jezykiem?! :))
Teraz zrob to uzywając unii Zastosowane przez Ciebie rozwiazanie jest
bardzo nieeleganckie i nieefektywne.
--
pozdrawiam, peters
peters_at_nospam_poczta.onet.pl
http://peters.republika.pl (strona Petersa dla elektroników)
From: "Tomasz Gumny" <tgumny_at_nospam_idn.org.pl>
Subject: Re: 8051, Keil C i dlugie liczby
Date: Wed, 18 Apr 2001 13:04:27 +0200
oczywiscie unie sa rozwazaniem eleganckim
ale ciekaw jestem czy to pomoze ???
Wyglada na to, ze pomoglo ... :D
A nie masz zwyczaju sprawdzac jak kompilator przeklada niektore konstrukcje?
Mozna sie z tego sporo nauczyc, a przy okazji troche zoptymalizowac zapis. Tak
przy okazji: ja uzywam definicji:
union
{
unsigned int i;
struct { char highbyte, lowbyte; } s;
} x;
Oczywiscie mozna to zastosowac do dluzszych liczb niz int.
TG
From: =?iso-8859-2?Q?Marek_Szyma=F1ski?= <maras_at_nospam_cso.com.pl>
Subject: Re: 8051, Keil C i dlugie liczby
Date: Fri, 20 Apr 2001 15:26:58 +0200
Tak
przy okazji: ja uzywam definicji:
union
{
unsigned int i;
struct { char highbyte, lowbyte; } s;
} x;
Oczywiscie mozna to zastosowac do dluzszych liczb niz int.
A można zrobić tak ???
union {
unsigned long liczba;
unsigned char bajty[4];
} u;
i odwoływać się:
u.liczba = 0; jak chcę mieć liczbę
lub
u.bajty[n] = 0; jak chcę mieć n-ty bajt liczby
????
Marek Szymański
From: "Artur Miller" <armi_at_nospam_poczta.onet.pl>
Subject: Re: 8051, Keil C i dlugie liczby
Date: Fri, 20 Apr 2001 16:02:02 +0200
Użytkownik "Marek Szymański" <maras_at_nospam_cso.com.pl> napisał w wiadomości
news:9bpdhk$2hs$1_at_nospam_news.tpi.pl...
A można zrobić tak ???
union {
unsigned long liczba;
unsigned char bajty[4];
} u;
i odwoływać się:
u.liczba = 0; jak chcę mieć liczbę
lub
u.bajty[n] = 0; jak chcę mieć n-ty bajt liczby
Pewnie mozna bo i tak probowalem, ale jakos programik sie zwieszal i nie
mialem czasu dochodzic dlaczego ... zreszta nie jest to jakis krytyczny
moment w programie, zeby nie mialoby byc wolniej. A urzadzonko poszlo juz do
klienta ... po temacie, ale dzieki za odzew.
_at_nospam_
From: Marcin Wolcendorf <wolcendo_at_nospam_free.polbox.pl>
Subject: Re: 8051, Keil C i dlugie liczby
Date: Wed, 18 Apr 2001 16:58:00 +0200
Andy wrote:
Artur Miller napisał(a) w wiadomości: <9bjq5m$ghg$1_at_nospam_news.onet.pl>...
...
Jeszcze nie wiem ale pewnie zaraz sie dowiem :) Ale nawet jak zrobie c =
liczba & 0xFFL; to tez nic z tego :(
zrob "c" takiego typu jak "liczba" powiedzmy long
i "cc" typu char
c = liczba;
c &= 0xffL;
cc = c;
oczywiscie unie sa rozwazaniem eleganckim
ale ciekaw jestem czy to pomoze ???
A gdyby tak, a może by:
((unsigned char*)(&liczba))[i]
gdzie 'i' jest licznikiem pętli.
Tylko nie piszcie, ile to-to zajmuje i dlaczego operacje na wskaźnikach
są takie długie... ;-).
--
The yellow jester does not play,
But gently pulls the strings
And smiles, as the puppets dance
In... ( (C) McDonald-Sinfield )