miernik szerokosci impulsu na '51

uczynilem program w c, ktory mial by mierzyc szerokosc impulsu podawanego na T1; calosc dziala sobie na przerwaniu INT0 (polaczone piny INT0 i T1) czyli niejako wartosc licznika T1 to ilosc zmierzonych impulsow zegarowych 51; ustawienia rejestrow (w kolejnosci) TMOD=0x91; (pracuje tez przerwanie od T0 - co 500ms wyswietlany jest wynik) TR0=1; TR1=1; IT0=1; (przerwanie na zboczu opadajacym, czyli po zakonczeniu zliczania impulsow zegarowych) IE=0x83;

Przerwanie startuje, ale zawartosc T1 jest co najmniej dziwna; przy szerokosci impulsu ok 6ms, zawartosc T1 ok 40000 (taktowanie 8MHz), calkowicie stabilna, choc powinna przynajnioej troche plywa, i nie zmniejsza sie przy zminiejszaniu szerokosci impulsow, natomiast gdy mocno zwieksze ich szerokosc zawartosc T1 zmniejsza swoja wartosc ale o dziwne skoki i wynosi np - 20000, 8000, 3000; ktos ma pomysl gdzie popelniam blad? w przerwaniu od T1 przepisuje tylko wartosc TH1+TL1 do unsigned integer i zetuje licznik, takze nie ma mozliwosci by nie wyrabialo sie zcasowo...

pozdrawiam Artur

Reply to
ArturVF500
Loading thread data ...

Użytkownik ArturVF500 napisał:

[..]

T0 masz wylaczony, jesli chcesz go rowniez wlaczyc w TMOD wpisz 99h

[..]
1,5us * 40000 = 60000us = 60ms puszczasz jeden impuls czy fale? [..]

a zatrzymujesz go ? przed uruchomieniem jest wyzerowany ?

Reply to
AlexY

nie, jest wlaczony- napisalem, ze pracuje;) TMOD odpowaiada za konfiguracje:

0x01 (polbajt LSB) oznacza: GATE=0(bramkowanie z zewnatrz wylaczone), C/T=0 (czasomierz-zliczanie impulsow wewnetrznych), M1, M1 - Tryb1 (16 bit licznik) za wlaczenie odpowiada TR=1

fale, jak najbardziej i poprawka - ok 20ms, zle zmierzylem;) ale to i tak nie zmienia faktu, ze przy zmianie szerokosci impulsu wynik pozostaje niezmienny, do momentu, gdy baaaaaardzo wydluze czas impulsu - ok 5x; zwiekszanie szerokosci nie zmniejasz wyniku!

jest napisale powyzej;) nie zatrzymuje go bo i po co? po przyjsciu przerwania na T1 jest stan niski, wiec i tak nie zlicza najbardziej zasnanawia mnie ze wynik nie zmienia sie nawet o 1...

pozdawiam Artur

Reply to
ArturVF500

Użytkownik ArturVF500 napisał:

slusznie prawisz, odnioslem sie do swojego urzadzenia tylko zapomnialem ze u mnie oba timery mierza z zewnatrz

wyglada na to ze gdzies obcinasz mlodszy bajt, przy konwersji na BCD albo podczas wyswietlania, dopisz wyswietlanie wartosci binarnych albo hex'a to sie wyda

[..]
Reply to
AlexY

zaczelo dzialc (w sumie juz nie pamietam gdzie byl blad;) ale... dlugosc impulsu na oscyloskopie (mierzona na nna nodze 12 i 15 - polaczone razem) 1.5ms a wskazanie licznika ok 3000 (kwarc 12MHz co by nie bylo problemow z przeliczaniem;) ) czyli 2x za duzo... jakis pomysl?

Reply to
ArturVF500

Użytkownik ArturVF500 napisał:

nie ufam temu oscyloskopowi, moze rozkalibrowany. chyba ze po drodze przy przeliczaniu przesowasz gdzies bity o jedna pozycje za bardzo w lewo robisz jakis podglad w bity licznika? jeszcze mozesz zapodac sygnal z "wzorcowego" generatora, zwykle multimetry maja

Reply to
AlexY

tez rak myslelem, ale zmierzylem sobie kwarc 12MHz poganiajacy '51 i sie zgadza..

przerwanie wyglada tak { impulsy=TL1; impulsy=impulsy+256*TH1; TL1=0; TH1=0; } a wyswieltalnie jest na 100% ok, bo po podstawieniu jakiejs wartosci liczbowej np impulsy=35555 wyswietlana jest wlasciwa wartosc; i co jeszcze zauwazylem - wraz ze wzrostem dlugosci czasu impulsu wynik jest mniej stabilny przy 3000 wahania na poziomie 10-30, natomiast przy 30000 (15ms) dochodzi nawet do 5000!!; przebieg na oscyloskopie nie wykazuje tak duzych dewiacji

Reply to
ArturVF500

Użytkownik ArturVF500 napisał:

moze procek ktory uzywasz cykl maszynowy ma w 6-ciu cyklach zegarowych a nie w 12 zgodnie z intelowskim standardem? sprawdz dokumentacje

[..]

czy procek ktory zastosowales ma bramke shmitta na wejsciu? to moze byc skutek "zaliczania" impulsu w roznych momentach trwania zbocza a 5000 to zalednie 0,5ms co przy 15ms impulsu daje 3,(3)% , dla porownania te

10-30 dla 0,3ms to 1%, tym razem stawiam na niestabilnosc generatora byc moze polaczona z brakiem przerzutnika shmitta na wejsciu linii wyzwalajacych
Reply to
AlexY

problem juz rozwiazalem... bruzdzi drugie przerwanie... po jego wylaczeniu jest oki, choc nie wiem dlaczego (jest wywolywane co 50ms)... moze uzywam zlej skladni przerwan w C void it_t0 (void ) interrupt 1 using 1 - dla czasomierza na T0 i void it_int0 (void ) interrupt 0 using 2 - dla wejscia INT0

takze pozostaje mi jeszcze walka z przerwaniami.... pozdrawiam Artur

Reply to
ArturVF500

Użytkownik ArturVF500 napisał:

w sumie nic mi to nie mowi, pisze w asemblerze :)

zmien im priorytety (chociaz moze wlasnie to robisz linijkami jak powyzej) tak zeby T0 mial nizszy priorytet od INT0 stosowny wpis w rejestr IE wynosi 10000011b oraz IP 00000001b

Reply to
AlexY

ttiaaa... tez pisalem i wszystkoz awsze dzialalo;) C mi sie zachcialo i mam za swoje; nic to nauka czasami jest meczaca;) dzieki za pomoc i pozdrawiam Artur

Reply to
ArturVF500

Moze mierzysz okres miedzy impulsami ?

J.

Reply to
J.F.

juz jest oki; bruzdzilo mi drugie przerwanie; BTW czy ktos sie orientuje jak w C (KEIL) definiuje sie funkcje przerwania dla 51? w tej chwili robie to na czuja i mozliwe ze w tym ktwi wlasnie blad? obecnie uzywam interupt 1 do przerwania od T0 i interupt 0 do przerwania INT0

pozdrawiam Artur

Reply to
ArturVF500

Czy masz włączoną optymalizację? A może: impulsy = ((uint)TH1<<8) | (TL1); //?? tak strzelam.. :)

Pozdrawiam KKR

Reply to
KKR

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.