Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[ATmega644PA][avr-gcc] - zmienna jako indeks tablicy znaków w pgmspace

qba0991 27 Sie 2012 22:29 2151 6
  • #1 27 Sie 2012 22:29
    qba0991
    Poziom 7  

    Proszę na przyszłość używać tagu [syntax=C] do wklejania kodu...[/syntax].
    Poprawiłem to oraz tytuł na bardziej oddający problem, LordBlick

    Zacząłem swoją przygodę z mikrokontrolerami atmega i natknąłem się na dziwny dla mnie problem. Chce wyświetlić sobie jakiś tekst na hd44780 i korzystając z gotowej biblioteki radzia napisałem sobie taki oto kawałek kodu:

    Kod: C
    Zaloguj się, aby zobaczyć kod

    który w rezultacie wysypuje mi na ekran same krzaki. Za to program napisany w ten sposób działa:
    Kod: C
    Zaloguj się, aby zobaczyć kod

    dlaczego?! proszę pomóżcie, zapewne robię jakiś kretyński błąd ale wskażcie mi proszę gdzie. Dlaczego gdy korzystam ze zmiennej jako indeks w tablicy to nie działa?

    0 6
  • #2 27 Sie 2012 23:12
    LordBlick
    VIP Zasłużony dla elektroda

    Co masz na myśli pisząc ? :

    qba0991 napisał:
    korzystając z gotowej biblioteki radzia
    Tam są różne wersje, w tym jedna najnowsza i najsensowniejsza.
    1. Wartości opóźnień są różne w obu przykładach, ale to może nie mieć wpływu.
    2. Zwracaj baczną uwagę na to co kompilator ma za zastrzeżenia do kodu(warnings)... Zamień wszystkie typy char na uint8_t.

    0
  • #3 28 Sie 2012 08:07
    mfriedrich
    Poziom 15  

    W pierwszym przykładzie zmień delay na większy czas, może po prostu zlewają ci się znaki.

    0
  • Pomocny post
    #4 28 Sie 2012 10:15
    voytaschec
    Poziom 24  

    Spróbuj tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #5 28 Sie 2012 10:19
    qba0991
    Poziom 7  

    Dziękuje! :) Działa. Tylko proszę jeszcze o wytłumaczenie dlaczego?

    0
  • #6 28 Sie 2012 10:51
    voytaschec
    Poziom 24  

    Odczytanie z pamięci programu nie jest tak proste jak z pamięci RAM. W GCC do odczytywania tej pamięci stworzono specjalną funkcję pgm_read_byte, która jest (tak myślę) najbezpieczniejsza do operacji na pamięci programu.
    Teoretycznie wykorzystując wskaźnik do pamięci programu i traktując go jako tablicę (jak to zrobiłeś) powinno działać, ale widocznie GCC jeszcze sobie z tym nie radzi (może w następnej wersji). W CodeVision działa (ogólnie operacje na pamięci programu i EEPROM w CV są bardzo wygodne), ale CodeVision ma znowu inne wady i osobiście jednak wolę GCC :)

    0
  • #7 28 Sie 2012 11:25
    qba0991
    Poziom 7  

    Dzięki, zamykam temat.

    0