Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[bascom] zegar ciemniowy i wyswielacz led7segmentowy-problem

chrobot 08 Mar 2010 15:24 1317 2
  • #1
    chrobot
    Level 15  
    problem mój polega na nieprawidłowym wyswietlaniu cyfr . o ile w zakresie 0-99 wszystko jest ok., to powyżej 100 ma same zera :
    wyswietlacz ma 3 cyfry led-7-segmentowe i w założeniach ma liczyć czas od 0 do 999 sek

    pełny kod:
    Code:

    '$sim
    $regfile = "m8def.dat"                                      'informuje kompilator o pliku
    $crystal = 8000000                                          'informuje kompilator o
    Config Portd = Output                                       'port D jako wyjściowy
    Config Pinc.5 = Output                                      'linia PB1 jako wyjściowa
    Config Pinc.4 = Output                                      'linia PB2 jako wyjściowa
    Config Pinc.3 = Output                                      'linia PB3 jako wyjściowa
    Config Pinc.2 = Output                                      'linia led jako wyjściowa
    Config Pinb.0 = Output                                      'linia pu jako wyjściowa
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Config Pinb.3 = Output

    Config Timer0 = Timer , Prescale = 256                      'konfiguracja Timer0 jako
    Declare Sub Pobr_znaku(cyfra As Byte)                       'deklaracja procedury
    On Timer0 Mult_wysw                                         'przerwanie od przepełnienia

    Dim A As Byte , B As Byte , C As Byte , Z As Byte           'definicje zmiennych A, B, C,
    Dim Nr_wysw As Byte                                         'zmienna określająca numer
    Dim D As Byte
    Dim E As Byte

    Config Timer1 = Timer , Prescale = 256
    On Timer1 Odmierz_1s                                        'przerwanie od przepełnienia

    Dim Sekundy As Integer
    Dim U As Integer
    Dim Dana As Integer

    W1 Alias Portc.3                                            'przypisanie linii PB0 nazwy W1
    W2 Alias Portc.4                                            'przypisanie linii PB1 nazwy W2
    W3 Alias Portc.5                                            'przypisanie linii PB2 nazwy W3

    Pu Alias Pinb.0                                             'wyjscie na Pu
    Plus Alias Pinb.1                                           'dodaj warosc
    Minus Alias Pinb.2                                          'odejmnij wartosc
    Go Alias Pinb.3                                             'przycisk startu
    Leda Alias Pinc.2                                           'sygnalizacja
     Portb.1 = 1
     Portb.2 = 1
     Portb.3 = 1
     Portc.2 = 1                                                'zgas led
     Portb.0 = 1                                                'wylacz pu

    Portd = &B11111111                                          'wygas wyswietlacz
    Waitms 1

    Enable Interrupts                                           'odblokowanie globalnego
    Enable Timer0                                               'odblokowanie przerwania od
    Load Timer0 , 125                                           '125                                           'załadowanie do licznika
            'wartości początkowej 131, bo
            '256 - 125 = 131
    Enable Timer1
    Counter1 = 34286
    Stop Timer1
    Start Timer0

    'A = 3
    'B = 2
    'C = 1
    '123 sposób wyświetlania

    A = 0
    B = 0
    C = 0
    U = 0
    Dana = 95

    D = 5                                                       'czekaj
    E = 25                                                      'czekaj2

    'A = 0
    'B = 0
    'C = 0
    Sekundy = 0


    Do                                                          'początek nieskończonej pętli
     'Portc.2 = 1                                                'zgas led

    If Plus = 0 And Minus = 1 Then
     Gosub Czekaj2
       If Plus = 0 And Minus = 1 Then
        Gosub Czekaj
        Incr U
         Incr Dana
            If Dana > 999 Then Dana = 999
        Gosub Czekaj
         Gosub Wyswietl

     Bitwait Plus , Set
        End If : End If


     If Minus = 0 And Plus = 1 Then
        Gosub Czekaj2
       If Minus = 0 And Plus = 1 Then
       Gosub Czekaj
       Decr U
       Decr Dana
       if dana<0 then dana=0
       Gosub Czekaj
       Gosub Wyswietl
     Bitwait Minus , Set
        End If : End If


    If Go = 0 Then
     Gosub Czekaj2
     If Go = 0 Then
    Bitwait Go , Set
        Gosub Start_stop
    End If : End If

    Loop                                                        'koniec pętli nieskończonej
    End

    '==========
    'tu mi cos nie działa
    Wyswietl:



    Dana = Dana Mod 100
    C = Dana / 100
    'Dana = Dana Mod 10
    'B = Dana Mod 10
    B = Dana / 10
    A = Dana Mod 10

    Return

    Start_stop:
    Enable Timer1
    Counter1 = 34286
    Start Timer1
    Portc.2 = 0                                                 'zapal led
    Portb.0 = 0                                                 'wyl pu

    Return
                                                            'koniec programu
    Czekaj:
    Waitms D
    Return

    Czekaj2:
    Waitms E
    Return


    Sub Pobr_znaku(cyfra As Byte)                               'definicja procedury
            'Pobr_znaku
     If Cyfra < 10 Then                                         'jeżeli wartość otrzymanej do
            'wyświetlenia cyfry < od 10,
      Portd = Lookup(cyfra , Kody7seg )                         'to wpisanie do portu D
            'wartość kodu z tablicy
            'stałych Kody7seg
     Else                                                       'w przeciwnym razie
      Portd = 0                                                 'wpisanie do portu D wartości
            '0 która wygasza wyświetlacz
     End If                                                     'koniec warunku If...Then
    End Sub                                                     'koniec procedury

    Mult_wysw:                                                  'podprogramu obsługi
            'przerwania od przepełnienia
            'Timer0 w którym odbywa się
            'multipleksowanie
     Load Timer0 , 125                                          'załadowanie do licznika
            'wartości początkowej
     Set W1                                                     'wygaszenie wyświetlacza 1
     Set W2                                                     'wygaszenie wyświetlacza 2
     Set W3                                                     'wygaszenie wyświetlacza 3
     Select Case Nr_wysw                                        'w zależności od wartości
            'Nr_wysw, wykonaj:
      Case 0:                                                   'gdy Nr_wysw = 0, to
       Call Pobr_znaku(a)                                       'wywołanie procedury
            'pobierającej z tablicy kod
            'znaku dla wartości A

       Reset W1                                                 'włączenie wyświetlacza 1
      Case 1:                                                   'gdy Nr_wysw = 1, to
       Call Pobr_znaku(b)                                       'wywołanie procedury
            'pobierającej z tablicy kod
            'znaku dla wartości B

       Reset W2                                                 'włączenie wyświetlacza 2
      Case 2:                                                   'gdy Nr_wysw = 2, to
       Call Pobr_znaku(c)                                       'wywołanie procedury
            'pobierającej z tablicy kod
            'znaku dla wartości C
            '
       Reset W3                                                 'włączenie wyświetlacza 3
     End Select                                                 'koniec instrukcji wyboru
     Incr Nr_wysw                                               'zwiększenie o jeden wartości
            'Nr_wysw
     If Nr_wysw = 3 Then                                        'jeśli wartość Nr_wysw
            'osiągnie 3, to
      Nr_wysw = 0                                               'zeruj wartość Nr_wysw
     End If
    Return                                                      'powrót z podprogramu
            'przerwania


    Odmierz_1s:                                                 'podprogramu obsługi przerwania
          'przepełnienia od Timer1
     Counter1 = Counter1 + 34286                                'wpisanie wartości początkowej
          'licznika
     Incr Sekundy                                               'zwiększenie o 1 wartości
          'Sekundy

     If Sekundy = U Then
     Portb.0 = 1
     Portc.2 = 1                                                'zgasled

    Stop Timer1
    Disable Timer1

    End If
    Return



    Kody7seg:                                                   'tablica stałych Kody7seg
            'przechowująca kody
            'wyświetlanych cyfr
    'Kody cyfr

    Data &B10000010 , &B10111011 , &B10000101 , &B10010001 , &B10111000
    Data &B11010000 , &B11000000 , &B10011011 , &B10000000 , &B10010000


    problem tkwi w tym podprogramie :

    Code:


    '==========
    'tu mi cos nie działa
    Wyswietl:

    Dana = Dana Mod 100
    C = Dana / 100
    'Dana = Dana Mod 10
    'B = Dana Mod 10
    B = Dana / 10
    A = Dana Mod 10

    Return


    proszę o jakieś sugestie ....
  • Helpful post
    #2
    Krauser
    Level 26  
    Code:

    C = Dana \ 100
    Dana = Dana Mod 100
    B = Dana \ 10
    A = Dana Mod 10

    Takie przekształcenia można łatwo sprawdzić w symulacji. PS. Używasz zmiennych typu integer, czy na pewno potrzebujesz zmiennych ze znakiem.
  • #3
    chrobot
    Level 15  
    miałeś racje zmenna