Grzegorz Latocha
Guest
Mon Aug 14, 2006 6:58 am
Witam!
Zacząłem naukę MSP430 od zestawu:
http://www.mikroprocesor.pl/product_info.php?cPath=24_33&products_id=48
choć to chyba nie ma znaczenia dla moich pytań :)
1. Napisałem sobie obsługę odczytu temperatury z wbudowanej diody, ale
co dziwne dwa ostatnie bity w rejestrze ADC12MEM0 są zawsze 11, dzięki
czemu i dokładność i rozdzielczość spadła. Co może być nie tak, nie mam
kodu przy sobie, ale jak trzeba to wkleję w środę. I czy w ogóle ma
jakikolwiek sens używanie tej diody do mierzenia temperatury otoczenia,
procesor przy 32kHz chyba nie grzeje się aż tak bardzo?
2. Poczułem radość z pisania w C (choć nie znam go dobrze - prawie
wcale) i zacząłem używać zmiennych typu float, ale one strasznie dużo
pamięci zabierają. Program zliczający ilość naciśnięć klawisza + proste
menu + kilka obliczeń zajmuje ponad 7kB! Tak na moje oko to podobny
mieściłem w C2051 Atmela. Są jakieś inne biblioteki do przecinków, czy
po prostu unikacie liczb float. Acha kompiluję MSPGCC.
3. Mam jeszcze pytanie o programowanie wewnętrznego flasha, chcę używać
information memory do zapisywania ustawień. Ale po lekturze mam pytanie,
czy jeżeli program zajmuje ok 10kB to pozostałe 50kB z program memory
mogę wykorzystać jako DataFlash? byłoby fajnie, a nie znalazłem w DS
żednych zakazów co do tego, oczywiście z pominięciem ostatniego bloku,
gdzie są wektory przerwań.
To na razie tyle, pewnie się jeszcze urodzą jakieś pytania
pozdrawiam
Grzegorz
Bogdan Gutknecht
Guest
Mon Aug 14, 2006 8:58 am
Quote:
2. Poczułem radość z pisania w C (choć nie znam go dobrze - prawie
wcale) i zacząłem używać zmiennych typu float, ale one strasznie dużo
pamięci zabierają. Program zliczający ilość naciśnięć klawisza + proste
menu + kilka obliczeń zajmuje ponad 7kB! Tak na moje oko to podobny
mieściłem w C2051 Atmela. Są jakieś inne biblioteki do przecinków, czy
po prostu unikacie liczb float. Acha kompiluję MSPGCC.
A jak sądzisz? W assemblerze do zliczania wciśnięć stosowałeś arytmetykę
zmiennoprzecinkową? Zapewne nie. Dlaczego? Bo byłby to przejaw głupoty. To
dlaczego pisząc w C chcesz to robić? Kompilator nie wprowadzi nowych
instrukcji do procesora tylko będzie wykorzystywał te, które procesor
posiada.
Kompilator robi to co mu kazesz. Jeśli każesz używać mu zmiennej float to on
rezerwuje na nią miejsce w pamięci, później każesz dodać jeden to dodaje
korzystając z arytmetyki zmiennoprzecinkowej. Jak porównuje dwie liczby to
porównuje wszystkie ich bajty. I tak za każdym odwołaniem do tej zmiennej.
J.F.
Guest
Mon Aug 14, 2006 9:12 am
On Mon, 14 Aug 2006 08:58:22 +0200, Grzegorz Latocha wrote:
Quote:
2. Poczułem radość z pisania w C (choć nie znam go dobrze - prawie
wcale) i zacząłem używać zmiennych typu float, ale one strasznie dużo
pamięci zabierają. Program zliczający ilość naciśnięć klawisza + proste
menu + kilka obliczeń zajmuje ponad 7kB! Tak na moje oko to podobny
mieściłem w C2051 Atmela. Są jakieś inne biblioteki do przecinków, czy
po prostu unikacie liczb float. Acha kompiluję MSPGCC.
Niestety ale na 8-bitowe procki 4 dzialania zajmuja ok kilobajta.
A jak jeszcze wstawiles printf w pelnej wersji, to to jest wielka
kobyla.
J.
Grzegorz Latocha
Guest
Mon Aug 14, 2006 11:00 am
Bogdan Gutknecht napisał(a):
Quote:
2. Poczułem radość z pisania w C (choć nie znam go dobrze - prawie
wcale) i zacząłem używać zmiennych typu float, ale one strasznie dużo
pamięci zabierają. Program zliczający ilość naciśnięć klawisza + proste
menu + kilka obliczeń zajmuje ponad 7kB! Tak na moje oko to podobny
mieściłem w C2051 Atmela. Są jakieś inne biblioteki do przecinków, czy
po prostu unikacie liczb float. Acha kompiluję MSPGCC.
A jak sądzisz? W assemblerze do zliczania wciśnięć stosowałeś arytmetykę
zmiennoprzecinkową? Zapewne nie. Dlaczego? Bo byłby to przejaw głupoty. To
dlaczego pisząc w C chcesz to robić? Kompilator nie wprowadzi nowych
instrukcji do procesora tylko będzie wykorzystywał te, które procesor
posiada.
Kompilator robi to co mu kazesz. Jeśli każesz używać mu zmiennej float to on
rezerwuje na nią miejsce w pamięci, później każesz dodać jeden to dodaje
korzystając z arytmetyki zmiennoprzecinkowej. Jak porównuje dwie liczby to
porównuje wszystkie ich bajty. I tak za każdym odwołaniem do tej zmiennej.
no przeciez nie dodaje impulsow w zmiennej float. Ale pozniej te impulsy
mnoze razy np. 25 i dziele przez 0,9873 i tu przyznasz że float bywa
pomocny, no ale nic zrobię tak, że przemnoże wszystko przez 10000 a
potem na etapie konwersji na LCD skrocę o kilka miejsc. Obsluga mnożenia
dwu słownego powinna być krótsza niż floaty. Chyba, że macie inny pomysł?
pozdrawiam
Grzegorz Latocha
Guest
Mon Aug 14, 2006 11:02 am
J.F. napisał(a):
Quote:
On Mon, 14 Aug 2006 08:58:22 +0200, Grzegorz Latocha wrote:
2. Poczułem radość z pisania w C (choć nie znam go dobrze - prawie
wcale) i zacząłem używać zmiennych typu float, ale one strasznie dużo
pamięci zabierają. Program zliczający ilość naciśnięć klawisza + proste
menu + kilka obliczeń zajmuje ponad 7kB! Tak na moje oko to podobny
mieściłem w C2051 Atmela. Są jakieś inne biblioteki do przecinków, czy
po prostu unikacie liczb float. Acha kompiluję MSPGCC.
Niestety ale na 8-bitowe procki 4 dzialania zajmuja ok kilobajta.
A jak jeszcze wstawiles printf w pelnej wersji, to to jest wielka
kobyla.
J.
to dobrze, że MSP jest 16

hmmm, nie używam printf, bo nie bardzo wiem co by mi to moglo dać,
przecież nie wyrzuci mi tego na LCD domyślnie??
pozdrwiam
GL
Bogdan Gutknecht
Guest
Mon Aug 14, 2006 11:52 am
Quote:
no przeciez nie dodaje impulsow w zmiennej float. Ale pozniej te impulsy
mnoze razy np. 25 i dziele przez 0,9873 i tu przyznasz że float bywa
pomocny, no ale nic zrobię tak, że przemnoże wszystko przez 10000 a
potem na etapie konwersji na LCD skrocę o kilka miejsc. Obsluga mnożenia
dwu słownego powinna być krótsza niż floaty. Chyba, że macie inny pomysł?
pozdrawiam
Na pewno będzie. Dodatkowo jeśli procesor nie ma dzielenia to lepiej zastąp
dzielenie mnożeniem. Będzie szybciej.
Maksymilian Dutka
Guest
Mon Aug 14, 2006 12:02 pm
Grzegorz Latocha napisał(a):
Quote:
J.F. napisał(a):
On Mon, 14 Aug 2006 08:58:22 +0200, Grzegorz Latocha wrote:
2. Poczułem radość z pisania w C (choć nie znam go dobrze - prawie
wcale) i zacząłem używać zmiennych typu float,
(...)
Jeżeli wolny procesor i jest mało miejsca to lepiej unikać. Niestety w
tego typu procesorach, obliczenia na liczbach zmiennoprzecinkowych są
emulowane, a kod do ich emulacji trochę zajmuje i niestety jest bardzo
wolny.
(...)
Quote:
hmmm, nie używam printf, bo nie bardzo wiem co by mi to moglo dać,
przecież nie wyrzuci mi tego na LCD domyślnie??
Jak go zmusisz to tak, ale trzeba trochę pokombinować. Lepiej użyć
sprintf. Co on daje, ano bardzo dużo: możesz ładnie wszystko
skonwertować i sformatować do ślicznej postaci dającej się pokazać
użytkownikowi.
Z tym że pełna wersja to Ci z 10KB wsyśnie ;)
Przykład:
Chcesz wyświetlić aktualny czas:
char bufor[50];
int godzina=14;
int minuta=05;
int sekunda=50;
sprintf(bufor,"%d Godzin %d Minut %d Sekund",godzina,minuta,sekunda);
w bufor masz:
14 Godzin 5 Minut 50 Sekund
łatwiej czegoś takiego nie zrobisz :)
Pozdrawiam
MD
Grzegorz Latocha
Guest
Mon Aug 14, 2006 12:03 pm
Bogdan Gutknecht napisał(a):
Quote:
no przeciez nie dodaje impulsow w zmiennej float. Ale pozniej te impulsy
mnoze razy np. 25 i dziele przez 0,9873 i tu przyznasz że float bywa
pomocny, no ale nic zrobię tak, że przemnoże wszystko przez 10000 a
potem na etapie konwersji na LCD skrocę o kilka miejsc. Obsluga mnożenia
dwu słownego powinna być krótsza niż floaty. Chyba, że macie inny pomysł?
pozdrawiam
Na pewno będzie. Dodatkowo jeśli procesor nie ma dzielenia to lepiej zastąp
dzielenie mnożeniem. Będzie szybciej.
hmm, a jak się zastępuje dzielenie mnożeniem, zawsze zastępowałem
odejmowaniem, ale jeżeli da się mnożeniem byłoby miło bo procesor ma
sprzętowe mnożenie
proszę o algorytm
Grzegorz Latocha
Guest
Mon Aug 14, 2006 12:26 pm
Maksymilian Dutka napisał(a):
Quote:
Grzegorz Latocha napisał(a):
J.F. napisał(a):
On Mon, 14 Aug 2006 08:58:22 +0200, Grzegorz Latocha wrote:
2. Poczułem radość z pisania w C (choć nie znam go dobrze - prawie
wcale) i zacząłem używać zmiennych typu float,
(...)
Jeżeli wolny procesor i jest mało miejsca to lepiej unikać. Niestety w
tego typu procesorach, obliczenia na liczbach zmiennoprzecinkowych są
emulowane, a kod do ich emulacji trochę zajmuje i niestety jest bardzo
wolny.
(...)
hmmm, nie używam printf, bo nie bardzo wiem co by mi to moglo dać,
przecież nie wyrzuci mi tego na LCD domyślnie??
Jak go zmusisz to tak, ale trzeba trochę pokombinować. Lepiej użyć
sprintf. Co on daje, ano bardzo dużo: możesz ładnie wszystko
skonwertować i sformatować do ślicznej postaci dającej się pokazać
użytkownikowi.
Z tym że pełna wersja to Ci z 10KB wsyśnie ;)
Przykład:
Chcesz wyświetlić aktualny czas:
char bufor[50];
int godzina=14;
int minuta=05;
int sekunda=50;
sprintf(bufor,"%d Godzin %d Minut %d Sekund",godzina,minuta,sekunda);
w bufor masz:
14 Godzin 5 Minut 50 Sekund
łatwiej czegoś takiego nie zrobisz :)
ooo, super, super, tylko ciekawe ile kodu, ja to na pieszo przez
dziesięć i reszta z dzielenia, co jest dosyć krótkie
ale podoba mi się bardzo, dzisiaj zobaczę ile zajmuje w pamięci
Dzięki wielkie wszystkim
pozdrawiam
GL
Maksymilian Dutka
Guest
Mon Aug 14, 2006 12:51 pm
Grzegorz Latocha napisał(a):
(...)
Quote:
Przykład:
Chcesz wyświetlić aktualny czas:
char bufor[50];
int godzina=14;
int minuta=05;
int sekunda=50;
sprintf(bufor,"%d Godzin %d Minut %d Sekund",godzina,minuta,sekunda);
w bufor masz:
14 Godzin 5 Minut 50 Sekund
łatwiej czegoś takiego nie zrobisz :)
ooo, super, super, tylko ciekawe ile kodu, ja to na pieszo przez
dziesięć i reszta z dzielenia, co jest dosyć krótkie
(...)
Poczytaj sobie:
http://www.cplusplus.com/ref/cstdio/sprintf.html
Na początku pisanie programu, miejsce zajmowane przez program będzie
szybko rosło potem się wszystko uspokoi.
Pozdrawiam
MD
Bogdan Gutknecht
Guest
Mon Aug 14, 2006 3:44 pm
Quote:
hmm, a jak się zastępuje dzielenie mnożeniem, zawsze zastępowałem
odejmowaniem, ale jeżeli da się mnożeniem byłoby miło bo procesor ma
sprzętowe mnożenie
proszę o algorytm
Zamiast dzielić przez 3 mnożysz przez 85 (256/3) i dzielisz przez 256, czyli
bierzesz starszy bajt. Dla słów 16-bitowych analogicznie.
Grzegorz Latocha
Guest
Wed Aug 16, 2006 6:40 am
Bogdan Gutknecht napisał(a):
Quote:
hmm, a jak się zastępuje dzielenie mnożeniem, zawsze zastępowałem
odejmowaniem, ale jeżeli da się mnożeniem byłoby miło bo procesor ma
sprzętowe mnożenie
proszę o algorytm
Zamiast dzielić przez 3 mnożysz przez 85 (256/3) i dzielisz przez 256, czyli
bierzesz starszy bajt. Dla słów 16-bitowych analogicznie.
hmm, będę musiał popróbować i dowiedzieć się jak skopiować wyższe dwa
bajty z long int do zwykłego int. Narazie mam zrobioną pętlę odejmującą,
używam tego do konwersji na znaki, więc maksymalnie robi 9 pętli -
tragedii nie ma, ale na przyszłość.
A tak w ogóle to dziękuję za dobre tipsy. Wyrzuciłem floaty i dzielenie
i program zmalał o połowę

)
Teraz jeszcze problem z napisami, który też trochę zredukuje, ale to
nowy wątek założyłem bo taki bardziej ogólny:).
pozdrawiam
GL