eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikasdcc i at89c51 - dostęp do pinu "na około"sdcc i at89c51 - dostęp do pinu "na około"
  • Data: 2017-03-14 19:07:22
    Temat: sdcc i at89c51 - dostęp do pinu "na około"
    Od: Atlantis <m...@w...pl> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    Ciąg dalszy moich eksperymentów z archaicznymi mikrokontrolerami. ;)

    Już kiedyś pytałem, czy da się w jakiś sposób przesłać wygodną
    konstrukcję wskazującą bezpośrednio na pin (np. "P0_0") za pomocą
    wskaźnika w C. Otrzymałem odpowiedź, że się nie da i muszę to robić w
    sposób standardowy.

    Natknąłem się jednak na pewne problemy... Próbuję przeportować pewną
    bibliotekę do obsługi przycisków (debouncing + wykrywanie długiego
    wciśnięcia). Kod podpatrzony w jednej z książek pana Kardasia, z paroma
    moimi modyfikacjami.

    Generalnie sprowadza się do tego, że mam strukturę opisującą przycisk:

    typedef struct key {
    unsigned char *port;
    unsigned char pin:3;
    unsigned char state:4;
    unsigned int timer;
    void (*push_proc)(void);
    void (*long_proc)(void);
    } key_t;

    Struktura jest inicjowana za pomocą funkcji key_init(), która przypisuje
    argumenty do struktury przekazanej przez wskaźnik, czyli wygląda to w
    ten sposób:

    key_init(&button2, &P0, 0, funkcja, funkcja);

    Kolejne argumenty oznaczają: adres struktury, adres portu, numer pinu w
    porcie, wskaźnik na funkcję wykonywaną po krótkim wciśnięciu przycisku i
    wskaźnik na funkcję wykonywaną po przytrzymaniu przycisku.

    Potem stan przycisku jest cały czas sprawdzany wewnątrz funkcji
    key_update(), która przyjmuje za argument adres struktury.

    Tyle tytułem wprowadzenia.

    Sęk w tym, że kod nie chce działać. Drogą eliminacji doszedłem do tego, że:
    1) Same wejścia cyfrowe działają - odwołanie się do nich bezpośrednio
    daje pozytywny efekt.
    2) Działa także konstrukcja key_press = !(P0 & (1<<NUMER_PINU))
    3) Program wchodzi do funkcji key_update.

    NIE DZIAŁA natomiast następująca konstrukcja:

    key_press = !(*(key->port) & (1<<(key->pin)));

    Strukturę inicjuję podając dane właściwego portu i pinu, a pomimo tego
    wciskanie przycisku nie jest widoczne.

    I teraz pytanie: co jest nie tak. Czyżbym w sdcc i/lub at89c51 nie mógł
    przesyłać w ten sposób informacji o porcie? A może po prostu coś
    przeoczyłem i w powyższej linijce tkwił jakiś banalny błąd, który umyka
    mojej uwadze, gdy na nią patrzę?

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: