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

[atmega8][c] WinAvr fprintf na LCD

Weis 03 Gru 2009 20:27 1752 8
  • #1 7341793
    Weis
    Poziom 12  
    Witam
    Korzystam z przykładu stdiodemo.c Joerga Wunscha WinAVR-20090313.
    Mam problem z wyświetleniem elementów tablicy.
    FILE lcd_str = FDEV_SETUP_STREAM(lcd_putchar, NULL, _FDEV_SETUP_WRITE);
     stderr = &lcd_str;
    
    unsigned char Tablica[5];
    Tablica[0]=48+1
    fprintf(stderr,"%s", Tablica[0]);     ??   tu wyświetla prawidłowo 49
    fprintf(stderr,"%s", Tablica);	       ??   a tu wyświetla 1
    

    Do tablicy są wpisywane cyfry 1-9. Muszę dodawać 48 żeby się normalnie wyświetlały.
    Tablica[0]=Cyfra+48;

    Nie wiem skąd taka różnica w wyświetlaniu elementów tablicy. Teksty wyświetla dobrze.
    Nie mam pojęcia gdzie szukać błędu?
  • #3 7342068
    Weis
    Poziom 12  
    To źle napisałem, jest %i i działa prawidłowo.
    
    fprintf(stderr,"%i", Tablica[0]);     ??   tu wyświetla prawidłowo cyfrę 49
    


    Wydawało mi się, że jeśli zainicjuje tablicę jako char to będzie dobrze.

    
    fprintf(stderr,"%s", Tablica);	       ??   a tu wyświetla 1 zamiast cyfrę 49
    


    Nie mogę znaleźć jak to zmienić. Na dodatek kompilator nie strajkuje.
  • #4 7342078
    Freddie Chopin
    Specjalista - Mikrokontrolery
    No ale co ty chcesz tu zmieniać, dlaczego i po co? cyfra 1 to zupełnie coś innego niż znak '1' i tyle. Podajesz 49 do wyświetlania cyfr, więc konwertuje to na napis "49". Podajesz 49 do wyświetlania stringów więc wyświetla Ci znak o kodzie 49, czyli '1'.

    Tak w ogóle to ten drugi przykład, gdy dajesz tablicę liczb do specyfikatora %s działa Ci w ogóle tylko przypadkiem...

    4\/3!!
  • #5 7342314
    Weis
    Poziom 12  
    Potrzebne mi jest wyświetlenie znaku 0-9 po naciśnięciu klawiatury.
    Wychodzi na to, że na razie będę musiał zadowolić się tą funkcją. Bo przypadkiem działa tak jak chciałem. Przyciskam 1 i wyświetla mi 1 (dodaję do wartości klawisza 48 ) przesuwa się w prawo ... itd. Zwykłe wprowadzanie znaków.
    Przydałaby się podpowiedź jak zrobić to prawidłowo.
  • #6 7342842
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Wrzucasz (okrutnie ogromnego) fprintf'a do tak trywialnej rzeczy i jeszcze widzisz w tym wielki problem?

    Jak masz 10 klawiszy to uwierz mi, "switch" z 10-cioma elementami "case" będzie i szybszy i mniejszy.

    char character;

    switch(my_button)
    {
    case MY_BUTTON_1:
    character = '1';
    break;
    case MY_BUTTON_2:
    character = '2;
    break;
    ...
    }
    LCD_put(character);

    4\/3!!
  • #7 7343346
    Weis
    Poziom 12  
    Dopiero zaczynam przygodę z c. Wcześniej pisałem trochę w asm-ie.
    Mam obsługę klawiszy z https://www.elektroda.pl/rtvforum/topic1416904.html
    Na wyjściu otrzymuję kod klawisza (gdy zostanie puszczony) i kod długości wciśnięcia.
    O fprintf pytam bo chcę zrozumieć jak to działa i gdzie ewentualnie popełniam błąd.

    W przykładzie Joerga Wunscha jest:
    int
    lcd_putchar(char c, FILE *unused)
    {
      static bool nl_seen;
    
      if (nl_seen && c != 'n')
        {
          /*
           * First character after newline, clear display and home cursor.
           */
          hd44780_wait_ready();
          hd44780_outcmd(HD44780_CLR);
          hd44780_wait_ready();
          hd44780_outcmd(HD44780_HOME);
          hd44780_wait_ready();
          hd44780_outcmd(HD44780_DDADDR(0));
    
          nl_seen = false;
        }
      if (c == 'n')
        {
          nl_seen = true;
        }
      else
        {
          hd44780_wait_ready();
          hd44780_outdata(c);
        }
    
      return 0;
    }


    Na razie nie rozumiem niektórych szczegółów:
    Dlaczego jest int przed lcd_putchar,czemu FILE *unused.
    W moim "programie nauczania" jeszcze tego nie miałem :) Dojdę jeszcze do tego.

    Czy i jak to można dostosować do twojego
    LCD_put(character);

    Jak dotąd uruchomiłem wyświetlanie na LCD zegara po I2c-FM31276 ,klawiatura 4x4 (bez niczyjej pomocy).
    Na atmega8 zajmuje
    Program: 3690 bytes (45.0% Full)
    Data: 186 bytes (18.2% Full)
    Nie wiem czy to jest dużo. Nie mam takiego doświadczenia.
  • #8 7344047
    flapo213
    Poziom 21  
    Zgodzę się z tym co napisałeś ale bez fprintfa. Spróbuj sobie dodać gdziekolwiek w twoim programie taką linijkę kodu float f = 0.0; i zobacz ile kodu Ci to dogeneruje. Dlatego też Freddy zasugerował Ci fakt iż w programowaniu na PC to nie ma znaczenia ale dla mikrokontrolerów ma, czysta ekonomia Twój Atmega8 ma 8k flasha a Twój PC pewnie 2 GbRamu no cóż różnicę widać od razu.

    Pozdrawiam
  • #9 7345091
    Freddie Chopin
    Specjalista - Mikrokontrolery
    @Weis:
    pytania które zadajesz dotyczą w większości podstaw programowania w języku C, a ja na takie z zasady nie odpowiadam, bo są o tym strony, książki i tysiące tematów.

    Parametr typu FILE* nazywa się tak jak autor miał fantazję go nazwać, a nazwa ta oddaje jego rolę, która jest żadna, dlatego też parametr ten jest nieużywany.

    @flapo123:
    sama linijka którą pokazałeś zapewne niczego nie wygeneruje, nawet przy optymalizacji zero. Operacja przypisania stałej do float'a nie jest skomplikowana, więc problemu nie ma. Lepiej byłoby go podzielić albo choć pomnożyć, choć tak czy siak nie wiem co to ma wspólnego z tym akurat problemem, bo w nim nie ma żadnych liczb zmiennoprzecinkowych.

    4\/3!!
REKLAMA