- posted
19 years ago
Pomiar czestotliwosc - Bascom
- Vote on answer
- posted
19 years ago
- Vote on answer
- posted
19 years ago
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
- Vote on answer
- posted
19 years ago
- Vote on answer
- posted
19 years ago
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
- Vote on answer
- posted
19 years ago
- Vote on answer
- posted
19 years ago
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
- Vote on answer
- posted
19 years ago
- Vote on answer
- posted
19 years ago
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 LoopPrzerwanie_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 ;)
- Vote on answer
- posted
19 years ago
- Vote on answer
- posted
19 years ago
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.
- Vote on answer
- posted
19 years ago
- Vote on answer
- posted
19 years ago
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.
- Vote on answer
- posted
19 years ago
- Vote on answer
- posted
19 years ago
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
- Vote on answer
- posted
19 years ago