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ę?