logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATMega8] [ATMega8][C][Atmel Studio] - Jak stworzyć przenośne menu dla sterownika silnika DC?

doman1989 06 Lis 2013 09:02 1785 7
REKLAMA
  • #1 12920765
    doman1989
    Poziom 10  
    Witam,

    Potrzebuję zrobić sobie menu do sterownika silnika DC, aby było to menu łatwe do przenoszenia i edytowania między projektami postanowiłem je zrobić na strukturach.
    Tu pojawia się problem i od 3 dni nie mogę wpaść na to co źle robię.

    Oto wycinki kodu aby ułatwić zobrazowanie problemu:

    plik Menu.h
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    plik menu.c
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    plik main
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    No i próbuję pobrać tekst ze struktury i dostaję śmieci na wyświetlaczu.

    Dodam, że jeżeli zastosuję takie coś:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    to normalnie mi sczytuje napis z podanego char'a.

    Próbowałem już na setki sposobów i niestety poległem już z tym. Mam książkę pana Tomasza F. ale niestety podrozdział "Odczyt danych z pamięci FLASH" jest strasznie krótki i nie można na jego podstawie dowiedzieć się jak działa pgm_read_xxxx. Menu na podstawie książki też jest jak dla mnie strasznie nie intuicyjne choć w ramach edukacyjnych odpaliłem je na mojej ATMedze8.

    Tak więc proszę o wytłumaczenie mi na chłopski rozum jak to powinno wyglądać i dlaczego tak a nie inaczej, żebym "zatrybił" raz a porządnie.

    pozdrawiam,
    Doman
  • REKLAMA
  • #2 12921009
    kazzik87
    Poziom 12  
    Zamiast:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Spróbuj dać:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Nie bardzo rozumiem to:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    cols = kolumna
    rows = wiersz
  • REKLAMA
  • #3 12921182
    doman1989
    Poziom 10  
    Witam,

    Kolego kazzik87, troszeczkę nie zrozumiałeś mojego problemu.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Wyżej wymieniona linijka będzie powodować przeskakiwanie po kolejnych elementach tablicy (struktury) menu.

    Moim problemem jest to, że chce wyświetlić tekst zawarty np:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Tekst prosto z chara to mi wychodzi, ale ja chce go zczytywać przez wskaźnik zawarty w strukturze (przypisany do danej pozycji menu).

    Pozdrawiam
  • REKLAMA
  • #4 12921521
    tmf
    VIP Zasłużony dla elektroda
    Linijka:
    unsigned int tempx=pgm_read_word(wsk_do_tab->linijka1_tekst[wiersz]);
    nie zwraca tego co oczekujesz. Spodziewasz się wskaźnika na tekst (pole linijka1_tekst), ale pobierasz kod dwóch sąsiednich liter, bo indeksujesz string. pgm_read_word nie zwraca ostrzeżenia, bo nie oczekuje wskaźnika, a jedynie liczbę i tą dostaje - a że są to litery a nie adres to czyta śmieci.
    Pamiętaj też, że to co na początku nauki może ci się wydawać nieintuicyjne, dalej może okazać się sensowniejsze. A zastosowanie list w przypadku struktur dynamicznych i elementów powiązanych ze sobą jest lepszym pomysłem niż korzystanie z tablic o sztywnych rozmiarach.
  • REKLAMA
  • #5 12921578
    doman1989
    Poziom 10  
    Witam,

    W takim razie panie Tomku jak mam zrobić aby pobrać wskaźnik na to konkretne pole, tak abym wyświetlał tekst? Czy mógłby Pan napisać jak dobrze obchodzić się z poleceniem pgm_read_xxxx aby otrzymywać informację która mnie konkretnie interesuje?

    Pozdrawiam,
  • Pomocny post
    #6 12921966
    tmf
    VIP Zasłużony dla elektroda
    doman1989 napisał:
    Witam,

    W takim razie panie Tomku jak mam zrobić aby pobrać wskaźnik na to konkretne pole, tak abym wyświetlał tekst? Czy mógłby Pan napisać jak dobrze obchodzić się z poleceniem pgm_read_xxxx aby otrzymywać informację która mnie konkretnie interesuje?

    Pozdrawiam,


    Dobrze obchodzisz się z makrem pgm_read_xxx, lecz po prostu podajesz mu zły argument. Może tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    co spowoduje pobranie adresu z pola linijka1_tekst, który jest wskaźnikiem na właściwy tekst i dopiero później:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    co zwróci ci pojedynczy znak wskazywany przez tempx, czyli wskaźnik z pola linijka1_tekst. W ten sposób możesz odczytać cały łańcuch znak po znaku. Zawsze warto odpalić symulator, żeby sprawdzić co masz zwracane i czy jest to to, czego oczekujesz.
    Niemniej twój program zawiera także inne błędy i się nie kompiluje.
  • #7 12922217
    doman1989
    Poziom 10  
    Witam,

    Kod mam dobry, program się kompiluje - tu są tylko fragmenty jak w 1 poście zaznaczyłem.

    Jestem już bliżej celu ;) Ale dalej problem, dodałem te 2 linijki do programu, ale tekst mam wyświetlony źle.

    Muszę mieć taki kod aby było dobrze wyświetlane na 2 linijkach:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Czyli tak jak by przy linijka2_tekst nie pobierał adresu, chodz przy linijka1_tekst też skoro muszę dodawać 6.

    Pewnie trzeba coś z funkcją GetAddr jak było u Pana, ale to pobawię się jutro.

    Pozdrawiam,
  • #8 12924480
    doman1989
    Poziom 10  
    Witam,

    Dziś na świeżo kod przejrzałem i opóźnienie wynikało z 1 błedu Enuma.
    Tak więc dzięki wielkie Panu Tomkowi za fachowe rady, teraz może odczyt danych z pamięci FLASH nie będzie stanowił dla mnie takiego problemu (mam nadzieję).

    Pozdrawiam,
REKLAMA