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



Teraz jest 13 kwi 2026, o 13:55


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 16 ] 
Autor Wiadomość
PostNapisane: 29 lip 2015, o 13:48 
Offline
Nowy

Dołączył(a): 22 cze 2015
Posty: 21
Pomógł: 0

Witam,

Uruchomiłem płytkę Arduino Pro Mini (stykówka, 4 diody, 4 rezystory, 1 brzęczyk, dwa przyciski) i rozpocząłem programowanie w Eclipse. Wszystkie operacje testowe przeprowadzone na diodach zakończyły się powodzeniem. Przebrnąłem również pomyślnie przez konfigurację TIMER'a 8-bitowego, oraz 16-bitowego. Docelowo zmierzałem do obsługi przerwań PCINT (stąd dwa zamontowane przyciski). Zanim jednak przeszedłem do tego zagadnienia, stwierdziłem że napiszę prosty program, aby ustalić czy przyciski powodują pożądane reakcje. I tu napotkałem na problem. Przyciski podłączone są do masy i ich naciśnięcie powoduje obecność stanu niskiego odpowiednio na pinach PC0 oraz PC1. Założenie teoretyczne potwierdziłem badaniem praktycznym - sprawdziłem miernikiem i istotnie, na wskazanych pinach występuje GND po naciśnięciu przycisku. Nie ma również mowy o tym, że przyciski podłączone są omyłkowo do niewłaściwych pinów, bowiem gdy w linijce PORTC |= (1<<PC0) dokonam modyfikacji na PORTC &= ~(1<<PC0) - program zaczyna działać, dioda migocze, a na pinie procesora do którego podłączony jest switch, występuje stan 0. Problem jednak w tym, że podanie GND na ten pin czy to za pomocą przycisku, czy też przez bezpośrednie zwarcie przewodu (GND - PC0) nie powoduje żadnej reakcji.
Gdzie robię błąd? Za wszelkie wskazówki z góry dziękuję.

Płytka: Obrazek

Poniżej kod:
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: 29 lip 2015, o 14:17 
Offline
Użytkownik

Dołączył(a): 01 sty 2014
Posty: 116
Pomógł: 14

PINx zamiast PORTx :)

PORTx to rejestr wyjściowy, możesz dzięki niemu ustawić PULL-UP jeśli konfigurujesz wejście. Najlepiej tak właśnie zrobić.

PINx to rejestr wejściowy, w nim odczytujesz stan przycisku.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lip 2015, o 14:29 
Offline
Nowy

Dołączył(a): 22 cze 2015
Posty: 21
Pomógł: 0

Daniel880 napisał(a):
PINx zamiast PORTx :)

PORTx to rejestr wyjściowy, możesz dzięki niemu ustawić PULL-UP jeśli konfigurujesz wejście. Najlepiej tak właśnie zrobić.

PINx to rejestr wejściowy, w nim odczytujesz stan przycisku.


Dzięki za odpowiedź. Zgadzam się z Tobą i zwykle tak konfiguruję wejścia (PINx - rejestr wejściowy, istotnie). Natomiast w BB Mirek w ćwiczeniu z microswitchami konfiguruje wejścia właśnie poprzez PORTx (strona 189). Tak czy inaczej, bez względu na to, czy skonfiguruję tę linię kodu jako PORTC czy też PINC, nie ma żadnej reakcji na wciśnięty przycisk.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lip 2015, o 14:39 
Offline
Użytkownik

Dołączył(a): 01 sty 2014
Posty: 116
Pomógł: 14

Akurat na 189 stronie mam coś o timerach;)

Nie zrozumieliśmy się do końca;p Chodzi o zmianę:

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


na:

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


Chodzi o bity, z których odczytujesz stan przycisku. Są one tylko w rejestrze PINC i żadnym innym. Jestem pewien, że zmiana tej lini kodu naprawi twój problem;)


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lip 2015, o 14:47 
Offline
Nowy

Dołączył(a): 22 cze 2015
Posty: 21
Pomógł: 0

Daniel880 napisał(a):
Akurat na 189 stronie mam coś o timerach;)

Nie zrozumieliśmy się do końca;p Chodzi o zmianę:

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


na:

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


Chodzi o bity, z których odczytujesz stan przycisku. Są one tylko w rejestrze PINC i żadnym innym. Jestem pewien, że zmiana tej lini kodu naprawi twój problem;)



Wszystko jasne. Widocznie masz starszą wersję BB. Dzięki serdeczne, nie zauważyłem tego głupiego błędu. Już wszystko działa.

Pozdrawiam!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lip 2015, o 14:47 
Offline
Moderator
Avatar użytkownika

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

sternick napisał(a):
Natomiast w BB Mirek w ćwiczeniu z microswitchami konfiguruje wejścia właśnie poprzez PORTx (strona 189).


Panie panie - no teraz toś pan napisał ..... gdzie ten Mirek TAKIE rzeczy pisze ....

ani w starym wydaniu książki (miękka okładka) - ani w nowym wydaniu książki (twarda okładka) nigdzie takich bzdur nie piszę panie kolego - więc proszę nie wymyślaj takich rzeczy ok ? Jeśli czegoś nie rozumiesz - to po prostu dopytaj - zamiast takie kwiatki sadzić - ok ? (to tak na przyszłość)

ty pewnie nie rozumiesz co to są WEJŚCIA a co to są WYJŚCIA jeśli chodzi o funkcjonalność pinów procka. Nie będę od nowa tego tutaj opisywał - po prostu weź książkę i jeszcze raz dokładnie przeczytaj .....

(aha chyba że masz stare wydanie w miękkiej okładce to tam zabrakło takiego doprecyzowania - które możesz sobie na moim blogu zobaczyć zawsze - więc patrz: http://mirekk36.blogspot.com/2012/01/av ... stawy.html )

A że w książce zobaczyłeś np dla pinu klawisza

PORTB |= KEY1;

to WCALE nie oznacza, że konfiguruję pin jako we/wy - tylko "podciągam go programowo" do VCC

ale jak mówię - poczytaj - dopytaj - a nie wypisuj takich rzeczy to moja gorąca prośba

_________________
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: 29 lip 2015, o 15:19 
Offline
Nowy

Dołączył(a): 22 cze 2015
Posty: 21
Pomógł: 0

mirekk36 napisał(a):
sternick napisał(a):
Natomiast w BB Mirek w ćwiczeniu z microswitchami konfiguruje wejścia właśnie poprzez PORTx (strona 189).


Panie panie -

Panie, Panie, kobita na polanie.

Przepraszam, jeśli powyższym szerzę nieprawdę. Zapewne wynika to z niedokładnego zrozumienia tematu.
A przechodząc do meritum, rozumiem czym są wejścia i wyjścia. Zapoznałem się z pojęciami: rejestru kierunkowego, rejestru wejściowego oraz rejestru wyjściowego.

W rejestrze kierunkowym ustalam, czy dany pin ma być wejściem, czy też wyjściem

Rejestr wyjściowy służy do ustaleniu początkowego, panującego na nim stanu, np. logicznej jedynki: PORTx |= (1<<PCx)

Rejestr wejściowy z kolei pozwala na ustalenie początkowego stanu logicznego, jaki będzie panował na skonfigurowanym w rejestrze kierunkowym wejściu procesora. I tu pojawia się moje niezrozumienie. Dlaczego podciągam do VCC przez linię kodu: PORTC |= (1<<PC0) zamiast PINC |= (1<<PC0) ? Ustalam stan na wejściu czy wyjściu procesora? Skoro na wejściu, to czemu nie używamy linii PINC |= (1<<PC0) ? Dodam, że gdy użyję właśnie takiej konfiguracji i wpiszę PINC |= (1<<PC0) zamiast PORTC |= (1<<PC0) to program działa dokładnie tak samo! Czyli na wejściu panuje stan wysoki, który mogę zmienić np. poprzez podanie z zewnątrz masy. Poniżej przedstawiam kod DZIAŁAJĄCEGO programu i proszę o wyjaśnienie. Dodam, że wskazany przez Ciebie link o rejestrach ZNAM - czytałem. Pytanie pozostaje aktualne.

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: 29 lip 2015, o 15:41 
Offline
Moderator
Avatar użytkownika

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

sternick napisał(a):
I tu pojawia się moje niezrozumienie. Dlaczego podciągam do VCC przez linię kodu: PORTC |= (1<<PC0) zamiast PINC |= (1<<PC0) ?


No dobrze to przeniosę ten tekst z bloga tutaj bo nie wiem czy zajrzałeś:

DDRB DDRC DDRD - rejestry kierunku
PORTB PORTC PORTD - rejestry wyjściowe
PINB PINC PIND - rejestry wejściowe

i rysunek bo pewnie też nie widziałeś:

Obrazek

widzisz to ?

firma ATMEL wymyśliła sobie trzy rodzaje rejestrów

DDRx
PINx
PORTx


DDRx - bitami tego rejestru ustawiasz kierunek - zrozumiałe ? do niczego innego on nie służy

PINx - chcąc odczytać JAKI MASZ STAN na WEJŚCIU danego pinu no musisz czytać ten rejestr - bo w zależności od stanu na wejściu dany bit będzie miał albo ZERO albo JEDEN - zrozumiałe ?

no i przechodzimy do

PORTx - chcą wystawić jakiś stan na zewnątrz ZERO albo JEDEN (gdy kierunek pinu jest wyjściem!) wpisujesz jedynki albo zera do tego portu - i pojawiają się one na pinach - zrozumiałe ?

czyli gdy ustawimy jakiś pin procka jak WEJŚCIE to można by powiedzieć, że rejestr PORTx jest nieużyteczny w tym momencie bo co można ustawiać ? na pinie gdy nie jest WYJŚCIEM - prawda ?

ale .... ! ale UWAGA ... z tego powodu firma ATMEL wymyśliła alternatywną funkcjonalność - żeby ten rejestr nie leżał odłogiem gdy pin lub piny są wejściami ...

otóż w tym czasie jeśli zapiszesz JEDYNKĘ na danym bicie to załączasz taki mały rezystorek w środku - który podciąga WEJŚCIE na tym bicie do VCC

TERAZ rozumiesz ? To wynika wprost z noty PDF a nie z moich jakichś tam analiz poetyckich tekstów ;) ....

i dlatego w pewnych (wyżej wymienionych sytuacjach) używamy konkretnych rejestrów - wyjątkiem jest tylko rejestr PORTx, który ma dodatkowe zastosowanie gdy pin jest wejściem

_________________
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: 29 lip 2015, o 15:50 
Offline
Nowy

Dołączył(a): 22 cze 2015
Posty: 21
Pomógł: 0

Mirku, tak wszystko jest dla mnie zrozumiałe. Wyjaśniłeś kwestię tą linią:

mirekk36 napisał(a):
ale .... ! ale UWAGA ... z tego powodu firma ATMEL wymyśliła alternatywną funkcjonalność - żeby ten rejestr nie leżał odłogiem gdy pin lub piny są wejściami ...

otóż w tym czasie jeśli zapiszesz JEDYNKĘ na danym bicie to załączasz taki mały rezystorek w środku - który podciąga WEJŚCIE na tym bicie do VCC


Jednak czy możesz mi wyjaśnić, dlaczego udaje mi się uzyskać STAN WYSOKI na wejściu procesora, gdy używam poniższego zapisu:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Zgodnie z tym co napisałeś, zapis ten jest błędny, albowiem PORTx służy do wystawiania stanów w przypadku wejść. Mógłbyś się do tego odnieść? Z góry dziękuję.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lip 2015, o 16:13 
Offline
Użytkownik

Dołączył(a): 01 sty 2014
Posty: 116
Pomógł: 14

Obrazek

Pewnie dlatego. Jest to screen z noty katalogowej jak coś, bo wygląda na to, że mogłeś nie czytać;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lip 2015, o 16:21 
Offline
Moderator
Avatar użytkownika

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

Daniel880 napisał(a):
Obrazek

Pewnie dlatego. Jest to screen z noty katalogowej jak coś, bo wygląda na to, że mogłeś nie czytać;)


to nie jest dostępne we wszystkich prockach AVR o ile dobrze pamiętam czyli np w ATmega8 nie a już w ATtiny2313 tak

_________________
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: 29 lip 2015, o 16:26 
Offline
Użytkownik

Dołączył(a): 01 sty 2014
Posty: 116
Pomógł: 14

a to tego nie wiedziałem ale screen prosto z noty Atmegi328, takiej samej jak w płytce kolegi;)

Sam nie wiedziałem, że rejestr PIN ma taką funkcjonalność. Myślałem, że znajdę tam coś o tym, że rejestr PIN jest tylko do odczytu a tu taka niespodzianka;)

Właśnie sprawdziłem notę Atmegi8:Obrazek

Rejestr PIN tylko do odczytu;)



Ostatnio edytowano 29 lip 2015, o 16:30 przez Daniel880, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lip 2015, o 16:30 
Offline
Moderator
Avatar użytkownika

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

Daniel880 napisał(a):
Atmegi328

no bo to już nowsze procki a więc będzie i w: m48, m88, m168 ale także m644p, m1284 itp itd ;)


Autor postu otrzymał pochwałę

_________________
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: 29 lip 2015, o 16:50 
Offline
Nowy

Dołączył(a): 22 cze 2015
Posty: 21
Pomógł: 0

Daniel880 napisał(a):
Daniel880
Dziękuję za wszystkie, pomocne odpowiedzi i cieszę się, że sprowokowałem Cię do poszukiwań, które i do Twojej wiedzy wniosły coś pożytecznego ;)

mirekk36 napisał(a):
mirekk36
Dziękuję za cierpliwość, poświęcony czas oraz przystępne wyjaśnienie kwestii.

Konkluzja jest taka: we wszystkich procesorach w ciemno konfigurujemy stan wejść/wyjść przez PORTx, lub zaglądamy do noty i sprawdzamy funkcjonalność PINx (r/w). Tak się składa, że korzystałem z dwóch mikrokontrolerów. Właśnie ATtiny2313 oraz ATmega328P no i oba jak się okazuje, na taką konfigurację pozwalają.

Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lip 2015, o 18:19 
Offline
Moderator
Avatar użytkownika

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

sternick napisał(a):
Konkluzja jest taka: we wszystkich procesorach w ciemno konfigurujemy stan wejść/wyjść przez PORTx, lub zaglądamy do noty i sprawdzamy funkcjonalność PINx (r/w)


Nie panie kochany - konkluzja jest inna

we wszystkich prockach ustawiamy kierunek pinów za pomocą zapisu do rejestru DDRx

we wszystkich prockach ustawiamy stan na WYJŚCIU pinów za pomocą zapisu do rejestru PORTx

we wszystkich prockach odczytujemy stan wejść na pinach za pomocą odczytu z rejestru PINx
---------------------------------------
we wszystkich prockach podciągamy WEJŚCIE programowo do VCC przez PORTx

----------------------------------------------------------

bo takie podejście panie kochany to zadziała w KAŻDYCH procesorach


****************************************

zaś w nowszych prockach możemy (jako bonus) korzystać z funkcjonalności TOGGLING PIN żeby zmieniać stan na wyjściu PORTx poprzez zmianę stanu bitów w rejestrach PINx

_________________
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: 29 lip 2015, o 20:08 
Offline
Nowy

Dołączył(a): 22 cze 2015
Posty: 21
Pomógł: 0

Przecież dokładnie to samo napisałem.



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: 16 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Majestic-12 [Bot] 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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO