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

[BASCOM][Atmega32] Cuda z funkcją Alias

BUZ11 19 Lut 2010 22:51 2867 13
  • #1 7721352
    BUZ11
    Poziom 12  
    Witajcie,
    Sprawdzałem z trzema wersjami Bascoma (1.11.8.3, 1.11.9.3, 1.11.9.8 -wszystkie oryginalne) i sam nie mogę uwierzyć co się dzieje. Otóż w samym układzie jak i zgodnie z symulacją nie następuje zmiana stanów portu. Czy u Was jest tak samo??? I o co tu chodzi???
    Oto kod:

    $regfile = "m32def.dat" ' specify the used micro
    $crystal = 8000000 ' used crystal frequency

    Config Pina.0 = Output
    Config Pina.1 = Output

    Dim Przekaznik() As Byte

    Przekaznik.1 Alias Porta.0
    Przekaznik.2 Alias Porta.1

    dim x as byte

    x=1
    set Przekaznik.x ' - nie działa
    '---------------
    set Przekaznik.1 ' - działa

    end


    Problem w tym, że chcę sterować portami funkcją for-next, ale nie mogę, bo nie działa sterowanie zmiennej z parametrem.
    Czy ma ktoś pomysł co jest grane?
  • #2 7721748
    xury
    Specjalista automatyka domowa
    Błąd kompilatora, że pozwolił nadać alias zadeklarowanej zmiennej.
    A działa tak:
    $regfile = "m32def.dat"                                     ' specify the used micro
    $crystal = 8000000 ' used crystal frequency
    
    Config Pina.0 = Output
    Config Pina.1 = Output
    
    
    Przekaznik Alias Porta
    
    
    Dim X As Byte
    
    X = 1
    Set Przekaznik.x
    
    end
  • #3 7721767
    BUZ11
    Poziom 12  
    Kompiluje, ale brak działania...
  • #5 7721824
    BUZ11
    Poziom 12  
    W obydwóch przypadkach kompiluje bez informacj o błędach, ale program nie działa tzn. nie ustawia mi stanu wysokiego na porcie. Jedynie w pierwszym moim listingu polecenie: set Przekaznik.1 ' - działa prawidłowo, czyli mam stan wysoki na wyjściu PortA.0
    Jednak poleceniem tym nie zrobię automatycznej zmiany stanu portów poleceniem for-next, bo jakakolwiek próba działania na aliasach pomimo bezbłędnej kompilacjii nie działa...
  • #6 7721881
    leon1313
    Poziom 15  
    jeśli nie rozwiążesz tego problemu bezpośrednio, zrób sobie jakiegoś sub-a z case w środku. Powinno pomóc.
    
    sub zmien_portA(byval N as byte)
        select case N
            case 0: toggle porta.0 (ew set porta.1)
            ...
            ...
        end select
    end sub
    
  • #7 7722031
    Konto nie istnieje
    Poziom 1  
  • #8 7725988
    BUZ11
    Poziom 12  
    Dziękuję za zainteresowanie problemem.

    Cytat:

    Przekaznik.x Alias Porta.x
    X = 0
    Przekaxnik.x = 1


    To działa, ale to nie do końca rozwiązuje mój problem. W ten sposób mogę zmieniać parametr x tylko w zakresie 0-7 - bo operuję tylko na jednym porcie - w tym przypadku A.

    Postaram się opisać to czego potrzebuję:
    Muszę mieć 20 wyjść, powiedzmy od 1 do 20 nazwane przekaznik.1 - przekaznik.20 przypisane do:
    PortuA: przekaznik1-8,
    PortuC przekaznik9-16 i
    PortuB przekaznik17-20.
    Chodzi mi o to, żeby zmieniając parametr x w zakresie 1 do 20 zmieniać stan tych portów. Najlepiej za pomocą komendy:
    przekaznik.x = 1 lub 0
    Ma to dla mnie jeszcze jedno bardzo ważne znaczenie. Zakładam, że może kiedyś nastąpić zmiana podłączenia przekażników na wyjściach procesora, np. przekaznik1 - do wyjścia portuB.0 a przekażnik 8 do portuA.0 Gdybym miał przypisanie za pomocą Aliasów, to wystarczy, że tam zmienię przypisanie i nie muszę ruszać reszty programu, a tak to muszę w każdym miejscu, gdzie tylko użyję tych portów to zmieniać ręcznie. Mam nadzieję, że jest to zrozumiałe...

    Znalazałem inne pseudo rozwiązanie, ale to nie to o co mi chodziło, a mianowicie:

    Przekaznik.x Alias Porta.x
    przekaznik.y alias portc.y
    przekaznik.z alilas portb.z
    X = 0
    y=1
    z=2

    Przekaxnik.x = 1
    Przekaxnik.y = 1
    Przekaxnik.z = 1


    Jednak to nadal mnie nie satysfakcjonuje... bo ciągle muszę pamiętać o trzech parametrach...

    Powoli jednak zaczynam wątpić, czy da się tak zrobić i snuję program na pętlach... i poszczególnych portach... :)
  • #9 7726028
    Konto nie istnieje
    Poziom 1  
  • #10 7726077
    BUZ11
    Poziom 12  
    Daruję sobie, robię sterowanie pin po pinie...
    A jestem ciekaw czy da się w ten sposób wysterowywać porty w C?
  • #11 7726196
    Konto nie istnieje
    Poziom 1  
  • #12 7726301
    BUZ11
    Poziom 12  
    Cytat:
    Widzę że nie jesteś świadomy tego co chciałeś zrobić.


    Nie bardzo rozumiem. Wydawało mi się to naturalne, że próbuję sobie ułatwić życie... i taki tok myślenia wydawał mi się logiczny.
  • #13 7726441
    Konto nie istnieje
    Poziom 1  
  • #14 7755697
    piotr5000
    Poziom 21  
    jeżeli zadeklarujesz :

    Pk_1 alias portA.0
    Pk_2 alias portA.1
    Pk_3 alias portA.2
    .....
    .....
    .....
    Pk_20 alias portC.3

    to zmiany będziesz dokonywał tylko w deklaracjach , reszta programu zostanie bez zmian (jeżeli Pk_20 podłączysz np do portu A.0 to zmiana Pk_20 alias portA.0 i już)

    Ale chcąc sterować w pętli pamiętaj że :
    1=2^0
    2=2^1
    4=2^2
    itd...

    jeśli zmienna Przekaźnik będzie typu lond (4 bajty ) a porty potraktujesz jako bajty tej zmiennej ( PortX,PortC,PortB,PortA ) to zwiększając zmienną Przekaźnik * 2 w pętli od 0 do 2^(24-1) będziesz wystawiał 1 kolejno na :
    PortA.0
    PortA.1
    PortA.2
    PortA.3
    PortA.4
    PortA.5
    PortA.6
    PortA.7
    PortB.0
    PortB.1
    PortB.2
    ...
    ...
    ...
    PortC.3

    jest to "luźna myśl" ale może ktoś pomoże ją rozwinąć ( przelać na kod )
    albo "puści z wodą w kanał"
REKLAMA