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

Jak napisać program w Bascom do obsługi 4 wyświetlaczy LED z 74LS164?

guteczek 23 Gru 2005 09:25 5469 13
  • #1 2108607
    guteczek
    Poziom 11  
    Posty: 35
    Pomógł: 1
    Witam.
    Bardzo proszę o pilny help.
    Potrzebuję programu obsługi w bascomie 4 wyśw.led z użyciem scalaczka 74ls164
  • Pomocny post
    #2 2109287
    jony15
    Poziom 25  
    Posty: 604
    Pomógł: 68
    Ocena: 74
    w bascomie nie pomoge ( nie używam ) w asm wygląda to tak:

    Send74ls:
    push r6
    push a
    mov a,data ;
    mov r6,#8
    t_Start:
    mov c,acc.0
    mov _ab,c
    rr a
    clr _clk
    Nop
    setb _clk
    djnz r6,t_start
    pop a
    pop r6
    ret

    przed wywołaniem tego wpisujesz do "data" to co kcesz wyslac. w programie deklarujesz data - 1 bajt, _ab - pin do ktorego podlaczone sa piny 1 i 2 ; 164-ki, _clk - pin 8 - 74ls164. pozdrawiam
  • Pomocny post
    #3 2109500
    jacur
    Poziom 32  
    Posty: 1748
    Pomógł: 166
    Ocena: 295
    W helpie baskomowym przeczytaj o konfiguracji SPI i polecenie spiout. Jezeli urzywasz avr-a i chcesz wykozystac sprzetowe SPI to ustawiasz konfiguracie zgodnie z helpen i linie data podpiansz pod wykjscie MOSI a linie clock pod wyjscie SCK.
  • Pomocny post
    #4 2109508
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    jony15 napisał:
    w bascomie nie pomoge ( nie używam ) w asm wygląda to tak:
    
    ...
       mov c,acc.0
       mov _ab,c
       rr a  
    ...
    

    ... pozdrawiam

    Po pierwsze - stawiasz bajt "na głowie" , a po drugie - guteczek nie napisał , że chodzie o 51-kę.
    guteczek zainteresuj się SHIFTOUT(pin_data,pin_clk,var,mode) ;)

    Pozdrawiam
    Piotrek
  • Pomocny post
    #5 2112005
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    coś takiego:
    Przerwanie_timer1:                                            'przerwanie co 0,0015625 sekundy (640Hz)
       Ie = &B00000000                                            'wylacz przerwania
       Th1 = &HFC : Tl1 = &H00
       P3.7 = 1 : P1.0 = 1 : P1.1 = 1 : P1.6 = 1 : P1.7 = 1
       Incr Wyswietlacz_licznik
       If Wyswietlacz_licznik = 5 Then Wyswietlacz_licznik = 0
       Wyswietlacz_dane = Poczatek_wyswietlacz_cyfra_kopia
       Wyswietlacz_dane = Wyswietlacz_dane + Wyswietlacz_licznik
       Wyswietlacz_dane = Peek(wyswietlacz_dane)
       If Wyswietlacz_licznik <> 4 Then
          Wyswietlacz_dane = Lookup(wyswietlacz_dane , Wyswietlacz_konfiguracja_segmentow)
       End If
       Shiftout P1.5 , P1.2 , Wyswietlacz_dane , 1
       Wyswietlacz_dane = Lookup(wyswietlacz_licznik , Wyswietlacz_sterowanie_cyframi)
       P1.0 = Wyswietlacz_dane.0 : P1.1 = Wyswietlacz_dane.1 : P1.6 = Wyswietlacz_dane.2 : P1.7 = Wyswietlacz_dane.3
       P3.7 = Wyswietlacz_dane.4
       Ie = &B10001111                                            'wlacz przerwania i timer1 i int1
    Return
    '-------------------------------------------------------------------------------
    Wyswietlacz_sterowanie_cyframi:
    Data &B11111110 , &B11111101 , &B11111011 , &B11110111 , &B11101111
    '-------------------------------------------------------------------------------
    Wyswietlacz_konfiguracja_segmentow:
    Data 24 , 189 , 208 , 148 , 53 , 22 , 18 , 60 , 16 , 20       '0..9
    Data 255 , 116 , 90 , 247                                     'BLANK, Stopien,Celcjusz,-
    Data 48 , 155 , 83 , 147                                      'A,u ,t ,o
    '-------------------------------------------------------------------------------
    

    Trzeba tylko zalaczyc przerwanie timera, zmienic odpowiednio piny wyjsciowe i sterujace tranzystorami i zadeklarować zmienne na poczatku programu. U mnie są cztery cyfry i dodatkowe segmenty jako piaty wyswietlacz. W programie jest uzyte adresowanie za pomoca peek (bezposredni dostep do pamieci) w ten sposob program zajmuje mniej miejsca = dziala szybciej.
  • Pomocny post
    #6 2114068
    PIOTR111
    Poziom 16  
    Posty: 279
    Pomógł: 9
    Ocena: 47
    Witam
    Dla celów edukacyjnych w załączniku jest schemat i program
    do obsługi czterech wyświetlaczy na układzie 74164
    W układach bardziej rozbudowanych programowo trzeba wykorzystać
    Przerwania
    Piotr
    Załączniki:
    • Jak napisać program w Bascom do obsługi 4 wyświetlaczy LED z 74LS164? 0000001.jpg (217.73 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #7 2118608
    guteczek
    Poziom 11  
    Posty: 35
    Pomógł: 1
    Witam i dziękuję za pomoc.
    Nie mam żadnego doświadczenia w pisaniu programów,chcę zrobić licznik zliczający od 9999 do 0 w dół i wgórę, procek to attiny2313,czy zlicznie zrobić poprzez zadeklarowanie zmiennej i do niej dodawać lub odejmować impulsy zliczane z wejścia procka?, w jaki sposób używając podanych wcześniej programów obsługi 74ls164 wyprowadzić zliczoną liczbę impulsów na wyświetlacz led jeśli jest to zakres 9999?
  • Pomocny post
    #8 2119150
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    Ja to robię tak że pisze sobie procedurę która zwraca (zapisuje do innej zmiennej) wynik dzielenia pierwszego przez 10 (czyli funkcja mod). Następnie zmienna wejściowa jest dzielona przez 10 i tak zostawiana. Programik na początku podstawia "swoją" zmienną do procedury dzielenia. A następnie wywołuję procedurę jeden raz. Wynik jest teraz przepisywany do prawego wyświetlacza. Nastepnie wywołujemy jeszcze jeden raz, wynik do 2 wyświetlacza od prawej, następnie trzeci raz i wynik do 3 wyświetlacza od prawej - i tak aż uznamy ze wystarczy. W tym przypadku (9999) będzie to cztery razy. "Wymyśliłem" coś takiego ostatnio przy konstruowaniu jakiegoś urządzenia.
    Na forum jesteśmy (albo jestem) w stanie pomóc ci w napisaniu takiego programu. Musisz tylko przedstawić jak ma to działać no i jaki sprzęt wykorzystamy (gdzie przypięte guziki, sterowanie 164, sterowanie tranzystorórów, itd.

    Dim test as word
    Dim wyswietlacz_1 as byte
    Dim wyswietlacz_2 as byte
    Dim wyswietlacz_3 as byte
    Dim wyswietlacz_4 as byte
    Dim wejscie_dzielenia as word
    Dim wyjscie_dzielenia as byte
    
    -------------------------------------------------------------
    Do
     ...
     wejscie_dzielenia=test 'przepisanie zmiennej do podzielenia
     gosub wyswietlacz_dzielenie
     wyswietlacz_1=wyjscie_dzielenia
     gosub wyswietlacz_dzielenie
     wyswietlacz_2=wyjscie_dzielenia
     gosub wyswietlacz_dzielenie
     wyswietlacz_3=wyjscie_dzielenia
     gosub wyswietlacz_dzielenie
     wyswietlacz_4=wyjscie_dzielenia
     ...
    Loop
    End
    
    ----------------------------------------------------
    Wyswietlacz_dzielenie:
     wyjscie_dzielenia=wejscie_dzielenia mod 10
     wejscie_dzielenia=wejscie_dzielenia /10
    Return
    [/url]
  • #9 2119443
    guteczek
    Poziom 11  
    Posty: 35
    Pomógł: 1
    Dzięki za chęć pomocy.
    Procka mam attiny 2313, podłączenia są następujące:
    wyprowadzenie nr.12-tranzystor setek,13-tranzystor dziesiątek,14-tranzystor jedności.74ls164 podłączony jest: clr-do +5V,clk-11 wyprowadzenie procka,AB(zwarte)-9 wyprowadzenie procka.
    Nie chcę absorbować czasu na całość, popróbuję resztę programu sklekocić sam (ma być tam jeszcze dołączona klawiatura zwierająca jedną lub kilka z 4 linii portów do plusa i wejście liczące impulsy oraz wyjścia do sterowania przekaźników).Chodzi mi tylko o to aby zmienną którą przyjmę w programie jako aktualną wartość licznika impulsów wyświetlić na tymże właśnie wyświetlaczu poprzez 74ls164,na razie będzie to wartość 3 cyfrowa(999) więc jeśli nie jest to problemem to bardzo proszę o takowy program z opisem takim aby ktoś początkujący taki jak ja zrozumiał jak on działa i abym mógł samodzielnie rozszerzyć zakres do 4 cyfr.Czy obsługa wyświetlacza ma być na przerwaniu jeśli ma być podłączona klawiatura czy metoda jest inna? Resztę programu będę sam dopasowywał .
    Z góry dziękuję za odpowiedź i program.
    Pozdrawiam.
  • Pomocny post
    #10 2119788
    jacur
    Poziom 32  
    Posty: 1748
    Pomógł: 166
    Ocena: 295
    Mozna to zrobic tak :
    Wszystkie zmienne musza byc tego samego typu czyli integer zmienna początkowa to "liczba"

    tysiac= liczba/1000' wyswietlanie tysiecy

    sto = liczba Mod 1000
    sto = sto / 100' wyswietlanie setek

    dziesiec = liczba Mod 100
    dziesiec = dziesiec / 10' wyswietlanie dziesiatek

    jeden = liczba Mod 10 ' wyswietlanie jednosci
  • Pomocny post
    #11 2120076
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    $regfile = "2313def.dat"
    $crystal = 6000000
    Config Timer1 = Timer , Prescale = 8
    On Timer1 Tajmer1_przepelnienie
    Enable Timer1 : Start Timer1
    Enable Interrupts
    '-------------------------------------------------------------------------------
    Dim Wyswietlacz_licznik As Byte
    Dim Wyswietlacz_dane As Byte
    
    Dim Wyswietlacz_cyfry(4) As Byte
    
    Dim Wyswietlacz_kopia(4) As Byte
    
    Dim Zmienna As Word
    
    Dim Dzielenie_wejscie As Word
    Dim Dzielenie_wyjscie As Byte
    Dim Dzielenie_pomoc As Word
    '-------------------------------------------------------------------------------
    Zmienna = 765
    Do
       Dzielenie_wejscie = Zmienna
       Gosub Dzielenie
       Wyswietlacz_cyfry(1) = Dzielenie_wyjscie
       Gosub Dzielenie
       Wyswietlacz_cyfry(2) = Dzielenie_wyjscie
       Gosub Dzielenie
       Wyswietlacz_cyfry(3) = Dzielenie_wyjscie
       Gosub Wyswietlacz_kopia
    Loop
    End
    '-------------------------------------------------------------------------------
    Dzielenie:
       Dzielenie_pomoc = Dzielenie_wejscie Mod 10
       Dzielenie_wyjscie = Low(dzielenie_pomoc)
       Dzielenie_pomoc = Dzielenie_wejscie
       Dzielenie_wejscie = Dzielenie_pomoc / 10
    Return
    '-------------------------------------------------------------------------------
    Wyswietlacz_kopia:                                          'skopiowanie zmiennych aby nic nie mignelo
       Wyswietlacz_kopia(1) = Wyswietlacz_cyfry(1)
       Wyswietlacz_kopia(2) = Wyswietlacz_cyfry(2)
       Wyswietlacz_kopia(3) = Wyswietlacz_cyfry(3)
    Return
    '-------------------------------------------------------------------------------
    Tajmer1_przepelnienie:
       Portb.0 = 1
       Portb.1 = 1
       Portb.2 = 1
       Incr Wyswietlacz_licznik                                 'normalnie zaczniemy 1,2,3 1,2,3 1,2,3
       If Wyswietlacz_licznik > 3 Then Wyswietlacz_licznik = 1  'odciecie za duzych wartosci
       Wyswietlacz_dane = Wyswietlacz_kopia(wyswietlacz_licznik)       'zaladowanie zmiennej odpowiadajacej cyfrze
       Wyswietlacz_dane = Lookup(wyswietlacz_dane , Wyswietlacz_segmenty)       'przetlumaczenie zmiennej na zapalone segmenty
       Shiftout Portd.6 , Portd.5 , Wyswietlacz_dane , 1        'wyslanie do 74HC164
       Wyswietlacz_dane = Lookup(wyswietlacz_licznik , Wyswietlacz_cyfry)       'ustalenie ktory tranzystor zalaczony
       Portb.0 = Wyswietlacz_dane.0                             'zalaczenie odpowiednich tranzystorow
       Portb.1 = Wyswietlacz_dane.1
       Portb.2 = Wyswietlacz_dane.2
    Return
    '-------------------------------------------------------------------------------
    Wyswietlacz_segmenty:                                       'konfiguracja segmentow
    Data 255 , 254 , 252 , 255 , 255 , 255 , 255 , 255 , 255 , 255       '0,1,2..9
    Wyswietlacz_cyfry:
    Data &B11111111 , &B11111110 , &B11111101 , &B11111011      'tranzystor zalacza sie w zerze - pirwsze nie uzywane - nie kasowac
    '-------------------------------------------------------------------------------
    
    Tyle zrobiłem na szybko.
    Pzrerób sobie to tak jak potrzebujesz. Acha trzeba jeszcze skonfigurować odpowiednio wyjscia, ustalić jakie wartosci zapalają odpowiednie cyfry.
  • #12 2120769
    guteczek
    Poziom 11  
    Posty: 35
    Pomógł: 1
    Dzięki za program wyświetlający.
    Jeśli dobrze zrozumiałem to zera nieznaczące nie są wygaszane?, jeśli tak to mam jeszcze pytanie jak przerobić program aby te zera były wygaszone?. i czy w instrukcjach tego przerwania obsługującego wyświetlacz mogę dopisać instrukcje obsługi klawiszy tak aby załatwić to za jednym "zamachem"?
    Raz jeszcze dziękuję za pomoc.
  • Pomocny post
    #13 2120880
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    obsługa guzików w przerwaniu to bardzo dobry pomysł. Zastanawiałbym się również czy by jednak nie przenieść wszystkiego na timer0 (ten jest 8 bitowy) ale taki akurat miałęm projekcik. Do wygaszania zer trzeba by dodać 10 cyfrę (która będzie pusta - 255). Są trzy cyfry więc trzeba zacząc sprawdzanie od lewej (czyli w przykładzie od trzeciej)
    ....
    if wysiwtelacz_cyfry(3)=0 then
       wysiwtlacz_cyfry(3)=10 'to jest ten pusty znak. W ten sposób też mozna zmusić ledy do wyświetlania innych znaczków niż cyfry (np. stopnie celcjusza)
       if wysietlacz_cyfry(2)=0 then wysietlacz_cyfry(2)=10 'trzeciej cyfry nie wygaszamy bo tak ładniej wygląda
    end if
    Coś takiego umieszczasz przed wywołaniem procedury kopiowania zmiennych do wyświetlacza.

    Dobra pokazaiśmy potęgę bascoma. Teraz niech koledzy pokażą podobny przykład napisany w asemblerze.
    Koledzy zumek i boskidialer jesteście?
  • #14 2121791
    guteczek
    Poziom 11  
    Posty: 35
    Pomógł: 1
    Dzięki za cenne wskazówki,są mi bardzo pomocne bo stawiam dopiero pierwsze kroki w pisaniu programów.
    Pozdrawiam.

    Dodano po 5 [minuty]:

    Jeszcze jedno pytanko, w programie bascom avr(wersja demo) nie mam procka attiny2313 w tych które on obsługuje, jak go ewentualnie zaprogramować?, może jest jakiś inny program którym da się to zrobić?,mam jeszcze pony proga który był razem z programatorem isp na płytce.

Podsumowanie tematu

✨ Dyskusja dotyczy napisania programu w Bascom do obsługi czterech wyświetlaczy LED sterowanych za pomocą układu 74LS164 i mikrokontrolera ATtiny2313. Przedstawiono przykłady kodów w asemblerze i Bascomie, w tym wykorzystanie funkcji ShiftOut oraz konfiguracji SPI do przesyłania danych do 74LS164. Omówiono metodę dzielenia liczby na poszczególne cyfry (tysiące, setki, dziesiątki, jedności) w celu wyświetlenia wartości licznikowej na wyświetlaczach. Zaproponowano obsługę wyświetlaczy w przerwaniu timerowym, co pozwala na jednoczesną obsługę klawiatury i wygaszanie zer nieznaczących przez przypisanie specjalnego znaku pustego. Podano schemat podłączenia 74LS164 do pinów mikrokontrolera oraz wskazówki dotyczące programowania i rozszerzania funkcjonalności licznika impulsów. Poruszono także kwestie programowania ATtiny2313 w Bascomie oraz alternatywne narzędzia programistyczne.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA