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

[Atmega8][C/Eclipse] - skan klawiatury matrycowej = dziwne znaczki na LCD

aero19000 25 Paź 2014 21:22 1917 28
  • #1 14073245
    aero19000
    Poziom 10  
    Witam staram się zrobić pewne urządzenie do którego potrzebna jest klawiatura matrycowa nie wiem czy nie porwałem się na zbyt ambitny temat jakim jest programowanie avr, dla niektórych może to być błahostka ale nie dla mnie. Otóż znalazłem na stronie http://mikrokontrolery.net/avr_klawiatura_matrycowa.htm obsługę klawiatury matrycowej oraz biblioteki do LCD http://radzio.dxp.pl/hd44780/hd44780_avr_8-bit_rw_c.htm , połączyłem to wszystko i chce żeby po wciśnięciu klawisza jego wartość została zapisana do zmiennej oraz była wyświetlana na LCD, problem w tym że po wciśnięciu klawisza na LCD wyświetlają się różne znaczki (nic sensownego), męczę to już dłuższy czas i nie mam już pomysłu.

    oto co udało mi się uzyskać
    Kod: C#
    Zaloguj się, aby zobaczyć kod


    Czy ktoś mógłby mi pomóc w rozwiązaniu tego problemu ???
  • #2 14073267
    witoldwitoldowicz
    Poziom 28  
    LCD_Initalize();
    LCD_WriteText chyba nie obsługuje int tylko char.
  • #3 14073298
    aero19000
    Poziom 10  
    mam LCD_Initalize ();
    czyli jak rozumiem trzeba użyć innej instrukcji która by wyświetlała int, tylko czy ta biblioteka posiada ową instrukcję?. Z tego co ją przeglądałem to nie.
  • #5 14073315
    witoldwitoldowicz
    Poziom 28  
    stdio.h funkcja sprintf.
  • #7 14073345
    aero19000
    Poziom 10  
    Samuraj otóż niestety nie działa

    próbowałem z sprintfem i faktycznie wyświetlało ale wartości całkiem z poza zakresu klawiatury
  • Pomocny post
    #8 14073361
    witoldwitoldowicz
    Poziom 28  
    aero19000 napisał:
    Samuraj otóż niestety nie działa
    Ponieważ trzeba podać wskaznik (char*)
  • #10 14073449
    aero19000
    Poziom 10  
    Zrobiłem tak jak radziliście z użyciem instrukcji itoa i już ładnie wyświetla, teraz jak rozumiem to zmienna x będzie miała wartości które mogę użyć do dalszych obliczeń a dzięki wskaźnikowi buff będę mógł je wyświetlać ?
  • #11 14073531
    tronics
    Poziom 38  
    Mniej więcej. Ogółem chodzi o to, że to co chcesz wyświetlać to jest ciąg znaków i tak musi być wysyłane do wyświetlacza. Liczba 255 to 0b11111111 i tak wygląda zmienna uint8_t na której prowadzić chcesz obliczenia, natomiast żeby to wyświetlić na wyświetlaczu trzeba wysłać 2, 5, 5 (a dokładniej 0x32, 0x35, 0x35 bo takie są kody ASCII tych cyfr). I tutaj przychodzi z pomocą ten bufor. Ja tutaj wstawiłem tylko 2 elementowy bo max masz 12 więc akurat 2 cyfry. Jeśli będziesz potrzebował dłuższe łańcuchy trzeba dłuższe bufory.
  • #12 14075227
    aero19000
    Poziom 10  
    Mam kolejne pytanie, jeśli zrobię coś takiego

    Kod: C#
    Zaloguj się, aby zobaczyć kod


    To w jaki sposób wyświetlić tablicę "z" ?
    A może inny pomysł jak przypisać do zmiennej 3 cyfrową liczbę(dziesiątki, jedności i część ułamkową) ?
  • #13 14077840
    dondu
    Moderator na urlopie...
    aero19000 napisał:
    To w jaki sposób wyświetlić tablicę "z" ?
    A może inny pomysł jak przypisać do zmiennej 3 cyfrową liczbę(dziesiątki, jedności i część ułamkową) ?

    Zdecyduj o co chcesz zapytać. :)
  • #15 14078857
    aero19000
    Poziom 10  
    Tak właśnie o to chodzi tronics
  • #16 14088147
    aero19000
    Poziom 10  
    Męczę to w dalszym ciągu i nie mam pomysłu na poprawne wykonanie tego. Myślę że zrobienie tego w pętli tak jak wyżej i wpisywanie do tablicy to byłoby dobre tylko jak później zapisać tablice 3 pozycyjną do jednej zmiennej i wyświetlić to za pomocą bufora?
  • #17 14088294
    dondu
    Moderator na urlopie...
    aero19000 napisał:
    ... tylko jak później zapisać tablice 3 pozycyjną do jednej zmiennej i wyświetlić to za pomocą bufora?

    To dwa różne problemy:

    aero19000 napisał:
    ... zapisać tablice 3 pozycyjną do jednej zmiennej ...

    Zmiana 3 cyfr na liczbę to sumowanie iloczynów każdej cyfry z jej wagą w danym systemie liczbowym, który chcesz obliczyć np. dziesiętnie: 123 = 1*100 + 2*10 +3*1
    Przecież znasz to bardzo dobrze :)


    aero19000 napisał:
    ... wyświetlić to za pomocą bufora?

    Od zamiany liczby na ciąg znaków są funkcje rodziny prinft()


    Ale jeśli dobrze rozumiem, Ty masz 3 cyfry (każda w osobnej pozycji tablicy) i potrzebujesz je zapisać do bufora odpowiednio zamieniając na znaki ASCII - wystarczy więc do danej cyfry zapisanej binarnie dodać 0x40 (kod ASCII znaku zero) i zapisać w odpowiednim miejscu w buforze.

    Czy o to Ci chodziło?
  • #18 14088343
    aero19000
    Poziom 10  
    mniej więcej o to chodzi.
    Czyli jeśli zrobię to w ten sposób

    Kod: C#
    Zaloguj się, aby zobaczyć kod

    to powinno funkcjonować, czy się mylę ?
  • #19 14088403
    dondu
    Moderator na urlopie...
    Mniej więcej, ale po co zamieniać na liczbę skoro:

    dondu napisał:
    Ale jeśli dobrze rozumiem, Ty masz 3 cyfry (każda w osobnej pozycji tablicy) i potrzebujesz je zapisać do bufora odpowiednio zamieniając na znaki ASCII - wystarczy więc do danej cyfry zapisanej binarnie dodać 0x40 (kod ASCII znaku zero) i zapisać w odpowiednim miejscu w buforze.


    chyba, że wykorzystujesz zmienną a jeszcze gdzieś indziej.
  • #20 14088531
    aero19000
    Poziom 10  
    Właśnie że chcę ją wykorzystać w dalszej części, a jeśli chcę aby zmienna a=z*10+y+u/10; to musi być typu float ? i czy z,y,u też muszą ?
  • #21 14089144
    BlueDraco
    Specjalista - Mikrokontrolery
    Nie musi być typu float. Wystarczy, że a będzie przechowywać wartość pomnożoną przez 10, a przy wyświetlaniu wstawisz przecinek pomiędzy odpowiednie cyfry.
  • #22 14089985
    aero19000
    Poziom 10  
    Tyle, że aby ją można było wykorzystać to tak chyba być nie może
  • #23 14095626
    dondu
    Moderator na urlopie...
    aero19000 napisał:
    Tyle, że aby ją można było wykorzystać to tak chyba być nie może

    Niestety dopóki nie pokażesz całego programu, to tylko Ty wiesz co można, a czego nie.
    Generalnie należy unikać liczb zmiennoprzecinkowych na mikrokontrolerach takich jak ten z Twojego tematu.
  • #24 14096711
    aero19000
    Poziom 10  
    całość jest chaotyczna ponieważ w pisaniu programu jak pisałem jestem początkujący więc proszę o wyrozumiałość
    Kod: C#
    Zaloguj się, aby zobaczyć kod

    Kod: C#
    Zaloguj się, aby zobaczyć kod

    Kod: C#
    Zaloguj się, aby zobaczyć kod


    Kod: C#
    Zaloguj się, aby zobaczyć kod


    Kod: C#
    Zaloguj się, aby zobaczyć kod
  • #25 14127517
    aero19000
    Poziom 10  
    Przepraszam za kolejny wpis ale teraz borykam się kilkoma innymi problemami mianowicie jednym z nich jest zapis/ odczyt z eeprom
    sugeruje się informacjami zawartymi w książkach oraz http://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html i w swoim kodzie zapisałem coś takiego

    Kod: C#
    Zaloguj się, aby zobaczyć kod

    i przy wyrażeniach zapisu do eeprom wyskakują mi błędy podczas kompilacji typu
    "Multiple markers at this line
    - incompatible type for argument 2 of
    '__eewr_float_m8
    '"
    nie rozumiem dlaczego. Czy mógłby mi ktoś to wytłumaczyć łopatologicznie ?
  • #26 14127583
    vonar
    Poziom 28  
    Chyba niezbyt uważnie przeglądasz dokumentację AVR-libc...
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #27 14127666
    aero19000
    Poziom 10  
    To w takim układzie jak będzie wyglądał odczyt (zakłóciło mi to cały pogląd na informacje uzyskane z książki, ale to najwidoczniej coś źle zrozumiałem )

    Do tej pory próbowałem to zrobić
    Kod: C#
    Zaloguj się, aby zobaczyć kod

    odczyt mam w innym pliku źródłowym, czy tam też należałoby zrobić tak jak przy zapisie eeprom_read_float (&ee_K_Pi, K_Pi);, czy według float eeprom_read_float (const float *__p) __ATTR_PURE__ eeprom_read_float (&ee_K_Pi) ?
  • #28 14127704
    vonar
    Poziom 28  
    A może w końcu zajrzysz do dokumentacji?
    Cytat:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Read one float value (little endian) from EEPROM address __p.



    Dlaczego ciągle zamieszczasz kod C jako C#?
  • #29 14218466
    aero19000
    Poziom 10  
    Zamykam temat, gdyż główny problem został rozwiązany, za pomocą instrukcji itoa. Dziękuje wszystkim za pomoc
REKLAMA