logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[BASCOM] Jak odczytać stan całego portu w BASCOM za pomocą PINx?

LED5W 29 Wrz 2008 18:18 3549 10
REKLAMA
  • #1 5582812
    LED5W
    Poziom 34  
    Posty: 2302
    Pomógł: 264
    Ocena: 162
    Witajcie
    Dopiero zaczynam programować mikrokontrolery (ściślej jednego :)) i mam pewne wątpliwości.
    Pierwsza rzecz o którą mi chodzi to czy można odczytać stan całego portu za pomocą PINx? np.
    IF PINB = &B00000001 THEN

    Druga sprawa jeśli np. jeden z tych pinów jest ustawiony jako wyjście to jaką wartość będzie miał dany bit przy odczycie?
    Mam nadzieję, że w miarę jasno to opisałem. Czekam na odpowiedzi.
  • REKLAMA
  • Pomocny post
    #2 5582941
    K_o_n_r_a_d
    Poziom 23  
    Posty: 318
    Pomógł: 86
    Ocena: 9
    LED5W napisał:

    Pierwsza rzecz o którą mi chodzi to czy można odczytać stan całego portu za pomocą PINx? np.
    IF PINB = &B00000001 THEN

    Tak, można.
    LED5W napisał:
    Druga sprawa jeśli np. jeden z tych pinów jest ustawiony jako wyjście to jaką wartość będzie miał dany bit przy odczycie?
    Nie ma znaczenia czy jest jako wyjście czy jako wejście. Odczytując rejestry PINx odczytujemy aktualny stan portu. Czyli jeśli dany pin jest wyjściem i ma ustawiony stan wysoki to taki tez odczytamy (o ile nie jest na stałe podłączony do masy - wtedy odczytamy stan niski bo taki faktycznie będzie na pinie, co uszkodziłoby pin).
  • REKLAMA
  • REKLAMA
  • #4 5583124
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    LED5W napisał:
    A jeżeli będę chciał odczytać bity tylko z wejść to mogę napisać
    IF PINB AND DDRB <> 0 THEN

    ?

    A sam nie możesz sprawdzić :?:

    Piotrek
  • #5 5586017
    LED5W
    Poziom 34  
    Posty: 2302
    Pomógł: 264
    Ocena: 162
    Właśnie sprawdziłem i jakieś błędy pokazuje.
    Jak to poprawnie rozwiązać?
    Gdy użyję zmiennej (jak niżej) to nie ma błędów.
    Wejscie = Pinb And Ddrb
    If Wejscie <> 0 Then

    Czy można to jakoś inaczej rozwiązać?
  • #6 5586042
    K_o_n_r_a_d
    Poziom 23  
    Posty: 318
    Pomógł: 86
    Ocena: 9
    Po prostu Bascom nie rozumie złożonych działań.
    Tak samo jak nie rozumie: a=b+c*d (trzeba rozbić na pojedyncze działania).
  • REKLAMA
  • #7 5586110
    LED5W
    Poziom 34  
    Posty: 2302
    Pomógł: 264
    Ocena: 162
    To głupi jest, przerzucam się na C. :D

    Czyli rozbić mogę tylko za pomocą zmiennej, tak jak wyżej napisałem?

    Swoją drogą trochę to dziwne, że dla przypisania sie tak da, a dla badania warunku nie.

    Dodano po 1 [godziny] 25 [minuty]:

    Znalazłem na dodatek błąd - zamiast ddrb powinny być odwrócone bity tego rejestru - teraz odczytuje stany tylko z wyjść.:| Jak to wpisać?
  • #9 5589274
    LED5W
    Poziom 34  
    Posty: 2302
    Pomógł: 264
    Ocena: 162
    K_o_n_r_a_d napisał:

    Wiem, że się stosuje NOT, ale dla Bascoma
    Wejscie = Pinb And Not Ddrb
    to za dużo. A dla mnie dwie zmienne dla jednego porównania to też za dużo (tak mi się wydaje). Proszę pomóż mi, bo oprócz tych zmiennych nie mam pomysłów, a wydaje mi się, że można to jakoś prościej / inaczej zrobić. Jak nie można to też napisz. ;)
  • #11 5589481
    LED5W
    Poziom 34  
    Posty: 2302
    Pomógł: 264
    Ocena: 162
    O to mi chodziło. Czyli jedna zmienna musi być.
    Czasami najprostsza rzecz najtrudniej przychodzi do głowy. ;)
    Dzięki

Podsumowanie tematu

✨ W dyskusji omówiono możliwość odczytu stanu całego portu mikrokontrolera w BASCOM za pomocą rejestru PINx, np. PINB. Potwierdzono, że odczyt PINx zwraca aktualny stan fizyczny pinów, niezależnie od tego, czy dany pin jest skonfigurowany jako wejście czy wyjście. W przypadku pinu ustawionego jako wyjście, odczyt zwróci stan logiczny faktycznie obecny na pinie, o ile nie jest on fizycznie zwarany do masy. Poruszono problem filtrowania odczytu tylko do pinów skonfigurowanych jako wejścia, co wymaga zastosowania maski z rejestrem DDRx. BASCOM nie obsługuje złożonych wyrażeń logicznych bezpośrednio w instrukcjach warunkowych, dlatego konieczne jest rozbicie operacji na pojedyncze kroki z użyciem zmiennych pośrednich. Aby odczytać tylko stany pinów wejściowych, należy wykonać operację logicznego AND pomiędzy PINx a negacją DDRx (np. Wejscie = PINB AND NOT DDRB). Dyskusja wskazuje, że w BASCOM nie da się tego zrobić w jednej linii warunkowej bez zmiennych pośrednich. Podano także przykład użycia operatora NOT do odwrócenia bitów rejestru DDRx.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA