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.

2 przyciski i zmiana góra dół - atmega 8 - Bascom

IMEX 06 Cze 2009 13:37 2542 10
  • #1 06 Cze 2009 13:37
    IMEX
    Poziom 20  

    proszę o pomoc

    jestem totalnie początkującym i robię sterownik do swiateł

    jestem na etapie pisania programu a dokładnie wyboru programu z menu

    mam coś takiego i działa ale tylko na jeden przycisk i dodaje mi wartość +1 ale chce żeby drugim przyciskiem odejmować

    Code:
    Do
    
       If Pinb.5 = 0 Then
          Waitms 100
          If Pinb.5 = 0 Then
          A = A + 1
              If A > 4 Then
              A = 1
              End If


          End If
       End If
    Gosub Menu


    to jest oczywiście kawałek kodu

    0 10
  • Pomocny post
    #2 06 Cze 2009 13:43
    gothye
    Poziom 33  

    Prościej sie nie da :

    Code:
      
    
    'w góre
     if pinb.5 = 0 then
          if A <> 4 then 'wartosc maxymalna A
             incr A
             waitms 100
          end if
          
       end if

       'w dół
       if pinb.6 = 0 then
          if A <> 0 then 'wartosc minimalna A
             decr A
             waitms 100
          end if
          
       end if

    0
  • #3 06 Cze 2009 13:54
    IMEX
    Poziom 20  

    Dziekuje Działa - oczywiście kliknełm wiadomo co

    a jak używam w programie - przykład kodu

    Code:
    If A = 1 Then
    
         Lcd "program 1"
    Portc = &B00000001
    Waitms 50
    Portc = &B00000011
    Waitms 50
    Portc = &B00000111
    Waitms 50
    Portc = &B00001111
    Waitms 50
    Portc = &B00011111
    Waitms 50
    Portc = &B000111111
    Waitms 50
    Portc = &B01111111
    Waitms 50
    Portc = &B11111111
    Waitms 50
    Portc = &B00000000
    End If


    jak zmieniać prędkość (czas) na podobnej zasadzie dwoma przyciskami innymi
    Code:
    Config Pinb.7 = Input
    
     Config Pinb.8 = Input


    w zakresie od 0 do 9 czy jakkolwiek

    to juz byłbym w domku krótko mówiac

    0
  • #4 06 Cze 2009 14:02
    gothye
    Poziom 33  

    Code:
    dim czas as byte
    

    if pinb.7 = 0 then
       if czas <> 255 then 'wartosc max czas
          incr czas
       end if
    end if

    if pinb.6 = 0 then
       if czas <> 0 then 'wartosc min czas
          decr czas
       end if
    end if


    a potem w programie ...

    Code:
    waitms czas 

    0
  • #5 06 Cze 2009 14:12
    Maciek4141
    Poziom 22  

    Deklarujesz zmienną czas jako integer i wszędzie dajesz waitms czas.
    Teraz deklarujesz np. zmienną poz_czas - będzie ona posiadała wartości np. 1-10.
    Piszesz obslugę tych przycisków (tak jak dla góra/dół), tylko umieś je w odpowiednim miejscu kodu (my go całego nie widzimy). W instrukcjach warunkowych dla przycisków obsługujących czas daj Incr poc_czas (dodawanie 1, oraz decr - odejmowanie 1) oraz Call zmien_czas (skok do podprogramu).

    Kolejnym krokiem jest zadeklarowanie podprogramu: Declare Sub zmien_czas.

    Za End głownej pętli dajesz:

    Code:
    Sub zmien_czas
    
      Select case poz_czas:
      case 1: czas=100
      case 2: czas=250
      case 3: czas=500
      itd.
      end select
    End sub


    Dodano po 1 [minuty]:

    Heh, ktoś mnie uprzedził.

    0
  • #6 06 Cze 2009 14:45
    IMEX
    Poziom 20  

    Właśnie i tego się bałem

    Powiecmy że prędkości jest 10 w zakresie od 0 - 9
    dlaczego - bo takie klikanie mija się z celem
    ale dla wartości 0 czy li wolno niech będzie

    Code:

    0 = 10000
    1 = 5000
    2 = 2000
    3 = 1000
    4 = 800
    5 = 500
    6 = 300
    7 = 100
    8 = 50
    9 = 20


    to tak dla przykładu

    a i niewiem gdzie ten twój kod mam dokladnie wstawić ten od czasu

    a zrobiłem tak i nie działa i powinien być zapętlony

    Code:
    $regfile "m8def.dat"
    

    $crystal = 1000000

    Dim A As Byte

    Config Pinb.5 = Input
     Config Pinb.6 = Input
     Config Pinb.0 = Input
     Config Pinb.1 = Input
    Set Pinb.5
    Set Pinb.6
    Set Pinb.0
    Set Pinb.1


    Do
    'w góre
     If Pinb.5 = 0 Then
          If A <> 4 Then                                        'wartosc maxymalna A
             Incr A
             Waitms 100
          End If

       End If

       'w dół
       If Pinb.6 = 0 Then
          If A <> 0 Then                                        'wartosc minimalna A
             Decr A
             Waitms 100
          End If

       End If
    Gosub Menu

    dim czas as byte

    If Pinb.0 = 0 Then
       if czas <> 255 then 'wartosc max czas
          incr czas
       end if
    end if

    If Pinb.1 = 0 Then
       if czas <> 0 then 'wartosc min czas
          decr czas
       end if
    end if




    Loop

    Menu:

    Cls

         If A = 1 Then
         Lcd "program 1" ; A
    Portc = &B00000001
    Waitms Czas
    Portc = &B00000011
    Waitms Czas
    Portc = &B00000111
    Waitms Czas
    Portc = &B00001111
    Waitms Czas
    Portc = &B00011111
    Waitms Czas
    Portc = &B000111111
    Waitms Czas
    Portc = &B01111111
    Waitms Czas
    Portc = &B11111111
    Waitms Czas
    Portc = &B00000000
    End If

         If A = 2 Then
         Lcd "program 2"
       Portc = &B00000000
             Waitms 50
      Portc = &B01010101
           Waitms 50




      Portc = &B10101010
    End If

         If A = 3 Then
         Lcd "program 3"
    Waitms 50
    Portc = &B00000011
    Waitms 50
    Portc = &B00000110
    Waitms 50
    Portc = &B00001100
    Waitms 50
    Portc = &B00011000
    Waitms 50
    Portc = &B00110000
    Waitms 50
    Portc = &B01100000
    Waitms 50
    Portc = &B11000000
    Waitms 50
    Portc = &B01100000
    Waitms 50
    Portc = &B00110000
    Waitms 50
    Portc = &B00011000
    Waitms 50
    Portc = &B00001100
    Waitms 50
    Portc = &B00000110
         End If

         If A = 4 Then
         Lcd "program 4"
    Portc = &B00001111
    Waitms 20
    Portc = &B00000000
    Waitms 20
    Portc = &B00001111
    Waitms 20
    Portc = &B00000000
    Waitms 100

    Portc = &B11110000
    Waitms 20
    Portc = &B00000000
    Waitms 20
    Portc = &B11110000
    Waitms 20
    Portc = &B00000000
    Waitms 100


         End If

    Return


    Dodano po 19 [minuty]:

    A i jeszcze jest problem taki z tym kodem

    Code:
    'w góre
    
     If Pinb.5 = 0 Then
          If A <> 4 Then                                        'wartosc maxymalna A
             Incr A
             Waitms 100
          End If

       End If

       'w dół
       If Pinb.6 = 0 Then
          If A <> 0 Then                                        'wartosc minimalna A
             Decr A
             Waitms 100
          End If

       End If


    ze jak wcisnę przycisk i go trzymam to przełanczaja sie kolejne programy

    a i dziala zmiana predkości tylko że pierwotna wartość po uruchomieniu to czas=0

    2 przyciski i zmiana góra dół - atmega 8 - Bascom

    0
  • #7 06 Cze 2009 15:28
    Robewit
    Poziom 25  

    Musisz zadeklarować wartość danej -czas- na początku programu, np.: czas = 20.

    0
  • #8 07 Cze 2009 07:44
    emarcus
    Poziom 35  

    IMEX napisał:
    Właśnie i tego się bałem


    ze jak wcisnę przycisk i go trzymam to przełanczaja sie kolejne programy





    Tak to wlasnie jest gdy increamentacja lub decr. zmiennej jest umieszczona w petli 'do...loop' i jest warunkowana poziomem na okreslonym wejsciu. Za kazdym "obrotem' petli zawarte w niej polecenia sa bezblednie wykonywane, przedzielone ustawionymi czasemi zatrzymania programu w postaci 'wait' lub 'waitms'. Masz przypadek w stylu klawiatury komputera. Zjawisko to mozesz niwelowac do pewnego stopnia zmieniajac czasy przerw 'waitms', tak aby 'uwolnic' przycisk przed uplywem tego czasu.
    Zechcesz miec czyste przelaczenie (increamentacja zmiennej), niezalezne od czasu trzymania przycisku najlatwiej bedzie wykorzystac ktorys z interruptow zewnetrznych (INT0 lub INT1) kontrolowany zboczem rosnacym (RISING ) lub opadajacym (FALLING).
    Jezeli oba interrupty masz wolne to mozesz uzyc jeden (np. INT0) do kontroli increamentacji programu/zmiennej, drugi (np. INT1) do procesu decr. Nie zapomnij przy tym o "DEBOUNCE" przyciskow pracujacych z interruptem.

    Nie bardzo rozumiem o co idzie w drugiej czesci:

    Cytat:

    a i dziala zmiana predkości tylko że pierwotna wartość po uruchomieniu to czas=0

    Nigdzie w listingu nie ma zadnej wartosci lub zmiennmej przypisanej/zadeklarowanej jako wartosc poczatkowa, co wiec moze byc oprocz zera?
    Zechcesz miec wartosc jakiejs zmiennej lub stalej rozna od zera, to albo ja deklarujesz na poczatku, albo czytasz ja z eeprom.

    e marcus

    0
  • #9 07 Cze 2009 15:00
    IMEX
    Poziom 20  

    Jestem zupełnie poczatkującym tzn ucze sie bascoma od 3 dni wiec proszę o wyrozumiałość

    Start programu rozwiązałem sobie tak - bo jak odpalałem to nic się nie działo

    Code:
    A = 1
    
    Czas = 100

    A=1 to jest start programu pierwszego - bedzie wiecej tylko trzeba to roapisać
    Czas=100 to ustalona jest podstawowa predkosc migania diodek

    Pytanie
    Jak mogę rozwiązać żeby nie powtarzać - głównie chodzi tu o czas
    Code:
    Portc = &B00000001
    
    Waitms Czas


    lub
    Code:
    Waitms Czas
    
      Portc = &B01010101
      Portd = &B10101010


    prościej może da się to rozwiązać a jednocześnie zmniejszę i bardziej wykorzystam pamieć i bedzie to czytelniejsze w stylu to tylko przykład
    Code:
    '---- data for LED human output ------
    
    Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144

    lub
    '---- data for LED human output ------
    Tabela:
    Data Portc = &B01010101 , B01010101 , B01010101 , czas
    Data Portd = &B01010101 , B01010101 , B01010101 , czas


    Jakieś pomysły - bez wielkich zmian we wstępnym projekcie

    0
  • #10 22 Cze 2009 23:22
    IMEX
    Poziom 20  

    NIEDZIAŁA

    Code:
    $regfile "m8def.dat"
    

    $crystal = 1000000

    Dim A As Byte

    Config Pind.0 = Output
    Config Pind.2 = Output
    Config Pind.3 = Output
    Config Pinc.0 = Input
    Config Pinc.1 = Input
    Set Pind.0
    Set Pind.2
    Set Pind.3
    Set Pinc.0
    Set Pinc.1

    A = 3

    Do

    If Pinc.0 = 0 Then
    If A = 1 Then
    incr A
    Waitms 100
    End If
    End If

    If Pinc.1 = 0 Then
    If A = 2 Then
    decr A
    Waitms 100
    End If
    End If

    Loop


    If A = 1 Then
    Portd.0 = 1
    Portd.2 = 1
    Portd.3 = 1
    Waitms 50
    Portd.0 = 0
    Portd.2 = 0
    Portd.3 = 0
    Waitms 200
    End If

    If A = 2 Then
    Portd.0 = 1
    Portd.2 = 1
    Portd.3 = 1
    Waitms 200
    Portd.0 = 0
    Portd.2 = 0
    Portd.3 = 0
    Waitms 200
    End If

    If A = 3 Then
    Portd.0 = 1
    Portd.2 = 1
    Portd.3 = 1
    Waitms 500
    Portd.0 = 0
    Portd.2 = 0
    Portd.3 = 0
    Waitms 500

    End If

    If A = 4 Then
    Portd.0 = 1
    Portd.2 = 1
    Portd.3 = 1
    Waitms 1000
    Portd.0 = 0
    Portd.2 = 0
    Portd.3 = 0
    Waitms 1000

    End If

    Return


    rozkladam łapki

    0
  • #11 23 Cze 2009 01:03
    dawid512
    Poziom 32  

    Przyjrzyj się:

    Code:
    A = 3
    

    Do

    If Pinc.0 = 0 Then
    If A = 1 Then
    incr A
    Waitms 100
    End If
    End If

    If Pinc.1 = 0 Then
    If A = 2 Then
    decr A
    Waitms 100
    End If
    End If

    Loop


    Warunek ze zmienną A nigdy nie będzie spełniony gdyż na początku deklarujesz A=3. Po za tym po co bez sensu pisać takie warunki?
    Code:
    If A = 1 Then
    
    Portd.0 = 1
    Portd.2 = 1
    Portd.3 = 1
    Waitms 50
    Portd.0 = 0
    Portd.2 = 0
    Portd.3 = 0
    Waitms 200
    End If

    If A = 2 Then
    Portd.0 = 1
    Portd.2 = 1
    Portd.3 = 1
    Waitms 200
    Portd.0 = 0
    Portd.2 = 0
    Portd.3 = 0
    Waitms 200
    End If


    Poczytaj o select case. W każdym case'ie umieść jakąś procedurę o do wyboru procedury zaprzęgnij jakąś zmienną którą będziesz inkrementował lub dekrementował.

    0
  Szukaj w 5mln produktów