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 pobieranie danych z tablicy

Andrzej Ł 26 Lip 2011 18:12 4533 18
REKLAMA
  • #1 9761371
    Andrzej Ł
    Poziom 21  
    Jest to tylko część mojego programu do sterowania matrycą 48 przekaźników, który napisałem i w zasadzie już by działał, gdyby nie drobny problem, a mianowicie:

    Z klawiatury wpisuję liczbę dwucyfrową od 01-48(nazwaną w programie NUMER), po czym zostaje wysłany po szynie I2C adres układu dekodującego i liczba ustawiająca port 8-bitowy układu PCF8574FP, w efekcie przyciąga odpowiedni przekaźnik.

    Adres i cyfra ustawiająca porty mają być pobierane z tablicy, na razie do celów próbnych 8 NUMERów danych,docelowo 48.
    Oto fragment programu z tablicą:



    Kod: text
    Zaloguj się, aby zobaczyć kod

    Zasada działania:
    z dwóch zmiennych Digit1 i Digit2 tworzy się mój numer (bo z klawiatury wpisuję np. 0(digit1) i 6(digit2)), czyli NUMER 06 (zarazem numer przekaźnika który ma przyciągnąć).
    Teraz program ma pobrać dane z tabeli nazwanej NUMER6.
    I tu jest problem, bo NUMER jest zmienną (od 1-48), a w tablicy jest NUMERx i program nie zna tych numerów. Czyli wyobrażam sobie że polecenie musiałoby jakoś tak wyglądać:

    I = Lookup(0 , Numer(n))
    Z = Lookup(1 , Numer(n))


    (n) czyli NUMER z tablicy.

    Kombinowałem już różnie z nawiasami u góry i poniżej w tablicy ale jakoś kicha.
    Dodam, że jak wpiszę na stałe, np.

    I = Lookup(0 , Numer7)
    Z = Lookup(1 , Numer7)

    to po wklepaniu jakichkolwiek cyfr procedura jest wykonywana i przyciąga wybrany przekaźnik nr.7

    Nie wiem,czy problem dobrze i zrozumiale opisałem,proszę pomóżcie koledzy :)
  • REKLAMA
  • #3 9762555
    xury
    Specjalista automatyka domowa
    Nie możesz przekazywać części nazwy etykiety jako zmiennej. Etykieta danych to adres w pamięci flash. Musiałbyś przepisać adres każdej etykiety do zmiennej używając LOADLABEL.
    Albo oczywiście tak jak kolega powyżej zaproponował.
  • REKLAMA
  • #5 9763536
    Andrzej Ł
    Poziom 21  
    dzięki koledzy,jak sprawdzę dam znać o wynikach.Widzę kolego snaap,ze poprawiłeś w pierszym poscie dane z tabelki(adres 64),były tam inne liczby,nad którymi sie zastanawiałem czy to nie dodatkowe operandy w cellu poprawnego funkcjonowania procedury :)

    Dodano po 1 [minuty]:

    dzięki koledzy,jak sprawdzę dam znać o wynikach.Widzę kolego snaap,ze poprawiłeś w pierszym poscie dane z tabelki(adres 64),były tam inne liczby,nad którymi sie zastanawiałem czy to nie dodatkowe operandy w cellu poprawnego funkcjonowania procedury :)
  • REKLAMA
  • #7 9764773
    Andrzej Ł
    Poziom 21  
    jest nieżle ,program działa,ale jest jeden drobny mankament:
    wyzwala zawsze przekażnik jeden wyżej,czyli wpisuję 01 a wyzwala 2,wpisuję 02 a wyzwala 3.
    Zmieniłem operację na :numer =numer-1 wtedy jest ok,ale działają przekażniki 1-7,ósmy nie działa po wklepaniu numeru 08.

    Jeżeli dobrze rozumuję to działa to tak:

    -wpisuję np.01 ,czyli 1.
    -numer jest podwajany ,czyli przyjmuje wartość 2
    -I=lookup(numer,numert) -odczytaj do zmiennej I drugą pozycję z tablicy zwanej numert
    -powiększa zmienną numer o jeden(czyli z 2 robi 3)
    Z=lookup (numer,numert)-odczytaj do zmiennej Z trzecią pozycję z tablicy zwanej numert

    druga pozycja to cyfra 64 w drugim rzędzie,a 3 pozycja to by wypadało 253 (przek.2) w drugi rzędzie

    Dodano po 31 [minuty]:

    JUż kapuję w czym jest błąd.
    Dodałem do tablicy na pierwszej pozycji Data 00,00 -Data 64,254 jest teraz na drugiej pozycji do odczytu i jest ok :)
  • #8 9765785
    snnaap
    Poziom 25  
    Cytat:
    jest nieżle ,program działa,ale jest jeden drobny mankament:
    wyzwala zawsze przekażnik jeden wyżej,czyli wpisuję 01 a wyzwala 2,wpisuję 02 a wyzwala 3.


    problem polega na tym, że dane w dacie liczone są od 0,1,2 ... a Pan zaczyna liczyć od 1, 2, 3...

    rozwiązania są dwa albo dodanie dwóch elementów na początek (post powyżej) lub wpisanie w kodzie tak:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Pozdrawiam
  • #9 9767399
    Andrzej Ł
    Poziom 21  
    dziękuję ,wszystko jasne :) Układ już śmiga,narazie jedna karta z 16 przekażnikami.Docelowo jeszcze dwie,sa już gotowe tylko muszę polutować płytki dekoderów z PCF8574.
    Zastanawia mnie jeszcze jeden objaw.Testuję to wszystko na płytce ZL2AVR.
    Cały procesor jest jakby spowolniony.Testując wcześniej inne programy na tej płytce tez to występowało.
    Np. podczas procedury wyświetlanaia dwóch liczb na wyśw. 7 segmentowym z układem 4543

    przy zapisie(fragment programu):

    On Timer0 Mult_wysw
    Enable Interrupts
    Enable Timer0
    Load Timer0 , 125

    występowało sekwencyjne migotanie wyświetlaczy,dopier stopniowe zmniejszanie
    wartości Load timer0, az do 1 usunęło problem.

    Równierz inne programy są spowolnione ,nawet waitms 20 powoduje defacto opóżnienie rzędu 1,5s -tak jakby procek zwalniał 1000 razy albo i więcej
    Używam ATMEGA8L-8PU

    konfiguracja jest:


    $regfile = "m8def.dat"
    $crystal = 8000000

    Czy to problem z fusebitami ?

    Wcześniej pracowałem na 89C2051/4051 i niebyło żadnych takich problemów
  • #11 9767479
    Andrzej Ł
    Poziom 21  
    w ustawieniach fusebitów nic jeszcze nie grzebałem,nawet niezaglądałem jeszcze do tych zakładek.Procek kupiłem ,do płytki wsadziłem,program napisany,skompilowany i zaprogramowany.
  • REKLAMA
  • #13 9772249
    Andrzej Ł
    Poziom 21  
    dałem $crystal=1000000 i od razu dał gazu.
    Treść zakładek niezgadza się u mnie z opisem z książki wiązani.

    u mnie w zakładce jest np. tak :

    0101:0101 external RC osc. czyli tutaj podpinam zewnętrzy kwarc z płytki 8MHz ?

    Rozumiem że wewnętrzny oscylator jest taktowany tylko 1MHz i tej f nieda się zmienić bez zewnętrznego kwarcu ?
  • #14 9772906
    snnaap
    Poziom 25  
    Cytat:
    Rozumiem że wewnętrzny oscylator jest taktowany tylko 1MHz i tej f nieda się zmienić bez zewnętrznego kwarcu ?


    Nie, masz do wyboru 1Mhz, 2Mhz, 4Mhz, 8Mhz oraz wszystkie powyższe z podziałem przez 8 czyli 125kHz, 250kHz, 500kHz i 1Mhz.

    Standardowo Atmega8 jest dostarczana w konfiguracji 8Mhz z podziałem przez 8 czyli 1Mhz.

    Wszystko zależy od ustawień fuse bits.

    Jakim programem programujesz?
  • #15 9773173
    Andrzej Ł
    Poziom 21  
    demo 1.11.7.3


    A mógłbyś zerknąc na moją procedurę odczytu klawiatury,w zasadzie cały program działa,tylko jest jeszce sparawa tego typu,że po wpisaniu pierszej cyfry pozostaje tylko pewien czas (waitms 150) na wpisanie drugiej ,bo inaczej wyskakuje zero jak sie niezmieszczę,a program miałby się zatrzymać i czekać aż wpiszę drugą.No i na wpis pierwszej też jest ta zwłoka,takze jak bym chciał szybkim ruchem wklepać drugą zaraz po pierwszej to jej nieprzyjmie ,albo zmieni tą pierwszą.
    Powinien chyba czytać pierwszą ,po czym czekać na puszczenie klawisza(powrót portb do poprzedniego stanu) i wtedy przyjąc drugą.

    Kod: text
    Zaloguj się, aby zobaczyć kod


    jakby co to wrzucę cały listing :)
  • #17 9820860
    Andrzej Ł
    Poziom 21  
    witam ponownie,niestety procedura nie działa

    jesli dobrze rozumiem to uwarunkowanie

    'if tmp2=1'

    oznacza :jesli zmienna tmp2 na pierwszym miejscu

    a

    'tmp2=2'

    oznacza :zmienna tmp2 na drugim miejscu ,tak masz na myśli ?

    przepraszam moderatora ale niebardzo wiem ja to zrobić zeby listing wyświetlał sie w tych białych oknach ,bo to sie chyba niektórym niepodoba,także proszę o info zamiastt raportowania
  • #18 9821248
    snnaap
    Poziom 25  
    Witam



    Program wrzucasz pomiędzy znacznik [ c o d e ] a znacznik [ / c o d e] lub np [ s y n t a x = basic4gl] [/ s y n t a x ] ' bez spacji.

    A wracając do tematu:
    1. Dobrze rozumiesz w sprawie tej zmiennej tmp.
    2. pokaż program po złożeniu tego wszystkiego w całość \, bo teraz to mamy sieczkę w tym temacie.
    3. czy przyciski są podciągnięte do + zasilania ' jeżeli możesz pokaż schemat.

    Pozdrawiam


    PS
    Sorki za poprzednią pomyłkę na którąś ktoś zwrócił uwagę, oczywiście nie miało być Quote - zwykłe przejęzyczenie
  • #19 9872619
    Andrzej Ł
    Poziom 21  
    witam ponownie ,oto cały kod:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    klawiaturę mam tak przerobioną w tej chwili,że odczytuje rzeczywistą cyfrę wciśniętego klawisza,potem to przerobię na "standard" ,czyli odczyt i konwersja poprzez pobieranie z tabeli rzeczywistej cyfry
REKLAMA