Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 28 mar 2024, o 23:59


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 2 sty 2017, o 02:49 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 06 paź 2016
Posty: 22
Pomógł: 0

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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 sty 2017, o 04:21 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 sty 2017, o 05:32 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 06 paź 2016
Posty: 22
Pomógł: 0

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...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 sty 2017, o 06:36 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

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

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 sty 2017, o 07:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 sty 2017, o 12:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

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 ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 sty 2017, o 13:41 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 06 paź 2016
Posty: 22
Pomógł: 0

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

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 4 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO