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

Wykonanie stopera [ATMega8]

jamnik89pl 12 Mar 2010 12:16 2148 9
REKLAMA
  • #1 7818306
    jamnik89pl
    Poziom 10  
    Witam, siedzę już kilka dni pisząc i jednocześnie ucząc się programowania w BASCOM'ie. Napotkałem na mały problem przy programowaniu stopera, mianowicie nie potrafię zmusić układu by rozpoczynał odliczanie w momencie wciśnięcia przycisku. Proszę o pomoc, sam próbowałem już wielu sposobów ale puki co na razie nic nie wychodzi :(

    Switch włączający jest podłączony do masy układu i Portu C.4.
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Config Lcd = 16 * 4
    Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portd.4 , E = Portd.3 , Rs = Portd.2
    Deflcdchar 2 , 31 , 32 , 32 , 32 , 32 , 32 , 32 , 32
    
    Config Timer0 = Timer , Prescale = 1
    
    Config Pinc.4 = Input
    Set Pinc.4
    
    
    Dim Przerw0 As Word
    Dim Czas As Byte
    Dim Sekundy_d As Byte
    Dim Minuty_d As Byte
    Dim Sekundy_j As Byte
    Dim Minuty_j As Byte
    Dim Setne As Byte
    Dim Ostatnia_st As Byte
    Dim Ostatnia_sd As Byte
    Dim Ostatnia_sj As Byte
    Dim Ostatnia_md As Byte
    Dim Ostatnia_mj As Byte
    Dim Naj_st As Byte
    Dim Naj_sd As Byte
    Dim Naj_sj As Byte
    Dim Naj_md As Byte
    Dim Naj_mj As Byte
    
    
    Dim Wart_ac As Bit
    
    Cursor Off
    
     Ostatnia_st = 0
     Ostatnia_sj = 0
     Ostatnia_sd = 0
     Ostatnia_mj = 0
     Ostatnia_md = 0
     Naj_st = 9
     Naj_sd = 9
     Naj_sj = 9
     Naj_md = 9
     Naj_mj = 9
    
    On Timer0 Licz
    
    
     Enable Interrupts
    
     Enable Timer0
    
     Stop Timer0
    
     Timer0 = 0
    
     Cls
    
    
    Do
    
    
    
       Home
    
      Locate 4 , 1
      Lcd "TIME: " ; Minuty_d ; Minuty_j ; ":" ; Sekundy_d ; Sekundy_j ; "," ; Setne
    
      Locate 3 , 1
      Lcd "LAST: " ; Ostatnia_md ; Ostatnia_mj ; ":" ; Ostatnia_sd ; Ostatnia_sj ; "," ; Ostatnia_st
    
      Locate 2 , 1
      Lcd "BEST: " ; Naj_md ; Naj_mj ; ":" ; Naj_sd ; Naj_sj ; "," ; Naj_st
    
    
    
      If Wart_ac = 1 Then
    
       Stop Timer0
    
       Ostatnia_st = Setne
       Setne = 0
    
       Ostatnia_sd = Sekundy_d
       Sekundy_d = 0
    
       Ostatnia_md = Minuty_d
       Minuty_d = 0
    
       Ostatnia_sj = Sekundy_j
       Sekundy_j = 0
    
       Ostatnia_mj = Minuty_j
       Minuty_j = 0
    
    
    
       Timer0 = 0
    
       Start Timer0
    
      End If
    
    
     Loop
    
    End
    
    '----------------------------------
    
    Licz:
    
      Incr Przerw0
    
      If Przerw0 = 3125 Then
    
      Incr Setne
    
      Przerw0 = 0
    
          If Setne = 10 Then
             Incr Sekundy_j
             Setne = 0
          End If
    
          If Sekundy_j = 10 Then
             Incr Sekundy_d
             Sekundy_j = 0
          End If
    
          If Sekundy_d = 6 Then
                Incr Minuty_j
                Sekundy_j = 0
                Sekundy_d = 0
          End If
    
          If Minuty_j = 10 Then
             Incr Minuty_d
             Minuty_j = 0
          End If
    
          If Minuty_d = 10 Then
             Minuty_d = 0
             Minuty_j = 0
          End If
    
     End If
    
    Return
    
  • REKLAMA
  • #2 7818351
    alien_audio
    Poziom 21  
    Witam.
    A w którym miejscu w programie sprawdzasz czy przycisk jest włączony?
  • REKLAMA
  • #3 7818367
    jamnik89pl
    Poziom 10  
    W zamieszczonym kodzie nie ma tej linijki, ale próbowałem już funkcją Debounce, Bitwait, jak i w systemie 1/0. Przy tej ostatniej przytrzymanie przycisku powodowało ciągłe resetowanie czasu a przy debounce, działało tylko przy przytrzymanym włączniku.
  • REKLAMA
  • #4 7818388
    leon1313
    Poziom 15  
    Musisz ustawiać znacznik, albo lepiej- odblokować przerwanie :-)
  • REKLAMA
  • Pomocny post
    #5 7818432
    alien_audio
    Poziom 21  
    odczytujemy stan przycisku np : instrukcją
    IF pinc.4 = 0 then ( tu wstawiamy co ma program zrobić )
    najlepiej wstawić jakiś podprogram który zadziała jako stoper
    zadeklaruj sobie podprogram np: stoper
    po naciśnięciu przycisku wywołasz podprogram stoper
    w podprogramie stoper umieścisz jak ma działać stoper



    declare sub stoper
    do
    IF pinc.4 = 0 then call stoper
    loop

    sub stoper
    ' tu wpisz co ma robić po nacisnięciu przycisku
    end sub
  • #6 7819058
    jamnik89pl
    Poziom 10  
    Przerobiłem program zgodnie z Twoją wskazówką, wygląda on teraz tak:
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Config Lcd = 16 * 4
    Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portd.4 , E = Portd.3 , Rs = Portd.2
    Deflcdchar 2 , 31 , 32 , 32 , 32 , 32 , 32 , 32 , 32
    
    Config Timer0 = Timer , Prescale = 1
    
    Declare Sub Stoper
    Config Pinc.4 = Input
    Set Pinc.4
    
    Dim Przerw0 As Word
    Dim Czas As Byte
    Dim Sekundy_d As Byte
    Dim Minuty_d As Byte
    Dim Sekundy_j As Byte
    Dim Minuty_j As Byte
    Dim Setne As Byte
    Dim Ostatnia_st As Byte
    Dim Ostatnia_sd As Byte
    Dim Ostatnia_sj As Byte
    Dim Ostatnia_md As Byte
    Dim Ostatnia_mj As Byte
    Dim Naj_st As Byte
    Dim Naj_sd As Byte
    Dim Naj_sj As Byte
    Dim Naj_md As Byte
    Dim Naj_mj As Byte
    
    Cursor Off
    
    
    
     Ostatnia_st = 0
     Ostatnia_sj = 0
     Ostatnia_sd = 0
     Ostatnia_mj = 0
     Ostatnia_md = 0
     Naj_st = 9
     Naj_sd = 9
     Naj_sj = 9
     Naj_md = 9
     Naj_mj = 9
    
    On Timer0 Licz
    
    
     Enable Interrupts
    
     Enable Timer0
    
     Stop Timer0
    
     Timer0 = 0
    
    Cls
    
    
    Do
    
    
    
       Home
    
      Locate 4 , 1
      Lcd "TIME: " ; Minuty_d ; Minuty_j ; ":" ; Sekundy_d ; Sekundy_j ; "," ; Setne
    
      Locate 3 , 1
      Lcd "LAST: " ; Ostatnia_md ; Ostatnia_mj ; ":" ; Ostatnia_sd ; Ostatnia_sj ; "," ; Ostatnia_st
    
      Locate 2 , 1
      Lcd "BEST: " ; Naj_md ; Naj_mj ; ":" ; Naj_sd ; Naj_sj ; "," ; Naj_st
    
    
    
     If Pinc.4 = 0 Then Call Stoper
    
    Loop
    
     Sub Stoper
    
       Stop Timer0
    
       Ostatnia_st = Setne
       Setne = 0
    
       Ostatnia_sd = Sekundy_d
       Sekundy_d = 0
    
       Ostatnia_md = Minuty_d
       Minuty_d = 0
    
       Ostatnia_sj = Sekundy_j
       Sekundy_j = 0
    
       Ostatnia_mj = Minuty_j
       Minuty_j = 0
    
    
    
       Timer0 = 0
    
       Start Timer0
    
    End Sub
    
    
    
    
    End
    
    '----------------------------------
    
    Licz:
    
      Incr Przerw0
    
      If Przerw0 = 3125 Then
    
      Incr Setne
    
      Przerw0 = 0
    
          If Setne = 10 Then
             Incr Sekundy_j
             Setne = 0
          End If
    
          If Sekundy_j = 10 Then
             Incr Sekundy_d
             Sekundy_j = 0
          End If
    
          If Sekundy_d = 6 Then
                Incr Minuty_j
                Sekundy_j = 0
                Sekundy_d = 0
          End If
    
          If Minuty_j = 10 Then
             Incr Minuty_d
             Minuty_j = 0
          End If
    
          If Minuty_d = 10 Then
             Minuty_d = 0
             Minuty_j = 0
          End If
    
     End If
    
    Return
    

    Jednak ujawnił się problem z zakłóceniami. Wystarczy zbliżyć rękę do kabla na którym wisi switch, a uruchamia się sub Stoper, czasami nawet dzieje się tak bez widocznej przyczyny. Jest jakiś sposób na zniwelowanie tego efektu ?
  • Pomocny post
    #7 7819087
    alien_audio
    Poziom 21  
    Należy zastosować rezystor 10K podciągający pinc.4 do plusa. Można też dać kondensator 1nF z tego pinu do masy.
    Celem zniwelowania stanów nieustalonych. Powinno pomóc.
  • #9 7819185
    jamnik89pl
    Poziom 10  
    Wielkie dzięki ;) Rezystor całkowicie rozwiązał problem.
  • Pomocny post
    #10 7821730
    Konto nie istnieje
    Poziom 1  
REKLAMA