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



Teraz jest 10 sty 2025, o 17:01


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 47 ]  Przejdź na stronę Poprzednia strona  1, 2
Autor Wiadomość
PostNapisane: 6 sty 2014, o 19:14 
Offline
Nowy

Dołączył(a): 06 sty 2014
Posty: 15
Pomógł: 0

zrzut ekranu - projekt zaimportowany z bloga

Obrazek

[ obrazki umieszczamy na forum - mirekk36 - w przeciwnym razie będą kasowane tak jak ten przykro mi :(

tu masz instrukcję co i jak - wystarczy zajrzeć:
topic44.html

]


zapisuje, kompiluje i nic.
jest dobrze tylko w jednym przypadku - gdy sam tworzę projekt oraz stworzeniu projektu w opcjach ustawiam odpowiedni mikrokontroler



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2014, o 19:51 
Offline
Użytkownik

Dołączył(a): 14 paź 2013
Posty: 29
Pomógł: 0

Witam. Analizuję ten kod użytkownika jacekk232 na Atmega8 ale nie mogę zrozumieć jak to działa że sygnał jest generowany na 5 portach a następnie odczytany na pinie INT0. Czy mógł by mi to ktoś wytłumaczyć?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2014, o 22:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Skoro zostałem wywołany do tablicy :-) to postaram się wytłumaczyć jak to działa.

Klawisze jednym końcem podłączone są do pinów PC1...PC5, natomiast drugie końce podłączone są do pinu PD2 czyli INT0.

Na początku konfiguracja pinów. PC1 do PC5 jako wyjścia w stanie niskim a PD2 jako przerwanie zewnętrzne wywoływane zboczem opadającym. Jednocześnie PD2 ustawiony zostaje jako wejście z podciągnięciem do VCC.
Wciśnięcie jakiegokolwiek klawisza powoduje, że na PD2 zostaje podany stan niski. Wywołane zostaje przerwanie INT0 i skok do funkcji obsługi tego przerwania.

Na początku przerwania zostaje zmieniona konfiguracja pinów czyli PC1 do PC5 jako wejścia podciągnięte do VCC a PD2 jako wyjście w stanie niskim. Następnie mamy pięć warunków sprawdzających na którym wejściu od PC1 do PC5 panuje stan niski podany poprzez wciśnięty klawisz z pinu PD2.
Na końcu funkcji zostaje przywrócona pierwotna konfiguracja pinów czyli PD2 jako wejście podciągnięte do VCC (przerwanie INT0 cały czas jest włączone) a PC1 do PC5 jako wyjścia w stanie niskim.

Po wyjściu z przerwania i powtórnym wciśnięciu jakiegokolwiek klawisza cała procedura zaczyna się od nowa.

Myślę, że ten opis przybliży nieco działanie tego mechanizmu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2014, o 23:30 
Offline
Użytkownik

Dołączył(a): 14 paź 2013
Posty: 29
Pomógł: 0

A to w której linijce kodu jest to badanie na którym pinie następuje stan niski?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2014, o 23:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

W tych liniach są sprawdzane stany na pinach PC1..PC5
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: 14 lut 2014, o 23:36 
Offline
Użytkownik

Dołączył(a): 14 paź 2013
Posty: 29
Pomógł: 0

O to teraz kod zaczyna robić się jasny dla mnie. Wielkie dzięki za pomoc.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 lut 2014, o 16:40 
Offline
Użytkownik

Dołączył(a): 14 paź 2013
Posty: 29
Pomógł: 0

Ale teraz jeszcze dojrzałem, że w int main(void) klawisze ustawione są jako wyjścia i stan niski gdzie w ISR( INT0_vect ) klawisze są ustawione jako wejście i załączony wewnętrzny rezystor. Jak to może działać skoro według mnie całość się zaprzecza przez co całość nie powinna działać.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 lut 2014, o 19:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

tukang napisał(a):
Jak to może działać skoro według mnie całość się zaprzecza przez co całość nie powinna działać.

Nic tu niczemu nie zaprzecza a całość doskonale działa. A jak to działa to opisałem w poprzednim poście. Ale może niejasno to opisałem.
Dlatego może napisz z czym konkretnie masz problem, której części kodu nie rozumiesz. A ja wtedy postaram się to wyjaśnić.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lut 2014, o 14:53 
Offline
Użytkownik

Dołączył(a): 14 paź 2013
Posty: 29
Pomógł: 0

To prosiłbym część w której sprawdzany jest czy i który przycisk został wciśnięty.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lut 2014, o 23:08 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Sprawdzanie wciśnięcia klawiszy odbywa się w przerwaniu INT0 w liniach od 11 do 15.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

A działa to tak. Po wejściu do przerwania piny klawiszy ustawiane są jako wejścia podciągnięte do Vcc (linia 3 i 4).
Następnie pin PD2 jest ustawiany jako wyjście w stanie niskim (linia 6 i 7). Na PD2 panuje stan niski więc możemy go potraktować jako GND. Czyli mamy typową sytuację, w której wciśnięcie klawisza zwiera wejście do GND.

Jeśli wciśnięty został np. klawisz 3 podłączony do PC3 to stan niski z PD2 zostanie podany na wejście PD3. Warunki w liniach od 11 do 15 sprawdzają na którym pinie od PC1 do PC5 jest stan niski.
Czyli po wciśnięciu PC3 PINC przyjmie wartość 0bxx11011x. Na tą wartość zostaje nałożona maska KL3 czyli 0b00001000. Po wykonaniu iloczynu logicznego & otrzymujemy
Kod:
  0bxx11011x
  0b00001000
& 0b00000000

Wartość 0b00000000 to FALSE (fałsz) co po zastosowaniu negacji logicznej ! da nam TRUE (prawda). Czyli wykonany zostanie warunek
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Gdyby jednak przerwanie się wykonało a żaden klawisz nie byłby wciśnięty (drgania styków) to żaden warunek się nie wykona bo
Kod:
PINC  0bxx11111x
KL3   0b00001000
&     0b00001000  (TRUE)

!0b00001000 (FALSE)


Dla pozostałych klawiszy zadziała to tak samo.
W PINC literą x oznaczyłem bity, które nas nie interesują.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 maja 2015, o 20:56 
Offline
Użytkownik

Dołączył(a): 09 mar 2015
Posty: 30
Pomógł: 0

Witam!
Bardzo pięknie i logicznie to wszystko opisane. Wielkie dzięki.
Pytanko mam o tą wstawkę
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Co ona robi, dlaczego trzeba i skąd wiadomo że trzeba ją wstawić?
Czy to chodzi o eliminację drgań styków?
W niebieskiej książce jest użyte _delay_ms(50) i powtórne zbadanie stanu styków.
Tutaj tego nie ma. Czy magiczne "nop" to załatwia ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 maja 2015, o 21:03 
Offline
Moderator
Avatar użytkownika

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

jacekrv1 napisał(a):
W niebieskiej książce jest użyte _delay_ms(50) i powtórne zbadanie stanu styków.

To o czym mówisz w Bluebooku to panie jest absolutny wstęp - pierwsze zetknięcie początkującego z tym zagadnieniem, i jeśli chcesz się dowiedzieć jak używać przycisków szczególnie w sposób nieblokujący to po prostu czytaj dalej książkę i nie zatrzymuj się na tym rozdziale - rozumiesz ?

Poza tym zaglądaj na mojego bloga - szczególnie zobacz sobie to:
http://mirekk36.blogspot.com/2012/10/ob ... w-cd2.html

poczytaj to dokładnie

_________________
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: 19 maja 2015, o 21:28 
Offline
Użytkownik

Dołączył(a): 09 mar 2015
Posty: 30
Pomógł: 0

Dzięki Mirku za szybką odpowiedź. Masz rację: "Kto czyta nie błądzi"!
Już mam wiedzę nt. eliminacji drgań styków. Ale moje pytanie dotyczy asm("nop"). Po cholerę toto jest? Widzę, że w niektórych listingach jest to używane nawet kilka/naście razy pod rząd. Domyślam się że chodzi o zwłokę czasową. Ale ile ona trwa? No i powtórzę: dlaczego trzeba i skąd wiadomo że trzeba ją wstawić? Jak wtedy zachowuje się procesor?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 maja 2015, o 21:30 
Offline
Użytkownik

Dołączył(a): 22 sty 2014
Posty: 1806
Zbananowany użytkownik

Pomógł: 168

"nop" jest rozkazem assemblera. . Mówi on do ALU "nie rób nic" i trwa jeden cykl zegara.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 maja 2015, o 22:25 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Jeśli na pin procesora zostanie podany jakiś stan, to ten stan zostanie wpisany do rejestru wejściowego po upływie jednego taktu zegara. Dopiero wtedy procesor odczyta faktyczny stan pinu. Jeśli odczyt nastąpiłby wcześniej, procesor odczytałby poprzedni stan pinu mimo, że na tym pinie panowałby już nowy stan.

To samo działa dla rejestru wyjściowego. Pomiędzy wpisaniem jakiegoś stanu do rejestru wyjściowego a wystawieniem tego stanu na pinie mija też jeden takt.

To wyjaśnia dlaczego w programie jest użyta instrukcja nop, która zatrzymuje ów program na jeden takt zegara.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Piny na porcie C przestawione zostały z wyjść na wejścia i włączone zostały pull-upy.
Następnie PD2 zostaje przestawiony z wyjścia ne wejście w stanie niskim.
Następnie następuje odczyt stanów na pinach portu C.
Jednak wcześniej program zostaje wstrzymany na czas jednego taktu po to aby mieć pewność, że stan niski z PD2, podany na jeden z pinów portu C poprzez przycisk, wpisany został do rejestru wejściowego PINC.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 maja 2015, o 22:12 
Offline
Użytkownik

Dołączył(a): 09 mar 2015
Posty: 30
Pomógł: 0

O widzisz! O taką informację mi chodziło. Teraz mam jasność.
Szacun wielki jacekk232. Gdzie się klika "pomógł"?
:-)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 maja 2015, o 10:17 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

W tym temacie nie klikniesz "pomógł" żadnej osobie bo wydaje mi się, że to tylko autor danego tematu może. Ale spoko. Najważniejsze, że moje wypociny na coś się zdały :-)



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: 47 ]  Przejdź na stronę Poprzednia strona  1, 2

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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