logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
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 2001 28
REKLAMA
  • #1 14073245
    aero19000
    Poziom 10  
    Posty: 31
    Ocena: 3
    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 ???
  • REKLAMA
  • #2 14073267
    witoldwitoldowicz
    Poziom 28  
    Posty: 698
    Pomógł: 163
    Ocena: 60
    LCD_Initalize();
    LCD_WriteText chyba nie obsługuje int tylko char.
  • #3 14073298
    aero19000
    Poziom 10  
    Posty: 31
    Ocena: 3
    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.
  • REKLAMA
  • #5 14073315
    witoldwitoldowicz
    Poziom 28  
    Posty: 698
    Pomógł: 163
    Ocena: 60
    stdio.h funkcja sprintf.
  • #7 14073345
    aero19000
    Poziom 10  
    Posty: 31
    Ocena: 3
    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
  • REKLAMA
  • Pomocny post
    #8 14073361
    witoldwitoldowicz
    Poziom 28  
    Posty: 698
    Pomógł: 163
    Ocena: 60
    aero19000 napisał:
    Samuraj otóż niestety nie działa
    Ponieważ trzeba podać wskaznik (char*)
  • Pomocny post
    #9 14073379
    tronics
    Poziom 38  
    Posty: 5062
    Pomógł: 358
    Ocena: 840
    @Samuraj - nie będzie działać... do końca. Zauważ fragment kodu z x=10, X=11 i X=12 :)
    Jeśli mamy integery można itoa() użyć.
    czyli można zrobić tak:
    na początku zrobić
    char buff[2];


    a później:

    itoa(x,buff,10);
    LCD_WriteText(buff);
  • #10 14073449
    aero19000
    Poziom 10  
    Posty: 31
    Ocena: 3
    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  
    Posty: 5062
    Pomógł: 358
    Ocena: 840
    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  
    Posty: 31
    Ocena: 3
    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
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    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  
    Posty: 31
    Ocena: 3
    Tak właśnie o to chodzi tronics
  • #16 14088147
    aero19000
    Poziom 10  
    Posty: 31
    Ocena: 3
    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
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    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  
    Posty: 31
    Ocena: 3
    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
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    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  
    Posty: 31
    Ocena: 3
    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
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    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  
    Posty: 31
    Ocena: 3
    Tyle, że aby ją można było wykorzystać to tak chyba być nie może
  • #23 14095626
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    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  
    Posty: 31
    Ocena: 3
    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
  • REKLAMA
  • #25 14127517
    aero19000
    Poziom 10  
    Posty: 31
    Ocena: 3
    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  
    Posty: 690
    Pomógł: 151
    Ocena: 30
    Chyba niezbyt uważnie przeglądasz dokumentację AVR-libc...
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #27 14127666
    aero19000
    Poziom 10  
    Posty: 31
    Ocena: 3
    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  
    Posty: 690
    Pomógł: 151
    Ocena: 30
    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  
    Posty: 31
    Ocena: 3
    Zamykam temat, gdyż główny problem został rozwiązany, za pomocą instrukcji itoa. Dziękuje wszystkim za pomoc

Podsumowanie tematu

✨ W dyskusji poruszono problem z wyświetlaniem wartości z klawiatury matrycowej na wyświetlaczu LCD w projekcie opartym na mikrokontrolerze Atmega8. Użytkownik miał trudności z poprawnym wyświetlaniem znaków, które zamiast oczekiwanych wartości pojawiały się jako dziwne znaczki. Uczestnicy zasugerowali użycie funkcji itoa do konwersji wartości na ciąg znaków, co pomogło w rozwiązaniu problemu. Dodatkowo, omawiano kwestie związane z zapisem i odczytem danych z pamięci EEPROM, wskazując na błędy w użyciu funkcji eeprom_write_float i eeprom_read_float. Użytkownik zakończył temat, informując, że główny problem został rozwiązany.
Wygenerowane przez model językowy.
REKLAMA