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

[Atmega8][Bascom] instrukcja call zwiecha

paavo91 21 Lut 2010 19:25 2059 8
  • #1 21 Lut 2010 19:25
    paavo91
    Poziom 19  

    Witam. Zadeklarowałem podprogramy w bascomie żeby mi zaświecało kolejne LEDy.

    np.

    Declare Sub Greena
    Greena:

    Portb.0 = 1
    Portd.2 = 1
    Return


    Declare Sub Greenb
    Greenb:

    Portb.0 = 1
    Portd.0 = 1
    Return

    greena i greenb to oczywiście 2 diody.

    Kod wygląda tak:



    Do

    Call Greenb
    wait 1
    Call Greenc
    Loop
    End

    Gdy odpale to wszystko zapala się tylko greena i nic się więcej nie dzieje. Dlaczego? Coś namieszałem z ta deklaracją? W takim razie jak zrobić żeby zadeklarować nazwy dla odpowiednio ustawionych portów jak własnie chcę?


    Dziękuje i pozdrawiam.

    0 8
  • #2 21 Lut 2010 19:52
    adamz74
    Poziom 31  

    1. Zdefiniowałeś funkcje Greena i Greenb, wywołujesz Greenb i Greenc?!
    2. Która funkcja ma wyłączyć diody?
    3. Używaj znacznika [code].

    Pozdr!

    0
  • #3 21 Lut 2010 20:01
    paavo91
    Poziom 19  

    Code:
    $regfile = "m8def.dat"                                      ' INFORMACJA O PROCESORZE
    
    $crystal = 1000000



    Config Portd = Output
    Config Portb = Output
    Config Portc = Output


    Portd.3 = 1
    Portd.4 = 1

    Portb.0 = 0
    Portb.1 = 0
    Portb.2 = 0
    Portb.3 = 0
    Portb.4 = 0

    Portc.5 = 0
    Portd.0 = 0
    Portd.1 = 0
    Portd.2 = 0



    Declare Sub Greena
    Greena:

    Portb.0 = 1
    Portd.2 = 1
    Return


    Declare Sub Greenb
    Greenb:

    Portb.0 = 1
    Portd.0 = 1
    Return

    Declare Sub Greenc
    Greenc:
    Portb.1 = 1
    Portd.2 = 1
    Return



    Declare Sub Greend
    Greend:
    Portb.1 = 1
    Portd.0 = 1
    Return


    Declare Sub Greene
    Greene:
    Portb.2 = 1
    Portd.2 = 1
    Return


    Declare Sub Greenf
    Greenf:
    Portb.2 = 1
    Portd.0 = 1
    Return

    Declare Sub Greeng
    Greeng:
    Portb.3 = 1
    Portd.2 = 1
    Return

    Declare Sub Greenh
    Greenh:
    Portb.3 = 1
    Portd.0 = 1
    Return

    Declare Sub Greeni
    Greeni:
    Portb.4 = 1
    Portd.2 = 1
    Return


    Declare Sub Greenj
    Greenj:
    Portb.4 = 1
    Portd.0 = 1
    Return


    Led0 Alias Portb.4
    Led1 Alias Portb.3
    Led2 Alias Portb.2
    Led3 Alias Portb.1
    Led4 Alias Portb.0

    Red_jhfdb Alias Portc.5
    Green_jhfdb Alias Portd.0
    Red_igeca Alias Portd.1
    Green_igeca Alias Portd.2

    Do

    Call Greena
    Wait 1
    Call Greenb
    Wait 1
    Call Greenc
    Wait 1
    Call Greend
    Wait 1


    Loop

    End


    Proszę oto pełny kod. Pomyliłem się jak mówiłeś ale zmiana nic nie pomogła.
    Muszę deklarować co będzie wyłaczać diody? Chcę je po prostu zapalić kolejno.

    0
  • #4 21 Lut 2010 20:08
    mirekk36
    Poziom 42  

    Zrób to mniej więcej tak ;)


    Code:
    $regfile = "m8def.dat"                                      ' INFORMACJA O PROCESORZE 
    
    $crystal = 1000000



    Config Portd = Output
    Config Portb = Output
    Config Portc = Output


    Portd.3 = 1
    Portd.4 = 1

    Portb.0 = 0
    Portb.1 = 0
    Portb.2 = 0
    Portb.3 = 0
    Portb.4 = 0

    Portc.5 = 0
    Portd.0 = 0
    Portd.1 = 0
    Portd.2 = 0


    ' deklaracje podprogramów
    Declare Sub Greena
    Declare Sub Greenb
    Declare Sub Greenc
    Declare Sub Greend



    Led0 Alias Portb.4
    Led1 Alias Portb.3
    Led2 Alias Portb.2
    Led3 Alias Portb.1
    Led4 Alias Portb.0

    Red_jhfdb Alias Portc.5
    Green_jhfdb Alias Portd.0
    Red_igeca Alias Portd.1
    Green_igeca Alias Portd.2

    Do

    Call Greena
    Wait 1
    Call Greenb
    Wait 1
    Call Greenc
    Wait 1
    Call Greend
    Wait 1

    Loop


    ' ciała podprogramów
    Greena:

    Portb.0 = 1
    Portd.2 = 1
    Return

    Greenb:

    Portb.0 = 1
    Portd.0 = 1
    Return

    Greenc:
    Portb.1 = 1
    Portd.2 = 1
    Return

    Greend:
    Portb.1 = 1
    Portd.0 = 1
    Return


    mam nadzieję, że teraz już będziesz wiedział jak to się robi ;) .... deklaracje są na górze programu przed pętlą główną natomiast ciała procedur są za pętlą główną. A u ciebie wykonywała się zgodnie z kolejnością programu tylko Greena i program szedł w maliny

    0
  • #5 21 Lut 2010 21:47
    paavo91
    Poziom 19  

    Aaaa kucze nie wiedziałem. Myślałem że procedury również :)
    Dziękuje za oświecenie.
    Pozdrawiam!

    Dodano po 1 [godziny] 22 [minuty]:

    Czy mógłbym przy okazji spytać czy jest takie polecenie w bascomie, żeby w pętli programy nagle wykonać "reset portów" tzn. aby ustawić wszystkie na "0"?

    0
  • #6 21 Lut 2010 22:01
    polprzewodnikowy
    Poziom 26  

    remus39 napisał:
    Czy mógłbym przy okazji spytać czy jest takie polecenie w bascomie, żeby w pętli programy nagle wykonać "reset portów" tzn. aby ustawić wszystkie na "0"?


    Reset PORTX

    0
  • #7 21 Lut 2010 23:08
    leon1313
    Poziom 14  

    mirekk36 napisał:
    Zrób to mniej więcej tak ;)
    ....

    Zawsze myślałem, że za pomocą call wywołuje się procedury opisane w znacznikach sub..end sub.
    W sposobie, który ty opisałeś, nie trzeba nic deklarować, co zresztą podpowiada help z BASCOM-a:
    Code:

    $regfile = "m48def.dat"                                     ' specify the used micro

    $crystal = 4000000                                         ' used crystal frequency

    $baud = 19200                                               ' use baud rate

    $hwstack = 32                                               ' default use 32 for the hardware stack

    $swstack = 10                                               ' default use 10 for the SW stack

    $framesize = 40                                             ' default use 40 for the frame space

     

    Goto Continue

    Print "This code will not be executed"

     

    Continue:                                                   'end a label with a colon

    Print "We will start execution here"

    Gosub Routine

    Print "Back from Routine"

    End

     

     

    Routine:                                                   'start a subroutine

    Print "This will be executed"

    Return   

    No ale mogę się mylić, TheBestOf nie jestem :-)

    0
  • #8 21 Lut 2010 23:13
    mirekk36
    Poziom 42  

    No pewnie, że może i nie trzeba deklarować ;) ja powoli już zapominam Bascoma bo piszę już tylko w C. A przyzwyczajony jestem do dobrego stylu programowania czyli deklarowania funkcji. A bascom pozwala na takie tworki - może i dobrze tylko później każdy gubi się w większym kodzie. Ale kompilacja także działa z tymi deklaracjami bo sprawdziłem ;) .... ja kiedyś jak pisałem w bascomie to nigdy tak nie robiłem - jak już to korzystałem normalnie po ludzku z deklaracji fukcji do których przekazywałem parametry itp

    Ale wiadomo - "program" można napisać i na samych poleceniach typu Goto ;)

    0
  • #9 21 Lut 2010 23:18
    leon1313
    Poziom 14  

    OT - ktoś pamięta tablicę skoków kernela w C-64 ?
    Większość swoich programów staram się pisać jako procedury/funkcję, które ( jako małe klocki ) służą mi do składania większych projektów. Podobno niezbyt profesjonalnie, ale jeśli chodzi o późniejsze udoskonalenia- idealne.

    0