Układ mikroporcesorowy mierzący częśtotliwość na 8051

To forum jest dla wszystkich pasjonatów wiecznie młodych mikrokontrolerów '51. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
dr_mateusz
-
Posty: 8
Rejestracja: 17 sty 2011, 21:14
Lokalizacja: Krosno

Układ mikroporcesorowy mierzący częśtotliwość na 8051

Post autor: dr_mateusz » 17 sty 2011, 21:15

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.

Awatar użytkownika
kayron
Użytkownik
Posty: 2051
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 18 sty 2011, 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
-
Posty: 8
Rejestracja: 17 sty 2011, 21:14
Lokalizacja: Krosno

Post autor: dr_mateusz » 22 sty 2011, 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.
Załączniki
schemat.jpg

Awatar użytkownika
mr_x
Użytkownik
Posty: 385
Rejestracja: 12 gru 2010, 19:05
Lokalizacja: /bin/bash
Kontakt:

Post autor: mr_x » 22 sty 2011, 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
-
Posty: 8
Rejestracja: 17 sty 2011, 21:14
Lokalizacja: Krosno

Post autor: dr_mateusz » 23 sty 2011, 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?

Awatar użytkownika
mr_x
Użytkownik
Posty: 385
Rejestracja: 12 gru 2010, 19:05
Lokalizacja: /bin/bash
Kontakt:

Post autor: mr_x » 23 sty 2011, 18:11

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

dr_mateusz
-
Posty: 8
Rejestracja: 17 sty 2011, 21:14
Lokalizacja: Krosno

Post autor: dr_mateusz » 24 sty 2011, 0: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.
Załączniki
schemat1.jpg

Awatar użytkownika
mr_x
Użytkownik
Posty: 385
Rejestracja: 12 gru 2010, 19:05
Lokalizacja: /bin/bash
Kontakt:

Post autor: mr_x » 24 sty 2011, 0: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
-
Posty: 8
Rejestracja: 17 sty 2011, 21:14
Lokalizacja: Krosno

Post autor: dr_mateusz » 24 sty 2011, 0:21

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

Awatar użytkownika
mr_x
Użytkownik
Posty: 385
Rejestracja: 12 gru 2010, 19:05
Lokalizacja: /bin/bash
Kontakt:

Post autor: mr_x » 24 sty 2011, 0: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
-
Posty: 8
Rejestracja: 17 sty 2011, 21:14
Lokalizacja: Krosno

Post autor: dr_mateusz » 24 sty 2011, 0:38

Czy tak jak teraz jest dobrze:
Załączniki
schemat.jpg

Awatar użytkownika
mr_x
Użytkownik
Posty: 385
Rejestracja: 12 gru 2010, 19:05
Lokalizacja: /bin/bash
Kontakt:

Post autor: mr_x » 24 sty 2011, 0: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
-
Posty: 8
Rejestracja: 17 sty 2011, 21:14
Lokalizacja: Krosno

Post autor: dr_mateusz » 24 sty 2011, 0: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.
Załączniki
schemat.jpg

gomarko
-
Posty: 71
Rejestracja: 13 paź 2010, 21:20
Lokalizacja: Konin

Post autor: gomarko » 24 sty 2011, 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: 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


dr_mateusz
-
Posty: 8
Rejestracja: 17 sty 2011, 21:14
Lokalizacja: Krosno

Post autor: dr_mateusz » 24 sty 2011, 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.
Załączniki
schemat.jpg
TM_schem2.jpg

ODPOWIEDZ