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

Atmega16 - Błąd kompilacji przy wyświetlaniu tekstu na LCD w C++

bloniak91 30 Paź 2013 00:15 1932 15
  • #1 12895654
    bloniak91
    Poziom 9  
    Witam serdecznie,
    wspomnę, że jestem początkującym "programistą" i jest to moje 1 poważne starcie z uC.
    Planuje wykonać pewne urządzenie, które będzie wyświetlało temperaturę na LCD oraz przy wciśnięciu przycisku, będzie wyświetlał się losowy napis z tablicy na LCD. Niestety otrzymuję błąd przy kompilowaniu.


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


    Błąd jaki otrzymuję:
    main.c:80: warning: passing argument 1 of 'lcd_puts' makes pointer from integer without a cast
    main.c:84: error: expected declaration or statement at end of input
    bardzo proszę o podpowiedź, pomoc


    Moderowany przez Dzimi:

    Tytuł postu poprawiony

  • #2 12895674
    Piotr Piechota
    Poziom 22  
    1) a nie brakuje na końcu }
    2) lcd_puts pewnie oczekuje stringa a nie znaku i to z poza zakresu tablicy...
    3) z deklaracją tablicy też namieszałeś na pewno ma 6 wierszy?
  • #3 12895752
    bloniak91
    Poziom 9  
    Rzeczywiście, brakowało } na końcu. Dodałem i program został skompilowany. Zaprogramowałem Atmege, podłączyłem układ i nie działa ta jak powinien. Startuje, wyświetla napis Temperatura, w dolnym wierszu pokazuję aktualną temperaturę. Przerwania nie działają, a co najgorsze, pomiar temperatury również nie. Tak jak przy pierwszym pomiarze odczyta, tak zostaje do końca...
    Cytat:

    2) lcd_puts pewnie oczekuje stringa a nie znaku i to z poza zakresu tablicy...

    Czyli rozumiem, że nie da się odczytać takiej tablicy, którą zadeklarowałem? Jak można rozwiązać problem przechowywania kilku zdań (do 20 znaków), które losowo byłyby wyświetlane przy przerwaniu?
  • #4 12895777
    krru
    Poziom 33  
    To jest tablica napisów - dostęp do pojedynczego napisu to zdania[]. Podwójny indeks daje pojedynczy znak z wybranego napisu.

    PS. Wielkości tablic na napisy masz chyba za małe - musi być co najmniej o 1 więcej niż jest znaków.
  • #5 12895788
    GSM
    Poziom 25  
    Czemu w ogóle napisy zapisujesz w postaci pojedynczych znaków?
    Jest to niepraktyczne a do tego może spowodować wiele problemów. Chociażby przy użyciu lcd_puts, czy podobnych funkcji operujących na łańcuchach znaków. Te funkcje oczekują, że napis będzie zakończony znakiem \0, dopiero wtedy kończą swoją pracę.
    Używaj cudzysłowów do deklarowania napisów, wtedy kompilator sam zakańcza napisy zerem.

    Pozdrawiam,
    GSM
  • #6 12896297
    bloniak91
    Poziom 9  
    Poprawiłem w ten sposób:

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

    Poprawiłem kod na taki jak wyżej, ale i tak nie działa poprawnie. Temperatura jaka zostanie zmierzona za pierwszym pomiarem zostaje do końca pracy układu. Przerwanie nie działa.
    Dzięki za wszystkie dotychczasowe wskazówki!
  • #7 12896314
    GSM
    Poziom 25  
    bloniak91 napisał:
    Temperatura jaka zostanie zmierzona za pierwszym pomiarem zostaje do końca pracy układu. Przerwanie nie działa.

    1. działa prawidłowo
    2. przerwanie działa.

    Problem w tym, że ty się nie zgadzasz z kompilatorem i procesorem, ale to one mają rację.
    return 0; masz w pętli głównej, więc wykonuje się ona tylko raz.

    Pozdrawiam,
    GSM
  • #8 12897017
    bloniak91
    Poziom 9  
    okej, rzeczywiście, głupi błąd z tym return 0. Poprawiłem, działa normalnie jeśli chodzi o termometr. Natomiast gdy nastąpi przerwanie, poprzez wciśnięcie przycisku, LCD zaczyna "wariować", bardzo szybko migają różne znaki. I tak dzieję się do końca, tzn. aż wyłączę zasilanie i włączę od nowa. Czy program nie wychodzi z przerwania? I czemu nie wyświetla się jakiś napis z tablicy tylko zaczynają się wariacje?
  • #9 12897395
    Piotr Piechota
    Poziom 22  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #10 12897512
    bloniak91
    Poziom 9  
    Niestety dodanie flaga=0; do kodu nic nie zmieniło, nadal wyświetlacz wariuje i nie wychodzi z przerwania, przynajmniej tak mi się wydaję, bo nie powraca do wyświetlania temperatury...
  • #11 12897558
    GSM
    Poziom 25  
    bloniak91 napisał:
    nie wychodzi z przerwania, przynajmniej tak mi się wydaję

    Jeśli nawet nie rozumiesz co twój własny kod robi, to nie jest zbyt dobrze.
    Zacznij od zrozumienia jak działa twój program i dopiero wtedy po kolei eliminuj wszystkie możliwe powody takiego zachowania.

    Pozdrawiam,
    GSM
  • #12 12897829
    wojekkk
    Poziom 18  
    Czy noga INT0 jest podciagnieta do zasilania rezystorem lub sciagnieta do masy wzglednie jak jest ustawione wyzwalanie przerwania czy po puszczeniu przycisku wisi w powietrzu?
  • #13 12897837
    bloniak91
    Poziom 9  
    zmienilem fragment kodu
         if(flaga)
    {
            int i =( rand() % 6 ) + 4;
    		flaga=0;
           LCD_CLEAR;            
            LCD_LOCATE(0,0);
           lcd_puts(zdania[i]);
    	   _delay_ms(1000);
    	   
    	 
    } 

    Zrobiłem przerwanie, wyświetliło napis Slowenia, po czym zaczęły znowu skakać znaki na wyświetlaczu... Po odłączeniu i włączeniu do napięcie taka sama historia, Slowenia i następnie skaczące znaki. Czym to może być spowodowane? I dlaczego nie losuje innego napisu niż Slowenia?
  • #14 12897903
    wojekkk
    Poziom 18  
    Masz tablice
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    co oznacza ze ma ona 6 wierszy po 19 kolumn.

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


    co daje 7 wierszy+ przecinek jak na 8 wiersz.

    do tego w przerwaniu atakujesz ta tablice tym:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


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


    daje wynik od 4 do 10....

    Przemysl to.

    i czytaj ostrzezenia kompilatora a nie tylko bledy.
  • #15 12898156
    bloniak91
    Poziom 9  
    @wojekkk!
    Bardzo dziękuję za wskazanie mi błędu! Wynikał on z nieuwagi oraz częstej modyfikacji tablicy zdania, a rand, to już w ogóle porażka!
    Poprawiłem, działa tak jak należy! :D
REKLAMA