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.

Licznik impulsów zewnętrznych z wyświetlaniem LCD 99999

ejcon 28 Mar 2011 20:06 1955 9
  • #1 28 Mar 2011 20:06
    ejcon
    Poziom 13  

    Witam,
    Jestem początkujący w programowaniu bascom chcę zrobić licznik impulsów podawanych na timer o jako licznik .
    Zrobiłem licznik ale liczy max 255 a ja potrzebuje licznik z 99999 .
    Nie bardzo wiem jak mam to zrobić .Proszę o pomoc

    Code:
     
    
    $regfile = "m8def.dat"                                     'Info dla kompilatora.

    $crystal = 16000000                                         'Informujemy kompilator o kwarcu 16MHz.



     Config Lcd = 16 * 2                                        'Konfiguracja Lcd.

     Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5



     Config Timer0 = Counter , Edge = Rising                    'Timer0 jako licznik, od zbocza narastającego.

      Tccr0 = 7

     Config Pind.1 = Output                                     'Port wykonawczy.

      Set Portd.1                                               'Ustaw poziom wysoki na wyjściu Portd.1.

     Config Pind.4 = Input                                      '

       Set Portd.4                                              '



     On Timer0 Sekunda                                          'Podprogram.                                    '



     Enable Interrupts                                          'Zezwalaj na wszystkie przerwania.

     Enable Timer1                                              'Odblokowujemy przerwanie.



     Cls                                                        'Wyczyść Lcd.







     '------------------------------------------------------------------------------------------------------

    Do                                                          'Początek pętli głównej programu.

       Home                                                     'Wyświetlaj wynik w jednym miejscu.

      Lcd Counter0                                              '



      If Counter0 = 12 Then                                     '

     Reset Portd.1                                              '

     Else                                                       '

      If Counter0 = 16 Then                                     '

      Set Portd.1                                               '



      End If                                                    '

      End If

     Loop                                                       'Powtórz pętlę.

    End                                                         'Koniec pętli.

    '--------------------------------------------------------------------------------------------------------

    Sekunda:                                                    'Podprogram.

      Incr Counter0                                             'Po każdym impulsie powiększaj zawartość zmiennej.

      Return                                                    'Wróć do programu.

    0 9
  • #2 28 Mar 2011 20:11
    Piotrek-787
    Poziom 15  

    Timer 0 jest timerem 8 bitowym i może zliczać tylko do 255.

    0
  • #3 28 Mar 2011 20:12
    ejcon
    Poziom 13  

    To może jest jakiś sposób na zrobienie licznika z 99999 miejscami?

    0
  • #4 28 Mar 2011 20:14
    tadzik85
    Poziom 38  

    wykorzystać przerwanie

    0
  • #5 29 Mar 2011 18:24
    ejcon
    Poziom 13  

    Wtam,
    Panowie tak jak pisałem jestem początkujący .
    Mam pomysł żeby zrobić licznik z przerwaniem żeby liczył do 9
    następnie napisać program do przeniesienia do następnej cyfry po pojawieniu się 9>10 następna liczba .
    Mam tylko problem jak zrobić to przeniesienie .
    nie wiem czy dobrze kombinuję
    jeśli zmienna Licznika będzie >9 to wyświetl w następnej cyfrze .Ale dalej nie wiem jak to zrobić .Proszę o pomoc w tej sprawie?

    0
  • #6 29 Mar 2011 18:59
    tadzik85
    Poziom 38  

    co przerwanie do zmiennej dodawaj 100
    wyświetlając dodawaj tą zmienna i wartość licznika

    0
  • #7 29 Mar 2011 19:29
    ejcon
    Poziom 13  

    Witam,
    Można prosić o przykład takiego codu?

    0
  • #8 31 Mar 2011 21:38
    ejcon
    Poziom 13  

    Zrobiłem tak lecz nie nalicza mi jednego impulsa ale paczkę.
    Podajac jeden raz na wejscie T0 masę chcę żeby zliczyło tylko jeden impuls.
    Kod wyglada tak

    Code:
    $regfile = "M32def.dat"                                   'informuje kompilator o pliku
    
          'dyrektyw mikrokontrolera
    $crystal = 16000000
     $swstack = 64
     $hwstack = 64
     $framesize = 64                                            'informuje kompilator
          'o częstotliwości oscylatora
          'taktującego mikrokontroler
    $baud1 = 9600

    Config Lcd = 16 * 2                                         'konfiguracja typu wyťwietlacza
          'LCD
    Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2       'konfiguracja linii
          'mikrokontrolera, do ktˇrych
          'do-¦czono wyťwietlacz
          'LCD
    Dim Licz As Integer
    Dim Przep As Integer
    Dim Impuls As Integer
    Dim Cyfra As Integer


     Config Timer0 = Counter , Edge = Rising                    'Timer0 jako licznik, od zbocza narastającego.



     Config Pind.6 = Input                                      'Port wykonawczy.

      Set Portd.6                                               'Ustaw poziom wysoki na wyjściu Portd.1.

     Config Pinb.0 = Input                                      '

       Set Portb.0
     Config Portd.5 = Input

       Set Pinb.5

       If Pind.6 = 1 Then                                       '
      Reset Przep
    End If

       If Pind.5 = 1then
       Print Przep ; "przep "
       End If


     On Timer0 Sekunda                                          'Podprogram.                                    '



     Enable Interrupts                                          'Zezwalaj na wszystkie przerwania.

     Enable Timer0
                                                  'Odblokowujemy przerwanie.
      Timer0 = 255

      Counter0 = 255


     Cls                                                        'Wyczyść Lcd.



     '------------------------------------------------------------------------------------------------------

    Do                                                          'Początek pętli głównej programu.

       Home                                                     'Wyświetlaj wynik w jednym miejscu.
      Lcd Przep ; "IMPULSOW "

      Print Impuls ; "impul "
      Print Przep ; "przep "
      Print Counter0 ; "con"
      Print Cyfra ; "cyfra"

     Loop                                                       'Powtórz pętlę.

    End                                                         'Koniec pętli.

    '--------------------------------------------------------------------------------------------------------

    Sekunda:                                                    'Podprogram.
     Enable Interrupts
     Incr Przep
     Incr Counter0
     Licz = Przep
     If Przep = 256 Then
     Incr Cyfra
     End If
    Impuls = Counter0
      If Licz > 0 Then
      Counter0 = 255
     End If

      Return

    0
  • #9 03 Kwi 2011 01:44
    ejcon
    Poziom 13  

    Witam,
    Mam problem z zliczaniem impulsów chciałbym żeby zliczał zewnetrzne impulsy pojednczo a nie całe paczki.Można prosić o pomoc w tej sprawie?

    Code:
     $regfile = "M32def.dat"                                   'informuje kompilator o pliku
    
          'dyrektyw mikrokontrolera
    $crystal = 16000000
     $swstack = 64
     $hwstack = 64
     $framesize = 64                                            'informuje kompilator
          'o częstotliwości oscylatora
          'taktującego mikrokontroler
    $baud1 = 9600

    Config Lcd = 16 * 2                                         'konfiguracja typu wyťwietlacza
          'LCD
    Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2       'konfiguracja linii
          'mikrokontrolera, do ktˇrych
          'do-¦czono wyťwietlacz
          'LCD
    Dim Licz As Integer
    Dim Przep As Integer
    Dim Impuls As Integer
    Dim Cyfra1 As Integer
    Dim Cyfra2 As Integer
    Dim Cyfra3 As Integer
    Dim Cyfra4 As Integer
    Dim Cyfra5 As Integer

     Config Timer0 = Counter , Edge = Rising                    'Timer0 jako licznik, od zbocza narastającego.



     Config Portd.6 = Input                                     'Port wykonawczy.
     Set Pind.6                                                 'Ustaw poziom wysoki na wyjściu Portd.1.

     Config Portb.0 = Input                                     '

       Set Pinb.0
     Config Portd.5 = Input

     Set Pinb.5

       If Pind.6 = 1 Then
       Reset Przep                                              '
      Reset Cyfra1
      Reset Cyfra2
      Reset Cyfra3
      Reset Cyfra4
      Reset Cyfra5
    End If

       If Pind.5 = 1 Then
       Print Przep ; "przep "
       End If


     On Timer0 Sekunda                                          'Podprogram.                                    '


     Enable Interrupts                                          'Zezwalaj na wszystkie przerwania.

     Enable Timer0
                                                  'Odblokowujemy przerwanie.
      Timer0 = 255

    Cls                                                         'Wyczyść Lcd.

    Do
                                                               'Początek pętli głównej programu.

       Home                                                     'Wyświetlaj wynik w jednym miejscu.
      Lcd Cyfra5 ; Cyfra4 ; Cyfra3 ; Cyfra2 ; Cyfra1 ; Przep ; "ILOSC"


      Print Counter0 ; "con"
      Print Przep ; "przep "
      Print Cyfra1 ; "cyfra1"
      Print Cyfra2 ; "cyfra2"
      Print Cyfra3 ; "cyfra3"
      Print Cyfra4 ; "cyfra4"
      Print Cyfra5 ; "cyfra5"


       If Pind.6 = 0 Then
       Przep=0                                                    '
      Cyfra1 = 0
       Cyfra2 = 0
       Cyfra3 = 0
      Cyfra4 = 0
     Cyfra5 = 0

    End If

       If Pind.5 = 0 Then
       Print Cyfra5 ; Cyfra4 ; Cyfra3 ; Cyfra2 ; Cyfra1 ; Przep ; "ILOSC"
       End If


     Loop                                                       'Powtórz pętlę.

    End                                                         'Koniec pętli.

    '--------------------------------------------------------------------------------------------------------

    Sekunda:                                                    'Podprogram.
     Enable Interrupts
     Incr Przep
     Incr Counter0
     Licz = Przep
     If Przep = 9 Then
     Incr Cyfra1
     Przep = 0
     End If
     If Cyfra1 = 9 Then
     Incr Cyfra2
     Cyfra1 = 0
     End If
     If Cyfra2 = 9 Then
     Incr Cyfra3
     Cyfra2 = 0
     End If
     If Cyfra3 = 9 Then
     Incr Cyfra4
     Cyfra3 = 0
     End If
     If Cyfra4 = 9 Then
     Incr Cyfra5
     Cyfra4 = 0
     End If
     If Cyfra5 = 9 Then
     Cyfra1 = 0
     Cyfra2 = 0
     Cyfra3 = 0
     Cyfra4 = 0
     Cyfra5 = 0
     End If
    Impuls = Counter0
      If Licz > 0 Then
      Counter0 = 255
     End If

      Return

    0
  • #10 03 Kwi 2011 17:32
    asembler
    Poziom 32  

    W ząb nie znam bascoma ale tak ci podpowiem :-)
    Jak sam pisałeś ten program i znasz bascoma to sobie poradzisz.

    Code:

    Incr Cyfra1
    If cyfra1 >9  Then
        cyfra1=0;
        Incr Cyfra2
        If Cyfra2 >9 Then
            cyfra2=0
            Incr Cyfra3
            If Cyfra3 >9 Then
            cyfra3=0;
            end if 
        end if
    end if

    0