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

[Bascom]Licznik z wyswietlaczem 7-segmentowym

czarny007 18 Paź 2009 10:39 3343 11
REKLAMA
  • #1 7142640
    czarny007
    Poziom 2  
    Ostatnio pracuje w bascomie... Chce napisać prosty program pod atmega8, który będzie sterował 4 wyświetlaczami 7 segmentowymi.. program ma być licznikiem impulsów które mają być wyświetlane na wyświetlaczach... zastosowałem metodę multipleksy na tranzystorach BC327.. Moje pytanie.. co w kodzie poniżej jest źle ze program nie może skompilować: (błąd powstaje w linijce 4 i 43). proszę o pomoc z programem...


    
    $regfile = "m8def.dat"                                      'typ procesora
    $crystal = 16000000                                         'taktowanie
    
    Config Timer0 = Timer , Gate = Internal , Mod = 2
    
    Load Timer0 , 255
    
    On Timer0 Tim                                               'timer dla podprogramu Tim
    Enable Interrupts
    Enable Timer0                                               'właczenie timera
    
    Start Timer0                                                'start timera
    
    'deklarowanie zmiennych
    
    Dim A As Byte                                               'zmienna A typu byte
    
    
    'deklarowanie zmiennych do kolejnych cyfr wyswietlacza
    Dim Jednosc As Byte , Dziesiatki As Byte , Setki As Byte , Tysiace As Byte
    
    Dim Licznik As Word
    'deklarowanie nazw pinow
    Impuls Alias Portc.5
    Res Alias Portc.4
    
    
    
    Do                                                          'petla
    
    
      If Impuls = 0 Then
      Incr Licznik
    
      If Licznik = 1000 Then
      Licznik = 0
     'obliczanie wartosci kolejnych cyfr skladowych
      Jednosci = Licznik Mod 10
      Dziesiatki = Dziesiatki / 10 : Dziesiatki = Dziesiatki Mod 10
      Setki = Setki / 100 : Setki = Setki Mod 10
      Tysiace = Tysiace / 1000 : Tysiace = Tysiace Mod 10
    
       Waitms 100                                               'wstrzymanie na 100ms
    
      End If
    
       'resetowanie licznika
      If Res = 0 Then
      Licznik = 0
      Waitms 100
      End If
    
    
    
      Loop                                                      'koniec petli
      End
    
    
    
      'podprogram Tim
    
    
    
      Tim:
      Incr A                                                    'DODATNIE DO ZMIENNEJ A +1
      If A = 4 Then
      A = 0
    
    
      Select Case
    
      Case 0:
    
    Portb = 255 Or &B00001111
    Portd = Lookup(tysiace , Dta)
    If Licznik > 999 Then Reset Portb.3                         'wlaczanie tranzystora zapalajacego 1000
    
      Case 1:
    
    Portb = 255 Or &B00001111
    Portd = Lookup(setki , Dta)
    If Licznik > 99 Then Reset Portb.2                          'wlaczanie tranzystora zapalajacego 100
    
      Case 2:
    
    Portb = 255 Or &B00001111
    Portd = Lookup(dziesiatki , Dta)
    If Licznik > 9 Then Reset Portb.1                           'wlaczanie tranzystora zapalajacego 10
    
      Case 3:
    
    Portb = 255 Or &B00001111
    Portd = Lookup(jednosci , Dta)
    
    Reset Portb.0
    
    
    End Select
    
    Return
    
    
     Dta:
     Data 17 , 119 , 73 , 67 , 39 , 131 , 129 , 87 , 1 , 3
    


    Poprawiłem tytuł - regulamin p.11.1
    [zumek]
  • REKLAMA
  • #2 7143045
    arnoldziq
    VIP Zasłużony dla elektroda
    Config Timer0 = Timer , Gate = Internal , Mod = 2

    GATE ???
    Cytat:
    Syntax
    CONFIG TIMER0 = COUNTER , PRESCALE= 1|8|64|256|1024 ,
    EDGE=RISING/FALLING , CLEAR TIMER = 1|0
    CONFIG TIMER0 = TIMER , PRESCALE= 1|8|64|256|1024

    Jednosci = Licznik Mod 10
    Jednosci - byte
    Licznik - word ........ = nie da rady
  • #3 7143149
    sp3ots
    Poziom 38  
    witam !
    niezgodność:
    Dim Jednosc As Byte
    Jednosci = Licznik Mod 10
  • #4 7143192
    jacobsek
    Poziom 22  
    Witam.

    Ustaw kierunki portów. Jeśli odczytujesz stan wejścia (impuls,reset) to musi być jako wejściowy i taki też dajesz alias (pin).
    Następna sprawa to select case , ale co? musisz podać select case A, i coś tam jeszcze się znajdzie dalej do poprawki:
    Dziesiatki = Dziesiatki / 10 : Dziesiatki = Dziesiatki Mod 10
    Setki = Setki / 100 : Setki = Setki Mod 10
    tysiace = Tysiace / 1000 : Tysiace = Tysiace Mod 10
    0=0/100:0=0 mod 10?chyba musisz jeszcze popracować nad wyliczaniem kolejnych cyfr do wyświetlania a i nad przerwaniem gdzie można by inaczej załączać tranzystory
  • REKLAMA
  • #5 7143208
    sp3ots
    Poziom 38  
    Brak zakończenia dwóch warunków:
    If Licznik = 1000 Then

    If A = 4 Then
    A = 0
  • #6 7144120
    arturkowal18
    Poziom 10  
    czyli jak prawidłowo będzie wyglądał kod?
  • REKLAMA
  • #7 7144163
    czarny007
    Poziom 2  
    Dołączam się do pytania poprzednika...
    Jak będzie wyglądać poprawnie skonstrułowany kod?
  • REKLAMA
  • #8 7144290
    jacobsek
    Poziom 22  
    Ja sądzę że powinieneś przemyśleć sugestie i napisać poprawiony kod, a wtedy ktoś może wyłapie jakieś pozostałe błędy i w ten sposób wspólnie coś z tego będzie.Pomimo tego że jest to dość prosty kod do napisania, nie sądzę żeby ktoś chciał za Was to zrobić, tak byłoby gorzej dla Was bo nie ma to jak nauka poprzez własne myślenie?
  • #9 7147113
    sp3ots
    Poziom 38  
    Witam !
    Kiedy piszemy skomplikowany program należy sprawdzić poszczególne fragmenty programu jeśli to jest możliwe.
    Ja sprawdziłem w symulacji Bascoma AVR, jak działa zamiana liczby czterocyfrowej
    na pojedyncze cyfry, aby można je było wpisać do poczwórnego wyświetlacza LED.
    I oto co mi wyszło :
    w miejscu Licznik = dla symulacji można wpisać dowolną liczbę z zakresu 0-9999
    wynik powinien być zgodny z naszym wpisem.

    
    $sim 'Symulacja Bascoam-AVR Demo 1.11.9.5
    $regfile = "m8def.dat"
    $crystal = 16000000
    Dim Jednosci As Long    ' po zmianie na Byte nie działa
    Dim Dziesiatki As Long   ' po zmianie na Byte nie działa
    Dim Setki As Long         ' po zmianie na Byte nie działa
    Dim Tysiace As Long     ' po zmianie na Byte nie działa
    Dim Licznik As Long
    
    Licznik = 5678       'dla sprawdzenia, tu podstawiamy
                              'liczbę  od 0 do 9999
    
      Jednosci = Licznik Mod 10
    Dziesiatki = Licznik / 10
    Dziesiatki = Dziesiatki Mod 10
         Setki = Licznik / 100
         Setki = Setki Mod 10
       Tysiace = Licznik / 1000
    
    Print Tysiace ; Setki ; Dziesiatki ; Jednosci
    End
    

    Witam ponownie !
    Widzę że nikt z zainteresowanych nie pochwalił się swoją pracą !
    W miedzy czasie po siedziałem w Bascomie i udało mi się posklejać razem program.
    Pewnie nie działa jak zainteresowani Panowie by sobie tego życzyli ?
    Dla własnej wygody dostosowałem program do ATTiny2313, użyłem wyświetlacza
    4xLED wsp Anoda, sterowanie katod bez kluczy tranzystorowych, przez rezystory
    1k. Naciśnięcie przycisku Impuls powoduje start zliczania ( nie tak miało to działać)
    Myślę że sobie to sami Panowie poprawicie.

    
    $regfile = "attiny2313.dat"
    $crystal = 10000000
    Config Timer0 = Timer , Prescale = 1
    
    On Timer0 Tim
    Enable Interrupts
    
    Enable Timer0
    Start Timer0
    
    Dim A As Byte
    'deklarowanie zmiennych do kolejnych cyfr wyswietlacza
    Dim Jednosci As Long       ' po zmianie na Byte nie działa
    Dim Dziesiatki As Long       ' po zmianie na Byte nie działa
    Dim Setki As Long       ' po zmianie na Byte nie działa
    Dim Tysiace As Long       ' po zmianie na Byte nie działa
    Dim Licznik As Long
    
    'deklarowanie nazw pinow
    Config Portb = Output
    Config Portd.4 = Output
    Config Portd.1 = Output
    Config Portd.0 = Output
    Config Portd.6 = Output
    
    Config Portd.5 = Input
    Portd.5 = 1
    Impuls Alias Pind.5
    
    Config Portd.3 = Input
    Portd.3 = 1
    Reset_licznik Alias Pind.3
    
    Do
    'Resetowanie Licznika
    If Reset_licznik = 0 Then
    Licznik = 0
    End If
    
    If Impuls = 0 Then
    Incr Licznik
    Waitms 100
    End If
    
    If Licznik > 9999 Then Licznik = 0
     'obliczanie wartosci kolejnych cyfr skladowych
      Jednosci = Licznik Mod 10
    Dziesiatki = Licznik / 10
    Dziesiatki = Dziesiatki Mod 10
         Setki = Licznik / 100
         Setki = Setki Mod 10
       Tysiace = Licznik / 1000
    Loop
    End
    
    Tim:
    Incr A
    If A = 4 Then
    A = 0
    End If
    
    Select Case A
    Reset Portd.6
    Reset Portd.0
    Reset Portd.1
    Reset Portd.4
    
    Case 0:
    Portb = Lookup(tysiace , Dta)
    If Licznik > 999 Then Set Portd.6
    
    Case 1:
    Portb = Lookup(setki , Dta)
    If Licznik > 99 Then Set Portd.0
    
    Case 2:
    Portb = Lookup(dziesiatki , Dta)
    If Licznik > 9 Then Set Portd.1
    
    Case 3:
    Portb = Lookup(jednosci , Dta)
    Set Portd.4
    End Select
    Return
    
    Dta:
    Data &B11000000 , &B11111001 , &B10100100 , &B10110000 , &B10011001 , &B10010010 , &B10000010 , &B11111000 , &B10000000 , &B10010000
    'Data &H3F , &H06 , &H5B , &H4F , &H66 , &H6D , &H7D , &H07 , &H7F , &H6F , &H00 , &H80
    
    
  • #10 7156861
    sp3ots
    Poziom 38  
    Witam !
    Dodałem wczoraj kod.
    Pozdrawiam. Stefan gg6293398
  • #11 7159350
    Wojtek75
    Poziom 24  
    Zmienne Long w tym przykładzie można spokojnie zastąpić zmiennymi typu Word.

    pozdr.
  • #12 7164807
    sp3ots
    Poziom 38  
    Witam !
    Zastępując fragment programu :

    'If Impuls = 0 Then
    'Incr Licznik
    'Waitms 100
    'End If

    Debounce Pind.5 , 0 , Licz , Sub

    i dopisując :

    Licz:
    Incr Licznik
    Return
    Otrzymamy program zliczający pojedyncze impulsy.

    Pozdrawiam. Stefan
REKLAMA