Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[STM32][C/Keil] - software do klawiatury matrycowej 4x3

młody druciarz 05 Sie 2014 20:14 1773 23
  • #1 05 Sie 2014 20:14
    młody druciarz
    Poziom 5  

    Mam problem z poniższym programem. Podejrzewam, że chodzi tutaj o niepoprawne używanie zmiennej char. Program pisałem samodzielnie w oparciu o książki wydawnictwa BTC. Klawiatura i procesor działają poprawnie.

    program główny

    Kod: C
    Zaloguj się, aby zobaczyć kod


    kb4x3_lib.c
    Kod: C
    Zaloguj się, aby zobaczyć kod


    kb4x3_lib.h
    Kod: C
    Zaloguj się, aby zobaczyć kod

    0 23
  • #2 05 Sie 2014 20:47
    BlueDraco
    Specjalista - Mikrokontrolery

    A my, nie znając nawet schematu, mamy zgadnąć, jaki to problem, tak?

    To nie jest forum dla wróżek.

    0
  • #3 05 Sie 2014 21:32
    Eagle
    Poziom 23  

    Cytat:
    Klawiatura i procesor działają poprawnie.


    Cieszymy się razem z tobą, że wszystko jest OK. Jeśli będzie problem, nie krępuj się i napisz.

    0
  • #4 05 Sie 2014 22:48
    młody druciarz
    Poziom 5  

    Przepraszam, że mój poprzedni post nie zawierał szczegółowych informacji.

    Klawiatura matrycowa, taka jak kamami kamodkb4x4 natomiast moja jest 4x3 (10 cyfr + # i *), podłączona do portu GPIOC w następujący sposób: piny 12 - 15 do wierszy, 8-10 do kolumn. Do wierszy są przyłączone szeregowo rezystory 10k. Piny podłączone do wierszy są ustawione jako wyjścia push-pull natomiast piny podłączone do kolumn jako wejścia pull-down.

    Problem generalnie polega na tym, że funkcja KBD_ReadKey (w mojej bibliotece) nie zwraca wartości. Mikrokontroler to STM32F103RB (układ ZL31ARM).

    0
  • #5 05 Sie 2014 23:34
    szczywronek
    Poziom 27  

    Kompilator nie zwraca Ci uwagi na typ parametrów przekazywanych do GPIO_SetBits(...)? Nie wiem czy akurat to jest głównym problemem, ale na moje oko tablice GPIORows/Cols powinny być trochę innego typu (uint16_t).

    0
  • #6 05 Sie 2014 23:39
    94075
    Użytkownik usunął konto  
  • #7 05 Sie 2014 23:43
    szczywronek
    Poziom 27  

    albertb napisał:
    rozwiązuje się generalnie zmieniając deklarację i definicję funkcji z typu void na dowolny inny ;-)
    Albo od razu się deklaruje jakiś typ inny niż void, tak jak zrobił to Autor w swoim programie. Dzięki temu nic nie trzeba zmieniać ;)

    0
  • #8 06 Sie 2014 01:07
    94075
    Użytkownik usunął konto  
  • #10 06 Sie 2014 10:49
    BlueDraco
    Specjalista - Mikrokontrolery

    Reasymując: nie znamy schematu i nie wiadomo, jakie są objawy niedziałania programu. No, to już możemy pomagać, bo Autor nie chce użyć debuggera, żeby sprawdzić, co się dzieje w procedurze odczytu klawiatury.

    0
  • #11 06 Sie 2014 11:13
    starob
    Poziom 25  

    BlueDraco napisał:
    Reasymując: nie znamy schematu i nie wiadomo, jakie są objawy niedziałania programu. No, to już możemy pomagać, bo Autor nie chce użyć debuggera, żeby sprawdzić, co się dzieje w procedurze odczytu klawiatury.


    Od debuggera należy zacząć.. prawdopodobnie stany portów zmieniać się będą właściwie. Wątpliwości budzi jedynie wartość opornika szeregowego 10k. Dałbym mniejszy lub wcale.
    Oczywiście sposób obsługi klawiatury też pozostawia wiele do życzenia. Jest małe prawdopodobieństwo, że procedura odczytu klawiatury "trafi" w moment wciśnięcia klawisza, a gdy już trafi to natychmiast zostanie nadpisana zerem.

    0
  • #12 06 Sie 2014 11:55
    szczywronek
    Poziom 27  

    Jasne, ok, zgadzam się, że Autor nie odrobił pracy domowej i niezbyt się przyłożył do opisu problemu. Ale do zauważenia, że 16-bitową maskę pinu przepycha przez tablicę "charów" debugger nie jest potrzebny ;) Może jestem jakiś dziwny, ale ja tam lubię znajdować błędy u innych :yes:

    0
  • #13 06 Sie 2014 12:02
    94075
    Użytkownik usunął konto  
  • #14 06 Sie 2014 12:46
    starob
    Poziom 25  

    szczywronek napisał:
    Ale do zauważenia, że 16-bitową maskę pinu przepycha przez tablicę "charów"


    W którym miejscu, bo nie widzę ?

    0
  • #15 06 Sie 2014 13:01
    szczywronek
    Poziom 27  

    @albertb A może być taki trochę pseudokod?

    Kod: c
    Zaloguj się, aby zobaczyć kod


    S'il vois plait ;) Funkcja z założenia ma zwrócić numer miesiąca (1...12) w wyniku błędnego działania zwraca wartość 13.
    Zwraca jakąś wartość? Ano zwraca.
    Czy jest to poprawna wartość? Nie.
    Założyłem, że Autor pisząc o nie "zwracaniu wartości" miał na myśli nie zwracanie wartości poprawnej/oczekiwanej. Ty założyłeś (z tego co rozumiem), że miał na myśli nie zwracanie żadnej wartości. Patrząc na kod przedstawionej przez Autora funkcji wydaje się to raczej mało prawdopodobne.

    @starob - maski z "stm32f10x_gpio.h" lądują w tablicach GPIORows i GPIOCols:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #16 06 Sie 2014 13:36
    starob
    Poziom 25  

    szczywronek napisał:
    maski z "stm32f10x_gpio.h" lądują w tablicach GPIORows i GPIOCols


    No fakt :) nie używam biblioteki

    0
  • #17 06 Sie 2014 13:39
    94075
    Użytkownik usunął konto  
  • #18 06 Sie 2014 13:58
    szczywronek
    Poziom 27  

    @starob - to jeszcze trzeba nawrócić Autora na słuszną drogę :D

    @albertb - przecież wszyscy wiemy, że Autor w opisie problemu nie jest ani dokładny, ani logiczny... Staram się pomóc na podstawie dostarczonych informacji najlepiej jak potrafię, Ty prowadzisz analizy logiczno-językowe. Ok, moje założenie jest błędne, przepraszam że przyjmując je znalazłem błąd w funkcji Autora (opisany powyżej). Wytłumacz, proszę, jak Autor ma zastosować Twoją radę:

    albertb napisał:
    Takie problemy rozwiązuje się generalnie zmieniając deklarację i definicję funkcji z typu void na dowolny inny
    w odniesieniu do swojej funkcji:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #19 06 Sie 2014 14:00
    Eagle
    Poziom 23  

    albertb napisał:
    szczywronek napisał:
    Założyłem, że Autor pisząc o nie "zwracaniu wartości" miał na myśli nie zwracanie wartości poprawnej/oczekiwanej. Ty założyłeś (z tego co rozumiem), że miał na myśli nie zwracanie żadnej wartości


    Zdanie "nie zwraca wartości" jest równoważne logicznie zdaniu "nie zwraca żadnej wartości"
    natomiast NIE jest równoważne logicznie zdaniu "nie zwraca wartości poprawnej"

    Więc Twoje założenie jest błędne

    Albert


    Zgadzam się z Albertem, bo w/g twojego sposobu rozumowania, gdy masz napisać funkcję która nic nie zwraca, to Ty piszesz funkcję która zwraca coś nieprawidłowego ? Przecież to nie logiczne. Od tego jest void.

    0
  • #20 06 Sie 2014 14:01
    94075
    Użytkownik usunął konto  
  • #21 06 Sie 2014 14:22
    szczywronek
    Poziom 27  

    Eagle napisał:
    Przecież to nie logiczne. Od tego jest void.
    Ależ ja uważam dokładnie tak samo - jeśli funkcja ma nic nie zwracać to void i voila :) Funkcja Autora nie jest void -> zwraca jakąś wartość -> Autor napisał "nie zwraca wartości" -> pewnie zjadł przymiotnik "poprawnej" bo inaczej nie miałoby to sensu.

    Kolego albertb wiem co masz na myśli. Tylko, że jeśli Autor się "przestraszy" i zwieje z Elektrody to też nie będzie pożytku ;) ... przynajmniej dla Niego.

    0
  • #22 06 Sie 2014 20:43
    młody druciarz
    Poziom 5  

    Póki co jeszcze mnie stąd nie wykurzyliście. <hihihi>

    szczywronek napisał:
    Kompilator nie zwraca Ci uwagi na typ parametrów przekazywanych do GPIO_SetBits(...)? Nie wiem czy akurat to jest głównym problemem, ale na moje oko tablice GPIORows/Cols powinny być trochę innego typu (uint16_t).


    Kompilator zwracał uwagę jako zagrożenie. Przy zmianie typu tablic na ten, zasugerowany przez Ciebie funkcja KBD_ReadKey zwracała wartości, lecz nie są one zgodne z przyciśniętymi klawiszami. Wydaje mi się, że to jest pierwszy krok do przodu. :D


    starob napisał:
    Od debuggera należy zacząć.. prawdopodobnie stany portów zmieniać się będą właściwie. Wątpliwości budzi jedynie wartość opornika szeregowego 10k. Dałbym mniejszy lub wcale.
    Oczywiście sposób obsługi klawiatury też pozostawia wiele do życzenia. Jest małe prawdopodobieństwo, że procedura odczytu klawiatury "trafi" w moment wciśnięcia klawisza, a gdy już trafi to natychmiast zostanie nadpisana zerem.


    Dzięki literaturze wydawnictwa BTC wiem jak uruchomić debugger, lecz niestety tryb ten jest dla mnie absolutnie nieczytelny. Pragnę zaznaczyć, że to moje początki w MK.

    Sposób obsługi klawiatury jest żywcem wzięty z książki "STM32 - aplikacje i ćwiczenia w języku C" Marka Galewskiego. Jeśli ktoś zasugerowałby lepszy algorytm byłbym bardzo wdzięczny.

    0
  • #23 06 Sie 2014 21:27
    szczywronek
    Poziom 27  

    No pięknie... ja tu się produkuję nt. pomocy i wyrozumiałości, a Ty odpłacasz czymś takim :lol:

    młody druciarz napisał:
    Przy zmianie typu tablic na ten, zasugerowany przez Ciebie funkcja KBD_ReadKey zwracała wartości, lecz są one zgodne z przyciśniętymi klawiszami.
    Nie pozostaje nic innego jak zapytać:
    - czy po zakończeniu zmieniana funkcja dalej zwracała wartości? (piszesz, że zwracała przy zmianie)
    - kiedy przestała zwracać? (użyłeś formy przeszłej)
    - jakie powinny być te wartości? ("lecz" sugeruje, że zwracane wartości nie były poprawne)
    - to właściwie działa czy nie?

    Programy pisz tak, aby nie było ani błędów, ani ostrzeżeń.

    0
  • #24 07 Sie 2014 10:01
    starob
    Poziom 25  

    młody druciarz napisał:
    KBD_ReadKey zwracała wartości, lecz są one zgodne z przyciśniętymi klawiszami

    Wszystkie kody są niewłaściwe, czy tylko dla czwartego rzędu?
    .. bo masz 4 rzędy i 3 kolumny, więc w funkcji KBD_ReadKey trzeba zmienić warunki na (r<4) i (c<3)

    Przed następnym krokiem polecam lekturę http://mikrokontrolery.blogspot.com/2011/04/przycisk-drgania-stykow-debouncing.html

    młody druciarz napisał:
    Sposób obsługi klawiatury jest żywcem wzięty z książki "STM32 - aplikacje i ćwiczenia w języku C" Marka Galewskiego. Jeśli ktoś zasugerowałby lepszy algorytm byłbym bardzo wdzięczny.


    To nie jest algorytm tylko przykład "czegoś tam" więc każdy będzie lepszy :)

    np. na początek będzie wystarczający :
    1. Sprawdzić czy naciśnięty jest w ogóle klawisz
    a) ustawić wszystkie bity rzędów
    b) odczytać bity kolumn czy któryś bit jest ustawiony
    c) wyzerować wszystkie bity rzędów (nie koniecznie ale trzeba o tym pamiętać przy odczycie kodu klawisza)
    <NIE> nie robisz nic
    <TAK>
    2. odczekać ok 20 ms na stabilizację styków
    3. odczytać kod klawisza
    4. odczekać na puszczenie klawisza (jak w pkt. 1 )
    jest to potrzebne aby wielokrotnie nie odczytać tego samego znaku np. podczas wpisywania ciągów wieloznakowych

    ... tak z grubsza:)

    0