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



Teraz jest 19 cze 2026, o 15:51


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 12 ] 
Autor Wiadomość
PostNapisane: 13 paź 2015, o 13:41 
Offline
Użytkownik

Dołączył(a): 09 mar 2013
Posty: 28
Lokalizacja: Góra Kalwaria
Pomógł: 0

Witam, po pona dwuletniej przerwie, właśnie siadłem do starego projektu i natrafiłem na następujący problem:
Jak programowo sprawdzić, jaki jest stan na porcie skonfigurowanym jako wyjście?

Dodam może, że projekt zawiera 4 timery, którym podajemy HH:MM:SS startu i HH:MM:SS stopu. Informację o czasie włączenia/wyłączenia poszczególnych timerów chcę umieścić na LCD.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 paź 2015, o 13:57 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 162
Pomógł: 6

odczytaj rejestr PORTx



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 paź 2015, o 13:58 
Offline
Użytkownik

Dołączył(a): 26 lip 2015
Posty: 269
Pomógł: 34

Jeśli przycisk podłączony do masy to chyba tak sprawdź dawno nie używałem avr :
if(!(PINX & (1<<PX)))
X = zależna do jakiego pinu podłączasz przycisk.
Obejrzyj poradniki mirka "chyba o przyciskach" i "led czwiczenia" czy cóś takiego poszukaj a znajdzesz tam mirek pokazuje różne proste efekty led.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 paź 2015, o 16:19 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

A czy chcesz wiedzieć jaki jest stan ustawiony przez Ciebie na tym wyjściu czy stan faktyczny?
Jak będziesz czytał z rejestru PORTx (PORTx & (1 << Pxy)) to masz stan teoretyczny (czyli czy ustawiłeś jako wyjście o wartości 1 czy 0). Jak odczytasz z rejestru PINx (PINx & (1 << Pxy)) to odczytujesz stan fizycznego wejścia a ten może być czasami inny od ustawionego (np. coś ściągnęło linię ustawioną jako wyjście o stanie 1 do GND).

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 paź 2015, o 16:25 
Offline
Użytkownik

Dołączył(a): 11 wrz 2013
Posty: 709
Zbananowany użytkownik

Pomógł: 23

@Bartek123.
Myślę, że koledze chodziło o coś zupełnie innego, a mianowicie WYJŚCIE, a nie WEJŚCIE - w uC robi to sporą różnicę.

Cytuję:
"W przypadku, gdy pin mikrokontrolera ustawiony jest jako wyjście, odczytanie stanu pinu powoduje faktycznie odczytanie wartości zapisanej w rejestrze wyjściowym PORTx, gdyż to on wtedy wymusza stan pinu."

Jednak trzeba uważać, aby nie sprawdzać za wcześnie, bo stan musi się ustalić.

--
Grzegorz...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 paź 2015, o 17:24 
Offline
Użytkownik

Dołączył(a): 09 mar 2013
Posty: 28
Lokalizacja: Góra Kalwaria
Pomógł: 0

Dzięki za pomoc, niestety nie mogę tego w tej chwili przetestować, ale rozumiem, że dla pinu PA1 taki zapis będzie prawidłowy:
if (!(PINA &(1<<PA1)))
powyższy if wykona się dla stanu niskiego na porcie?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 paź 2015, o 17:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Cytuj:
Cytuję:
"W przypadku, gdy pin mikrokontrolera ustawiony jest jako wyjście, odczytanie stanu pinu powoduje faktycznie odczytanie wartości zapisanej w rejestrze wyjściowym PORTx, gdyż to on wtedy wymusza stan pinu."

Oj, nie mogę się z tym zgodzić. Jak odczytujesz rejestr PINx to odczytujesz faktyczny stan pinu a nie wartość ustawioną w PORTx. Oczywiście aby była różnica musisz brutalnie wymusić zmianę stanu portu poprzez podłączenie czegoś wysokoprądowego do niego.


Edit:
@sauron80:
zapis
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
odczytuje stan fizycznego pinu a zapis
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
odczytuje stan rejestru, czyli co chciałeś mieć na tym porcie.
W większości przypadków będziesz miał tam to samo.

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 paź 2015, o 17:48 
Offline
Użytkownik

Dołączył(a): 11 wrz 2013
Posty: 709
Zbananowany użytkownik

Pomógł: 23

Fakt zdaje się, że kolega ma rację, bo jak damy rezystor pull-down to może być inny stan niż w rejestrze.

--
Grzegorz...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 paź 2015, o 18:31 
Offline
Użytkownik

Dołączył(a): 09 mar 2013
Posty: 28
Lokalizacja: Góra Kalwaria
Pomógł: 0

Rozumiem rozważania teoretyczne, ale ten pin steruje triakiem przez optotriak i nie ma tam możliwości wymuszenia innego stanu niż ustawiony na porcie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 paź 2015, o 18:38 
Offline
Użytkownik

Dołączył(a): 11 wrz 2013
Posty: 709
Zbananowany użytkownik

Pomógł: 23

No to skoro sam ustawiasz i twierdzisz, że taki "musi być" to po co to sprawdzać.
Przecież wiesz kiedy wystawiłeś dany stan na danej "nóżce" uC?

--
Grzegorz...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 paź 2015, o 18:48 
Offline
Użytkownik

Dołączył(a): 09 mar 2013
Posty: 28
Lokalizacja: Góra Kalwaria
Pomógł: 0

Tak jak napisałem na początku, steruje 4 urządzeniami, ale oddzielnie jest funkcja wyświetlająca dane na wyświetlaczu i tam aby wyświetlić odpowiedni komunikat sprawdzam jaki jest stan wyjścia, oczywiście można do tego dać jakąś zmienną globalną, ale tak wydaj mi się prościej (nie wiem czy lepiej) :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 paź 2015, o 19:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Cytuj:
oczywiście można do tego dać jakąś zmienną globalną, ale tak wydaj mi się prościej (nie wiem czy lepiej)
Lepiej:
- nie zajmujesz niepotrzebnie pamięci na co i tak jest przechowywane w mikroprocesorze
- wykonujesz operacje na rejestrze na którym są szybsze operacje niż na pamięci RAM

W Twoim przypadku to czy sprawdzasz PINx czy PORTx nie ma znaczenia.
Według mnie u Ciebie bardziej elegancko jest sprawdzenie PORTx. Ale tylko jak na pewno nigdy nie skopiujesz tego fragmentu kodu by nim chcieć tak czytać stanu pinu wejściowego :). Więc jak nie zagwarantujesz sobie tego, to może użyj czytania z PINx, wtedy operacja będzie działać zawsze (na piny wejściowe i wyjściowe).

Co do pociągnięcia do innego stanu wyjścia to należy się trochę postarać. ATmegi mają dość dużą wydajność prądową i zmiana stanu wymaja dość mocnego podciągnięcia. Ale są tacy co podłączają bezpośrednio bazę tranzystora NPN sterującego przekaźnikiem do wyjścia pinu (bez żadnych rezystorów) :lol: .

--
Pozdrawiam,
Robert


Autor postu otrzymał pochwałę


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

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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO