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

Program w BASCOM dla M16: Przesuwanie litery na LCD o 5 miejsc

arktik1 09 Cze 2009 12:11 4470 35
Najlepsze odpowiedzi

Jak w BASCOM-ie dla ATmega16 przesuwać znak na LCD o 5 pozycji po każdym naciśnięciu przycisku, bez używania WAIT i bez przesuwania całego wyświetlacza?

Najprościej zrób to jako licznik pozycji 0..4, po każdym naciśnięciu zwiększaj go, zawijaj przez `MOD 5` i wypisuj znak tylko w odpowiednim miejscu LCD, zamiast używać `SHIFTLCD` do przesuwania całego wyświetlacza [#6641500][#6650942] Hose2 pokazał wersję skróconą: `Incr L1`, `L1 = L1 MOD 5`, potem jedno `Locate` i kilka warunków `If L1 = ... Then Lcd ...`, co daje ruch w obrębie 5 pól [#6641500] Jeśli chcesz, żeby po dojściu do końca ruch wracał w drugą stronę, zmieniaj kierunek przesuwania po osiągnięciu granicy; przy zagnieżdżeniu `IF` i `FOR` najpierw zamykaj `NEXT`, potem `END IF` [#6634736] Do obsługi przycisku bez dużych opóźnień możesz użyć `DEBOUNCE` — `Config Debounce` wystarczy wpisać raz dla wszystkich wywołań — albo przerwania od timera, jeśli kod ma działać w większym programie bez `WAIT` [#6650942][#6636182] Jeśli zamiast przycisku użyjesz enkodera, BASCOM ma też gotowe polecenie `ENCODER` w helpie [#6668125]
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA
  • #1 6634453
    arktik1
    Poziom 27  
    Posty: 1281
    Pomógł: 61
    Ocena: 39
    Witam
    Chciał bym prosić o napisanie prostego programiku który na wyświetlaczu LCD przesuwał by np literę o 5 miejsc do przodu i z powrotem .
    Czyli po kolei po naciśnięciu przycisku.
    Naciskamy przycisk 1 miejsce do przodu ,następne przyciśnięcie ,następne miejsce do przodu.
    gdy dojdzie do 5 to samo tylko do tyłu.
  • REKLAMA
  • #2 6634542
    wader_669
    Poziom 28  
    Posty: 1512
    Pomógł: 93
    Ocena: 15
    zapoznac sie z poleceniem shift albo shift lcd.
  • #3 6634653
    arktik1
    Poziom 27  
    Posty: 1281
    Pomógł: 61
    Ocena: 39
    No właśnie próbowałem tak:
    
    If Pind.7 = 0 Then
    Wait 1
    For A = 1 To 10
       Shiftlcd Right
       Waitms 500
       End If
    Next
    

    Ale to źle działa.
  • Pomocny post
    #4 6634736
    hose2
    Poziom 17  
    Posty: 106
    Pomógł: 23
    Ocena: 4
    arktik1 napisał:
    No właśnie próbowałem tak:
    
    If Pind.7 = 0 Then
    Wait 1
    For A = 1 To 10
       Shiftlcd Right
       Waitms 500
       End If
    Next
    

    Ale to źle działa.


    Źle działa i źle wygląda. Jeśli zaczynasz warunek (IF) a w jego wnętrzu masz pętlę (FOR) to musisz najpierw zamknąć pętlę (NEXT) a później warunek (END IF).

    Zakładając, że chcesz zrealizować ten pomysł przesuwaniem zawartości wyświetlacza, zacznij od napisania na LCD literki, rozpocznij pętlę (chcesz 5 powtórzeń), następnie czekaj na wciśnięcie klawisza. Jeśli warunek spełniony to przesuń zawartość LCD w prawo. Wstaw opóźnienie, zamknij pętlę ("w prawo"). Rozpocznij pętlę ("w lewo") i kontynuuj, zmieniając kierunek przesuwania, jak dla "w prawo".

    To tak najprościej jak się dało nie podając gotowca na talerzu ;)
  • REKLAMA
  • #5 6634824
    arktik1
    Poziom 27  
    Posty: 1281
    Pomógł: 61
    Ocena: 39
    A nie można jakoś tego napisać bez poleceń WAIT.
    Ma to być dołożone do większego programu i przydało by się żeby nie było WAIT i przesuwania całego LCD tylko te 5 punktów.
    Dodam że zamiast litery będzie to strzałka.
    Wiem że trzeba coś napisać na LCD i jeszcze LOCATE.:D
    Chodzi o sam "kawałek" przesuwający po wciśnięciu przycisku.
    Potrzebny po prostu biegnący punkt na LCD inicjowany "przyciskiem"

    Dodano po 4 [godziny] 54 [minuty]:

    Mam rozumieć że się nie da??
  • #6 6636182
    janbernat
    Poziom 38  
    Posty: 3954
    Pomógł: 468
    Ocena: 51
    Jak nie chcesz wait(co zrozumiałe) to wykorzystaj przerwanie od timera.
  • #7 6636386
    arktik1
    Poziom 27  
    Posty: 1281
    Pomógł: 61
    Ocena: 39
    Wszystko dobrze.
    Wiem że można tylko 1 problemik.
    JAK????
  • #8 6636494
    janbernat
    Poziom 38  
    Posty: 3954
    Pomógł: 468
    Ocena: 51
    "a to być dołożone do większego programu i przydało by się żeby nie było WAIT i przesuwania całego LCD tylko te 5 punktów."
    A w tym większym programie masz wolne timery?
    Albo chociaż wolne rejestry COMPARE?
  • #9 6636906
    arktik1
    Poziom 27  
    Posty: 1281
    Pomógł: 61
    Ocena: 39
    Są wolne 2 liczniki z 3.
    Są to 2 proste programy Termometr i Woltomierz.
  • REKLAMA
  • #10 6637159
    wader_669
    Poziom 28  
    Posty: 1512
    Pomógł: 93
    Ocena: 15
    
    '******* procek *******
    $regfile = "m32def.dat"
    $crystal = 8000000
    
    $hwstack = 50
    $swstack = 50
    $framesize = 50
    
    '******* lcd *******
    Config Lcd = 24 * 2
    Config Lcdpin = Pin , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.1 , Rs = Porta.0
    Dim Menu As Byte
    
    
    '****** przycisk ******
    Config Pinb.2 = Input
    Set Portb.2
    Declare Sub Przycisk
    Dim Przycisk_x As Bit
    Dim x As Byte
    
    Cursor Off
    Cls
    
    Locate 1 , 13
    Lcd "X"
    Do
    
    Call Przycisk
    
    If przycisk_x = 1 Then
       przycisk_x=0
       If X < 5 Then
          Shiftlcd Left
          incr x
       Elseif X > 4 Then
          Shiftlcd Right
          incr x
          if x=9 then x=0
       End If
    End If
    
    Loop
    End
    
    Sub Przycisk
    If Pinb.2 = 0 Then
    Waitms 45
       If Pinb.2 = 0 Then
          Bitwait Pinb.2 , Set
    
          przycisk_X = 1
    
       End If
    End If
    End Sub
    


    Dodano po 7 [minuty]:

    jak bedzie mi sie chcialo (zaraz sie zastanowie) to ci napisze to bez waitow
  • #11 6637436
    adass
    Poziom 25  
    Posty: 1232
    Pomógł: 6
    Ocena: 119
    Działa ten program ok . Moje pytanie jak i co dopisać do tego programu żeby masa do R/W (pin PA6) była podawana programowo ,żeby nie trzeba było mostkować R/W do masy. Czy w bascomie to można zrobić ?
  • #12 6637502
    hose2
    Poziom 17  
    Posty: 106
    Pomógł: 23
    Ocena: 4
    Kilka pytań:
    - czy pętla główna programu często się powtarza (odświeżanie LCD, odpytywanie klawisza),
    - czy chcesz coś pisać na wyświetlaczu podczas animacji (wspólny bufor zawartości LCD),
    - czy klawisz ma tą animację tylko uruchamiać, czy również zatrzymywać
    Napisz o szczegółach, mniej się będziesz męczył :)
  • #13 6637589
    wader_669
    Poziom 28  
    Posty: 1512
    Pomógł: 93
    Ocena: 15
    adass napisał:
    Działa ten program ok . Moje pytanie jak i co dopisać do tego programu żeby masa do R/W (pin PA6) była podawana programowo ,żeby nie trzeba było mostkować R/W do masy. Czy w bascomie to można zrobić ?


    Nie jest to mozliwe.

    A tak na powaznie, to moze reset/set portx.x ?
  • #14 6638238
    arktik1
    Poziom 27  
    Posty: 1281
    Pomógł: 61
    Ocena: 39
    Jest to wyświetlacz 4x20
    Wyświetlane są na nim Temp.V. ,2 czy 3 napisy.
    Dlatego ważne jest by strzałka poruszała się w określonym polu np.
    Locate 4 ,10 do 4 ,15
    Nie można przesuwać całego LCD.
    Ma być to czujnik ruchu.
    po naciśnięciu przycisku strzałka ma przeskoczyć o 1 pole i czekać na następne naciśnięcie.
    Czujnikiem jest fototranzystor więc działa jak przycisk pozycja 1,0,1,0.
    z resztą chyba można zastosować DEBOUNCE .
    Tylko że wtedy skok będzie powodował opóźnienie.
    Może DEBOUNCE=0 wtedy działanie będzie szybsze co w dalszym ciągu nie rozwiązuje sprawy "skoku"

    Dodano po 18 [minuty]:

    Jakby interesowało to jest tu cały program do którego ma to być dopisane.
    Zdaję sobie sprawę że na pewno trzeba go jeszcze poprawić, w każdym razie działa.
    :D
    
    $regfile = "m16def.dat"
    $crystal = 10000000
    Config Porta = Input
            Porta = &B1111110
    Config Portc = Output
            Portc = &B00000000
    Config Portd = Input
            Portd = &B11111111
    Config Lcd = 20 * 2
    Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0 , E = Portb.4 , Rs = Portb.5
    Portb.6 = 1
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    
    Dim I As Word
    Config Timer1 = Timer , Prescale = 8
    On Timer1 Times
    Enable Timer1
    Enable Interrupts
    
    Dim V As Single
    Dim A As Single
    Dim P As Integer
    Dim C As Integer
    Dim R As Integer
    Dim Z As Byte
    Start Adc
    Start:
    P = 0
    V = 0
    A = 0
    C = 0
    R = 0
    Z = 0
    
    Deflcdchar 1 , 32 , 32 , 31 , 31 , 31 , 31 , 32 , 32        'miernik plynu
    
    '------------------------------temp-------------------
    Config 1wire = Porta.1
    Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32             'znak stopnia Celcjusza
    Dim Temp As Integer , Ss As String * 6
    Dim Dsid As Byte
    Cls
    
    
    Do
    Cursor Off
    
    If I = 0 Then Gosub Plyn
    
    '-----------------------napiecie
    '----pobieranie
    For Z = 1 To 10
     P = P + Getadc(0)
    Next T
    P = P / 10
     V = P / 80
    A = Frac(v)
    V = Int(v)
    A = A * 10
    R = Int(a) + 10
    C = V
    Locate 1 , 1
    Lcd " Went."
    Locate 2 , 1
    Lcd "V = "
    Lcd C
    Lcd R
    If V >= 10 Then
    Locate 2 , 7
    Lcd "."
    Locate 2 , 9
    Lcd "0"
    End If
    If V < 10 Then
    Locate 2 , 6
    Lcd "."
    Locate 2 , 8
    Lcd "0 "
    End If
    '---------------------temp
    1wreset
       1wwrite &H55
       1wverify Dsid
       1wwrite &HBE
       Temp = 1wread(2)
       1wreset
       1wwrite &HCC
       1wwrite &H44
    
       Temp = Temp * 10
       Temp = Temp / 16
       Ss = Str(temp)
       Ss = Format(ss , "0.0")
        Locate 1 , 7
       Lcd "Temp.Plynu"
       Locate 2 , 12
       Lcd ; Ss ; Chr(0)
    
       If Temp >= 330 Then                                      'TEMP WLACZENIA 1 BIEGU
       Portc.0 = 1
       End If
       If Temp <= 320 Then                                      'WYLACZENIA 1 BIEGU
       Portc.0 = 0
       End If
       If Temp >= 340 Then                                      'WLACZENIE 2 BIEGU
       Portc.1 = 1
       End If
       If Temp <= 320 Then                                      'WYLACZENIE 2 BIEGU
       Portc.1 = 0
       End If
       If Temp >= 350 Then                                      'wlaczenie 3 bieg
       Portc.2 = 1
       End If
       If Temp <= 320 Then                                      'wylaczenie 3 bieg
       Portc.2 = 0
       End If
    
    
    Loop
    End
    
    Plyn:
    '-----------------poziom wys
    Locate 4 , 1
    Lcd "E"
    Locate 4 , 7
    Lcd "F  "
    Portc.5 = 1
    Waitms 100
    If Pind.2 = 0 Then
     Locate 4 , 2
     Lcd Chr(1)
     End If
    If Pind.2 = 1 Then
    Locate 4 , 2
     Lcd " "
      End If
    If Pind.3 = 0 Then
     Locate 4 , 3
     Lcd Chr(1)
     End If
    If Pind.3 = 1 Then
     Locate 4 , 3
     Lcd " "
      End If
     If Pind.4 = 0 Then
     Locate 4 , 4
     Lcd Chr(1)
     End If
    If Pind.4 = 1 Then
     Locate 4 , 4
     Lcd " "
     End If
    If Pind.5 = 0 Then
     Locate 4 , 5
     Lcd Chr(1)
     End If
    If Pind.5 = 1 Then
     Locate 4 , 5
     Lcd " "
     End If
    If Pind.6 = 0 Then
    Locate 4 , 6
     Lcd Chr(1)
     End If
    If Pind.6 = 1 Then
    Locate 4 , 6
     Lcd " "
     End If
    
    Portc.5 = 0
    If Pind.3 = 1 Then
    Locate 3 , 1
    Lcd "Malo plynu"
    End If
    
    If Pind.3 = 0 Then
    Locate 3 , 1
    Lcd "Poziom    "
    End If
    If Pind.2 = 0 Then Portc.4 = 0
    If Pind.2 = 1 And Pind.3 = 1 Then Gosub Alarm
    Return
    
    Times:
    I = I + 1
    If I = 300 Then
    Stop Timer1
    I = 0
    Timer1 = 0
    Start Timer1
    End If
    Return
    
    Alarm:
    Portc.4 = 1
    Locate 3 , 1
    Lcd "     MALO           "
    Locate 4 , 1
    Lcd "    PLYNU           "
     Return
    


    Dodano po 4 [godziny] 30 [minuty]:

    Dorobiłem coś takiego i o dziwo działa.
    tylko może da się to jakoś skrócić??
    Bo muszę jeszcze dopisać powrót ,a to znów zajmie tyle samo linijek.
    :D
    
    $regfile = "m16def.dat"
    $crystal = 10000000
    
    Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0 , E = Portb.4 , Rs = Portb.5
    Config Portd = Input
            Portd = &B11111111
    
    Dim L1 As Byte
    L1 = 0
    Config Debounce = 0
    
    Cls
    Do
    Debounce Pind.7 , 0 , Zwieksz , Sub
    
    Loop
    End
    
    Zwieksz:
    Incr L1
    If L1 = 5 Then L1 = 0
    If L1 = 0 Then
    Locate 1 , 1
    Lcd "l"
    End If
    If L1 = 0 Then
    Locate 1 , 5
    Lcd " "
    End If
    If L1 = 1 Then
    Locate 1 , 2
    Lcd "1"
    End If
    If L1 = 1 Then
    Locate 1 , 1
    Lcd " "
    End If
    If L1 = 2 Then
    Locate 1 , 3
    Lcd "1"
    End If
    If L1 = 2 Then
    Locate 1 , 2
    Lcd " "
    End If
    If L1 = 3 Then
    Locate 1 , 4
    Lcd "1"
    End If
    If L1 = 3 Then
     Locate 1 , 3
      Lcd " "
    End If
    If L1 = 4 Then
    Locate 1 , 5
    Lcd "1"
    End If
    If L1 = 4 Then
    Locate 1 , 4
    Lcd " "
    End If
    
    
    
    Return
    
  • #15 6641500
    hose2
    Poziom 17  
    Posty: 106
    Pomógł: 23
    Ocena: 4
    Cytat:
    może da się to jakoś skrócić??

    spróbujmy (delikatna modyfikacja):

    
    ...
    
    Zwieksz:
    Incr L1
    L1 = L1 MOD 5
    Locate 1 , 1
    If L1 = 0 Then Lcd "1    "
    If L1 = 1 Then Lcd " 1   "
    If L1 = 2 Then Lcd "  1  "
    If L1 = 3 Then Lcd "   1 "
    If L1 = 4 Then Lcd "    1"
    
    Return
    


    Jeśli takie rozwiązanie Ci nie odpowiada, to można jeszcze ładniej zrobić :)
  • #16 6642396
    wader_669
    Poziom 28  
    Posty: 1512
    Pomógł: 93
    Ocena: 15
    Ja moge spojrzec na twoj kod, ale:
    1. Nie wytlumaczyles jasno co dokladnie ma robic procek.
    2. Nie wyjasniles twojego kodu, ja nie mam ochoty go od podstaw rozwalac.
    3. Jeszcze nie widzialem zebys mi wstawil pomogl.
  • #17 6644462
    arktik1
    Poziom 27  
    Posty: 1281
    Pomógł: 61
    Ocena: 39
    Jest to program do Chłodzenia wodnego komputera.
    Szkoda teraz wyjaśniać bo cały czas się zmienia.
    Ale w skrócie:
    napięcie-- pomiar V zasilania chłodnicy.
    temp-- Temperatura płynu chłodzącego + termostat 3 biegowy.
    poziom wys-- wskaźnik poziomu płynu w zbiorniczku.
    A to ostatnie ma pokazywać przepływ cieczy.
    Dzięki HOSE2 ,przecież to proste ,nie wiem jak mogłem na to nie wpaść.
    :D.

    Dodano po 4 [minuty]:

    No Sorry WADER ale moim zdaniem nie bardzo pomogłeś.
    napisałeś program który przesuwał znak ale od 1 do 5 i z powrotem po jednokrotnym naciśnięciu przycisku.
    Miało być inaczej.
    Potem napisałeś że napiszesz bez WAIT ,ale chyba ci się nie chciało.
    Więc myślę że wyjaśniłem sprawę PODZIĘKOWAŃ.

    Dodano po 8 [minuty]:

    Hose2 a co byś powiedział na ten kawałek?
    
    Locate 4 , 1
    Lcd "E"
    Locate 4 , 7
    Lcd "F"
    Portc.5 = 1
    Waitms 100
    If Pind.2 = 0 Then
     Locate 4 , 2
     Lcd Chr(1)
     End If
    If Pind.2 = 1 Then
    Locate 4 , 2
     Lcd " "
      End If
    If Pind.3 = 0 Then
     Locate 4 , 3
     Lcd Chr(1)
     End If
    If Pind.3 = 1 Then
     Locate 4 , 3
     Lcd " "
      End If
     If Pind.4 = 0 Then
     Locate 4 , 4
     Lcd Chr(1)
     End If
    If Pind.4 = 1 Then
     Locate 4 , 4
     Lcd " "
     End If
    If Pind.5 = 0 Then
     Locate 4 , 5
     Lcd Chr(1)
     End If
    If Pind.5 = 1 Then
     Locate 4 , 5
     Lcd " "
     End If
    If Pind.6 = 0 Then
    Locate 4 , 6
     Lcd Chr(1)
     End If
    If Pind.6 = 1 Then
    Locate 4 , 6
     Lcd " "
     End If
    
  • #18 6644793
    wader_669
    Poziom 28  
    Posty: 1512
    Pomógł: 93
    Ocena: 15
    arktik1 napisał:
    Witam
    Chciał bym prosić o napisanie prostego programiku który na wyświetlaczu LCD przesuwał by np literę o 5 miejsc do przodu i z powrotem .


    Aha no dobra. Spoko jak masz takie nastawienie. To ja dziekuje, milej zabawy.

    Dodano po 2 [minuty]:

    Jestem ciekaw jak bedzie wygladac koncowy kod. Moze pod koniec sie jeszcze zglosze i pokaze wam wszystkie bledy.
  • #19 6644928
    arktik1
    Poziom 27  
    Posty: 1281
    Pomógł: 61
    Ocena: 39
    No już bez przesady , było tak:
    Cytat:

    Chciał bym prosić o napisanie prostego programiku który na wyświetlaczu LCD przesuwał by np literę o 5 miejsc do przodu i z powrotem .
    Czyli po kolei po naciśnięciu przycisku.
    Naciskamy przycisk 1 miejsce do przodu ,następne przyciśnięcie ,następne miejsce do przodu.
    gdy dojdzie do 5 to samo tylko do tyłu.
  • #20 6644978
    wader_669
    Poziom 28  
    Posty: 1512
    Pomógł: 93
    Ocena: 15
    Aha to sorry rzeczywiscie moj blad. Zly program tobie napisalem, nie doczytalem w takim razie do konca. Zwracam honor.

    Dodano po 2 [godziny] 8 [minuty]:

    W sumie nie jest to do konca moj blad bo widze, ze zmieniales swojego posta po mojej pierwszej wypowiedzi. Dobra, sprawa nie wazna. Poprawilek kod.

    Dodano po 15 [minuty]:

    Tak patrze na twoj kod i napisz go sobie jak tobie sie to podoba. Jak nie bedzie tobie dzialac to sie zglos bo masz duzo bledow, wymienie ci wszystkie. Sam nie bede ci poprawiac kodu (za duzo roboty).
  • #21 6647617
    arktik1
    Poziom 27  
    Posty: 1281
    Pomógł: 61
    Ocena: 39
    Tu jest cały kod.
    Jeśli możesz to pokaż w którym miejscu jest błąd i jak poprawić .
    W każdym razie kod działa.
    
    $regfile = "m16def.dat"
    $crystal = 9000000
    Config Porta = Input
            Porta = &B11111100
    Config Portc = Output
            Portc = &B00000000
    Config Portd = Input
            Portd = &B11111111
    Config Lcd = 20 * 4
    Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0 , E = Portb.4 , Rs = Portb.5
    Portb.6 = 1
    
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    
    
    Dim V As Single
    Dim A As Single
    Dim P As Integer
    Dim C As Integer
    Dim R As Integer
    Dim Z As Byte
    Start Adc
    Start:
    P = 0
    V = 0
    A = 0
    C = 0
    R = 0
    Z = 0
    
    Deflcdchar 2 , 32 , 32 , 32 , 14 , 14 , 32 , 32 , 32       ' wskaznik przeplywu.
    
    Deflcdchar 1 , 32 , 32 , 31 , 31 , 31 , 31 , 32 , 32       'miernik plynu
    
    '------------------------------temp-------------------
    Config 1wire = Porta.1
    Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32       'znak stopnia Celcjusza
    Dim Temp As Integer , Ss As String * 6
    Dim Dsid As Byte
    '-----------------------przeplyw
    Dim L1 As Byte
    L1 = 0
    Dim L2 As Byte
    L2 = 0
    
    Config Debounce = 0
    
    Cls
    Locate 2 , 5
    Lcd "Dzien Dobry"
    Locate 3 , 2
    Lcd "System chlodzenia"
    Locate 4 , 6
    Lcd "WLACZONY"
    Wait 5
    Cls
    
    
    Do
    Cursor Off
    
    Debounce Pind.7 , 0 , Zwieksz , Sub       '---przeplyw
    Debounce Pina.7 , 0 , Wlacz , Sub
    If L2 = 5 Then Gosub Plyn
    If L2 = 5 Then L2 = 0
    
    If Pind.1 = 0 Then Gosub Alarm1
    If Portc.3 = 1 Then
    Locate 4 , 8
    Lcd "-"
    End If
    If Portc.3 = 0 Then
    Locate 4 , 8
    Lcd " "
    End If
    If Pina.6 = 0 Then Gosub Wyciek
    
    '-----------------------napiecie
    '----pobieranie
    For Z = 1 To 10
     P = P + Getadc(0)
    Next T
    P = P / 10
     V = P / 80
    A = Frac(v)
    V = Int(v)
    A = A * 10
    R = Int(a) + 10
    C = V
    Locate 1 , 1
    Lcd "  Went."
    Locate 2 , 1
    Lcd "V = "
    Lcd C
    Lcd R
    If V >= 10 Then
    Locate 2 , 7
    Lcd "."
    Locate 2 , 9
    Lcd "0"
    End If
    If V < 10 Then
    Locate 2 , 6
    Lcd "."
    Locate 2 , 8
    Lcd "0 "
    End If
    '---------------------temp
    1wreset
       1wwrite &H55
       1wverify Dsid
       1wwrite &HBE
       Temp = 1wread(2)
       1wreset
       1wwrite &HCC
       1wwrite &H44
    
       Temp = Temp * 10
       Temp = Temp / 16
       Ss = Str(temp)
       Ss = Format(ss , "0.0")
        Locate 1 , 8
       Lcd "   Temp.Plynu"
       Locate 2 , 14
       Lcd ; Ss ; Chr(0)
    
       If Temp >= 330 Then   'TEMP WLACZENIA 1 BIEGU
       Portc.0 = 1
       End If
       If Temp <= 320 Then   'WYLACZENIA 1 BIEGU
       Portc.0 = 0
       End If
       If Temp >= 340 Then   'WLACZENIE 2 BIEGU
       Portc.1 = 1
       End If
       If Temp <= 320 Then   'WYLACZENIE 2 BIEGU
       Portc.1 = 0
       End If
       If Temp >= 350 Then   'wlaczenie 3 bieg
       Portc.2 = 1
       End If
       If Temp <= 320 Then   'wylaczenie 3 bieg
       Portc.2 = 0
       End If
    
    
    Loop
    End
    
    Plyn:
    '-----------------poziom wys
    Locate 4 , 1
    Lcd "E"
    Locate 4 , 7
    Lcd "F"
    Portc.5 = 1
    Waitms 100
    If Pind.2 = 0 Then
     Locate 4 , 2
     Lcd Chr(1)
     End If
    If Pind.2 = 1 Then
    Locate 4 , 2
     Lcd " "
      End If
    If Pind.3 = 0 Then
     Locate 4 , 3
     Lcd Chr(1)
     End If
    If Pind.3 = 1 Then
     Locate 4 , 3
     Lcd " "
      End If
     If Pind.4 = 0 Then
     Locate 4 , 4
     Lcd Chr(1)
     End If
    If Pind.4 = 1 Then
     Locate 4 , 4
     Lcd " "
     End If
    If Pind.5 = 0 Then
     Locate 4 , 5
     Lcd Chr(1)
     End If
    If Pind.5 = 1 Then
     Locate 4 , 5
     Lcd " "
     End If
    If Pind.6 = 0 Then
    Locate 4 , 6
     Lcd Chr(1)
     End If
    If Pind.6 = 1 Then
    Locate 4 , 6
     Lcd " "
     End If
    
    If Pind.3 = 1 Then
    Locate 3 , 1
    Lcd "Malo plynu"
    End If
    
    If Pind.3 = 0 Then
    Locate 3 , 1
    Lcd "Poziom    "
    End If
    If Pind.2 = 1 And Pind.3 = 1 Then Gosub Alarm
    Portc.5 = 0
    Return
    
    Wlacz:
    Toggle Portc.3
    Return
    
    Alarm:
    Toggle Portc.4
    Locate 3 , 1
    Lcd " MALO     "
    Locate 4 , 1
    Lcd " PLYNU    "
    If Portc.3 = 1 And Portc.4 = 1 Then Gosub Wylacz
     Return
    
    '---------------------do przeplyw
    Zwieksz:
    Locate 3 , 13
    Lcd "Przeplyw"
    Locate 4 , 13
    Lcd Chr(2)
    Locate 4 , 20
    Lcd Chr(2)
    Incr L1
    If L1 = 10 Then L1 = 0
    L1 = L1 Mod 10
    If Portc.3 = 1 And L1 = 3 Then
    Locate 4 , 9
    Lcd "AUTO"
    End If
    If Portc.3 = 1 And L1 = 9 Then
    Locate 4 , 9
    Lcd "OFF "
    End If
    If Portc.3 = 0 And L1 = 6 Then
    Locate 4 , 9
    Lcd "    "
    End If
    
    Locate 4 , 14
    If L1 = 0 Then Lcd "*     "
    If L1 = 1 Then Lcd " *    "
    If L1 = 2 Then Lcd "  *   "
    If L1 = 3 Then Lcd "   *  "
    If L1 = 4 Then Lcd "    * "
    If L1 = 5 Then Lcd "     *"
    If L1 = 6 Then Lcd "    * "
    If L1 = 7 Then Lcd "   *  "
    If L1 = 8 Then Lcd "  *   "
    If L1 = 9 Then Lcd " *    "
    If L1 = 10 Then Lcd "*     "
    If L1 = 1 Then
    Incr L2
    End If
    If L2 = 5 Then Waitms 1
    Return
    
    Wylacz:
    Portc.6 = 1
    Waitms 300
    Portc.6 = 0
    Portc.3 = 0
    Return
    
    Alarm1:
    Portc.4 = 1
    Wait 1
    Portc.4 = 0
    Locate 3 , 12
    Lcd "  WOLNY  "
    Locate 4 , 12
    Lcd " przeplyw"
    If Portc.3 = 1 And Pind.1 = 0 Then Gosub Wylacz
    Return
    
    Wyciek:
    If Portc.3 = 1 And Pina.6 = 0 Then Gosub Wylacz
    If Pina.6 = 0 Then
    Locate 3 , 4
    Lcd "Wyciek Plynu"
    End If
    Return
    
    '------opis -----------------------------------------------------------------
    'Portc.4--Piszczyk
    'Portc.5--Zasilanie czujnika poziomu
    'Od Pind.2 do Pind.6 --Poziom płynu
    'Od Portc.0 Do Portc.2 --3 Biegi wentylatora
    'Porta.1 --czujnik temperatury.
    'Porta.0 --Voltomierz
    'Pind.1 --czujnik wolny przepływ
    'Pind.7 --wskaznik ruchu
    ' \Portc.6--do przekaźnika wylaczenia kompa.
    'Porta.6--czujnik wycieku.
    
  • #22 6649094
    hose2
    Poziom 17  
    Posty: 106
    Pomógł: 23
    Ocena: 4
    Ale masz bajery :)
    i znów optymalizacja:
    Plyn:
    '-----------------poziom wys
    Locate 4 , 1
    Lcd "E"
    Locate 4 , 7
    Lcd "F"
    Portc.5 = 1
    Waitms 100
    Locate 4 , 2
    If Pind.2 = 0 Then
     Lcd Chr(1)
    Else
     Lcd " "
    End If
    If Pind.3 = 0 Then
     Lcd Chr(1)
    Else
     Lcd " "
    End If
    If Pind.4 = 0 Then
     Lcd Chr(1)
    Else
     Lcd " "
    End If
    If Pind.5 = 0 Then
     Lcd Chr(1)
    Else
     Lcd " "
    End If
    If Pind.6 = 0 Then
     Lcd Chr(1)
    Else
     Lcd " "
    End If
    ...
    Incr L1
    If L1 = 10 Then L1 = 0              ' stosuj to
    L1 = L1 Mod 10                        ' lub to - wynik ten sam
    Locate 4 , 9
    If Portc.3 = 1 And L1 = 3 Then
    Lcd "AUTO"
    End If
    If Portc.3 = 1 And L1 = 9 Then
    Lcd "OFF "
    End If
    If Portc.3 = 0 And L1 = 6 Then
    Lcd "    "
    End If
    

    Nie analizowałem reszty kodu - skoro działa...
  • REKLAMA
  • #23 6649789
    arktik1
    Poziom 27  
    Posty: 1281
    Pomógł: 61
    Ocena: 39
    A dlaczego po:
    
    Locate 4 , 2
    If Pind.2 = 0 Then
     Lcd Chr(1)
    Else
     Lcd " "
    End If 
    

    nie ma następnego LOCATE??

    Dodano po 2 [godziny] 40 [minuty]:

    Mam jeszcze jedno pytanie.
    Czy jak w pętli jest 3x DEBOUNCE to przed pętlą trzeba wpisać :
    3x Config Debounce
    czy wystarczy 1 raz.
  • #24 6650942
    hose2
    Poziom 17  
    Posty: 106
    Pomógł: 23
    Ocena: 4
    arktik1 napisał:
    A dlaczego po:
    
    Locate 4 , 2
    If Pind.2 = 0 Then
     Lcd Chr(1)
    Else
     Lcd " "
    End If 
    

    nie ma następnego LOCATE??

    A do czego to LOCATE ma być potrzebne skoro piszesz na LCD znak za znakiem? Wyświetlacz pamięta ostatnią pozycję kursora :)

    arktik1 napisał:

    Mam jeszcze jedno pytanie.
    Czy jak w pętli jest 3x DEBOUNCE to przed pętlą trzeba wpisać :
    3x Config Debounce
    czy wystarczy 1 raz.

    Config Debounce wystarczy 1 raz - odnosi się do każdego wystąpienia DEBOUNCE.
  • #25 6666248
    arktik1
    Poziom 27  
    Posty: 1281
    Pomógł: 61
    Ocena: 39
    No i narodziła się kolejna sprawa.
    Układ detekcji obrotów.
    Znalazłem na elektrodzie taki kawałek kodu :
    
    Temp_enk = 0
    If Enk_a <> Temp_enk Then
    If Enk_a <> Enk_b Then
    Incr Poz
    Else
    Decr Poz
    End If
    Temp_enk = Enk1
    End If
    

    Chciał bym używać enkodera np>z myszki komputerowej zamiast 2 przycisków.
    co wy na to ??
    A może jest jakiś inny sposób?

    Dodano po 1 [minuty]:

    NP. do sterowania wyjściem PWM .

    Dodano po 3 [minuty]:

    A może jest coś w przykładach BASCOMA?
  • #26 6666811
    nouki
    Poziom 25  
    Posty: 1222
    Pomógł: 28
    Ocena: 98
    arktik1 napisał:
    No i narodziła się kolejna sprawa.
    Układ detekcji obrotów.


    Detekcji czy wyświetlania aktualnej wartości??
  • #27 6667161
    arktik1
    Poziom 27  
    Posty: 1281
    Pomógł: 61
    Ocena: 39
    Musi on zwiększać wartość PWM w uC,
    Zamiast S1 i S2.


    
    If S1 = 0 Then                                             'jeśli przyciśnięty S1, to
      Waitms 10                                                 'opóźnienie dla eliminacji drgań
           'styków
       If S1 = 0 Then                                           'sprawdzenie ponownie, czy
           'przycisk S1 dalej naciśnięty,
           'jeśli tak, to
       Incr I
                                                               'zwiększenie o jeden wartości I
       If I = 0 Then
                                                   'jeśli wartość I = 0, to
        I = 255                                                 'wpisanie do I wartości 255
       End If
       Pwm1a = I                                                'wpisanie wartości I do zmiennej
           'Pwm1a określającej wypełnienie
           'PWM
       Waitms 80                                                'opóźnienie 20 ms
      End If                                                    'koniec warunków
     End If
     If S2 = 0 Then                                             'jeśli przyciśnięty S2, to
      Waitms 10                                                 'opóźnienie dla eliminacji drgań
           'styków
      If S2 = 0 Then                                            'sprawdzenie ponownie, czy
           'przycisk S2 dalej naciśnięty,
           'jeśli tak, to
       Decr I                                                   'zmniejszenie wartości I o jeden
       If I = 255 Then                                          'jeśli wartość I = 255, to
        I = 0                                                   'zerowanie wartości zmiennej I
       End If
    
       Pwm1a = I                                                'wpisanie wartości I do zmiennej
           'Pwm1a określającej wypełnienie
           'PWM
       Waitms 80                                                'opóźnienie 20 ms
      End If                                                    'koniec warunków
     End If
       If I = 0 Then
        Portb.5 = 0
        End If
    
  • Pomocny post
    #28 6668125
    hose2
    Poziom 17  
    Posty: 106
    Pomógł: 23
    Ocena: 4
    arktik1 napisał:
    A może jest jakiś inny sposób?
    A może jest coś w przykładach BASCOMA?


    Tak, jest w helpie : "ENCODER"
  • #29 6703645
    arktik1
    Poziom 27  
    Posty: 1281
    Pomógł: 61
    Ocena: 39
    Poskładałem taki programik:
    
    $regfile = "m16def.dat"
    $crystal = 9000000
    Config Porta = Input
            Porta = &B11111100
    Config Portc = Output
            Portc = &B00010000
    Config Portd = Input
            Portd = &B11111111
    Config Portb = &B11111100
            Portb = &B11111111
    Config Lcd = 20 * 2
    Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , Db7 = Portb.2 , E = Portb.6 , Rs = Portb.7
    Portb.6 = 1
    
    Dim Wyn As Integer
    Config Timer0 = Counter , Edge = Rising
    Cursor Off
    Cls
    
    Do
    Timer0 = 0
    Start Timer0
    Waitms 900
    Stop Timer0
    
    
    Wyn = Timer0 * 1
    Locate 1 , 1
    Lcd Wyn
    Locate 2 , 1
    If Wyn = 0 Then Lcd "      "
    If Wyn = 1 Then Lcd "=     "
    If Wyn = 2 Then Lcd "==    "
    If Wyn = 3 Then Lcd "===   "
    If Wyn = 4 Then Lcd "====  "
    If Wyn = 5 Then Lcd "===== "
    If Wyn = 6 Then Lcd "======"
    If Wyn = 0 Then Gosub Alarm1
    Loop
    End
    

    Czy można wyeliminować WAITMS.
    Można to jakoś inaczej napisać??
  • #30 6704488
    hose2
    Poziom 17  
    Posty: 106
    Pomógł: 23
    Ocena: 4
    arktik1 napisał:
    Poskładałem taki programik:
    
    ...
    Timer0 = 0
    Start Timer0
    Waitms 900
    Stop Timer0
    
    
    Wyn = Timer0 * 1
    ...
    

    Czy można wyeliminować WAITMS.
    Można to jakoś inaczej napisać??


    A co ten programik ma robić, bo taki sposób użycia timera i waitms to dość niespotykana konstrukcja.

Podsumowanie tematu

✨ Użytkownik pyta o programowanie mikrokontrolera ATmega16 w BASCOM do zliczania impulsów zewnętrznych licznikiem T1 i przesuwania znaku/strzałki na wyświetlaczu LCD o 5 pozycji po naciśnięciu przycisku, bez blokujących opóźnień (WAIT). Problem dotyczy wyświetlania ruchu w określonym polu LCD, nie przesuwania całej zawartości. Zasugerowano metody z użyciem LOCATE, warunków logicznych oraz timerów/przerwań zamiast WAIT. W dalszej części dyskusji poruszono tematy: wykorzystania enkodera do sterowania PWM, budowy obrotomierza dla wentylatorów (pomiar częstotliwości sygnału z wentylatora) z użyciem timerów, oraz teoretyczne pytanie o podłączenie wielu mikrokontrolerów do jednego wyświetlacza LCD.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA