Układ mikroporcesorowy mierzący częśtotliwość na 8051
-
- -
- Posty: 8
- Rejestracja: 17 sty 2011, 21:14
- Lokalizacja: Krosno
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.
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.
-
- -
- Posty: 8
- Rejestracja: 17 sty 2011, 21:14
- Lokalizacja: Krosno
-
- -
- Posty: 8
- Rejestracja: 17 sty 2011, 21:14
- Lokalizacja: Krosno
-
- -
- Posty: 8
- Rejestracja: 17 sty 2011, 21:14
- Lokalizacja: Krosno
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.
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.
-
- -
- Posty: 8
- Rejestracja: 17 sty 2011, 21:14
- Lokalizacja: Krosno
-
- -
- Posty: 8
- Rejestracja: 17 sty 2011, 21:14
- Lokalizacja: Krosno
-
- -
- Posty: 8
- Rejestracja: 17 sty 2011, 21:14
- Lokalizacja: Krosno
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)
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: Zaznacz cały
;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
-
- -
- Posty: 8
- Rejestracja: 17 sty 2011, 21:14
- Lokalizacja: Krosno
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.
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.