Poprzedni temat «» Następny temat
Przesunięty przez: RcTomek
2011-01-25, 10:45
Układ mikroporcesorowy mierzący częśtotliwość na 8051
Autor Wiadomość
dr_mateusz
Nowy na forum


Dołączył: 17 Sty 2011
Posty: 8
Skąd: Krosno
Wysłany: 2011-01-17, 21:15   Układ mikroporcesorowy mierzący częśtotliwość na 8051

Witam,
dostałem projekt w którym mam do zaprojektowania układ mikroprocesorowy mierzący częstotliwość sygnału okresowego za pomocą licznika T1. Zakładamy, że procesor to pamięć programu. Wyniki pomiaru przesyła łączem szeregowym do PC.
1. Potrzebuję kompletnego schematu elektrycznego, w którym zawarte są wszystkie elementy, które są potrzebne by układ działał, a więc zasilacz, reset, taktowanie itp.
2. Opisu ustawień licznika(jego konfiguracja).
3. Algorytm programu.

Dodam, że układ ma być zrobiony na procesorze kompatybilnym z 8051 i program w języku Asembler.
Jeśli ktoś posiada podobny projekt, proszę o pomoc przy realizacji mojego.
Pozdrawiam.
 
     
kayron 
PLC FATEK, automatyka na życzenie



Wiek: 37
Dołączył: 21 Wrz 2008
Posty: 1857
Skąd: Poland
Wysłany: 2011-01-18, 16:44   

Oj.. na uczelniach jeszcze wałkują 8051 którego już prawie nikt nie używa. AT89C2051 ci wystarczy do tego. Opis pomiaru częstotliwości za pomocą 51 był w kursie ASM w EDW, ale to było lata temu.
Jaki masz mieć zakres mierzonych częstotliwości, bo to ważne, 51" demonem szybkości raczej nie jest.
 
 
     
dr_mateusz
Nowy na forum


Dołączył: 17 Sty 2011
Posty: 8
Skąd: Krosno
Wysłany: 2011-01-22, 22:29   

Zakres mierzonych częstotliwości nie jest podany, rysowanie schematu zacząłem na AT89S8252. Dzisiaj jeszcze wrzucę to co mi się udało zrobić.

[ Dodano: 2011-01-22, 23:16 ]
Oto schemat na razie bez układu zasilania. Prosiłbym o opinie czy jest dobrze zrobiony i o wypisanie błędów.

schemat.jpg
Plik ściągnięto 709 raz(y) 144,15 KB

 
     
mr_x 



Wiek: 31
Dołączył: 12 Gru 2010
Posty: 366
Skąd: /bin/bash
Wysłany: 2011-01-22, 23:33   

EA powinien być zwarty do plusa, chyba, że będziesz korzystać z zewnętrznej pamięci programu, ale nie po to (chyba) używasz kostki 89S8252, by tak robić. Podłącz też odwrotnie piny 2 i 3 gniazda DB9.
 
     
dr_mateusz
Nowy na forum


Dołączył: 17 Sty 2011
Posty: 8
Skąd: Krosno
Wysłany: 2011-01-23, 18:06   

Jeszcze zapytam o pomoc w sposobie zasilania tzn układzie do zasilania 89s8252 i czy ktoś ma pomysł na rozwiązanie opisu ustawień licznika i algorytm programu?
 
     
mr_x 



Wiek: 31
Dołączył: 12 Gru 2010
Posty: 366
Skąd: /bin/bash
Wysłany: 2011-01-23, 18:11   

Do zasilania wystarczy zwykły zasilacz stabilizowany 5V, np. na układzie 7805.
 
     
dr_mateusz
Nowy na forum


Dołączył: 17 Sty 2011
Posty: 8
Skąd: Krosno
Wysłany: 2011-01-24, 00:00   

Uzupełniłem schemat o zasilanie, proszę o sprawdzenie jego poprawności.
Mam też pytanie o pomoc w opisie licznika i algorytmie programu.
Pozdrawiam.

schemat1.jpg
Plik ściągnięto 627 raz(y) 178,24 KB

 
     
mr_x 



Wiek: 31
Dołączył: 12 Gru 2010
Posty: 366
Skąd: /bin/bash
Wysłany: 2011-01-24, 00:06   

Czemu ALE podłączyłeś z masą? ALE jest wyjściem dla zatrzasku młodszej części adresu mikrokontrolera. Ogólnie jeśli nie korzystasz z zewnętrznej pamięci, pozostaw ALE niepodłączony.
Wcześniej o to nie pytałem, lecz zastanawia mnie, po co rezystor z przyciskiem do RESET? Albo go zewrzyj (przycisk), albo usuń, bo wersja CMOS i tak posiada wewnętrzny rezystor podciągający do masy. Natomiast jeśli ma to służyć do zerowania układu, to rezystor może być o małej wartości lub bez niego, ale zwierasz końcówkę RESET do plusa (czyli zwierasz C3), a nie do masy.
 
     
dr_mateusz
Nowy na forum


Dołączył: 17 Sty 2011
Posty: 8
Skąd: Krosno
Wysłany: 2011-01-24, 00:21   

Proszę o sprawdzenie zamieszczonego układu jeszcze raz. Układ z opornikiem C5 ma służyć jako RESET. Ponownie zamieszczam układ:

schemat.jpg
Plik ściągnięto 501 raz(y) 178,31 KB

 
     
mr_x 



Wiek: 31
Dołączył: 12 Gru 2010
Posty: 366
Skąd: /bin/bash
Wysłany: 2011-01-24, 00:26   

Źle mnie zrozumiałeś. Kondensator od sygnału RESET ma być zwarty do plusa. Natomiast to linię RESET zwierasz do plusa, jeśli chcesz zresetować układ. Czyli przycisk podłącz równolegle do kondensatora. Może mieć on wartość 10µF, a rezystor z nim współpracujący 10kΩ.
 
     
dr_mateusz
Nowy na forum


Dołączył: 17 Sty 2011
Posty: 8
Skąd: Krosno
Wysłany: 2011-01-24, 00:38   

Czy tak jak teraz jest dobrze:

schemat.jpg
Plik ściągnięto 512 raz(y) 161,61 KB

 
     
mr_x 



Wiek: 31
Dołączył: 12 Gru 2010
Posty: 366
Skąd: /bin/bash
Wysłany: 2011-01-24, 00:43   

Tak może zostać. Algorytmu nie dam rady teraz opracować. Bardziej mogę pomóc przy schemacie.

[ Dodano: 2011-01-24, 00:47 ]
Zauważyłem, że odwróciłeś C10. Najpierw było dobrze, zamień jego polaryzację.
 
     
dr_mateusz
Nowy na forum


Dołączył: 17 Sty 2011
Posty: 8
Skąd: Krosno
Wysłany: 2011-01-24, 00:51   

Dziękuję za pomoc. I proszę o jakiegoś innego forumowicza o pomoc w opisie ustawień licznika(konfiguracja) i algorytmie programu. Dodam, że na zajęciach programowaliśmy w Asemblerze.

schemat.jpg
Plik ściągnięto 651 raz(y) 162,16 KB

 
     
gomarko 
Nowy na forum


Dołączył: 13 Paź 2010
Posty: 71
Skąd: Konin
Wysłany: 2011-01-24, 11:34   

Wygrzebane ze staroci po moich zabawach.
Może posłużyć jako inspiracja do własnych rozwiązań.
Ja w 89C51 miałem tylko dwa układy licznikowe, więc T1 miał dwie funkcje
1 sekundę służył do pomiaru częstotliwości, a w 2 sekundzie taktował transmisję szeregową
W 89C52 i dalszych już takiej konieczności nie będzie (można użyć osobnego timera
do taktowania transmisji szeregowej)

Kod:

;uC AT89C51 kwarc 11,0592MHz
;Pomiar częstotliwości bez zewnętrznych dzielników do około 435kHz
;Do pomiaru częstotliwości wykorzystano licznik T1 zliczający impulsy
;zewnętrzne (P3.5) bramkowane czasem odliczonym przez timer T0
;w celu zwiększenia pojemnosci licznika T1 wykorzystano rejestr w pamięci RAM
;procesora , którego zawartość jest zwiększana przy każdym przepełnieniu
;licznika T1 (w przerwaniu od T1). Po odliczeniu czasu bramkowania wynik
;przepisywany jest do bufora, a licznik zerowany.
;Dane z bufora zostają przekonwertowane na kod BCD i wysłane przez port RS
;
;Zastosowano timer1 raz jako licznik pomiaru impulsów zewnętrznych,
;naprzemiennie jako timer taktujący transmisję szeregową

;=============================================================================
;       REJESTRY Z RAM WYKORZYSTYWANE PRZEZ PROCEDURY
;=============================================================================
BUF_BCD         EQU     70H     ;4-bajtowy bufor danych w formacie upakowane BCD
BUF         EQU     50H     ;3-bajtowy bufor danych w formacie binarnym
SEK_10MS        EQU     35H     ;rejestr odliczania czasu 10ms
SEK_250US       EQU     34H     ;rejestr odliczania czasu 250us

        ORG     0H
    LJMP    START
;=============================================================================
; Przerwanie od przepełnienia timera T0 (ustawia znacznik TF0)
;------------------------------------------------------------------------------
        ORG     0BH     ;adres przerwania od przepelnienia timera T0
        LJMP    SERV_T0 ;skok do obsługi przerwania

;=============================================================================
; Przerwanie od przepełnienia timera T1 (ustawia znacznik TF1)
;------------------------------------------------------------------------------
    ORG     1BH     ;adres przerwania od przepelnienia timera T1
    INC     BUF+2   ;przepełnienie licznika zwiększa bajt
            ;rozszerzający pojemność licznika (jako najstarszy)
    RETI
;=============================================================================
; Przerwanie od portu szeregowego
;(znaczniki RI i TI nie są zerowane automatycznie w momencie obsługi przerwania)
;------------------------------------------------------------------------------
        ORG     23H     ;adres przerwania od transmisji szeregowej
    RETI

;=============================================================================
;obsługa przerwania od timera T0 (odliczanie czasu)   
;------------------------------------------------------------------------------
        ORG    50H
SERV_T0:
        DJNZ    SEK_250US,T0_ESC
        MOV     SEK_250US,#36    ;w tej linii jest  co 10ms


        DJNZ    SEK_10MS,T0_ESC
        MOV     SEK_10MS,#100    ;w tej linii jest  co 1sekundę
    CPL    TR1             ;start-stop zliczania licznika T1
                ;1-zliczanie 0- zatrzymanie zliczania
   
T0_ESC:
        RETI   
;------------------------------------------------------------------------------


;=============================================================================
;
;-----------------------------------------------------------------------------

    ORG    100H
START:

;=============================================================================
;       Ustawienie timerow i przerwan dla liczników
;=============================================================================
    MOV     TMOD,#01010010B ;timer 1 zlicza imp zewnętrzne z T1 P3.5
;            ;timer 0 w trybie 2 samoprzeladowuje sie co 250us
    MOV     TH0,#0  ;początkowa wartość do timera T0   
    SETB    TR0     ;start Timera 0 (odliczanie czasu)
    SETB    ET0     ;zezwolenie na przerwanie od Timera 0(odliczanie czasu)
    SETB    ET1     ;zezwolenie na przerwanie od Timera 1(pomiar częstotliwości)
    SETB    EA      ;zezwolenie ogólne na przerwania

    MOV     BUF,#0H     ;najmłodszy bajt licznika
        MOV     BUF+1,#0H
    MOV     BUF+2,#00H   ;najstarszy bajt licznika

;---------------------------------------------------------------------------

   
;---------------------------------------------------------------------------
PETLA:
        JB     TR1,PETLA     ;oczekuje na zakończenie pomiaru przez T1
       
           MOV     BUF+1,TH1       ;przepisanie stanu licznika do bufora
    MOV     BUF,TL1         
                ;(najstarszy bajt BUF+2 już tam jest)
   
;=============================================================================
;Skonfigurowanie timera 1 dla transmisji szeregowej
;-----------------------------------------------------------------------------   
   
        MOV     SCON,#01010000B ;transmisja 8bit,1bit-stop,bez parzystosci
        ORL     PCON,#80H    ;SMOD=1 (podwojenie prędkości transmisji)
        MOV     TH1,#250
    MOV     TL1,#250 ;zaladowanie timera transmisji dla 9600b
       
    MOV     TMOD,#00100010B ;timer 1 dla transmisji szeregowej
            ;timer 0 w trybie 2 samoprzeładowuje sie co 250us
    SETB    TR1    ;start timera T1 teraz dla taktowania transmisji
;=============================================================================
;Przekonwertowanie danych z licznika na upakowane BCD
;-----------------------------------------------------------------------------           
        MOV     R1,#BUF  ;adres najmłodszego bajtu liczby
                                ;(starsze są pod wyższymi adresami)
       
        MOV     B,#BUF_BCD ;adres najmlodszego bajtu z liczbami bcd
                                ;(starsze są pod wyższymi adresami)
    LCALL    BCD24 ;zamiana 3 bajtów na 4-bajtową liczbę BCD

;=============================================================================
;Wysłanie wyniku pomiaru przez port szeregowy
;-----------------------------------------------------------------------------
   
    LCALL    RS232     
;=============================================================================
;Skonfigurowanie timera 1 dla pomiaru czasu impulsu na wejściu zewnętrznym
;-----------------------------------------------------------------------------
    CLR    TR1        ;zatrzymanie licznika
    MOV     TMOD,#01010010B ;timer 1 zlicza imp zewnętrzne z T1 P3.5
;            ;timer 0 w trybie 2 samoprzeladowuje sie co 250us
   
    MOV     TH1,#0              ;wyzerowanie licznika
    MOV     TL1,#0   
    MOV     BUF+2,#0       ;zeruje najstarszy (dodatkowy) bajt licznika
   
   
KONIEC_PETLI:       
        JNB     TR1,$          ;czeka na ustawienie bitu
                    ;(ustawienie nastąpi w obsłudze przerwania)
    AJMP    PETLA

   
;=============================================================================
;      ;podprogramy:
;-----------------------------------------------------------------------------
RS232:     ;trochę prowizorycznie, ale wysyła zawartość bufora BCD
            ;przez port szeregowy w kodach ASCII 9600b
        CLR    TI
       
    MOV    A,BUF_BCD+3
    SWAP    A
    ANL    ACC,#0FH
    ADD    A,#30H
    MOV    SBUF,A
    JNB    TI,$
    CLR    TI
   
    MOV    A,BUF_BCD+3
    ANL    ACC,#0FH
    ADD    A,#30H
    MOV    SBUF,A
    JNB    TI,$
    CLR    TI

    MOV    A,BUF_BCD+2
    SWAP    A
    ANL    ACC,#0FH
    ADD    A,#30H
    MOV    SBUF,A
    JNB    TI,$
    CLR    TI
   
    MOV    A,BUF_BCD+2
    ANL    ACC,#0FH
    ADD    A,#30H
    MOV    SBUF,A
    JNB    TI,$
    CLR    TI
       
       
    MOV    A,BUF_BCD+1
    SWAP    A
    ANL    ACC,#0FH
    ADD    A,#30H
    MOV    SBUF,A
    JNB    TI,$
    CLR    TI
   
    MOV    A,BUF_BCD+1
    ANL    ACC,#0FH
    ADD    A,#30H
    MOV    SBUF,A
    JNB    TI,$
    CLR    TI
   
    MOV    A,BUF_BCD
    SWAP    A
    ANL    ACC,#0FH
    ADD    A,#30H
    MOV    SBUF,A
    JNB    TI,$
    CLR    TI
   
    MOV    A,BUF_BCD
    ANL    ACC,#0FH
    ADD    A,#30H
    MOV    SBUF,A
    JNB    TI,$
    CLR    TI
           
    ;na koniec polecenie przeniesienia kursora do nowej linni w terminalu
    MOV    SBUF,#0DH     
    JNB    TI,$
    CLR    TI
    MOV    SBUF,#0AH
        JNB    TI,$
    CLR    TI
    RET

;=======================================================================;
; Konwerter 3 bajtowej liczby BIN na BCD                                ;
;-----------------------------------------------------------------------;
; we:   R1 = adres danych wejściowych   (R1)   - low                    ;
;                                       (R1+3) - high                   ;
;                                                                       ;
;       B  = adres bufora wyjściowego   (B)   - low                     ;
;                                       (B+4) - high                    ;
;                                                                       ;
; zmienia: A,R0,R2,R3,R4,R5,R6                                          ;
;-----------------------------------------------------------------------;
BCD24:
;--- pobierz dane wejściowe ----
        MOV     A,@R1
        MOV     R4,A
        INC     R1
        MOV     A,@R1
        MOV     R5,A
        INC     R1
        MOV     A,@R1
        MOV     R6,A
BCD24B:
;--- zerowanie bufora wyjściowego
        CLR     A
        MOV     R1,B            ;pobierz adres bufora
        MOV     R2,#4           ;liczba bajtów bufora wyjściowego
BCD24L1:
        MOV     @R1,A           ;zerowanie
        INC     R1              ; bufora
        DJNZ    R2,BCD24L1      ; wyjściowego

;--- Główna pętla konwersji ----
        MOV     R3,#8*3         ;liczba bitów danych wejściowych
BCD24L2:
        XCH     A,R4            ;rotacja
        RLC     A               ; danych
        XCH     A,R4            ; wejściowycj
        XCH     A,R5            ;rotacja
        RLC     A               ; danych
        XCH     A,R5            ; wejściowycj
        XCH     A,R6            ;rotacja
        RLC     A               ; danych
        XCH     A,R6            ; wejściowycj

;---- pętla dodawania ----------
        MOV     R2,#4           ;liczba bajtów wyjściowych
        MOV     R1,B            ;pobierz adres bufora
BCD24L4:
        MOV     A,@R1           ;dodawanie
        ADDC    A,@R1           ; zawartości bufora
        DA      A               ; z korekcją dziesiętną
        MOV     @R1,A           ;zapisz
        INC     R1              ;następny bajt
        DJNZ    R2,BCD24L4      ;czy koniec bufora ?
;-------------------------------
        DJNZ    R3,BCD24L2      ;czy koniec głównej pętli ?
        RET

        END

 
     
dr_mateusz
Nowy na forum


Dołączył: 17 Sty 2011
Posty: 8
Skąd: Krosno
Wysłany: 2011-01-24, 22:41   

Dziękuję kolego za pomoc.
Całość:

Program inicjalizuje dwa liczniki. Licznik T1 zlicza impulsy. Licznik T0 pracuje jako czasomierz – co 0.05 powoduje wywołanie przerwanie licznika.
Program obsługi przerwania co 20-te wywołanie (czyli co 1 sekundę):
- zatrzymuje liczniki,
- pobiera ich wartości,
- wysyła wartości liczników przez port szeregowy,
- inicjuje nowe wartości liczników,
- uruchamia z powrotem liczniki.

Zegar mikroprocesora pracuje z częstotliwością 12MHz. Co 12 cykl zegarowy zwiększana jest wartość licznika T0 (1MHz). Po 0.05 s wartość licznika się zwiększy o 50000. Czyli licznik T0 (w trybie 16-to bitowym) przepełni się po 0.05s, jeśli zainicjujemy go wartością –15536 (3CB0h)

1. Schemat elektryczny:


2. Opis ustawienia licznika(konfiguracja):
MOV TMOD,#01010001B ;timer 1 zlicza impulsy zewnętrzne z T1 P3.5
;timer 0 w trybie 0 samo przeladowuje sie co 0.05s
MOV TH0,#0 ;początkowa wartość do timera T0
SETB TR0 ;start Timera 0 (odliczanie czasu)
SETB ET0 ;zezwolenie na przerwanie od Timera 0(odliczanie czasu)
SETB ET1 ;zezwolenie na przerwanie od Timera 1(pomiar częstotliwości)
SETB EA ;zezwolenie ogólne na przerwania
3. Algorytm programu:


Proszę o sprawdzenie zamieszczonego projektu.

TM_schem2.jpg
Plik ściągnięto 576 raz(y) 96,26 KB

schemat.jpg
Plik ściągnięto 738 raz(y) 160,64 KB

 
     
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  


Powered by phpBB modified by Przemo © 2003 phpBB Group
Strona wygenerowana w 0,15 sekundy. Zapytań do SQL: 13