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

gdzie dac instrukcje obslugiwana przycisk zegar led [bascom]

*zaba* 26 Kwi 2009 21:25 2196 12
REKLAMA
  • #1 6460208
    *zaba*
    Poziom 13  
    głowie sie już z tym od paru dni i nic próbowałem dużo ale nie wychodzi chodzi mi o przycisk który by zwiększał minuty
    może trzeba jakąś inna instrukcje użyć ?? za wszelka pomoc dziękuje
    if pinb.4=0 then
    incr setki 
    end if 


    tak wygląda program
    $regfile = "attiny2313.dat"
    $crystal = 1000000
    
     Config Pinb.0 = Output : Reset Portb.0
     Config Pinb.1 = Output : Reset Portb.1
     Config Pinb.2 = Output : Reset Portb.2
     Config Pinb.3 = Output : Reset Portb.3
     Config Pinb.4 = Input : Set Portb.4
     Config Pinb.5 = Output : Reset Portb.5
                                                 '
     Config Portd = Output
    
    
       Dim Jedn As Byte
       Dim Dzies As Byte
       Dim Setki As Byte
       Dim Tys As Byte
       Dim Ktorywys As Byte
    
    
    Enable Timer0
    Enable Interrupts
    Config Timer0 = Timer , Prescale = 8
    On Timer0 Wysw
    
    
    
    Do
    If Pinb.1 = 1 Then
    Waitms 1000
    Incr Jedn
    
    If Jedn = 10 Then
    Jedn = 0
    Incr Dzies
    If Dzies = 10 Then
    Dzies = 0
    Incr Setki
    If Setki = 10 Then
    Setki = 0
    Incr Tys
    If Tys = 10 Then
    Tys = 0
    
    End If
    End If
    End If
    End If
    End If
    
    
    Loop
    End
    
     Tabela:
    Data 130 , 222 , 168 , 140 , 212 , 133 , 129 , 158 , 128 , 132
    
     Wysw:
    Timer0 = 133
     Portb = &B00010000
    Incr Ktorywys
    
            If Ktorywys = 4 Then
             Ktorywys = 0
    
             End If
    
    Select Case Ktorywys
    
    Case 0:
    Portd = Lookup(jedn , Tabela)
    Portb.1 = 1
    
    Case 1:
    Portd = Lookup(dzies , Tabela)
    Portb.5 = 1
    
    Case 2:
    Portd = Lookup(setki , Tabela)
    Portb.3 = 1
    
    Case 3:
    Portd = Lookup(tys , Tabela)
    Portb.0 = 1
    
    End Select
    
    
    Return
  • REKLAMA
  • #2 6460604
    dawid512
    Poziom 32  
    Masz 2 opcje albo w pętli głównej albo w obsłudze przerwania. Po za tym jeśli już korzystasz z timera to wykorzystaj go do odliczania czasu zamiast korzystać z waitms.
  • #3 6466826
    *zaba*
    Poziom 13  
    Dzięki Dawid za pomoc ale jeśli chodzi o tą pętle główną to próbowałem dużo i jako że jeszcze jestem początkujący to mi coś nie wyszło
    próbowałem na select case i tez na gosub ai tez na incr ponizej jedna z moich prób i czy mógłbyś mi powiedzieć co robię źle byłbym bardzo wdzięczny
    
      $regfile = "attiny2313.dat"                               'najpierw określamy typ proca
    $crystal = 1000000                                          'definiujemy z jakim taktowaniem będzie pracował
    
    Dim Jedn As Byte , Dzies As Byte , Setki As Byte , Tys As Byte
    Dim Ktorywys As Byte ,
    
    
    Dim Odliczanie As Byte
    Dim Ustawienie As Byte
    
    
    Config Pinb.0 = Output : Reset Portb.0
    Config Pinb.1 = Output : Reset Portb.1
    Config Pinb.2 = Output : Reset Portb.2
    Config Pinb.3 = Output : Reset Portb.3
    Config Pinb.4 = Input : Set Portb.4
    Config Pinb.5 = Output : Reset Portb.5
                                                 '
    
    Config Portd = Output
       Portd = &B00000000
    
    Enable Timer0
    Enable Interrupts
    Config Timer0 = Timer , Prescale = 8
    On Timer0 Wysw
    
    
    Tys = Ustawienie
    
    
    Do
    
    If Pinb.4 = 0 Then
    Incr Ustawienie
    
    
    If Pinb.0 = 1 Then
       Waitms 100
    
       Incr Jedn
    
    If Jedn = 10 Then
       Jedn = 0
       Incr Dzies
    If Dzies = 10 Then
       Dzies = 0
       Incr Setki
    If Setki = 10 Then
       Setki = 0
       Incr Tys
    If Tys = 10 Then
       Tys = 0
    
    
    
    
    
    
    
    
    
     End If
     End If
     End If
    End If
    End If
    End If
    
    Loop
    
    End
    Tabela:
    Data 130 , 222 , 168 , 140 , 212 , 133 , 129 , 158 , 128 , 132
    
    
    
     Wysw:
    Timer0 = 133
    
          Portb = &B00000000
    
              Incr Ktorywys
    
            If Ktorywys = 4 Then
             Ktorywys = 0
    
             End If
    
          Select Case Ktorywys
              Case 0:
                Portd = Lookup(jedn , Tabela)
                Portb.0 = 1
    
              Case 1:
                Portd = Lookup(dzies , Tabela)
                Portb.1 = 1
    
              Case 2:
                Portd = Lookup(setki , Tabela)
                Portb.5 = 1
    
              Case 3:
                Portd = Lookup(tys , Tabela)
                Portb.3 = 1
    
    
            End Select
    
    
    
    
    
    
         Return
  • REKLAMA
  • #4 6470991
    *zaba*
    Poziom 13  
    Zrobiłem to tak ale nie do końca dobrze ponieważ mogę ustawić sobie licznik tylko gdy pinb.0=1 czyli co sekundę. Wiem że dałem instrukcje gosub w warunku ale gdy daję nowy warunek czyli IF PINB.4=0 THEN GOSUB USTAWIENIA nad tym pierwszym warunkiem to mi to nie działa czy mógłby ktoś wytłumaczyć co robię źle abym to sobie poprawił
    
      $regfile = "attiny2313.dat"                               'najpierw określamy typ proca
    $crystal = 1000000                                          'definiujemy z jakim taktowaniem będzie pracował
    
    Dim Jedn As Byte , Dzies As Byte , Setki As Byte , Tys As Byte
    Dim Ktorywys As Byte ,
    
    
    Dim Odliczanie As Byte
    Dim Ustawienie As Byte
    
    
    Config Portb.0 = Output : Reset Portb.0
    Config Portb.1 = Output : Reset Portb.1
    Config Portb.2 = Output : Reset Portb.2
    Config Portb.3 = Output : Reset Portb.3
    Config Pinb.4 = Input : Set Pinb.4
    Config Portb.5 = Output : Reset Portb.5
                                                 '
    
    Config Portd = Output
       Portd = &B00000000
    
    Enable Timer0
    Enable Interrupts
    Config Timer0 = Timer , Prescale = 8
    On Timer0 Wysw
    
    
    
    
    
    Do
    
    
    
    
    
    
    If Pinb.0 = 1 Then
    
       Waitms 1000
       Incr Jedn
      Gosub Ustawienie
    If Jedn = 10 Then
       Jedn = 0
       Incr Dzies
    If Dzies = 7 Then
       Dzies = 0
       Incr Setki
    If Setki = 10 Then
       Setki = 0
       Incr Tys
    If Tys = 7 Then
       Tys = 0
    
    
    
    
    
    
    
    
    
    
     End If
     End If
    End If
    End If
    End If
    
    
    
    Loop
    
    End
    Tabela:
    Data 130 , 222 , 168 , 140 , 212 , 133 , 129 , 158 , 128 , 132
    
    
    
     Wysw:
    Timer0 = 133
    
          Portb = &B00010000
    
              Incr Ktorywys
    
            If Ktorywys = 4 Then
             Ktorywys = 0
    
             End If
    
          Select Case Ktorywys
              Case 0:
                Portd = Lookup(jedn , Tabela)
                Portb.0 = 1
    
              Case 1:
                Portd = Lookup(dzies , Tabela)
                Portb.1 = 1
    
              Case 2:
                Portd = Lookup(setki , Tabela)
                Portb.3 = 1
    
              Case 3:
                Portd = Lookup(tys , Tabela)
                Portb.5 = 1
    
    
            End Select
    
    
    
    
    
    
         Return
    
    
        Ustawienie:
      If Pinb.4 = 0 Then
      Waitms 1
      Incr Setki
    
    
    
      If Setki = 10 Then
       Setki = 0
       Incr Tys
    If Tys = 7 Then
       Tys = 0
    
       End If
       End If
       End If
     Return
  • REKLAMA
  • #5 6471620
    janbernat
    Poziom 38  
    Dim Ustawienie As Byte -zmienna
    Chyba nigdzie nie używana
    Ustawienie: -etykieta
    Jakieś to dziwne.
  • #6 6473138
    *zaba*
    Poziom 13  
    Jak już wcześniej pisałem to kombinowałem na wiele sposobów zmienna "Ustawienie" pozostała z innych rozwiązań a Ustawienie to nie etykieta tylko podprogram Dzięki za spostrzegawczość a i czy mógłbym się dowiedzieć jak ty byś to rozwiązał
  • Pomocny post
    #7 6473155
    dawid512
    Poziom 32  
    Zastawia mnie po co ciągle robisz warunek w warunku jak np. tu
    If Pinb.4 = 0 Then
      Waitms 1
      Incr Setki
    
    
    
      If Setki = 10 Then
       Setki = 0
       Incr Tys
    If Tys = 7 Then
       Tys = 0
    
       End If
       End If
       End If 


    Jak już mówiłem wcześniej, jeżeli zaprzęgnąłeś timer to wykorzystaj go do odliczania sekundy wtedy pętla główna zostaje do twojej dyspozycji i bez problemu tam umieścisz ustawianie czasu.
  • #8 6473989
    *zaba*
    Poziom 13  
    dzięki będę próbował tak zrobić
  • REKLAMA
  • #9 6474349
    seba_x
    Poziom 31  
    a może po prostu użyj DEBOUNCE w pętli DO...LOOP
  • #10 6475252
    *zaba*
    Poziom 13  
    Dzięki bardzo zrobiłem to na timerze odliczanie zamiast wait 1 ale jaka dac wartosc w timer1 aby odmierzało co sekunde albo co minute jest jakis wzor aby to obliczyc?? przycisk działa wiekie dzieki
     
      $regfile = "attiny2313.dat"                               'najpierw określamy typ proca
    $crystal = 1000000                                          'definiujemy z jakim taktowaniem będzie pracował
    
    Dim Jedn As Byte , Dzies As Byte , Setki As Byte , Tys As Byte
    Dim Ktorywys As Byte ,
    
    
    
    
    
    Config Portb.0 = Output : Reset Portb.0
    Config Portb.1 = Output : Reset Portb.1
    Config Portb.2 = Output : Reset Portb.2
    Config Portb.3 = Output : Reset Portb.3
    Config Pinb.4 = Input : Set Pinb.4
    Config Portb.5 = Output : Reset Portb.5
                                                 '
    
    Config Portd = Output
       Portd = &B00000000
    
    Enable Timer0
    Enable Interrupts
    Config Timer0 = Timer , Prescale = 8
    On Timer0 Wysw
    
    Config Timer1 = Timer , Prescale = 8
    Enable Interrupts
    Enable Timer1
    On Timer1 Multi
    
    
    
    Do
    
    
    
       If Pinb.4 = 0 Then
       Gosub Ustawienie
       End If
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    Loop
    
    End
    Tabela:
    Data 130 , 222 , 168 , 140 , 212 , 133 , 129 , 158 , 128 , 132
    
    
    
     Wysw:
    Timer0 = 133
    
          Portb = &B00010000
    
              Incr Ktorywys
    
            If Ktorywys = 4 Then
             Ktorywys = 0
    
             End If
    
          Select Case Ktorywys
              Case 0:
                Portd = Lookup(jedn , Tabela)
                Portb.5 = 1
    
              Case 1:
                Portd = Lookup(dzies , Tabela)
                Portb.3 = 1
    
              Case 2:
                Portd = Lookup(setki , Tabela)
                Portb.1 = 1
    
              Case 3:
                Portd = Lookup(tys , Tabela)
                Portb.0 = 1
    
    
            End Select
    
             Return
    
    
            Multi:
            Timer1= 31000
            Incr Jedn
    
     If Jedn = 10 Then
     Jedn = 0
       Incr Dzies
    If Dzies = 6 Then
       Dzies = 0
       Incr Setki
    If Setki = 10 Then
       Setki = 0
       Incr Tys
    If Tys = 6 Then
       Tys = 0
    
    
    
     End If
    End If
    End If
    End If
    
    
    
         Return
    
    
        Ustawienie:
      Waitms 200
      Incr Setki
    
    
    
      If Setki = 10 Then
       Setki = 0
       Incr Tys
    If Tys = 6 Then
       Tys = 0
    
       End If
       End If
    
     Return
  • #11 6475352
    dawid512
    Poziom 32  
    Preskaler 64 a wartość wpisywana do timera to 49911. Wtedy otrzymasz sekundę( pamiętaj aby wartość wpisać tak: counter1= counter1 + 49911).
  • #12 6475915
    *zaba*
    Poziom 13  
    okej a mógłbym jeszcze wiedzieć jak to obliczyć z czego to wynika
  • #13 6482527
    *zaba*
    Poziom 13  
    Dobra już wiem znalazłem świetny artykuł na temat tych timer'ów . Wielkie dzięki za wszelką udzieloną mi pomoc :)
    Link
REKLAMA