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

[Atmega16] [Atmega16][C] - UART nie przesyła pełnych stringów, błąd w kodzie?

rewolt90 03 Lut 2017 20:49 855 5
  • #1 16250913
    rewolt90
    Poziom 9  
    Cześć,

    Naskrobałem programik, który powinien mi wysyłać przez UART co sekundę 1 z 3 stringów(czy tam tablic charów bo to w C) ale coś się buntuje.
    Problem polega na tym, że nie przesyła mi wszystkich wartości tylko jakieś ochłapy i to niepełne.

    Pytanie brzmi czy to ja mam błąd w kodzie? Gdzieś w USART_SendString? Czy może jest jakiś maksymalny rozmiar tablicy, która może być zadeklarowana automatycznie? Czy to może błąd samego kompilatora?
    Kompiluję w AtmelStudio 6.2 z GCC 4.8.1 na ATmega16.

    Próbowałem różne prędkości BAUDRATE - to samo. Dane ściągam przez Realterm i też sprawdzałem różne wersje, bez różnicy.
    Najpiękniej by byłoby, gdyby ktoś spróbował to jeszcze skompilować i puścić u siebie.


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



    Cytat:
    bbbbbbbbbbbbbbbbbbbbbbbbbb qaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

    bbbbbbbbbbbbbbbbbbbbbbbbbb qaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

    bbbbbbbbbbbbbbbbbbbbbbbbbb qaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

    bbbbbbbbbbbbbbbbbbbbbbbbbb qaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

    bbbbbbbbbbbbbbbbbbbbbbbbbb qaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
  • Pomocny post
    #2 16250949
    grko
    Poziom 33  
    @rewolt90 Ten procesor ma tylko 1KB pamięci RAM. Tworzenie tak wielkich zmiennych automatycznych nie jest dobrym pomysłem.
  • Pomocny post
    #3 16251320
    Konto nie istnieje
    Konto nie istnieje  
  • #4 16251472
    rewolt90
    Poziom 9  
    Hah!
    Panowie, oboje mieliście rację :D

    Tak długo siedziałem w C#, że całkiem zapomniałem ile znaczy optymalizacja i rodzaje zmiennych w C ;D
    Dzięki wielkie za pomoc, działa!

    A dla tych, co wpadną na ten temat w przyszłości - w poście poniżej @grko wyjaśnia, co się wydarzyło :)
    Temat zamykam.
  • Pomocny post
    #5 16251542
    grko
    Poziom 33  
    @rewolt90 Nie jest dokładnie tak jak piszesz. AVR gcc domyślnie umieszcza literały znakowe ("abcd...") w pamięci RAM. W twoim oryginalnym programie te literały były dodatkowo kopiowane na stos przy wywołaniu funkcji main co powodowało przepełnienie stosu. Dodanie static nie wymusza tego, że te zmienne wylądują w pamięci programu. Uniknąłeś w ten sposób tylko dodatkowego kopiowania na stos. Na avr-gcc jest coś takiego jak PROGMEM:
    http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html
    który pozwala na umieszczanie oraz dostęp do zmiennych w pamięci programu.
  • #6 16251559
    rewolt90
    Poziom 9  
    Wyjaśnienie rozwiązania w poście @grko i wyżej :)
REKLAMA