-
21. Data: 2009-10-14 12:38:46
Temat: Re: Dlaczego ATmega128 przekłamuje?
Od: "T.M.F." <t...@n...mp.pl>
> Dzięki za linka. Prawdopodobnie to rozwiąże ten problem. Szkoda tylko że
> trzeba odwoływać się do różnych chytrych sztuczek żeby uzyskać, tak
> wydaje się, podstawowe i częste pożądane działania.
Bo gcc nie byl projektowany do architektury harvardzkiej i nie ma
koncepcji roznych typow pamieci zajmujacych te same adresy. Co byc moze
sie zmieni, ale i tak niewiele z tego wyniknie. Natomiast jesli jest to
takim problemem to sa platne narzedzia.
> A za to jest bardzo fajna właściwość, bo można zadeklarować zmienne
> pełniące rolę dwustanowych flag jako "bool". Podejrzewam, że nie zajmują
> wtedy całego bajtu. Jeśli tak , to przydało by się coś takiego w
> programowaniu ATmegi. Kupę RAM-u zajmują flagi. Duże marnotrawstwo.
> Bawienie się w maski, to znów przystosowywanie się do kaprysów komputera.
Przejrzyj liste instrukcji AVR i nie bedziesz mial zludzen. Mozesz
zadeklarowac zmienna bool, mozesz wykorzystac pola bitowe, ale to ciagle
bedzie tlumaczone na operacje na bitach typu ustawianie, zerowanie itd.
--
Inteligentny dom - http://idom.wizzard.one.pl
http://idom.sourceforge.net/
Teraz takze forum dyskusyjne
Zobacz, wyslij uwagi, dolacz do projektu.
-
22. Data: 2009-10-14 12:39:53
Temat: Re: Dlaczego ATmega128 przekłamuje?
Od: "T.M.F." <t...@n...mp.pl>
> Ale to przecież nic innego jak zabawa w maski. Stosowanie chytrych
> sztuczek i obiegnięć do osiągnięcia, wydawałoby się, prostego celu.
> Kompilator robi miliony różnych automatycznych operacji, mógłby robić
> również i to. Wszystko powinno być podporządkowane wygodzie człowieka.
> Po co zaśmiecać głowę i treść programu operacjami które może zrobić
> maszyna.
> Szybkość, łatwość i wygoda, to powinny być priorytety w pracy programisty.
Postaraj sie zrozumiec na czym polega problem, bo to co piszesz jest
odpowiednikiem populizmu.
--
Inteligentny dom - http://idom.wizzard.one.pl
http://idom.sourceforge.net/
Teraz takze forum dyskusyjne
Zobacz, wyslij uwagi, dolacz do projektu.
-
23. Data: 2009-10-14 13:15:08
Temat: Re: Dlaczego ATmega128 przekłamuje?
Od: DJ <j...@p...onet.pl>
On 2009-10-14 14:36:32 +0200, "Darkac" <d...@w...pl> said:
> Użytkownik "DJ" <j...@p...onet.pl> napisał w
> wiadomości news:hb4f5g$v2f$1@news.dialog.net.pl...
>> On 2009-10-14 13:59:08 +0200, "Darkac" <d...@w...pl> said:
>>
>>> za to jest bardzo fajna właściwość, bo można zadeklarować zmienne
>>> pełniące rolę dwustanowych flag jako "bool". Podejrzewam, że nie
>>> zajmują wtedy całego bajtu. Jeśli tak , to przydało by się coś takiego
>>> w programowaniu ATmegi. Kupę RAM-u zajmują flagi. Duże marnotrawstwo.
>>
>> Oj, kłania się C...
>> http://en.wikipedia.org/wiki/Bit_field
>>
>
> Ale to przecież nic innego jak zabawa w maski.
struct?
i nawet nie przejrzałeś całej strony...
> Szybkość, łatwość i wygoda, to powinny być priorytety w pracy programisty.
Może jeszcze żeby się program sam napisał, podczas kiedy programista na
wakacjach.
--
DJ
PS. przy odpisywaniu na priv usun antyspamowy wpis z adresu
-
24. Data: 2009-10-14 13:17:47
Temat: Re: Dlaczego ATmega128 przekłamuje?
Od: Konop <k...@g...pl>
>>> w sumie liczą. Jak zrobić żeby stałe te były pobierane z pamięci
>>> programu we Flashu? Dlaczego powielane są do RAM-u? Czy słowo "const"
>>> oprócz
>> http://www.nongnu.org/avr-libc/user-manual/pgmspace.
html
> Dzięki za linka. Prawdopodobnie to rozwiąże ten problem. Szkoda tylko że
> trzeba odwoływać się do różnych chytrych sztuczek żeby uzyskać, tak
> wydaje się, podstawowe i częste pożądane działania.
Witam!!
Proponuję Tobie zapoznanie się z architekturą AVRów!! To nie jest
prosta sprawa w tym procku... są instrukcje LPM i SPM, wymagają
adresowania rejestrem Z. To nie jest ARM, w którym wszystko leży w
jednej przestrzeni adresowej i możesz odwoływać się do pamięci Flash tak
jak do pamięci RAM. Uważam, że dobrze, że pamięć Flash w AVRze obsługuje
się nie jak zwykłe zmienne, bo wymusza to na programiście odpowiednie
podejście do tego typu zmiennych. Poza tym, język C powinien być
standardowy, niezależnie od architektury docelowej. Stała obsługiwana
jest jak zwykła zmienna. W komputerach klasy PC stałe (const) trzymane
są w pamięci RAM, bo nie ma innego wyjścia. W ARMach trafiają do pamięci
Flash z reguły, bo jest jedna przestrzeń adresowa. Czemu dla AVRów
miałby być wyjątek??
> programowanie, gdzie nie jest przewidziany binarny sposób zapisu liczby.
> Jedynie dec lub hex. Prawdziwy horror, kiedy wciąż trzeba manipulować na
> pojedynczych bitach zmiennych czy rejestrów.
Jeśli chodzi tylko o zapis liczby, to ja tam wolę pisać 0x31fc zamiast
0011000111111100 ;)...
> A za to jest bardzo fajna właściwość, bo można zadeklarować zmienne
> pełniące rolę dwustanowych flag jako "bool". Podejrzewam, że nie zajmują
> wtedy całego bajtu. Jeśli tak , to przydało by się coś takiego w
> programowaniu ATmegi. Kupę RAM-u zajmują flagi. Duże marnotrawstwo.
> Bawienie się w maski, to znów przystosowywanie się do kaprysów komputera.
Hmmm... no to używaj DWUKROPKA :)... albo zrób sobie proste makra...
fakt, samemu musisz pogrupować flagi w bajty, no ale przynajmniej możesz
w łatwy sposób wpisywać "komplet" wartości... ja to robię na przykład
tak - definiuję sobie każdą zmienną stanu oraz kolejne jej bity:
#define STAN_URZADZENIA ucDeviceStatus
#define URZADZENIE_WLACZONE 0
#define URZADZENIE_ZAJETE 1
...
#define URZADZENIE_ZEPSUTE 7
później tworzę (wspólne dla wszystkich zmiennych stanu) makra do obsługi:
#define SET_FLAG(x,y) (x) |= (1<<(y))
#define CLR_FLAG(x,y) (x) &= ~(1<<(y))
#defien CHECK_FLAG(x,y) ((x) & (1<<y))
deklaruję zmienną:
unsigned char ucDeviceStatus;
i używam:
SET_FLAG(STAN_URZADZENIA , URZADZENIE_WLACZONE);
if (CHECK_FLAG (STAN_URZADZENIA , URZADZENIE_ZAJETE) )
CLR_FLAG (STAN_URZADZENIA, URZADZENIE_ZEPSUTE);
to taki przykład, nie jest to super, ale jest za to czytelne... mniej
pisania jest oczywiście, jak się używa DWUKROPKÓW :)...
Pozdrawiam
Konop
-
25. Data: 2009-10-14 13:21:46
Temat: Re: Dlaczego ATmega128 przekłamuje?
Od: Konop <k...@g...pl>
Darkac pisze:
> Piszę program na ATmega128 za pomocą edytora AVRSide i kompilatora WinAVR.
> Program jest juz trochę rozbudowany i zawiły. Jest obsługa przerwań
> czasowych co mniej więcej 1ms i używane jest sporo zmiennych globalnych.
> Program obrabia równolegle dwa sygnały A i B z przetwornika A/C.
> Jeśli sygnał A lub B spełni pewien warunek badany w przerwaniu, w pętli
> głównej wchodzi w odpowiadającą swojemu kanałowi jedną z dwóch
> bliźniaczych procedur (dość zawiłych).
> Jedna ze zmiennych ustawiana jest w menu (wyświetlacz LCD i klawiatura
> multipleksowana) i przyjmuje wartości 1 lub 0.
Bliźniacze procedury - tzn. ta sama procedura wywoływana z różnymi
parametrami, czy jednak dwie różne funkcje? Może nie są do końca
bliźniacze?? :)...
> Dziwne zjawisko występuje, kiedy program wejdzie w wykonywanie procedury
> tylko dla kanału B. W trakcie jej wykonywania powoduje samoistne
> wyzerowanie wspomnianej wcześniej zmiennej. Zmienna ta nie występuje w
> ogóle w tej procedurze. W całym programie jej wartość może być zmieniana
> ręcznie tylko w pewnym menu które trzeba specjalnie wywołać sekwencją
> działań.
ZAWSZE zeruje?? Nie używasz gdzieś tablic, wskaźników?? Wystarczy drobna
pomyłka, przekazanie jako wskaźnika nie adresu zmiennej tylko jej
wartości i już... zapis masz nie tam, gdzie trzeba... przy
niesprzyjających okolicznościach możesz zawsze zerować pewną pechową
zmienną...
Proponuję to, co już ktoś napisał - zostawić tą zmienną w starym
miejscu, dodać nową i używać nową ;)... jak problem zniknie, to łapać
moment zapisu do starej zmiennej ;)...
Pozdrawiam
Konop
-
26. Data: 2009-10-14 13:23:30
Temat: Re: Dlaczego ATmega128 przekłamuje?
Od: "Darkac" <d...@w...pl>
Użytkownik "T.M.F." <t...@n...mp.pl> napisał w wiadomości
news:hb4gsl$bd$1@atlantis.news.neostrada.pl...
>> Dzięki za linka. Prawdopodobnie to rozwiąże ten problem. Szkoda tylko że
>> trzeba odwoływać się do różnych chytrych sztuczek żeby uzyskać, tak
>> wydaje się, podstawowe i częste pożądane działania.
>
> Bo gcc nie byl projektowany do architektury harvardzkiej i nie ma
> koncepcji roznych typow pamieci zajmujacych te same adresy. Co byc moze
> sie zmieni, ale i tak niewiele z tego wyniknie. Natomiast jesli jest to
> takim problemem to sa platne narzedzia.
>
>> A za to jest bardzo fajna właściwość, bo można zadeklarować zmienne
>> pełniące rolę dwustanowych flag jako "bool". Podejrzewam, że nie zajmują
>> wtedy całego bajtu. Jeśli tak , to przydało by się coś takiego w
>> programowaniu ATmegi. Kupę RAM-u zajmują flagi. Duże marnotrawstwo.
>> Bawienie się w maski, to znów przystosowywanie się do kaprysów komputera.
>
> Przejrzyj liste instrukcji AVR i nie bedziesz mial zludzen. Mozesz
> zadeklarowac zmienna bool, mozesz wykorzystac pola bitowe, ale to ciagle
> bedzie tlumaczone na operacje na bitach typu ustawianie, zerowanie itd.
No tak, kopilator i edytor są bezpłatne. Darowanemu koniowi nie zagląda się
w zęby.
Nie powinienem narzekać.
-
27. Data: 2009-10-14 13:31:02
Temat: Re: Dlaczego ATmega128 przekłamuje?
Od: "Darkac" <d...@w...pl>
Użytkownik "Konop" <k...@g...pl> napisał w wiadomości
news:hb4j1q$gq2$1@inews.gazeta.pl...
>>>> w sumie liczą. Jak zrobić żeby stałe te były pobierane z pamięci
>>>> programu we Flashu? Dlaczego powielane są do RAM-u? Czy słowo "const"
>>>> oprócz
> Hmmm... no to używaj DWUKROPKA :)
Nie wiem o co chodzi z tym dwukropkiem, możesz przybliżyć?
-
28. Data: 2009-10-14 13:41:36
Temat: Re: Dlaczego ATmega128 przekłamuje?
Od: "T.M.F." <t...@n...mp.pl>
> SET_FLAG(STAN_URZADZENIA , URZADZENIE_WLACZONE);
> if (CHECK_FLAG (STAN_URZADZENIA , URZADZENIE_ZAJETE) )
> CLR_FLAG (STAN_URZADZENIA, URZADZENIE_ZEPSUTE);
>
> to taki przykład, nie jest to super, ale jest za to czytelne... mniej
> pisania jest oczywiście, jak się używa DWUKROPKÓW :)...
Oj, jednak pola bitowe sa czytelniejsze. No i jesli zmienisz ich
kolejnosc to nie pociaga to potem zazwyczaj uperdliwej zmiany we
wszytkich plikach.
--
Inteligentny dom - http://idom.wizzard.one.pl
http://idom.sourceforge.net/
Teraz takze forum dyskusyjne
Zobacz, wyslij uwagi, dolacz do projektu.
-
29. Data: 2009-10-14 13:52:26
Temat: Re: Dlaczego ATmega128 przekłamuje?
Od: "Darkac" <d...@w...pl>
Użytkownik "Konop" <k...@g...pl> napisał w wiadomości
news:hb4j99$hoj$1@inews.gazeta.pl...
> Darkac pisze:
>> Piszę program na ATmega128 za pomocą edytora AVRSide i kompilatora
>> WinAVR.
>> Program jest juz trochę rozbudowany i zawiły. Jest obsługa przerwań
>> czasowych co mniej więcej 1ms i używane jest sporo zmiennych globalnych.
>> Program obrabia równolegle dwa sygnały A i B z przetwornika A/C.
>> Jeśli sygnał A lub B spełni pewien warunek badany w przerwaniu, w pętli
>> głównej wchodzi w odpowiadającą swojemu kanałowi jedną z dwóch
>> bliźniaczych procedur (dość zawiłych).
>> Jedna ze zmiennych ustawiana jest w menu (wyświetlacz LCD i klawiatura
>> multipleksowana) i przyjmuje wartości 1 lub 0.
>
> Bliźniacze procedury - tzn. ta sama procedura wywoływana z różnymi
> parametrami, czy jednak dwie różne funkcje? Może nie są do końca
> bliźniacze?? :)...
>
Na tyle są bliźniacze, że mają treść w zasadzie taką samą, ale wszelkie
dane, parametry, flagi stanów i tabele na których operują pamiętane są w
innym zestawie (A lub B). Jakby się uprzeć, to może dałoby się napisać jedną
procedurę, która co chwila musiałaby się pytać, który kanał jest w tym
momencie obrabiany albo jako parametry trzeba by przesłać kilkadziesiąt
zmiennych. A większość tych parametrów i tak jest globalnych i znów przy
wyjściu trzeba by je odzyskiwać z procedury.
Historycznie tak było łatwiej i szybciej i bezpieczniej. Najpierw był w
programie tylko jeden kanał i kiedy powstała potrzeba dwóch, łatwo było
powielić procedurę na dwie i dodać do każdej nie wspólnej w niej zmiennej,
końcówkę _a w jednej i _b w drugiej. Pamięci programu jest jeszcze bardzo
dużo.
-
30. Data: 2009-10-14 19:24:23
Temat: Re: Dlaczego ATmega128 przekłamuje?
Od: John Smith <d...@b...pl>
>>>> Za to kocham MSP430, w hardware-owym debugerze można ustawić pułapkę
>>>> na zapis do obszaru pamięci i już wiadomo w wyniku jakiej instrukcji
>>>> nastąpił problem. Sprawę rozwiązuje się w chwilkę.
>>>
>>> Przeciez korzystajac z JTAG na ATMedze128 moze zrobic to samo...
>>
>> Za to kocham JTAG.
>
> To czemu tego autor wątku nie zrobi, a Wy nie doradzacie od początku?
Nie odpowiedziałeś na pytanie, to ja spróbuję.
Twoja miłość do JTAG-a chyba nie jest odwzajemniona, nie widzę
możliwości aby samodzielnie łącze JTAG-a miało możliwości
debugowania w systemie uC. W ATMega jest dodatkowo
moduł OCD w MSP430 jest moduł EEM.
Sugeruję zapoznać się z dokumentem SLAA263B, mozliwości tego modułu
są niesamowite i znacznie przerastają założenie prostej pułapki.
K.