Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

At89c2051 port 3 bit 6 pytanie.

15 Mar 2007 22:52 1298 13
  • Poziom 19  
    Witam. Własnie jestem w trakcie pisania programu do konwersji kodów z "techniki cyfrowej" Chcę by za pomocą przycisków można było zaprogramowac z jakiego kodu na jaki ma konwertować. Problem mój polega na tym, że napisałem cały program, wszystko działa w symulatorze ale nie wiem jak sprawa wygląda z P3.6. Czy tam znajduje się stan wysoki czy niski w procesie "bez komparatora" Proszę o poradę
    Czy jeśli wpiszę:

    mov R2,P3
    cjne R2,#10101010b,dalej ;porównanie rejestru z portem
    mov P1,#01010101
    dalej:
    ...
    to porówna mi R2 z jaką liczbą? co procesor "widzi" w miejscu P3.6?
    Zaznaczam, że nie będę operował bitem 6 w programie. Mam go wyzerować, można tak zrobić? Pomóżcie proszę.
  • Poziom 16  
    Porty po włączeniu procesora i prawidłowym resecie wszystkie są w stanie wysokim. Jeżeli nic nie zrobisz z p3.6 to cały czas będzie w stanie wysokim.



    Code:

    cjne R2,#10101010b,dalej ;porównanie rejestru z portem
    mov P1,#01010101
    dalej:


    cjne - wykonuje skok do dalej jeżeli R2 różne od 10101010, czyli w twoim przypadku jak nie zmieniasz w ogóle bitu 6 to

    mov P1,#01010101b

    nigdy się nie wykona, bo zawsze procesor to przeskoczy.
    Wstaw na początku programu

    Code:

    CLR P3.6


    i powinno być ok
  • Poziom 33  
    Przy instrukcji CJNE R2,#01010101b,dalej porównujesz cały bajt (nie bit).
    Jeżeli chcesz sprawdzic tylko jeden bit to albo zamaskuj wszytko oprócz tego bitu np:
    Code:

    mov A,P3
    mov R1,#01000000b
    anl A,R1
    jz dalej

    albo sprawd tylko ten bit
    Code:

    mov C,P3.6
    jc dalej

    I tak nawiasem to w AT89C2051 nie możesz wykorzystywac P3.6.....bo go nie istnieje jako I/O :)
  • Poziom 19  
    Stan bitu P3.6 to aktualny stan wyjścia komparatora analogowego.
    Możesz wyzerować ten bit po odczycie z portu, a przed porównaniem.

    Code:

       mov A, P3
       anl A, #10111111b
       cjne A, #10101010b, dalej
       mov P1,#01010101
    dalej:


    Dodano po 17 [minuty]:

    monsinior napisał:

    Porty po włączeniu procesora i prawidłowym resecie wszystkie są w stanie wysokim. Jeżeli nic nie zrobisz z p3.6 to cały czas będzie w stanie wysokim.


    Nieprawda, P3.6 nie jest normalną linią I/O.
    Przy odczycie P3.6 otrzymujemy stan wyjścia komparatora analogowego, którego wejścia są podłączone do P1.0 i P1.1.
    A więc stan na P3.6 zależy od napięć na P1.0 i P1.1.

    Cytat:

    Wstaw na początku programu

    Code:

    CLR P3.6


    i powinno być ok


    To nic nie da, bo P3.6 nie jest zwykłym wyprowadzeniem i nie posiada drivera wyjściowego. Takie ustawianie nie ma żadnego wpływu na stan wyjścia komparatora.


    @markosik20:
    Kolega chce przecież porównać bajt, a nie jeden bit.
    Przy czym bajt, ale z wyłączeniem P3.6.
  • Poziom 19  
    Tak właśnie chcę wykorzystać do porównania cały bajt (8 bitów portu P3) rozkazem CJNE i własnie nie wiem jak ten rozkaz się zachowa przy zmiennym bicie P3.6. A może da się go jakoś na stałe "zakotwiczyć" w programie? chodzi o to by przez cały proces był on zerem lub jedynką (obojętne, dostosuję program). Czy jeśli wynikiem porównania portu P3 z jakimś bajtem zostanie ustawiony pewien stan na P1.1 i P1.2 (wejścia komparatora) to czy będzie miał on wpływ na wykonywanie rozkazu porównania z bitem P3.6?.
    Ideałem dla mnie byłoby ustawienie raz na zawsze tego bitu P3.6 na stałe (by nie było reakcji na stan P1.1 i P1.2) To by mi problem rozwiązało. Może jest jakiś "myk" na to?

    Przesyłam fragment podrogramu.
    bcd_gray:
    mov R2,P3
    cjne R2,#10110000b,bajt2
    mov P1,#10000000b
    bajt2:
    cjne R2,#10110001b,bajt3
    mov P1,#10000001b
    bajt3:
    cjne R2,#10110010b,bajt4
    mov P1,#10000011b
    bajt4:
    cjne R2,#10110011b,bajt5
    mov P1,#10000010b
    bajt5:
    cjne R2,#10110100b,bajt6
    mov P1,#10000110b
    bajt6:
    cjne R2,#10110101b,bajt7
    mov P1,#10000111b
    bajt7:
    cjne R2,#10110110b,bajt8
    mov P1,#10000101b
    bajt8:
    cjne R2,#10110111b,bajt9
    mov P1,#10000100b
    bajt9:
    cjne R2,#10111000b,bajt10
    mov P1,#10001100b
    bajt10:
    cjne R2,#10111001b,bajt11
    mov P1,#10001101b
    bajt11:
    cjne R2,#10111010b,bajt12
    mov P1,#10001111b
    bajt12:
    cjne R2,#10111011b,bajt13
    mov P1,#10001110b
    bajt13:
    cjne R2,#10111100b,bajt14
    mov P1,#10001010b
    bajt14:
    cjne R2,#10111101b,bajt15
    mov P1,#10001011b
    bajt15:
    cjne R2,#10111110b,bajt16
    mov P1,#10001001b
    bajt16:
    cjne R2,#10111111b,bajt17
    mov P1,#10001000b
    bajt17:
    ret
  • Pomocny post
    Poziom 19  
    Jak widzę, odczytujesz wartość z portu P3 tylko raz, na początku.
    Jeśli tak to zmień to (czyli początek swego kodu, w którym odczytujesz z portu P3):

    Code:

    bcd_gray:
    mov R2, P3


    na to:

    Code:

    bcd_gray:
    mov A, P3
    anl A, #10111111b
    mov R2, A


    I zawsze w miejscu bitu odczytanego z P3.6 masz zero.
    Dalszy kod, widoczny dla mnie, bez zmian :)


    Swoją drogą, dziwnie ten fragment kodu wygląda. Jakie on ma zadanie?
    Konwersja jakiś kodów, jak wspomniałeś?
  • Poziom 19  
    Cytat:
    Swoją drogą, dziwnie ten fragment kodu wygląda. Jakie on ma zadanie?
    Konwersja jakiś kodów, jak wspomniałeś?

    Tak, ten podprogram konwertuje kod BCD (z rozszerzeniem do binarnego) na równoważny kod Graya. Urzadzenie ma mieć 4 przyciski: BCD, GRAY, 1z10, 7SEGM. Po wybraniu kodu zródłowego procesor czeka na powtórne naciśnięcie przycisku z wyborem kodu docelowego. Program oblicza wówczas do jakiego podprogramu konwersji ma skoczyć i w pętli wykonuje cały program wraz z danym podprogramem (tylko jednym). w tym poście przedstawiłem kod z BCD na GRAY. Mając na uwadzę tylko 2 dostępne porty, zastosowałem multiplekser i demultiplekser (układy diodowo bramkowe). Pozdrawiam, wieczorem sprawdzę ten programik:) dzięki
  • Poziom 19  
    Wydaje mi się, że dałoby się to zrobić prościej, niż z wykorzystaniem takiej drabinki porównań. Ale nie twierdzę, że tak nie będzie działało.
  • Poziom 19  
    Cytat:
    Wydaje mi się, że dałoby się to zrobić prościej, niż z wykorzystaniem takiej drabinki porównań. Ale nie twierdzę, że tak nie będzie działało.

    Proszę mnie jakoś naprowadzic na prostszą wersję tego. Jestem jeszcze początkująsym w dziedzinie programowania mikrokontrolerów, więc jeśli da się prosciej to może jakiś przykładzik?[/quote]
  • Poziom 19  
    Propozycje do rozważenia:
    - jeśli masz liczby BCD spakowane (w jednym bajcie dwie cyfry BCD) to może da się przeprowadzić konwersję dla każdej cyfry oddzielnie, a wynik złożyć z dwóch wyników (tak na pewno się da wykonać konwersję BCD -> binarny)
    - może wykorzystanie tablic przejścia z jednego kodu na drugi w niektórych przypadkach (tablice nie muszą pokrywać całego zakresu),
    - może zrobić tylko konwersję z kodu binarnego na każdy inny i w drugą stronę i wykonywać czasem dwie konwersje (z przejściem przez kod binarny).
  • Poziom 39  
    darkonel napisał:

    Proszę mnie jakoś naprowadzic na prostszą wersję tego. Jestem jeszcze początkująsym w dziedzinie programowania mikrokontrolerów, więc jeśli da się prosciej to może jakiś przykładzik?

    Jeśli chodzi o coś "prostszego" , to można np. jak poniżej.
    Code:

    bcd_gray:
       mov   DPTR,#tab
       mov   A,P3
       anl   A,#00001111b
       movc   A,@A+DPTR
       mov   P1,A
       ret
    tab:
       db   10000000b
       db   10000001b
       db   10000011b
       db   10000010b
       db   10000110b
       db   10000111b
       db   10000101b
       db   10000100b
       db   10001100b
       db   10001101b
       db   10001111b
       db   10001110b
       db   10001010b
       db   10001011b
       db   10001001b
       db   10001000b

    Prócz CJNE , MCS-51 ma jeszcze wiele "fajnych" instrukcji ;)

    Piotrek
  • Poziom 19  
    zumek napisał:

    Jeśli chodzi o coś "prostszego" , to można np. jak poniżej.
    Code:

    bcd_gray:
       mov   DPTR,#tab
       ...



    Przy założeniu, że konwersji ulega jedna cyfra zapisana w kodzie BCD (4 bity) na 4 bitowy wynik w kodzie Greya.
  • Poziom 39  
    VanThor napisał:
    Przy założeniu, że konwersji ulega jedna cyfra zapisana w kodzie BCD (4 bity) na 4 bitowy wynik w kodzie Greya.

    To nie jest gotowiec , tylko wskazówka ;)

    Piotrek
  • Poziom 19  
    Ok, dziękuję wszystkim za porady, już znalazłem rozwiązanie na mój problem. Pozdrawiam