ArturVF500
Guest
Sun Oct 31, 2004 11:35 am
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
AlexY
Guest
Sun Oct 31, 2004 12:39 pm
Użytkownik ArturVF500 napisał:
[..]
Quote:
TMOD=0x91; (pracuje tez przerwanie od T0 - co 500ms wyswietlany jest wynik)
T0 masz wylaczony, jesli chcesz go rowniez wlaczyc w TMOD wpisz 99h
[..]
Quote:
Przerwanie startuje, ale zawartosc T1 jest co najmniej dziwna; przy
szerokosci impulsu ok 6ms, zawartosc T1 ok 40000 (taktowanie 8MHz)
1,5us * 40000 = 60000us = 60ms
puszczasz jeden impuls czy fale?
[..]
Quote:
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,
a zatrzymujesz go ?
przed uruchomieniem jest wyzerowany ?
ArturVF500
Guest
Sun Oct 31, 2004 1:47 pm
Quote:
TMOD=0x91; (pracuje tez przerwanie od T0 - co 500ms wyswietlany jest
wynik)
T0 masz wylaczony, jesli chcesz go rowniez wlaczyc w TMOD wpisz 99h
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
Quote:
Przerwanie startuje, ale zawartosc T1 jest co najmniej dziwna; przy
szerokosci impulsu ok 6ms, zawartosc T1 ok 40000 (taktowanie 8MHz)
1,5us * 40000 = 60000us = 60ms
puszczasz jeden impuls czy fale?
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!
Quote:
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,
a zatrzymujesz go ?
przed uruchomieniem jest wyzerowany ?
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
AlexY
Guest
Sun Oct 31, 2004 2:40 pm
Użytkownik ArturVF500 napisał:
Quote:
TMOD=0x91; (pracuje tez przerwanie od T0 - co 500ms wyswietlany jest wynik)
T0 masz wylaczony, jesli chcesz go rowniez wlaczyc w TMOD wpisz 99h
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
slusznie prawisz, odnioslem sie do swojego urzadzenia tylko zapomnialem
ze u mnie oba timery mierza z zewnatrz
Quote:
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!
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
[..]
ArturVF500
Guest
Sun Oct 31, 2004 4:25 pm
Quote:
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
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?
AlexY
Guest
Sun Oct 31, 2004 5:04 pm
Użytkownik ArturVF500 napisał:
Quote:
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?
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
ArturVF500
Guest
Sun Oct 31, 2004 5:35 pm
Quote:
nie ufam temu oscyloskopowi, moze rozkalibrowany.
tez rak myslelem, ale zmierzylem sobie kwarc 12MHz poganiajacy '51 i sie
zgadza..
Quote:
chyba ze po drodze przy przeliczaniu przesowasz gdzies bity o jedna
pozycje za bardzo w lewo
robisz jakis podglad w bity licznika?
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
AlexY
Guest
Sun Oct 31, 2004 5:55 pm
Użytkownik ArturVF500 napisał:
Quote:
nie ufam temu oscyloskopowi, moze rozkalibrowany.
tez rak myslelem, ale zmierzylem sobie kwarc 12MHz poganiajacy '51 i sie
zgadza..
moze procek ktory uzywasz cykl maszynowy ma w 6-ciu cyklach zegarowych a
nie w 12 zgodnie z intelowskim standardem? sprawdz dokumentacje
[..]
Quote:
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
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
ArturVF500
Guest
Sun Oct 31, 2004 6:11 pm
Quote:
moze procek ktory uzywasz cykl maszynowy ma w 6-ciu cyklach zegarowych a
nie w 12 zgodnie z intelowskim standardem? sprawdz dokumentacje
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
AlexY
Guest
Sun Oct 31, 2004 6:31 pm
Użytkownik ArturVF500 napisał:
Quote:
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
w sumie nic mi to nie mowi, pisze w asemblerze :)
Quote:
takze pozostaje mi jeszcze walka z przerwaniami....
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
ArturVF500
Guest
Sun Oct 31, 2004 6:35 pm
Quote:
w sumie nic mi to nie mowi, pisze w asemblerze
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
J.F.
Guest
Sun Oct 31, 2004 8:01 pm
On Sun, 31 Oct 2004 14:47:24 +0100, ArturVF500 wrote:
Quote:
Przerwanie startuje, ale zawartosc T1 jest co najmniej dziwna; przy
szerokosci impulsu ok 6ms, zawartosc T1 ok 40000 (taktowanie 8MHz)
1,5us * 40000 = 60000us = 60ms
puszczasz jeden impuls czy fale?
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!
Moze mierzysz okres miedzy impulsami ?
J.
ArturVF500
Guest
Sun Oct 31, 2004 9:47 pm
Quote:
Moze mierzysz okres miedzy impulsami ?
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
KKR
Guest
Tue Nov 02, 2004 6:07 pm
Quote:
przerwanie wyglada tak
{
impulsy=TL1;
impulsy=impulsy+256*TH1;
TL1=0;
TH1=0;
}
Czy masz włączoną optymalizację?
A może:
impulsy = ((uint)TH1<<

| (TL1); //?? tak strzelam.. :)
Pozdrawiam
KKR