MSP430 pierwsze kroki

Aug 14, 2006 12 Replies

Witam! Zacząłem naukę MSP430 od zestawu:

formatting link
ć 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?


  1. 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.

  2. 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


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.

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.

Bogdan Gutknecht napisał(a):

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

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

Na pewno bêdzie. Dodatkowo je¶li procesor nie ma dzielenia to lepiej zast±p dzielenie mno¿eniem. Bêdzie szybciej.

Grzegorz Latocha napisał(a):

(...)

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.

(...)

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

Bogdan Gutknecht napisał(a):

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

Maksymilian Dutka napisał(a):

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

Grzegorz Latocha napisał(a): (...)

(...)

Poczytaj sobie:

formatting link
Na początku pisanie programu, miejsce zajmowane przez program będzie szybko rosło potem się wszystko uspokoi.

Pozdrawiam MD

Zamiast dzieliæ przez 3 mno¿ysz przez 85 (256/3) i dzielisz przez 256, czyli bierzesz starszy bajt. Dla s³ów 16-bitowych analogicznie.

Bogdan Gutknecht napisał(a):

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

A o rzutowaniu typów s³ysza³e¶, je¶li nie to poczytaj koniecznie. I przeanalizuj makra poni¿ej: #define byte(ptr,ofs) *(((uint8_t*)&(ptr))+(ofs)) #define word(ptr,ofs) *(((uint16_t*)&(ptr))+(ofs))

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required