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

Początki programowania - czemu nie działa?

fiskusmati 04 Kwi 2009 11:39 1382 21
  • #1 6372780
    fiskusmati
    Użytkownik obserwowany
    Napisałem żeby zobaczyć jak to będzie działać:

    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pinc.2 , Db5 = Pinc.3 , Db6 = Pinb.2 , Db7 = Pinb.1 , E = Pinc.1 , Rs = Pinc.0
    
    Dim X As Byte
    Dim Y As Byte
    Dim Z As Byte
    
    X = Y + Z
    Y = 2 + 3
    Z = 3
    
    
    
    Cls
    Lcd X
    
    
    
    End


    A na LCD wyświetla mi sie tylko 0, a powinno sie wyświetlić 8.


    O czym zapomniałem, i co źle zrobiłem?

    Pozdrawiam
  • Pomocny post
    #2 6372862
    .3lite
    Poziom 17  
    Kolejność?

    Z = 3
    Y = 2 + 3
    X = Y + Z
  • #3 6373647
    fiskusmati
    Użytkownik obserwowany
    Dzięki, działa.


    Do pinów 13 i 12 (PD7, PD6) podłączyłem po jednym switchu ktory po nacisnięciu zwiera daną linię do masy przez rezystor 470 R.

    Tu jest program:

    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pinc.2 , Db5 = Pinc.3 , Db6 = Pinb.2 , Db7 = Pinb.1 , E = Pinc.1 , Rs = Pinc.0
    
    
    Dim X As Byte
    Dim Y As Byte
    Dim Z As Byte
    Dim Suma As Byte
    Dim S As Byte
    
    Z = 3
    Y = 2 + 3
    X = Y * Z
    S = X + Y
    Suma = S + Z
    
    
    
    
    
    
    
    Config Pind.7 = Input
    Config Pind.6 = Input
    
    S1 Alias Pind.7
    
    S2 Alias Pind.6
    
    
    'poczatek programiku
    
    
    
    If S1 = 1 And S2 = 0 Then
    
       Waitms 25
    
       If S1 = 1 And S2 = 0 Then
    
    Do
    
    Cls
    Lcd "X jest rowny: "
    Waitms 500
    Lowerline
    Lcd X
    
    Wait 3
    Cls
    
    Lcd "Y jest rowny:"
    Waitms 500
    Lowerline
    Lcd Y
    
    Wait 3
    Cls
    
    Lcd "Z jest rowny:"
    Waitms 500
    Lowerline
    Lcd Z
    
    Wait 3
    Cls
    
    Lcd "Suma X,Y,Z = "
    Waitms 500
    Lowerline
    Lcd Suma
    
    
    End
    
    
    
    Loop
       End If
    End If
    


    Na ekranie nic nie ma po za kursorem na dole.


    Chodziło mi o to że po wciśnięciu przycisku cały program wystartuje.



    Pozdrawiam
  • #4 6376557
    fiskusmati
    Użytkownik obserwowany
    Probowałem zmeiniac jeszcze kolejnosci i podłączac pod inne piny ATmegi ale nic to nie dało.

    Czemu to nie działa?


    Pozdrawiam
  • Pomocny post
    #5 6381072
    zumek
    Poziom 39  
    fiskusmati napisał:
    ...Czemu to nie działa?

    Ponieważ źle zbudowałeś program.
    Jeżeli jakiś warunek If nie jest spełniony, to program "przeskakuje" do pozycji End If. Ponieważ u Ciebie obydwa końce warunków If, są poza pętlą Do...Loop, to przy nie spełnionych warunkach If, program leci w przysłowiowe krzaki, tudzież w nicość :D
    Czy zdajesz sobie sprawę, że umieszczenie polecenia End na końcu pętli Do...Loop spowoduje, że Twój program wykona się tylko raz i uC "zawiśnie na wieki" :?:
    Popraw tę część kodu z...
    
    Lcd Suma
    
    
    End
    
    
    
    Loop
       End If
    End If

    ... na
    
             Lcd Suma
             'End               'Usuń aspostrof sprzed End, jeśli pętla ma zadziałać 1 raz
          End If
       End If
    Loop
    
  • #6 6381135
    fiskusmati
    Użytkownik obserwowany
    Dzięki ale teraz program niezwazywszy na to czy uSwitche są włączone czy nie i tak zawsze startuje odrazu.

    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pinc.2 , Db5 = Pinc.3 , Db6 = Pinb.2 , Db7 = Pinb.1 , E = Pinc.1 , Rs = Pinc.0
    
    
    Dim X As Byte
    Dim Y As Byte
    Dim Z As Byte
    Dim Suma As Byte
    Dim S As Byte
    
    Z = 3
    Y = 2 + 3
    X = Y * Z
    S = X + Y
    Suma = S + Z
    
    
    
    
    
    
    
    Config Pind.7 = Input
    Config Pind.6 = Input
    
    S1 Alias Pind.7
    S2 Alias Pind.6
    
    Set Pind.7
    Set Pind.6
    
    
    'poczatek programiku
    
    
    
    If S1 = 0 And S2 = 0 Then
    
       Waitms 25
    
       If S1 = 0 And S2 = 0 Then
    
    Do
    
    Cls
    Lcd "X jest rowny: "
    Waitms 500
    Lowerline
    Lcd X
    
    Wait 3
    Cls
    
    Lcd "Y jest rowny:"
    Waitms 500
    Lowerline
    Lcd Y
    
    Wait 3
    Cls
    
    Lcd "Z jest rowny:"
    Waitms 500
    Lowerline
    Lcd Z
    
    Wait 3
    Cls
    
    Lcd "Suma X,Y,Z = "
    Waitms 500
    Lowerline
    Lcd Suma
             End                                                'Usuń aspostrof sprzed End, jeśli pętla ma zadziałać 1 raz
          End If
       End If
    Loop
    


    Tak wygląda poprawiony program
  • #8 6381363
    fiskusmati
    Użytkownik obserwowany
    Dzięki za starania, ale nieststy dalej nic.
    teraz jest pusty ekran jedynie takie co jest na samym początku: "_"

    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pinc.2 , Db5 = Pinc.3 , Db6 = Pinb.2 , Db7 = Pinb.1 , E = Pinc.1 , Rs = Pinc.0
    
    
    Dim X As Byte
    Dim Y As Byte
    Dim Z As Byte
    Dim Suma As Byte
    Dim S As Byte
    
    Z = 3
    Y = 2 + 3
    X = Y * Z
    S = X + Y
    Suma = S + Z
    
    
    
    
    
    
    
    Config Pind.7 = Input
    Config Pind.6 = Input
    
    S1 Alias Pind.7
    S2 Alias Pind.6
    
    Set Portd.7
    Set Portd.6
    
    
    'poczatek programiku
    
    
    Do
    If S1 = 0 And S2 = 0 Then
    
       Waitms 25
    
       If S1 = 0 And S2 = 0 Then
    
    Cls
    Lcd "X jest rowny: "
    Waitms 500
    Lowerline
    Lcd X
    
    Wait 3
    Cls
    
    Lcd "Y jest rowny:"
    Waitms 500
    Lowerline
    Lcd Y
    
    Wait 3
    Cls
    
    Lcd "Z jest rowny:"
    Waitms 500
    Lowerline
    Lcd Z
    
    Wait 3
    Cls
    
    Lcd "Suma X,Y,Z = "
    Waitms 500
    Lowerline
    Lcd Suma
             End                                                'Usuń aspostrof sprzed End, jeśli pętla ma zadziałać 1 raz
          End If
       End If
    Loop
  • Pomocny post
    #9 6381407
    Scofield1
    Poziom 11  
    Jeśli chcesz aby program wykonał się raz to po prostu nie umieszczaj kodu w nieskończonej pętli Do Loop. A jeśli już używasz pętli nieskończonej Do Loop to możesz bez problemu z niej wyjść funkcją Exit Do.
    Aby wyłączyć takie coś : "_" użyj funkcji : Cursor Off Noblink

    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pinc.2 , Db5 = Pinc.3 , Db6 = Pinb.2 , Db7 = Pinb.1 , E = Pinc.1 , Rs = Pinc.0
    
    
    Dim X As Byte
    Dim Y As Byte
    Dim Z As Byte
    Dim Suma As Byte
    Dim S As Byte
    
    Z = 3
    Y = 2 + 3
    X = Y * Z
    S = X + Y
    Suma = S + Z
    
    
    
    
    
    
    
    Config Pind.7 = Input
    Config Pind.6 = Input
    
    S1 Alias Pind.7
    S2 Alias Pind.6
    
    Set Portd.7
    Set Portd.6
    
    
    'poczatek programiku
    
    
    'Do    Usuń apostrof aby program był wykonywany nieskończoną ilość razy
    If S1 = 0 And S2 = 0 Then
    
       Waitms 25
    
       If S1 = 0 And S2 = 0 Then
    
    Cls
    Lcd "X jest rowny: "
    Waitms 500
    Lowerline
    Lcd X
    
    Wait 3
    Cls
    
    Lcd "Y jest rowny:"
    Waitms 500
    Lowerline
    Lcd Y
    
    Wait 3
    Cls
    
    Lcd "Z jest rowny:"
    Waitms 500
    Lowerline
    Lcd Z
    
    Wait 3
    Cls
    
    Lcd "Suma X,Y,Z = "
    Wait 3
    Lowerline                                        
          End If
       End If
    'Loop     Usuń apostrof aby program był wykonywany nieskończoną ilość razy
    End
    
  • #10 6381432
    fiskusmati
    Użytkownik obserwowany
    Wpisałem ten program co dałes wyżej, do atmegi i dalej jest to samo. Stoi w miejscu nie reaguje na nacisnięcie obu przycisków.
  • Pomocny post
    #11 6381445
    Scofield1
    Poziom 11  
    Jeśli nie usunąłeś apostrofów - ' przed Do i Loop w programie to on wykona się raz. A jeżeli w tym czasie nie naciśniesz tych przycisków to się nic nie pokaże. Najlepiej przed włączeniem zasilania do procesora naciśnij te przyciski i trzymaj gdy podłączysz zasilanie.
  • #12 6381469
    fiskusmati
    Użytkownik obserwowany
    Dalej nic.

    Probowałem na wszytkie mozliwosci, z Do i Loop bez, i tym zasilaniem tez tak robiłem ale dalej nic!

    A moge usunąc rezystor?
  • Pomocny post
    #13 6381508
    Scofield1
    Poziom 11  
    W poniższym kodzie zmieniłem miejsce konfiguracji portów jako wejściowych. Oraz przy instrukcjach warunkowych If zamiast AND (i) dałem Or(lub) co spowoduje, że warunek będzie spełniony gdy jeden z przycisków będzie wciśnięty. A i na początku programu wpisałem Wait 1 aby dać trochę czasu na wciśnięcie przycisku. A z tym rezystorem to nie wiem. Możesz spróbować go odłączyć.

    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pinc.2 , Db5 = Pinc.3 , Db6 = Pinb.2 , Db7 = Pinb.1 , E = Pinc.1 , Rs = Pinc.0
    
    Config Pind.7 = Input
    Config Pind.6 = Input
    
    S1 Alias Pind.7
    S2 Alias Pind.6
    
    Set Portd.7
    Set Portd.6
    
    Dim X As Byte
    Dim Y As Byte
    Dim Z As Byte
    Dim Suma As Byte
    Dim S As Byte
    
    Z = 3
    Y = 2 + 3
    X = Y * Z
    S = X + Y
    Suma = S + Z
    
    
    
    
    'poczatek programiku
    
    
    'Do    Usuń apostrof aby program był wykonywany nieskończoną ilość razy
    Wait 1
    If S1 = 0 Or S2 = 0 Then
    
       Waitms 25
    
       If S1 = 0 Or S2 = 0 Then
    
       Cls
       Lcd "X jest rowny: "
       Waitms 500
       Lowerline
       Lcd X
       Wait 3
    
       Cls
    
       Lcd "Y jest rowny:"
       Waitms 500
       Lowerline
       Lcd Y
    
       Wait 3
       Cls
    
       Lcd "Z jest rowny:"
       Waitms 500
       Lowerline
       Lcd Z
    
       Wait 3
       Cls
    
       Lcd "Suma X,Y,Z = "
       Waitms 500
       Lowerline
       Lcd Suma
       Wait 3
       End If
    End If
    'Loop     Usuń apostrof aby program był wykonywany nieskończoną ilość razy
    End
  • #14 6381516
    fiskusmati
    Użytkownik obserwowany
    Zrobiłem bez tego set, bez rezyztora poprostu hamsko zwarłem i chyba działa.
  • Pomocny post
    #15 6381530
    zumek
    Poziom 39  
    fiskusmati napisał:
    Zrobiłem bez tego set, bez rezyztora poprostu hamsko zwarłem i chyba działa.

    Na "chyba", to ja bym nie liczył.
    A jak masz podłączone te przyciski i o jakim rezystorze piszesz :?:
  • #16 6381545
    fiskusmati
    Użytkownik obserwowany
    Sorki koledzy, moja wina wsyztko. Zamiast do masy, dałem do Vcc.

    Wszytko działa :-)
    Pozdro

    EDIT

    Ztworzyłem coś takiego, mając na celu po wcisnięciu S1 zeby liczba Z zmieniła się o jeden w górę a po naciśnięciu S2 żeby zmalała o jeden.




    Efektu nie otrzymałem takiego jak chciałem.

    'informacja dla kompilatora
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    'konfiguracja wyjść wyświetlacza LCD
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pinc.2 , Db5 = Pinc.3 , Db6 = Pinb.2 , Db7 = Pinb.1 , E = Pinc.1 , Rs = Pinc.0
    
    'usuwanie kursora i czyszczenie LCD
    Cursor Off Noblink
    Cls
    
    'konfiguracja portów dla przycisków
    
    Config Pind.7 = Input
    Config Pind.6 = Input
    
    'zmienianie nazw portów
    
    S1 Alias Pind.7
    S2 Alias Pind.6
    
    'informacja dla procesora o zastosowaniu rezystora podciągającego
    
    Set Portd.7
    Set Portd.6
    
    '----------------------------------------------------------------
    
    'deklaracja zmiennych
    
    Dim Z As Long
    Dim A As Long
    
    
    'program głowny
    
    
    
    
    
    Do
    
    If S1 = 0 And S2 = 1 Then
    Cls
    Z = A + 1
    Lcd "Z ustawiono na:"
    Lowerline
    Lcd Z
    End If
    
    
    
    If S1 = 1 And S2 = 0 Then
    Cls
    Z = A + 1
    Lcd "Z ustawiono na:"
    Lowerline
    Lcd Z
    End If
    
    
    
    If S1 = 0 And S2 = 0 Then
    Cls
    Lcd "Reset"
    Waitms 400
    Cls
    End If
    
    Loop
    
    
    'koniec programu
    
    
    



    Pozdrawiam
  • #18 6382217
    fiskusmati
    Użytkownik obserwowany
    Co to jest to decr Z, incr Z oraz home?
  • Pomocny post
    #19 6382252
    dawid512
    Poziom 32  
    Incr - inkrementacja czyli Z=Z +1
    Decr - dekrementacja czyli Z=Z - 1
    Home - ustawienie kursora na pozycji 0,0.

    Polecam polskojęzyczny help do Bascoma tam wszystko pięknie pisze :)
  • #20 6390878
    fiskusmati
    Użytkownik obserwowany
    A czemuszto wywala mi błędy tutaj?

    Początki programowania - czemu nie działa?



    'informacja dla kompilatora
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    'konfiguracja wyjść wyświetlacza LCD
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pinc.2 , Db5 = Pinc.3 , Db6 = Pinb.2 , Db7 = Pinb.1 , E = Pinc.1 , Rs = Pinc.0
    
    'usuwanie kursora i czyszczenie LCD
    Cursor Off Noblink
    Cls
    
    'konfiguracja portów dla przycisków
    
    Config Pind.7 = Input
    Config Pind.6 = Input
    Config Pind.5 = Input
    
    'zmienianie nazw portów
    
    S1 Alias Pind.7
    S2 Alias Pind.6
    S3 Alias Pind.5
    
    'informacja dla procesora o zastosowaniu rezystora podciągającego
    
    Set Portd.7
    Set Portd.6
    Set Portd.5
    
    '----------------------------------
    
    
    Lcd "Wprowadź kod:"
    Lowerline
    
    Do
    If S1 = 0 Or S2 = 0 Or S3 = 0 Or Then
    Lcd "*"
    End If
    
    If S1 = 0 And S2 = 1 And S3 = 1 Then
    Gosub Pierwszy
    End If
    Loop
    End
    
    
    Pierwszy:
    
    Do
    
    If S1 = 0 Or S2 = 0 Or S3 = 0 Or Then
    Lcd "*"
    End If
    
    If S1 = 0 And S2 = 1 And S3 = 1 Then
    Gosub Drugi
    End If
    Loop
    End
    
    Drugi:
    
    Do
    
    If S1 = 0 Or S2 = 0 Or S3 = 0 Or Then
    Lcd "*"
    End If
    
    If S1 = 1 And S2 = 0 And S3 = 1 Then
    Gosub Trzeci
    End If
    Loop
    End
    
    Trzeci:
    
    Do
    
    If S1 = 0 Or S2 = 0 Or S3 = 0 Or Then
    Lcd "*"
    End If
    
    If S1 = 1 And S2 = 1 And S3 = 0 Then
    Gosub Kod_poprawny
    End If
    Loop
    End
    
    Kod_poprawny:
    
    Cls
    Lcd "KOD POPRAWNY !!!"


    Zaden błąd się nie zgadza!
  • Pomocny post
    #21 6391419
    crazy_phisic
    VIP Zasłużony dla elektroda
    ....
    Do
    If S1 = 0 Or S2 = 0 Or S3 = 0 Or Then
    Lcd "*"
    End If
    ....

    O jedno OR za dużo... w kolejnych warunkach również. Na przyszłość proszę ze zrozumieniem czytać komunikaty kompilatora.
  • #22 6391688
    fiskusmati
    Użytkownik obserwowany
    Dzięki
REKLAMA