Pomiar czestotliwosc - Bascom

Loading thread data ...

Np. tak:

'ustawienie

dim test as bit

reset test

Do if test=1 then disable int0 Shift Tmp2 , Left , 8 Tmp3 = Tmp + Tmp2 Tmp3 = Tmp3 * 2 Cls Tmp3 = Tmp3 Tmp3 = 100000 / Tmp3 Lcd "czestotliwosc=" Lowerline Lcd Tmp3 ; " Hz" Tl0 = 0 Th0 = 0 Waitms 5000 Enable Int0 start timer0 reset test end if End

Wypisz: if test=0 then stop timer0 Tmp = Tl0 Tmp2 = Th0 set test end if return

Reply to
Pablo C

Witam. Ja proponuję coś takiego: 'LCD CONFIGURATION $crystal = 1200000 '1,2Mhz Config Lcd = 16 * 4 Config Lcdpin = Pin , Db4 = P0.2 , Db5 = P0.3 , Db6 = P0.4 , Db7 = P0.5 , E = P0.1 , Rs = P0.0 Config Timer0 = Timer , Gate = Internal , Mode = 1 'ustawienie Licznika Dim Tmp3 As Long , Pstart As Bit Set Tcon.0 'reaguje na Zobcze On Int0 Int0_int Reset Pstart Enable Interrupts 'wlaczenie Przerwan Enable Int0 'zezwolenie na przerwanie int0 '... Do While Ie.0 = 1 : Wend Tmp3 = Counter0 Tmp3 = 1000000 / Tmp3 Rem wyświetlenie wyniku itp. ' .... Counter0 = 0 Enable Int0 'następny pomiar Loop

Int0_int: Rem zbocze opadające:początek pomiaru If Pstart = 0 Then Start Timer0 Set Pstart Else Rem zbocze opadające:koniec pomiaru (zmierzony czas trwania okresu) Stop Timer0 Disable Int0 Reset Pstart End If Return

Reply to
Piotrek Sz.

Teres snipped-for-privacy@WYTNIJTOpoczta.fm napisał(a):

Hmmm. W takim przypadku , można mierzyć tylko przebiegi o wypełnieniu 50/50 , a przy innych proporcjach wypełnienia wyjdzie knot :(

Pozdrawiam Piotrek

Reply to
Piotrek Sz.

Teres snipped-for-privacy@WYTNIJTOpoczta.fm napisał(a):

Przeanalizujmy Twój program ;)

Skąd wiadomo , że kiedy obsługiwałeś LCD nie została ustawiona flaga INT0 ? Bo jeśli została ustawiona , to po powyższej instrukcji odrazu wykona się przerwanie INT0 i nawet timera nie zdążysz wystartować :(

Skąd wiadomo że na wejściu INT0 nie występuje od iluśtam cykli stan "0" i timer rozpocznie zliczanie nie wtedy , kiedy należy , czyli natychmiast po pojawieniu się stanu niskiego na wej.INT0

Pojawiło się zbocze opadające i timer rozpoczął zliczanie ...

.. Ty go odrazu "w rogi" i stop , a powinien zliczać doputy , dopuki n wej. INT0 jest niski stan czyż nie ?

Po co te kombinacje ze zmiennymi pomocniczymi , nie prościej "Tmp3=Counter0" , a potem "Shift Tmp3,Left,1" zamiast matematyki ?

Ponarzekałem , a teraz rozwiązanie ( a istnieje ich wiele):

1.Startujemy Timer0 Do 1.Czekamy na wysoki stan na INT0 2.Zerujemy Test 3.Zerujemy Timer0 - przy wysokim stanie INT0 nie zlicza 4.Zerujemy flagę przerwania INT0 (TCON.1) - na wszelki wypadek 4.Zezwalamy na przerwania INT0 6.Czekamy na Test=1 - Timer0 rozpoczął zliczanie 7.Czekamy na wysoki stan na INT0 - koniec zliczania 9.Zabraniamy przerwań INT0 8.Counter0 do Temp3 - nie musimy zatrzymywac bo i tak już nie zlicza 10.Obliczamy i wyświetlamy 11.Skok do pkt. 1 Loop

Przerwanie_INT0: Ustaw Test Return

Tak należało by zbudować program , a bez przerwania też by się dało :)

Pozdrawiam Piotrek Sz.

PS Jakiś wymagający ten prowadzący ;)

Reply to
Piotrek Sz.

Teres snipped-for-privacy@WYTNIJTOpoczta.fm napisał(a): ..

W takim razie nie są wyłączane .

Niestety , nie ma takiej możliwości.Timer0 jest "bramkowany" stanem niskim na wej. INT0 .

To zajmuje mniej pamięci programu i jest szybsze.

Nie musisz , wystarczy raz wystartować.

Jedynie reset sprzętowy zeruje liczniki lub zapisanie zer do liczników.

Gdybyś podał więcej informacji , co Twój uC ma robić , jaka max częstotliwość będzie podawana na INT0 , z jakim kwarcrm pracuje itd. , było by łatwiej Ci pomóc :) Można by np. podawać mierzony sygnał na INT0 i odwrócony o 180 stopni(1 maluśki tranzystor) na INT1 i wykorzystywać przerwanie INT1 do oczytywania licznika(ów) Timera0 ,a wtedy program byłby śmiesznie prosty ;).

Pozdrawiam Piotrek Sz.

Reply to
Piotrek Sz.

Teres snipped-for-privacy@WYTNIJTOpoczta.fm napisał(a):

Wybacz , ale pleciesz bzdury.Jeżeli GATE=1 (EXTERNAL) to licznik zlicza impulsy zewnętrzne lub wewnętrzne( u Ciebie wewnetrzne) tylko wtedy , kiedy TR0=1 i INT0=0 (P3.2=0) innej możliwości NIE MA , a ta kreseczka nad INTx oznacza stan aktywny niski , a nie negację.Widze że musisz jeszcze sporo poczytać o prockac z rodziny MCS-51.Proponuje zrobic doświadczenie i wyświetlać w kółko zawartość liczników Timera0 , a wejście INT0(P3.2) recznie łączyć z masą czyli ustawiac niski stan , a wtedy zobaczysz na LCD co sie dzieje z licznikami jak ustawisz "0" i nie podłączaj tego wejścia czasami do + by ustawić stan "1".

Nie zrozumiałeś o co mi chodzi :( Przerwanie INT1 nie ma nic mierzyc , tylko odczytać Timer0. Pozdrawiam Piotrek Sz.

Reply to
Piotrek Sz.

Teres snipped-for-privacy@WYTNIJTOpoczta.fm napisał(a): ..

No cóż , muszę przyznać się do błędu :( Mam taką książeczkę "Mikrokomputery jednoukładowe rodziny MCS-51" napisaną przez p. Andrzeja Rydzewskiego i w niej stoi tak : "Jeśli w słowie TMOD jest GATE równe 1 , to zewnętrzne lub wewnętrzne impulsy zegarowe są dodatkowo bramkowane zewnętrznym sygnałem z wejścia INTi.W tym przypadku , po programowym uruchomieniu licznika(wpisaniu jedynko do TRi) , zliczanie może być sterowane zewnętrznie - licznik pracuje tylko wtedy , kiedy INTi=0". Więc byłem na 100% pewien , że tak jest w rzeczywistości ,a tu figa z makiem. Jak to już nie można nikomu wierzyć ;) By odkupić winy ... .. Start Timer0 'skasowanie znacznika Do 'petla w programie If Test = 1 Then Shift Tmp3 , Left , 1 Cls Tmp3 = 100000 / Tmp3 Lcd "czestotliwosc=" Lowerline Lcd Tmp3 ; " Hz" ' Wait 1 Reset Test End If Loop End Wypisz: If Test = 0 Then 'czy wyświetlacz już sie wyrobił ? Tmp3 = Counter0 Set Test 'nowa wartość do wyświetlenia - gotowa. End If Counter0 = 0 'zerujemy , by przy zmianie stanu INT0 na 1 zliczał od zera Start Timer0 'trzeba wystartować Timer ,ponieważ przy operacjach na Counter0 'licznik jest zatrzymywany Return

Myślę , że powinno być OK.

Pozdrawiam Piotrek

Reply to
Piotrek Sz.

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.