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, odczyt pinów i zapisanie ich do zmiennej

MacGyver123 05 Wrz 2011 17:10 1616 15
REKLAMA
  • #1 9897679
    MacGyver123
    Poziom 10  
    Cześć, mam problem w napisaniu programu w środowisku BASCOM:
    *W jaki sposób mogę napisać kod, który sprawdzał będzie które PINY(portu.a) mają stan wysoki. przykład:
    &B00011001
    w odpowiedzi chciał bym dostać zmienną "R" w której wyświetli się, że stan wysoki występuje na 3 pinach.
    Za wszelkie pomoce w naprowadzeniu wielkie THX
  • REKLAMA
  • #2 9897798
    nsvinc
    Poziom 35  
    Nie znam bascoma, ale postaram się przytoczyć to w pseudokodzie:

    MojaZmienna=&B00011001; //to ta zmienna której trzeba policzyć jedynki
    licz_jedynki=0;
    for (index=0;index<8;index++) { if(MojaZmienna&1) licz_jedynki++; MojaZmienna=MojaZmienna>>1; };

    Nie mam naprawdę pojęcia jaki jest syntax w bascomie, inni forumowicze na pewno podadzą ci użyteczny bascomowy przykład...
  • REKLAMA
  • #3 9897976
    Mundi1970
    Poziom 24  
    Czyli z kantońskiego na nasze :):

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #4 9897982
    xury
    Specjalista automatyka domowa
    Rozumiem, że nie istotne jest na którym miejscu te jedynki się znajdują ? Kod kolegi @nsvinc przetłumaczony na Bascom:

    Kod: text
    Zaloguj się, aby zobaczyć kod

    Sorry poprawiłem. Port jest liczony od 0 do 7 a nie jak wcześniej napisalem od 1 do 8

    Jak widać można na rożne sposoby.
  • #5 9898019
    Mundi1970
    Poziom 24  
    Tłumaczem przysięgłym, nie mógłbyś być ;)
  • REKLAMA
  • #7 9898064
    nsvinc
    Poziom 35  
    Pseudokod w pseudoC nie będący dokumentem urzędowym ma prawo zostać przetłumaczony w dowolny możliwy sposób, byle by tylko tłumaczenie oddawało mniej więcej oryginalną treść ;D ;D

    Znacznie szybsza metoda to lookup - czyli marnujemy 256 bajtów pamięci, aby zrobić to tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Tabelkę Bity wypełniamy tak, aby pod konkretnym indexem znajdowala sie ilosc jedynek w bajcie przedstawiającym ten index, czyli:

    index - ilosc_jedynek
    0 - 0
    1 - 1
    2 - 1
    3 - 2
    4 - 1
    5 - 2
    6 - 2
    7 - 3
    8 - 1
    9 - 2
    A - 2
    B - 3
    C - 2
    D - 3
    E - 3
    F - 4
    .....
    7E - 6
    7F - 7
    80 - 1
    81 - 2
    82 - 2
    .....
    FE - 7
    FF - 8
  • #9 9898446
    nsvinc
    Poziom 35  
    xury napisał:
    Woow.! No to teraz kolega zaszalał

    Ale przynajmniej bardzo szybko, wielokrotnie szybciej niż rozwiązanie z pętlą i ifem... :]
    Na ARMie to trzy instrukcje, sądzę, że na AVR niewiele więcej, bo nadal to jest po prostu load spod adresu + offset (T2: LDRB Rd,[Rm,Rn]; gdzie Rm to baza adresów, Rn to po prostu ten bajt odpowiadający indexowi...)
  • REKLAMA
  • #12 9898985
    M. S.
    Poziom 34  
    xury
    Cytat:
    Sorry poprawiłem. Port jest liczony od 0 do 7 a nie jak wcześniej napisalem od 1 do 8


    To popraw jeszcze Porta na Pina.
  • #13 9899134
    MacGyver123
    Poziom 10  
    Wielkie dzięki za wszystkie podpowiedzi, osobiście skorzystam z kodu kolegi Xury
    
    dim licznik as byte
    dim i as byte
    ...
    licznik = 0 
    for i = 0 to 7
     if PORTA.i = 1 then 
        incr licznik
     end if
    next
    

    ale czy nie powinno być "PINA.i" zamiast "porta.i" ?
    EDIT przeczytałem post kolegi UP
  • #16 9902108
    MacGyver123
    Poziom 10  
    WIelkie dzieki temat do zamknięcia
REKLAMA