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

[atmega8][bascom] reset odliczania

armo1 24 Cze 2010 15:59 1682 12
REKLAMA
  • #1 8226676
    armo1
    Poziom 10  
    mam taki problem a mianowicie zrobiłem taki układzik, w którym po naciśnięciu przycisku ma się załączyć przekaźnik na 30 sekund
    i wszystko działa ale chciałbym, żeby po ponownym naciśnięciu tego przycisku przed upływem tych 30 sekund odmierzanie czasu zaczynało
    się od nowa i nie wiem jak to zrobić? prosiłbym o jakieś łopatologiczne rady, gdyż jestem bardzo początkującym w temacie programowania
  • REKLAMA
  • #2 8226690
    xanio
    Poziom 27  
    Wklej kod, który do tej pory napisałeś.
  • #3 8227126
    armo1
    Poziom 10  
    proszę

     $regfile = "m8def.dat"
    $crystal = 8000000
      Config Portd = Output
      Config Pinb.0 = Input
      Portd = &B00000000
      Set Portb.0
    
    
      Do
        If Pinb.0 = 0 Then
           Portd.0 = 1
           Wait 30
           Portd.0 = 0
           End If
    
       Loop
       End
  • #4 8227158
    Logan
    Poziom 30  
    Coś czuję, że masz ustawiony wewnętrzny rezonator, a nie zewnętrzny kwarc! 5x8=30 sekund.
  • REKLAMA
  • #5 8227163
    armo1
    Poziom 10  
    wkradł się mały błąd już poprawiłem
  • #6 8227169
    Logan
    Poziom 30  
    Jeśli chcesz to zrobić, tak jak mówisz, to musisz czas odliczać za pomocą Timera, ponieważ "Wait" blokuje Ci procesor.
  • #7 8227496
    M. S.
    Poziom 34  
    Może tak:

    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Dim Czas As Word
      Config Portd = Output
      Config Pinb.0 = Input
      Portd = &B00000000
      Set Portb.0
    
    Do
      Incr Czas
      Waitms 1
      If Pinb.0 = 0 Then
           Portd.0 = 1
           Czas = 0
      End If
      If Czas >= 30000 Then
          Portd.0 = 0
          Czas = 30000
      End If
    
    Loop
    End


    A może użyć timer.
  • #8 8227520
    armo1
    Poziom 10  
    a możesz jakiś najprostszy przykład podać odmierzenia za pomocą timera np. 1 sekundy, próbuje odmierzyć 1 sekundę ale nie bardzo umiem posłużyć się timerem
    ustawiłem timer0 tak:
    Config Timer0 = Timer , Prescale = 256

    ale dalej nic nie wymyśliłem
  • REKLAMA
  • #9 8227541
    janbernat
    Poziom 38  
    Ale nie blokuje przerwań.
    Przycisk przenieś na PD2 lob PD3, ustaw zezwolenie obsługi przerwań i przerwania zewnętrznego, ustaw obsługę tego przerwania np.

    on INT0 ustaw_flage

    ustaw_flage:
    flaga=1
    return

    i wpisz zamiast:
    "If Pinb.0 = 0 Then"
    "If Pinb.0 = 0 or flaga=1 Then"
    P.S.
    Ale obsługi Timerów powinieneś się tez nauczyć.
  • REKLAMA
  • #10 8227608
    armo1
    Poziom 10  
    "Ale obsługi Timerów powinieneś się tez nauczyć." taki mam zamiar ale timery na pierwszy raz nie są takie łatwe jak "wait" , sposób M.S. działa Walczę ze sterownikiem do elektrowni wiatrowej i ten problem mnie troszkę przerósł, zaraz otwieram książkę i spróbuje opanować timery
    Wszystkim bardzo dziękuję
  • #11 8228033
    janbernat
    Poziom 38  
    To moze tak- ucz się działania Timerów- a przedtem opisz co ten sterownik do elektrowni ma robić.
    Opisz dokładnie.
    Tu na forum nastąpi "wymiana poglądów"- czyli kłótnia jak to zrobić- a Ty po paru dniach zobaczysz wyniki i zadasz pytania- czym wywołasz nową "wymianę poglądów".
    Ale z tej dyskusji czasem się można sporo dowiedzieć.
  • #12 8229413
    armo1
    Poziom 10  
    sterownik będzie liczył obroty wiatraka (zlicza co sekundę), wyświetlał wyniki na wyświetlaczu i sterował trzema przekaźnikami. Pierwszy przekaźnik będzie po osiagnięciu pewnych obrotów
    np. 100 obr rozłączał ładowanie akumulatorów, a drugi i trzeci przy pewnych obrotach np. 150 i 200 obr/min będą włączać obciążenie do wiatraka np. grzałki, co spowoduje wyhamowanie częściowe wiatraka i zapobiegnie zbyt dużym obrotom niebezpiecznym dla wiatraka. Prototyp obrotomierza zrobiłem z wykorzystaniem atmegi8
    i czujnika pola magnetycznego, który wraz z 4 magnesami jest zamontowany na elektrowni, ale po pierwszych testach stwierdziłem, że obr. wiatraka potrafią się dość gwałtownie zmieniać co by powodowało wkurzające klepanie przekaźnikami, więc żeby temu zapobiec najlepiej będzie resetować czas włączenia przekaźników co przy częstych skokach obr. do góry spowoduje ciągłe włączenie przekaźników, a z kolei
    krótki czas załączania przekaźników nie będzie niepotrzebnie zwalniał elektrowni w przypadku spadku obrotów.
  • #13 8237484
    janbernat
    Poziom 38  
    no, to tak pierwsza przymiarka:
    
    $regfile = "M8def.dat"
    $crystal = 8000000
    Config Lcd = 20 * 2
    Config Lcdpin = Pin , Db7 = Portc.0 , Db6 = Portc.1 , Db5 = Portc.2 , Db4 = Portc.3 , E = Portc.4 , Rs = Portc.5
    Config Timer1 = Timer , Prescale = 1024
    
    Config Int0 = Rising
    'Config Pind.2 = Input
    
    Enable Interrupts
    Enable Int0
    On Int0 Zliczaj
    Enable Ovf1
    On Ovf1 Komunikat
    Dim Flaga_1 As Byte
    Flaga_1 = 0
    Dim Wyliczenie As Single
    Dim Wynik As String * 5
    Dim Pomiar_tymczasowy As Word
    Dim Flaga_komunikat As Byte
    Dim Ilosc_pomiarow_100_obr As Byte
    Dim Ilosc_pomiarow_200_obr As Byte
    Dim Ilosc_pomiarow_300_obr As Byte
    Cursor Off
    
    Do                                                'głowna pętla
    
       If Pomiar_tymczasowy >= 100 Then
          'icr Ilosc_pomiarow_100_obr
    
                                                      'tu można sprawdzać wyniki pomiarów i robić z nimi różne rzeczy
       End If
    
    Loop
    End
    
    Zliczaj:                                          'to jest przerwanie od czujników
    
       If Flaga_1 = 0 Then
          Timer1 = 0
          Flaga_1 = 1
          Start Timer1
       Else
          Flaga_1 = 0
    
          Stop Timer1
    
          Cls
          If Flaga_komunikat = 1 Then
             Lcd "Wiatrak stoi"
             Flaga_komunikat = 0
          Else
             Lcd "obr/min"
             Wyliczenie = 501300 / Timer1             'Tę wartość trzeba obliczyć i sprawdzić- jak są cztery łopaty to będzie całkiem inna
             Wynik = Fusing(wyliczenie , "#.#")
             Lowerline
             Lcd Wynik ; "  " ; Timer1
             Pomiar_tymczasowy = Timer1
          End If
       End If
    
    Return
    
    Komunikat:                                        'jak się licznik przekręci- po 8,388608s to znaczy że wiatrak w zasadzie stoi
    
       Flaga_komunikat = 1
    
    Return
    

    Do obliczania obrotów wiatraka.
    ZMIEŃ nazwę postu.
    Np. na sterowanie elektrowni wiatrowej.
REKLAMA