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

[Atmega8][Bascom] instrukcja call zwiecha

paavo91 21 Lut 2010 19:25 2344 8
REKLAMA
  • #1 7729990
    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.
  • REKLAMA
  • #2 7730163
    adamz74
    Poziom 32  
    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!
  • REKLAMA
  • #3 7730229
    paavo91
    Poziom 19  
    $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.
  • REKLAMA
  • #4 7730288
    mirekk36
    Poziom 42  
    Zrób to mniej więcej tak ;)


    $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
  • #5 7730420
    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"?
  • #6 7731145
    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
  • #7 7731540
    leon1313
    Poziom 15  
    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:
    
    $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 :-)
  • #8 7731572
    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 ;)
  • REKLAMA
  • #9 7731609
    leon1313
    Poziom 15  
    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.
REKLAMA