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

Problem ze zmierzeniem długości impulsu na at89c4051

kosmat 26 Wrz 2005 18:29 1344 4
  • #1 1851232
    kosmat
    Poziom 2  
    Posty: 3
    Witam
    problem jest taki że generalna zasada pomiaru takiej długości jest znana...
    pod INT0 podpinam sygnał...
    ustawiam przerwanie na narastające zbocze... odpalam timer
    na opadającym zboczu odczytuje zawartość timera i zależnie ile wynosi to coś tam się ustawia.
    Napisałem taki program w c i coś nie działa a nie mam pojęcia co;]
    może kwestia jest taka że źle ustawiam to na jakie zbocze ma reagować... a może wszystko działa tylko złe wartości wyliczyłem na długość impulsu?
    mikrokontroler at89c4051 ... kwarc 12 Mhz
    impulsy leca od odbiornika RC ... 1 - 2 ms co 20 ms
    zamysł jest taki że jeśli impulsy sa krótsze od 1.5 ms to świeciła się jedna dioda... a jeśli dłuższe do druga ... ale zawsze świeci się tylko zielona ( gdy zmienna diodazielona=0) ... więc wygląda na to że w procedure obsługi przerwania wchodzi ale zawsze licznik nie dochodzi do odpowiedniej wartości. Tylko mam wrażenie że on w ogóle się chyba nie odpala bo z wyliczeń dla tego kwarcu i tych wartości impulsów to wartość 0B na TH1 jest dla impulsu około 1.5ms...


    #include <reg51.h>

    sbit diodazielona = P1^6;
    sbit diodaczerwona = P1^7;

    void Zapaldiode(void) interrupt 0
    {
    if(IT0==0)//rosnace zbocze ? ( tego nie jestem pewien bo sam to wymyśliłem ... w książce znalazłem że IT0=1 to opadające więc alanogicznie dałem IT0=0 rosnące)
    {
    TR1=1;
    IT0=1;
    }
    else if(IT0==1)//opadajace
    {
    if(TH1<0x06) {
    diodazielona=0;
    diodaczerwona=1;
    }
    else
    {
    diodazielona=1;
    diodaczerwona=0;
    }
    TR1=0;
    IT0=0;
    TL1=0;
    TH1=0;
    }
    }

    void main(void)
    {
    diodaczerwona=1;
    diodazielona=1;
    IT0=0;//rosnące zbocze?
    EA=1;
    EX0=1;
    TMOD=0x10;
    TL1=0;
    TH1=0;

    while(1);
    }

    Z góry dziękuję za pomoc;]
  • #2 1851354
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Nooo kolego , jak Ty sobie będziasz tak sam dopowiadał , to daleko nie zajedziesz.Manuala w łapki i czytać, czytać .... :D

    Piotrek

    PS
    Na dobry początek ;)
    ITx=1 ;zboczem
    ITx=0 ;poziomem
  • #3 1852354
    kosmat
    Poziom 2  
    Posty: 3
    Hmm no dobra... czytać czytać manuala:P ale w tych opisach nie ma nigdzie wzmianki o wyzwalaniu zboczem rosnącym... czyli nie da się odpalać przerwania na zmiane zboczem rosnącym i opadającym?
    A jeśli nie... to jak zmierzyć ten czas....?
  • #4 1852761
    Wilku
    Poziom 17  
    Posty: 330
    Pomógł: 5
    Start pomiaru już masz - zbocze opadające. Stop pomiaru zboczem narastającym się nie da niestety. Jednym ze sposobów (choć zależy to od wielu czynników) jest wprowadzenie programu w krótką pętlę i czekanie na poziom H na wejściu. Można też sprawdzać zwyczajnie w pętli głównej programu, ale tu błąd pomiaru będzie większy.
  • #5 1855434
    jj
    Poziom 19  
    Posty: 145
    Pomógł: 42
    Witam

    Rozwiązaniem problemu jest wykorzystanie możliwości bramkowania zliczania timera Tx stanem na wejściu INTx. Bramkowanie włącza się poprzez ustawienie bitu GATE dla odpowiedniego timera w rejestrze TMOD.
    Bit zezwolenia na pracę timera TRx ustawiony na stałe. Przerwanie zewnętrzne INTx wyzwalane zboczem opadającym. W procedurze obsługi tego przerwania należy odczytać stan rejestrów THx:TLx (długość impulsu na wejściu INTx w cyklach maszynowych mikrokontrolera), a następnie wyzerować rejestry THx i TLx, aby następny pomiar był prawidłowy. Pierwszy pomiar po resecie mikrokontrolera może być nieprawidłowy, ale rozwiązanie tego problemu pozostawiam Tobie.
    Poniżej masz kod w asemblerze realizujący pomiar tą metodą. Wynik pomiaru umieszczany jest w rejestrach r6:r7.
    $include(mod51)
    org 0000h 
    	ljmp _START 
    org 0003h
    	push	PSW
    	push	ACC
    	
    	mov	r7,TL0		;*
    	mov	r6,TH0		;* zmierzona długosc impulsu do r6:r7
    	clr	A		;*
    	mov	TH0,A		;*
    	mov	TL0,A		;* zerowanie rejestrow TH0 i TL0
    	
    	pop	ACC
    	pop	PSW
    	reti 
    
    _START: 
    	mov	TMOD,#009h	;T0 - timer, mod1, gate=1
    	setb	IT0		;INT0 wyzwalane zboczem opadajacym
    	setb	TR0		;start T0
    	mov	IE,#081h	;zezwolenie na przerwanie od INT0
    _LOOP:
    	sjmp _LOOP
    end


    pozdrawiam
    Jacek
REKLAMA