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

ATmega8 - Nieprawidłowe działania programu - Czary :(

r0bby 09 Kwi 2015 13:52 975 7
  • #1 14603318
    r0bby
    Poziom 9  
    Witam,

    Męczę się z kawałkiem kodu, który wbrew (mojej) logice, działa nie tak jak powinien. Chcę wyświetlić element tablicy stringów z pamięci PGMEM, a w niektórych wypadkach otrzymuję śmieci.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    i otrzymuję:
    
    05, Piątek
    05, ŔGŔFŔEŔDŔCŔBŔAŔ@Ŕ?Ŕ>Ŕ=Ŕ<Ŕ;Ŕ:Ŕ9Ŕ8Ŕe
    05, ŔGŔFŔEŔDŔCŔBŔAŔ@Ŕ?Ŕ>Ŕ=Ŕ<Ŕ;Ŕ:Ŕ9Ŕ8Ŕe
    

    Zmienne idx i d.WeekDay zawierają tą samą wartość, a raz prawidłowo wyświetlam łańcuch, a raz otrzymuję śmieci.
    Program kompilowany AS6.2 przy standardowych opcjach kompilatora.
  • #2 14603381
    p.kaczmarek2
    Moderator Smart Home
    d.WeekDay ma poprawna wartość?
    Spróbuj zamienić d.WeekDay na string (cyferki ASCII) i wysłać dla sprawdzenia czy jest ok.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    Pomogłem? Kup mi kawę.
  • #3 14603413
    BlueDraco
    Specjalista - Mikrokontrolery
    Jaką masz szybkość transmisji przez UART?

    Na moje oko to jesz źle:
    USART_Transmit_String_P(dni[d.WeekDay]);
    - poneważ wektor dni[] jest w PROGMEM, wskaźnik musisz czytać przez pgm_read_word()
  • #4 14603430
    p.kaczmarek2
    Moderator Smart Home
    BlueDraco napisał:

    Na moje oko to jesz źle:
    USART_Transmit_String_P(dni[d.WeekDay]);
    - poneważ wektor dni[] jest w PROGMEM, wskaźnik musisz czytać przez pgm_read_word()


    Ale przeciez koledze działa przez zwykłą zmienna idx... chyba, ze to przez optymalizacje?
    Pomogłem? Kup mi kawę.
  • #5 14604640
    r0bby
    Poziom 9  
    BlueDraco napisał:
    Jaką masz szybkość transmisji przez UART?

    Na moje oko to jesz źle:
    USART_Transmit_String_P(dni[d.WeekDay]);
    - poneważ wektor dni[] jest w PROGMEM, wskaźnik musisz czytać przez pgm_read_word()

    Transmisja 9600, 2 stopy, bez parzystości - transmisja śmiga w obu kierunkach bez problemu.
    Wskaźnik w funkcji USART_Trasmit_String_P czytam przez pgm_read_byte().
    p.kaczmarek2 napisał:

    d.WeekDay ma poprawna wartość?
    Spróbuj zamienić d.WeekDay na string (cyferki ASCII) i wysłać dla sprawdzenia czy jest ok.


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

    i otrzymuję:
    
    05
    00000101
    05, Piątek
    05, óˆ3yó‘ŕˆ1	ôŕ‰/•ŔŹďŔŹďߑϕƒŕĽ•ƒąŕ¸ß‘ŕˆ2	ôŕ‰/•ϓߓěf#)đ‚ŕŞß€5)ŔŕĄßˆ51ôƒ±ˆƒ€ŕŔŹďŔŹďߑϕϓߓě@ŕ`ŕpŕ€íŕ«ßƒŕÓßĎßAŕ`ŕpŕ€íŕ˘ßaŕÎÓßaŕΖĎßaŕΖËß`ŕΖÇßąßߑϕϓߓͷ޷d—¶ř”ŢżľÍż‚ŕ‡»}и€ă€ą…ł€c…»Wšx”†ŕ’ŕ(ł)'(»/ď4ăLŕ!P0@@@á÷
    Równe
    05
    00000101
    05, Piątek
    05, ŔGŔFŔEŔDŔCŔBŔAŔ@Ŕ?Ŕ>Ŕ=Ŕ<Ŕ;Ŕ:Ŕ9Ŕ8Ŕe
    Równe
    

    Nie wiem czy to ma znaczenie, ale program chodzi w pętli i generowane śmieci zamiast "Piątek" nie przy każdej iteracji są takie same. Czary :(

    Jedyne co mi przychodzi do głowy to proteza w stylu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    ale to urągałoby ludzkiej godności ;)
  • Pomocny post
    #6 14605015
    michalko12
    Specjalista - Mikrokontrolery
    Już Ci @BlueDraco napisał w czym jest problem

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #7 14605307
    r0bby
    Poziom 9  
    Działa :) Dzięki. Dobrze, że dokładnie napisałeś, bo nie wymyśliłbym takiej konstrukcji.

    Ale gdybyś jeszcze mógł, wyjaśnić dlaczego działa, byłbym wdzięczny. Bo nadal nie rozumiem, dlaczego konstrukcja
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    działała mi prawidłowo, a poniższa już nie. Przecież zarówno idx, jak i d.WeekDay zawierając liczby uint8_t.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #8 14605376
    BlueDraco
    Specjalista - Mikrokontrolery
    Ta pierwsza wersja prawdopodobnie działa z powodu optymalizacji, chociaż nie ma prawa działać. Wartość idx jest prawdopodobnie traktowana przez kompilator jako stała i ewaluacja wyrażeń z nią zachodzi podczas kompilacji - w tym przypadku jest ona niepoprawna.
REKLAMA