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

Odczyt stanu kilku portów i zamiana na licz. dziesiętną

liga 07 Gru 2004 18:26 1830 9
REKLAMA
  • #1 1043716
    liga
    Poziom 12  
    Posty: 40
    Pomógł: 1
    Ocena: 6
    Witam
    Mam pewien problem mianowicie chcem napisać program w Bascom AVR program, który odczytuje mi wartości z czterech portów mikrokontrolera i zamienia tą wartość na liczbę dziesiętną.
    Dopiero od niedawna zajmuję się Bascom AVR i próbowałem już różnych sztuczek z przesówaniem bitów itp. ale jak narazie te próby nie są zadowalające.
    Całe urządzenie ma działać na AT90s2313 a porty, z których mają być odczytane dane to PD2, PD3, PD4 i PD5. Porty są wejściami.
    Będę wdzięczny za jakąkolwiek podpowiedź.

    Pozdrawiam
  • REKLAMA
  • #2 1044045
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Generalnie polega to na przemnożeniu odpowiednich wartości portów przez potęgę liczby 256
    Liczba = PD5 + 256 * PD4 + 256^2 * PD3 + 256^3 * PD2
    Oczywiście przy założeniu że PD5 to najmłodszy bajt całej liczby.
    Jedynie nie wiem czy BASIC potrafi działać na takich dużych liczbach.
  • #3 1044234
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 51
    A możesz napisać jakie to dane będziesz odczytywał z tych pinów :?:
    Czy będzie to klawiatura , jakieś czujniki :?:
    Napisz dokładnie co to będzie podpiete do tych pinów.

    Pozdrawiam
    Piotrek Sz.
  • REKLAMA
  • #4 1044270
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    GienekS napisał:
    Generalnie polega to na przemnożeniu odpowiednich wartości portów przez potęgę liczby 256
    Liczba = PD5 + 256 * PD4 + 256^2 * PD3 + 256^3 * PD2
    Oczywiście przy założeniu że PD5 to najmłodszy bajt całej liczby.
    Jedynie nie wiem czy BASIC potrafi działać na takich dużych liczbach.


    No cóż, mamy tu pewne zamieszanie, chociaż Bascom obsłuży zmienną 4-bajtową jako typ Long, AT90S2313 nie ma "na bank" 4 portów... ;) PD2, PD3, PD4 i PD5 to są piny na porcie PORTD. Jak rozumiem, wynikiem ma być liczba 0-15 ?
    Dim Liczb as Byte
    .
    .
    .
    Liczb = PIND ' odczyt stanu pinów
    Shift Liczb, Right, 2 ' przesunięcie bitów w prawo, tak aby PD2 znaczyło 2^0, PD3 = 2^1, itd...
    Liczb = Liczb And & &B00001111 ' obcinamy wartość niepotrzebnych tutaj pinów PD6-PD7 (przesuwanie już obcieło PD0-PD2)

    Pozdrawiam, LightHouser
  • #5 1044668
    liga
    Poziom 12  
    Posty: 40
    Pomógł: 1
    Ocena: 6
    Ok dzięki za odpowiedzi coś pokombinuję i czekam na dalsze propozycje.
    A jeśli chodzi o to jakie dane będe odczytywał z pinów to są to dane z dekodera DTMF MT8870. Dekoder na wyjściach podaje binarną reprezentację wciskanych klawiszy w telefonie (0-9 i znaki #, *) i kłopot w tym, że potrzebuję zamienić tę reprezentację binarną na liczbę dziesiętną, a potem zrobić jakieś warunki, które dla odpowiedniej liczby wysterują jakiś port ale z tym to sobie jakoś dam radę chodzi mi o tą zamianę na liczbę dziesiętną.
    Jeszcze raz dziękuję za dotychczasowe odpowiedzi i czekam na kolejne wskazówki.

    Pozdrawiam Liga
  • REKLAMA
  • Pomocny post
    #6 1044778
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    Dim Liczb as Byte
    Dim Cyfra0 as Byte ' cyfra jednostek
    Dim Cyfra1 as Byte ' cyfra dziesiatek
    .
    .
    .
    Liczb = PIND ' odczyt stanu pinów
    Shift Liczb, Right, 2 ' przesunięcie bitów w prawo, tak aby PD2 znaczyło 2^0, PD3 = 2^1, itd...
    Liczb = Liczb And & &B00001111 ' obcinamy wartość niepotrzebnych tutaj pinów PD6-PD7 (przesuwanie już obcieło PD0-PD2)
    Cyfra0 = 0
    Cyfra1 = 0
    If Liczb < 10 Then
    Cyfra0 = Liczb
    Else
    Cyfra1 = 1
    Cyfra0 = Liczb - 10
    End If

    Zmienna "Liczb" nigdy w tym przykładzie nie bądzie wieksza od 15 (1111 binarnie)
    Mam nadzieję, że pomogłem ;)
    Pozdrawiam, LightHouser
  • #7 1045271
    liga
    Poziom 12  
    Posty: 40
    Pomógł: 1
    Ocena: 6
    Witam ponownie

    Dzięki za pomoc !! Już za pierwszym razem sobie poradziłem, a oto mój symulacyjny program który działa poprawnie z mikrokontrolerem.

    $regfile = "2313DEF.dat"

    $crystal = 8000000
    Dim A As Byte

    Config Pind.2 = Input
    Config Pind.3 = Input
    Config Pind.4 = Input
    Config Pind.5 = Input
    Config Pind.6 = Input

    Set Portd.2
    Set Portd.3
    Set Portd.4
    Set Portd.5
    Set Portd.6
    S1 Alias Portd.6
    Do
    A = Pind
    A = A And &B11000011
    Shift A , Right , 2
    Cls
    Lcd "A wynosi:"
    Lcd A
    Waitms 200
    Loop
    End

    Dzięki za pomoc.
    Pozdrawiam Liga
  • #8 1045739
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 51
    liga napisał:
    Witam ponownie
    Dzięki za pomoc !! Już za pierwszym razem sobie poradziłem...


    Chyba niebardzo sobie poradziłeś :(

    
    ...
    A = A And &B11000011
    ...
    


    Po operacji j/w bity 2,3,4,5 w zmiennej A zostaną ustawione na "0" , a nie o to Ci przecież chodziło.Maska dla operacji AND powinna w Twoim przypadku wyglądać &B00111100 .

    Pozdrawiam
    Piotrek Sz.
  • REKLAMA
  • Pomocny post
    #9 1046147
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    Ta maska może też wynosić &B00001111 (czyli 15 dziesietnie), jeżeli And będzie po "Shift", jak jak w moich wcześniejszych przykładach.
    Pozdrawiam, LightHouser
  • #10 1046859
    liga
    Poziom 12  
    Posty: 40
    Pomógł: 1
    Ocena: 6
    Heh po prostu nie zakumałem dobrze chyba całej zasady działania tej komendy AND :-)) przez jakiś przypadek urządzenie mi działało tak jak chciałem ale nie testowałem tego rozwiązania dokładnie bo to była już 4 nad ranem i dzisiaj okazało się że nie działa tak jak trzeba :-/. Zmieniłem wszystko zgodnie z ustawieniami jakie polecił mi LightHouser i teraz jest ok.
    Jeszcze raz wielkie dzięki
    Pozdrawiam, Liga

Podsumowanie tematu

✨ Dyskusja dotyczy problemu odczytu stanów czterech pinów mikrokontrolera AT90S2313 (PD2, PD3, PD4, PD5) i konwersji ich wartości binarnej na liczbę dziesiętną w programie napisanym w Bascom AVR. Piny te są wejściami i podłączone do dekodera DTMF MT8870, który generuje binarną reprezentację wciskanych klawiszy telefonu (0-9, #, *). Rozwiązanie polega na odczycie portu PIND, przesunięciu bitów w prawo o 2 pozycje, a następnie zastosowaniu maski bitowej &B00001111 w celu wyizolowania interesujących bitów. Wartość ta jest następnie interpretowana jako liczba od 0 do 15, którą można przekształcić na odpowiednią cyfrę dziesiętną. Wskazano błędy w stosowaniu maski bitowej w operacji AND oraz poprawiono ją na &B00111100 przed przesunięciem lub &B00001111 po przesunięciu. Przykładowy kod Bascom AVR został przedstawiony i przetestowany, potwierdzając poprawność metody. Dyskusja zawiera także uwagi dotyczące ograniczeń mikrokontrolera AT90S2313 oraz typów zmiennych w Bascom AVR (np. typ Long dla 4-bajtowych zmiennych).
Wygenerowane przez model językowy.
REKLAMA