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

Zmiania stanu tylko niektórych pinów

xamrex 21 Sty 2011 08:15 1415 12
REKLAMA
  • #1 9035455
    xamrex
    Poziom 28  
    Witam,
    Mam pytanie odnośnie zmiany stanu portów za pomocą polecenia
    portc=&B111111

    Załóżmy, że robię sterowanie multiplekserowo wyświetlaczem 7seg.
    Używam do tego celu scalaka 4543.

    Do portu A scalaka podaje Pinc.1 z uprocesora
    Do portu B scalaka podaje Pinc.2 z uprocesora
    Do portu C scalaka podaje Pinc.3 z uprocesora
    Do portu D scalaka podaje Pinc.4 z uprocesora

    A po Pinuc.5 mam podłączoną diodę led (zmiana jej stanu odbywa się przez naciśnięcie klawisza)

    Teraz chciałbym sobie zrobić kody 7seg.(tak, że jak napiszę cyfrę w programie, to taka sama wyświetli mi się na wyświetlaczu)

    Coś takiego:


    $regfile = "m8def.dat"
    $crystal = 8000000
    'Konfiguracje portów
    '***Do scalaka 4543***
    Config Pinc.1 = Output
    Config Pinc.2 = Output
    Config Pinc.3 = Output
    Config Pinc.4 = Output
    '***Dołączona diody***
    Config Pinc.0 = Output
    Config Pinc.5 = Output
    
    
    Do
    'jakis program
    Loop
    'Pod spodem jest oczywiście błędny zapis!
    Kody7seg:
    Data &B_1111_ , &B_1001_ , &B_0101_
    
    

    W skrócie, czy da się za pomocą takiego polecenia: portd=&B1111111 zmienić stan tylko na np. porcie b1 i b3, a pozostałe zostawić bez zmian?
  • REKLAMA
  • #3 9035487
    xamrex
    Poziom 28  
    Tak, wiem o tych poleceniach.
    Ale chciałem się upewnić czy za pomocą tego polecenia portd=&B1111111

    No, ale to teraz jedynym sposobem aby wyświetlić liczby na wyświetlaczu 7 segmentowym jest zrobienie czegoś takiego:
    If Cyfra = 0 Then
    Set Pinc.1
    Set Pinc.2
    Set Pinc.3
    Set Pinc.4
    End If
    
    If Cyfra = 1 Then
    Set Pinc.1
    Reset Pinc.2
    Reset Pinc.3
    Set Pinc.4
    
    If Cyfra = 2 Then
    Reset Pinc.1
    Set Pinc.2
    Reset Pinc.3
    Set Pinc.4
    End If
    

    Oczywiście trzeba to rozwinąć do liczby 9


    Nie da się tego jakoś zoptymalizować?
  • REKLAMA
  • #4 9035692
    piotrva
    VIP Zasłużony dla elektroda
    czym ty kolego sterujesz?
    rejestry PIN to rejestry WEJŚCIOWE!!
    steruj rejestrami PORTn.x
    możesz zawsze użyć czegoś takiego:
    
    PORTB = PORTB Or &B00010011 'ustawiamy bity
    PORTB = PORTB And &B11110010 'kasujemy bity
    
  • REKLAMA
  • #5 9035932
    mirekk36
    Poziom 42  
    piotrva napisał:
    
    PORTB = PORTB Or &B00010011 'ustawiamy bity
    PORTB = PORTB And &B11110010 'kasujemy bity
    


    No tak, tylko, że to nie rozwiąże niestety sytuacji z pozostałymi wolnymi bitami. Chyba że poskładamy kilka takich operacji ale to może w przypadku Bascoma zająć zbyt dużo czasu i multipleksowanie może się rozjeżdżać.

    Gdyby kiedyś kolega autor zechciał w końcu przejść na C to wtedy okazałoby się to łatwe proste, przyjemne szybkie i skuteczne rozwiązanie ;) .... no ale to Bascom więc nie będę podawał jak to można ładnie w C zrobić.
  • REKLAMA
  • #6 9035945
    xamrex
    Poziom 28  
    piotrva
    Pomyliło mi się z tym PIN
    Chyba dalej nikt nie rozumie, co chcę osiągnąć.
    Dodam schemat (przepraszam za jakość)
    Zmiania stanu tylko niektórych pinów
    Od pinu 23-28 są wyjścia
    a pin 13 i 14 to wejścia.

    Teraz gdy klikniemy klawisz znajdujący się na pinie 13, to oświeca/gaśnie dioda na porcie 23
    Gdy klikniemy klawisz na pinie 14, to oświeci/zgaśnie się dioda na porcie 28.

    
    if pind.7 = 0 then toggle portc.0
    if pinb.0 = 0 then toggle portc.5
    

    Chciałbym również móc sterować wyświetlaczem 7seg.
    Czyli na porty od portc.4 do portc.1 muszę podawać 0 lub 1 w zależności jaką cyfrę chcę uzyskać.

    Chciałbym teraz zrobić że jeśli w programie podam np. 5, to na wyświetlaczu ukaże się 5.

    Mogę to zrobić za pomocą IF (tak jak pisałem w 3cim poście)
    
    If Cyfra = 0 Then
    Set Pinc.1
    Set Pinc.2
    Set Pinc.3
    Set Pinc.4
    End If
    
    If Cyfra = 1 Then
    Set Pinc.1
    Reset Pinc.2
    Reset Pinc.3
    Set Pinc.4
    
    If Cyfra = 2 Then
    Reset Pinc.1
    Set Pinc.2
    Reset Pinc.3
    Set Pinc.4
    End If 
    



    ale bardziej profesjonalnie wydaje mi się, że jest zrobienie tego za pomocą funkcji LOOKUP

    Czyli:
    Kod_cyfr=Lookup(cyfra,kody7seg)
    portc=kod_cyfr
    
    'kody cyfr,(wiem ze ta skladnia jest zle, bo nie mozna stosowac _)
    kody7seg:
    Data &B_1111_ , &B_1001_ , &B_0101_ 
    

    Tylko wydaje mi się, że NIE DA SIĘ tego zrobić za pomocą Lookup, i trzeba użyć wszędzie tych ifów (dokładnie 10 warunków dla każdej cyfry)
    Mam rację?
  • #7 9035948
    piotrva
    VIP Zasłużony dla elektroda
    ja tez zachęcam do przejścia na C, ale skoro musi być bascom, to dlaczego kolega tak robi obsługę wyświetlacza?
    nie lepiej tak:
    1. gasimy wszystkie wspólne wyprowadzenia
    2. wystawiamy na port segmentów dane
    3. zapalamy odpowiedni wyświetlacz
    i potem w kolejnym, przerwaniu to samo dla drugiego wyświetlacza
  • Pomocny post
    #8 9036253
    Fredy
    Poziom 27  
    Zamiast dawać serię ifów daj jeden Select case.
    Potem ustaw te bity które chcesz zmieniać nie uszkadzając innych -czyli
    Portc=PortC or 0B00001111 .
    Teraz masz nieużywane bity 4-7 nietknięte , a te używane 0-3 ustawione.

    Potem dajesz Select case i dla każdej liczby robisz konstrukcję typu Portc=Portc and 0B1111xxxx gdzie x to odpowiednie kombinacje do uzyskania. W miejscu X jak dasz 1 to ustawisz a jak dasz 0 to skasujesz.

    W ten sposób uzyskasz ładną konstrukcję typu

    Select case liczba

    case 0: Portc=Portc and 0B11110100 to kasuje bit 0,1,3 a ustawia 2
    case 1: Portc=Portc and 0B11110101
    case 2: Portc=Portc and 0B11110111
    case 3: Portc=Portc and 0B11110010
    case 4: Portc=Portc and 0B11110100

    itd

    A odnośnie konstrukcji w języku C tego problemu, to akurat tu nie widzę żadnej przewagi C nad bascomem Oba mają OR AND i EXOR Select i maski.Może zapis troche krótszy w C.
  • #9 9036391
    mirekk36
    Poziom 42  
    Fredy napisał:
    dla każdej liczby robisz konstrukcję typu Portc=Portc and 0B1111xxxx gdzie x to odpowiednie kombinacje do uzyskania. W miejscu X jak dasz 1 to ustawisz a jak dasz 0 to skasujesz.


    No niestety ale to się nie zgadza :(

    Portc=Portc and 0B1111xxxx

    Jeśli tu zamiast x-ów dasz ZERA to wyzerujesz bity
    Ale NA PEWNO jeśli dasz zamiast x-ów JEDYNKI to ich nie ustawisz :( musiałbyś wtedy zmienić operację AND na OR

    Fredy napisał:

    case 0: Portc=Portc and 0B11110100 to kasuje bit 0,1,3 a ustawia 2
    case 1: Portc=Portc and 0B11110101
    case 2: Portc=Portc and 0B11110111
    case 3: Portc=Portc and 0B11110010
    case 4: Portc=Portc and 0B11110100


    Tu też kolega popełnia błąd :( .... już po pierwszym przebiegu wszystkich 5 wariantów na pozycjach 4 najmłodszych bitów będą same ZERA :( ... proponuję się zastanowić dlaczego?

    Fredy napisał:
    A odnośnie konstrukcji w języku C tego problemu, to akurat tu nie widzę żadnej przewagi C nad bascomem Oba mają OR AND i EXOR Select i maski.Może zapis troche krótszy w C.


    No a ja jednak widzę dużą przewagę i to wcale nie chodzi o krótszy zapis bo to akurat ma się nijak do tego zagadnienia.

    Chodzi po PIERWSZE o krótszy kod wynikowy, po DRUGIE zdecydowanie szybsze wykonywanie takich bardziej złożonych operacji co ma znaczenie szczególnie przy takich zagadnieniach jak wyświetlanie multipleksowane.

    podam jednak przykład w C:

    PORTC = (PORTC & 0xF0) | ( zmienna & 0x0F );
    


    gdzie zmienna przybiera wartości kroczące po interesujących nas bitach (4 najmłodszych) a 4 najstarsze bity będą NIETKNIĘTE i można na nich robić dowolne inne zadania.

    Ale na koniec należy dodać oczywiście że krótszy zapis dzięki temu że w jednej linii można wykonać kilka działań a nie tak jak w Bascomie tylko JEDNO !!! to jest to czego niestety nie będą w stanie odczuć osoby programujące i znające TYLKO Bascom :(
  • #10 9036420
    Fredy
    Poziom 27  
    mirekk36 napisał:

    No niestety ale to się nie zgadza :(

    Portc=Portc and 0B1111xxxx

    Jeśli tu zamiast x-ów dasz ZERA to wyzerujesz bity
    Ale NA PEWNO jeśli dasz zamiast x-ów JEDYNKI to ich nie ustawisz :( musiałbyś wtedy zmienić operację AND na OR



    Zaraz zaraz - ale ja wcześniej ustawiłem te bity przez Selectem . Czyli w miejscach xxxx masz same jedynki . Zatem ta konstrukcja zadziała.

    
    Portc=Portc or 0B00001111
    Portc=Portc and 0B1111xxxx


    ten kod powinienes skomentować.
  • Pomocny post
    #11 9036456
    mirekk36
    Poziom 42  
    aaaa no sorry, obydwie części kodu były opisane oddzielnie a teraz już rozumiem o co ci chodziło: (nie zauważyłem słówka POTEM - moja wina)

    
    Portc=PortC or 0B00001111
    
    case 0: Portc=Portc and 0B11110100 'to kasuje bit 0,1,3 a ustawia 2 
    case 1: Portc=Portc and 0B11110101 
    case 2: Portc=Portc and 0B11110111 
    case 3: Portc=Portc and 0B11110010 
    case 4: Portc=Portc and 0B11110100 
    


    tak, przyznaję rację że tak to zadziała jak opisałeś. Tzn przyznaję rację że zadziała bo już nie co do pozostałych moich wyrażonych wyżej opinii w tym tej najważniejszej, że w C programuje się łatwiej wbrew pozorom ;)

    Wprawdzie ciężko to porównać - ale jednak sporo kiedyś pisałem w Bascomie więc mogę się wypowiedzieć, sama konstrukcja SELECT CASE w bascomie to pożeracz kodu tzn pamięci Flash w procku. A to też trzeba wziąć pod uwagę.
  • #12 9036521
    xamrex
    Poziom 28  
    Wielkie dzięki panowie,
    na początku miałem problem ze zrozumieniem składni:
    PORTB = PORTB Or &B00010011 'ustawiamy bity 

    bo brałem to sobie tak na 'chlopski rozum' (a tak się nie da i mi głupoty wychodziły)
    ja sobie to w głowie przetwarzałem na np.
    8=8 or 3
    (czyli aby to sobie uzmysłowić zamieniałem portb na cyfrę 8), i dla mnie to w ogole sensu nie miało..
    Ale teraz już się zorientowałem i zaczynam to ogarniać, że polecenie
    portb=portb and &b11111100 nie służy do 'przerabiania tego na clhopski rozum' tylko do maskowania :)

    A co do C, to na pewno się na niego przerzucę, ale to może później, bo teraz w szkole chodzę na kurs Asemblera (do '51) a potem biorę się za C.
    Nauczyciel mi powiedział, że jak asemblera ogarnę, to z C będzie dla mnie drobnostką :)
  • #13 9037106
    piotrva
    VIP Zasłużony dla elektroda
    zaraz, skoro kolega chce wystawiać na te 4 piny liczbę (do dekodera BCD do wyświetlacza) to przecież nie łatwiej tak:
    
    'podpinasz kolejne wejścia dekodera pod piny np. PD0-PD3
    Dim liczba as byte, temp as byte
    liczba = 5
    temp = PORTD And &B11110000 'kasujemy bity PD0-PD3 i zapisujemy do zmiennej
    liczba = liczba AND &B00001111 ' jeśli liczba byłaby większa niż 15 to maskujemy wyższe bity
    PORTD = temp OR liczba 'łączymy dane wyższych pinów (pozostają po operacji bez zmian) ze zmienną częścią liczby i zapisujemy do rejestru PORTD
    
REKLAMA