eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaDlaczego ATmega128 przekłamuje?Re: Dlaczego ATmega128 przekłamuje?
  • Path: news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail
    From: Konop <k...@g...pl>
    Newsgroups: pl.misc.elektronika
    Subject: Re: Dlaczego ATmega128 przekłamuje?
    Date: Wed, 14 Oct 2009 15:17:47 +0200
    Organization: "Portal Gazeta.pl -> http://www.gazeta.pl"
    Lines: 69
    Message-ID: <hb4j1q$gq2$1@inews.gazeta.pl>
    References: <hb1sbu$qoq$1@news.lublin.pl> <hb1uet$fia$7@news.dialog.net.pl>
    <hb206d$t7q$1@news.lublin.pl> <hb46v6$5vf$2@atlantis.news.neostrada.pl>
    <hb48sg$8gj$1@news.task.gda.pl> <hb4bmb$t3a$1@srv.cyf-kr.edu.pl>
    <hb4efi$i1n$1@news.task.gda.pl>
    NNTP-Posting-Host: apc206.internetdsl.tpnet.pl
    Mime-Version: 1.0
    Content-Type: text/plain; charset=ISO-8859-2; format=flowed
    Content-Transfer-Encoding: 8bit
    X-Trace: inews.gazeta.pl 1255526266 17218 83.17.136.206 (14 Oct 2009 13:17:46 GMT)
    X-Complaints-To: u...@a...pl
    NNTP-Posting-Date: Wed, 14 Oct 2009 13:17:46 +0000 (UTC)
    X-User: konoppo
    X-Antivirus: avast! (VPS 091013-0, 2009-10-13), Outbound message
    In-Reply-To: <hb4efi$i1n$1@news.task.gda.pl>
    X-Antivirus-Status: Clean
    User-Agent: Thunderbird 2.0.0.23 (Windows/20090812)
    Xref: news-archive.icm.edu.pl pl.misc.elektronika:573333
    [ ukryj nagłówki ]

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

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: