ATNEL tech-forum
https://forum.atnel.pl/

Przyciski a przetwania
https://forum.atnel.pl/topic17205.html
Strona 1 z 1

Autor:  Krlk [ 2 sty 2017, o 02:49 ]
Tytuł:  Przyciski a przetwania

Cześć, ostatnio napisałem mały programik wykorzystujący timery i przerwania w trybie CTC, teraz chciałem dodać obsługę klawisza.
Dodałem obsługę taką jak na blogu Pana Mirka:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


I tu pojawia się pewne ALE...nie mogę wejść do zdażenia "PRESS"...

Dla przetestowania wstawiłem sobie tam zapalanie diody ale co bym nie robił to ta nie chce się załączyć...

Oczywiście próbowałem również podstawowej wersji detekcji wciśnięcia:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

i nic...

Tu rodzi się moje pytanie. Czy przerwanie może w jakiś sposób zakłócić odczyt wciśnięcia klawisza?

Poniżej, najistotniejsze fragmenty kodu, z punktu widzenia tego posta.

main.c:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


biblioteka z funkcja "init_IO".c:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


plik z definicjami plik.h:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Autor:  anshar [ 2 sty 2017, o 04:21 ]
Tytuł:  Re: Przyciski a przetwania

sei(); powinno znajdować się tuż przed pętlą główną while(1).
Czy masz napisane procedury obsługi tych przerwań?
Przynajmniej tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Autor:  Krlk [ 2 sty 2017, o 05:32 ]
Tytuł:  Re: Przyciski a przetwania

Przeniosłem sei(); przed pętlę while, a obie procedury obsługi przerwań napisałem w pliku z funkcjami, pliku.c (tam gdzie jest funkcja "init_IO"), ale w dalszym ciągu nie wchodzę do zdażenia "PRES BUT"...myślałem że to może coś sprzętowego, ale po podłączenia pinu 7 portu C, na którym mam zdefiniowany przycisk, zarówno do GND i VCC płytki, nie mam reakcji więc to prawie na pewno kwestia programowa...

Ten projekcik to zwykły zegarek na wyświetlaczu siedmiosegmentowym zestawu ATB. Płytka Atnel ma standardowo 4 moduły cyfr, wszystko działa, to znaczy kiedy chcę wyświetlić godzinę i minuty albo minuty i sekundy, ale do skończenia całości zostało mi do zrealizowania przełączanie pomiędzy tymi stanami czyli wyświetlaniem GG:MM i MM:SS po przyciśnięciu guzika...niby najprostsza rzecz na świecie...no i właśnie z nią mam ten problem...

Wrzucę niżej jak wygląda całość kodu może czegoś się dopatrzycie :)
Był bym wdzięczny :)

zegar.h:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.




zegar.c:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



main.c:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Siedzę nad tym całą noc, ale jestem już tak bardzo tym sfrustrowany że nie ma szans żebym dzisiaj coś znalazł :)

Tak naprawdę to program jest gotowy o ile załapie przycisk...

Autor:  mirekk36 [ 2 sty 2017, o 06:36 ]
Tytuł:  Re: Przyciski a przetwania

Krlk napisał(a):
                if( !key_lock && !(PORT_KEY & KEY ) ) {
                        key_lock=50000;
                       
                        TEST_LED_PORT &= ~TEST_LED;
                        //_delay_ms(10000);
                       
                        //stan ^= true;
                                               
                } else if( key_lock && (PORT_KEY & KEY ) ) key_lock++;

Bo to NIGDY nie ma prawa zadziałać, zajrzyj na bloga i porównaj toż masz tam poprawny kod

Autor:  Daro69 [ 2 sty 2017, o 07:24 ]
Tytuł:  Re: Przyciski a przetwania

Poza tym chochlikiem w sposobie odczytywania stanu bitów portu,
jeszcze mało znaczący, ale też duszek.
w przerwaniu wartość wyliczana w pętli to min. 1 max 99 = 99 a nie 100. (przydało by się else). ;)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

teraz jest od 0 do 99 = 100. setnym działaniem jest tylko wpisanie zera - bez inkrementacji.

Autor:  anshar [ 2 sty 2017, o 12:01 ]
Tytuł:  Re: Przyciski a przetwania

Dodatkowo zmień na:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Tutaj jest błąd:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


A jeśli zadeklarujesz zmienną static uint8_t licznik1;, którą masz w przerwaniu jako zmienną globalną uint8_t licznik1;to później możesz napisać:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

zamiast:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Aby ta cyfra z kropką nie migała, trzeba jeszcze zwiększyć trochę odświeżanie np OCR0=171 czyli 250Hz
Ostatni element tablicy const uint8_t cyfry[] PROGMEM tak na prawdę jest niepotrzebny:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


OCR2 powinno być równe 107, a nie 108.

No i na koniec musisz jeszcze gdzieś wywołać tą funkcję:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Pozdrawiam ;)

Autor:  Krlk [ 2 sty 2017, o 13:41 ]
Tytuł:  Re: Przyciski a przetwania

Zegarek działa zgodnie z założeniami. Dziękuję!

Lekcja na przyszłość, warto odpocząć jak się utknie, ego nie jest najważniejsze ;)

Strona 1 z 1 Strefa czasowa: UTC + 1
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/