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

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

IMEX 06 Cze 2009 13:37 2869 10
REKLAMA
  • #1 6622713
    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ć

    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
  • REKLAMA
  • Pomocny post
    #2 6622725
    gothye
    Poziom 33  
    Prościej sie nie da :

      
    '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
  • #3 6622753
    IMEX
    Poziom 20  
    Dziekuje Działa - oczywiście kliknełm wiadomo co

    a jak używam w programie - przykład kodu
    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
    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
  • REKLAMA
  • REKLAMA
  • #5 6622812
    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:
    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ł.
  • #6 6622852
    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
    
    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

    $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

    '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
  • #7 6623039
    Robewit
    Poziom 26  
    Musisz zadeklarować wartość danej -czas- na początku programu, np.: czas = 20.
  • #8 6625609
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #9 6627118
    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
    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
    Portc = &B00000001
    Waitms Czas


    lub
    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
    '---- 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
  • #10 6690947
    IMEX
    Poziom 20  
    NIEDZIAŁA

    $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
  • #11 6691276
    dawid512
    Poziom 32  
    Przyjrzyj się:
    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?
    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ł.
REKLAMA