Pomiar czestotliwosc - Bascom
Masz problem? Zapytaj na forum elektroda.pl
From: "Teres" <teres_at_nospam_poczta.fm>
Subject: Pomiar czestotliwosc - Bascom
Date: Mon, 3 Jan 2005 10:06:01 +0100
Witam!
Mam napisac program do mierzenia czestotliwosci w Bascomie, a potem
zasymulować to w Proteusie. Narazie poprawnie podaje mi czestotliwosc, ale
tylko dla jednego impulsu, przy założeniu że wypełnienie to 50%. Niestety
jeśli podłączę zegar, to głupieje. Pisze na AT89c52. Sygnał zegara
podłączany do ~INT0. Jeśli ktoś wie, napiszcie co jest nie tak.
Pozdrawiam,
Teres
Tutaj jest schemat do Proteusa
http://sof2.terramail.pl/f.DSN
A tutaj kod z Bascoma:
'LCD CONFIGURATION
Config Lcdpin = Pin , Db4 = P0.2 , Db5 = P0.3 , Db6 = P0.4 , Db7 = P0.5 , E
= P0.1 , Rs = P0.0
$crystal = 1200000 '1,2Mhz
Config Lcd = 16 * 4
Enable Interrupts 'wlaczenie
przerwan
Enable Int0
Set Tcon.0 'reaguje na
zobcze
Config Timer0 = Timer , Gate = External , Mode = 1 'ustawienie
licznika
'reaguje na podanie sygnalu na int0
Dim Tmp As Integer , Wynik As String * 9 , Tmp2 As Long , Tmp3 As Long
Set Tcon.4
Lcd "test" 'wlacza TR0
On Int0 Wypisz 'procedura
obslugi przerwania
Cls
Home
Tmp3 = 0
Lcd "Witaj"
Do
'nieskończona pętla
konca programu
Loop
End
Wypisz:
Reset Tcon.4
Tmp = Tl0
Tmp2 = Th0
Tl0 = 0
Th0 = 0
Shift Tmp2 , Left , 8 'przesuwamy o
8 miejsc starsza czesc licznika
Tmp3 = Tmp + Tmp2
Tmp3 = Tmp3 * 2 'wypelnienie
50%
Cls
Tmp3 = Tmp3
Tmp3 = 100000 / Tmp3
Lcd "czestotliwosc="
Lowerline
Lcd Tmp3 ; " Hz"
Tl0 = 0
Th0 = 0
Waitms 5000
Disable Int0
Enable Int0
Return
Return
From: "Pablo C" <pch[ciach]_at_nospam_poczta.onet.pl>
Subject: Re: Pomiar czestotliwosc - Bascom
Date: Mon, 3 Jan 2005 10:29:49 +0100
Zakładam, że przyczyną jest to, iż po wejściu do obsługi przerwania
wyłączasz je i program juz z niego nie wraca. Wywal Disable INT0 i
zastosuj jakiś znacznik wykonania przerwania. Poza tym nieużywaj lcd w
przerwaniu. W przerwaniu zachowaj tylko wskazania timera i ustaw znacznik.
Dopiero po wyzerowaniu znacznika w programie głownym do..loop wykonaj
kolejne przerwanie.
PC
Tutaj jest schemat do Proteusa
http://sof2.terramail.pl/f.DSN
A tutaj kod z Bascoma:
'LCD CONFIGURATION
Config Lcdpin = Pin , Db4 = P0.2 , Db5 = P0.3 , Db6 = P0.4 , Db7 = P0.5
, E
= P0.1 , Rs = P0.0
$crystal = 1200000 '1,2Mhz
Config Lcd = 16 * 4
Enable Interrupts 'wlaczenie
przerwan
Enable Int0
Set Tcon.0 'reaguje
na
zobcze
Config Timer0 = Timer , Gate = External , Mode = 1
'ustawienie
licznika
'reaguje na podanie sygnalu na int0
Dim Tmp As Integer , Wynik As String * 9 , Tmp2 As Long , Tmp3 As Long
Set Tcon.4
Lcd "test" 'wlacza
TR0
On Int0 Wypisz 'procedura
obslugi przerwania
Cls
Home
Tmp3 = 0
Lcd "Witaj"
Do
'nieskończona
pętla
konca programu
Loop
End
Wypisz:
Reset Tcon.4
Tmp = Tl0
Tmp2 = Th0
Tl0 = 0
Th0 = 0
Shift Tmp2 , Left , 8
'przesuwamy o
8 miejsc starsza czesc licznika
Tmp3 = Tmp + Tmp2
Tmp3 = Tmp3 * 2
'wypelnienie
50%
Cls
Tmp3 = Tmp3
Tmp3 = 100000 / Tmp3
Lcd "czestotliwosc="
Lowerline
Lcd Tmp3 ; " Hz"
Tl0 = 0
Th0 = 0
Waitms 5000
Disable Int0
Enable Int0
Return
Return
From: "Pablo C" <pch[ciach]_at_nospam_poczta.onet.pl>
Subject: Re: Pomiar czestotliwosc - Bascom
Date: Mon, 3 Jan 2005 10:37:09 +0100
Np. tak:
'LCD CONFIGURATION
Config Lcdpin = Pin , Db4 = P0.2 , Db5 = P0.3 , Db6 = P0.4 , Db7 = P0.5
, E
= P0.1 , Rs = P0.0
$crystal = 1200000 '1,2Mhz
Config Lcd = 16 * 4
Enable Interrupts 'wlaczenie
przerwan
Enable Int0
Set Tcon.0 'reaguje
na
zobcze
Config Timer0 = Timer , Gate = External , Mode = 1
'ustawienie
licznika
'reaguje na podanie sygnalu na int0
Dim Tmp As Integer , Wynik As String * 9 , Tmp2 As Long , Tmp3 As Long
dim test as bit
Set Tcon.4
Lcd "test" 'wlacza
TR0
On Int0 Wypisz 'procedura
obslugi przerwania
Cls
Home
Tmp3 = 0
Lcd "Witaj"
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
From: "Teres" <teresUSUNTO_at_nospam_WYTNIJTOpoczta.fm>
Subject: Re: Pomiar czestotliwosc - Bascom
Date: Mon, 3 Jan 2005 18:43:49 +0100
Użytkownik "Pablo C" <pch[ciach]_at_nospam_poczta.onet.pl> napisał w wiadomości
news:crb3u6$heq$1_at_nospam_nemesis.news.tpi.pl...
Np. tak:
[ciach]
Dzięki wielkie, sam nie wiem czemu o tym nie pomyślałem.
Pozdrawiam,
Teres
From: "Piotrek Sz." <zumek.SKASUJ_at_nospam_gazeta.pl>
Subject: Re: Pomiar czestotliwosc - Bascom
Date: Mon, 3 Jan 2005 18:37:50 +0000 (UTC)
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
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
From: "Teres" <teresUSUNTO_at_nospam_WYTNIJTOpoczta.fm>
Subject: Re: Pomiar czestotliwosc - Bascom
Date: Tue, 4 Jan 2005 21:15:58 +0100
Użytkownik "Piotrek Sz." <zumek.SKASUJ_at_nospam_gazeta.pl> napisał w wiadomości
news:crc3du$1rm$1_at_nospam_inews.gazeta.pl...
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
Niestety ale prowadzący chce żeby Timer nie byl uruchamiany recznie
(start/stop) tylko przez INT0 jako sterowanie.
Pozdrawiam,
Teres
From: "Piotrek Sz." <zumek.SKASUJ_at_nospam_gazeta.pl>
Subject: Re: Pomiar czestotliwosc - Bascom
Date: Tue, 4 Jan 2005 21:08:23 +0000 (UTC)
Teres <teresUSUNTO_at_nospam_WYTNIJTOpoczta.fm> napisał(a):
Niestety ale prowadzący chce żeby Timer nie byl uruchamiany recznie
(start/stop) tylko przez INT0 jako sterowanie.
Pozdrawiam,
Teres
Hmmm.
W takim przypadku , można mierzyć tylko przebiegi o wypełnieniu 50/50 , a przy
innych proporcjach wypełnienia wyjdzie knot :(
Pozdrawiam
Piotrek
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
From: "Teres" <teresUSUNTO_at_nospam_WYTNIJTOpoczta.fm>
Subject: Re: Pomiar czestotliwosc - Bascom
Date: Fri, 7 Jan 2005 14:40:58 +0100
Użytkownik "Pablo C" <pch[ciach]_at_nospam_poczta.onet.pl> napisał w wiadomości
news:crb3u6$heq$1_at_nospam_nemesis.news.tpi.pl...
[ciach]
Poprawiłem swój program i wyszło coś co wklejam poniżej. Niestety ciągle mam
problem, pierwszy pomiar jest ok, a potem jakieś kosmiczne liczby w Tmp3,
dzieląc 10000 przez Tmp3 dostaje 0 na wyświetalczu. Czy ten Timer0 nie
kasuje sie sam po zaprzestaniu podawania sygnału na INT0, chyba że to trzeba
zrobić jakoś inaczej, najlepiej dalej uruchamiane przerwaniem(tak chce
prowadzący), w ostateczności zrobie jako Counter0.
Pozdrawiam,
Teres
Kod programu:
'LCD CONFIGURATION
Config Lcdpin = Pin , Db4 = P0.2 , Db5 = P0.3 , Db6 = P0.4 , Db7 = P0.5 , E
= P0.1 , Rs = P0.0
$crystal = 1200000
'1,2Mhz
Config Lcd = 16 * 4
Enable Interrupts
'wlaczenie przerwan
Enable Int0
Set Tcon.0
'reaguje na zobcze
Config Timer0 = Timer , Gate = External , Mode = 1
'ustawienie licznika
'reaguje na podanie sygnalu na int0
Dim Tmp As Integer , Wynik As String * 9 , Tmp2 As Long , Tmp3 As Long ,
Test As Bit
Set Tcon.4
'wlacza TR0
On Int0 Wypisz
'procedura obslugi przerwania
Cls
Home
Tmp3 = 0
Lcd "Witaj"
Reset Test
'skasowanie znacznika
Do
'petla w programie
If Test = 1 Then
Disable Int0
Shift Tmp2 , Left , 8
Tmp3 = Tmp + Tmp2
Tmp3 = Tmp3 * 2
Cls
'Tmp3 = 100000 / Tmp3
Lcd "czestotliwosc="
Lowerline
Lcd Tmp3 ; " Hz"
Tl0 = 0
Th0 = 0
' Waitms 5000
Enable Int0
Start Timer0
Reset Test
End If
Loop
End
Wypisz:
If Test = 0 Then
Stop Timer0
Tmp = Tl0
Tmp2 = Th0
Set Test
End If
Return
From: "Piotrek Sz." <zumek.SKASUJ_at_nospam_gazeta.pl>
Subject: Re: Pomiar czestotliwosc - Bascom
Date: Fri, 7 Jan 2005 18:35:14 +0000 (UTC)
Teres <teresUSUNTO_at_nospam_WYTNIJTOpoczta.fm> napisał(a):
Przeanalizujmy Twój program ;)
Do
'petla w programie
If Test = 1 Then
Disable Int0
Shift Tmp2 , Left , 8
Tmp3 = Tmp + Tmp2
Tmp3 = Tmp3 * 2
Cls
'Tmp3 = 100000 / Tmp3
Lcd "czestotliwosc="
Lowerline
Lcd Tmp3 ; " Hz"
Tl0 = 0
Th0 = 0
' Waitms 5000
Enable Int0
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ć :(
Start Timer0
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
Reset Test
End If
Loop
End
Pojawiło się zbocze opadające i timer rozpoczął zliczanie ...
Wypisz:
If Test = 0 Then
Stop Timer0
.. Ty go odrazu "w rogi" i stop , a powinien zliczać doputy , dopuki n wej.
INT0 jest niski stan czyż nie ?
Tmp = Tl0
Tmp2 = Th0
Po co te kombinacje ze zmiennymi pomocniczymi , nie prościej "Tmp3=Counter0" ,
a potem "Shift Tmp3,Left,1" zamiast matematyki ?
Set Test
End If
Return
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 ;)
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
From: "Teres" <teresUSUNTO_at_nospam_WYTNIJTOpoczta.fm>
Subject: Re: Pomiar czestotliwosc - Bascom
Date: Sat, 8 Jan 2005 15:38:36 +0100
Użytkownik "Piotrek Sz." <zumek.SKASUJ_at_nospam_gazeta.pl> napisał w wiadomości
news:crmkp2$9bp$1_at_nospam_inews.gazeta.pl...
Teres <teresUSUNTO_at_nospam_WYTNIJTOpoczta.fm> napisał(a):
Przeanalizujmy Twój program ;)
Do
'petla w programie
If Test = 1 Then
Disable Int0
Shift Tmp2 , Left , 8
Tmp3 = Tmp + Tmp2
Tmp3 = Tmp3 * 2
Cls
'Tmp3 = 100000 / Tmp3
Lcd "czestotliwosc="
Lowerline
Lcd Tmp3 ; " Hz"
Tl0 = 0
Th0 = 0
' Waitms 5000
Enable Int0
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ć :(
Z tego co widze w Proteusie to zgodnie z czestotliwoscia sygnału wykonują
się przerwania, więc to chyba nie ma znaczenia
Start Timer0
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
Racja
Reset Test
End If
Loop
End
Pojawiło się zbocze opadające i timer rozpoczął zliczanie ...
Ale właściwie to timer ma zliczać czas tylko dla wysokiego stanu na INT0,
stąd właśnie ma ustwione GATE=EXTERNAL
Wypisz:
If Test = 0 Then
Stop Timer0
.. Ty go odrazu "w rogi" i stop , a powinien zliczać doputy , dopuki n
wej.
INT0 jest niski stan czyż nie ?
Zakładam że wypełnienie 50% więc tuż po zakończeniu stanu wysokiego podwajam
długość zliczoną i wypisuje
Tmp = Tl0
Tmp2 = Th0
Po co te kombinacje ze zmiennymi pomocniczymi , nie prościej
"Tmp3=Counter0" ,
a potem "Shift Tmp3,Left,1" zamiast matematyki ?
Nie wiedziałem, że coś takiego jest.
Set Test
End If
Return
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 :)
Bede dalej probował
Szczerze mówiąc to nie wiem czy powinienem używać instrukcji start i stop
timer.Poza tym czy po instrukcji stop timer, a nastepnie start zaczyna od
nowa zliczac od 0 ??
Pozdrawiam
Piotrek Sz.
Pozdrawiam,
Teres
PS
Jakiś wymagający ten prowadzący ;)
Młody doktorant ;)
From: "Piotrek Sz." <zumek.SKASUJ_at_nospam_gazeta.pl>
Subject: Re: Pomiar czestotliwosc - Bascom
Date: Sat, 8 Jan 2005 21:38:06 +0000 (UTC)
Teres <teresUSUNTO_at_nospam_WYTNIJTOpoczta.fm> napisał(a):
..
Z tego co widze w Proteusie to zgodnie z czestotliwoscia sygnału wykonują
się przerwania, więc to chyba nie ma znaczenia
W takim razie nie są wyłączane .
Ale właściwie to timer ma zliczać czas tylko dla wysokiego stanu na INT0,
stąd właśnie ma ustwione GATE=EXTERNAL
Niestety , nie ma takiej możliwości.Timer0 jest "bramkowany" stanem niskim na
wej. INT0 .
"Tmp3=Counter0" ,
a potem "Shift Tmp3,Left,1" zamiast matematyki ?
Nie wiedziałem, że coś takiego jest.
To zajmuje mniej pamięci programu i jest szybsze.
Szczerze mówiąc to nie wiem czy powinienem używać instrukcji start i stop
timer.
Nie musisz , wystarczy raz wystartować.
Poza tym czy po instrukcji stop timer, a nastepnie start zaczyna od
nowa zliczac od 0 ??
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.
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
From: "Teres" <teresUSUNTO_at_nospam_WYTNIJTOpoczta.fm>
Subject: Re: Pomiar czestotliwosc - Bascom
Date: Sat, 8 Jan 2005 23:13:26 +0100
Użytkownik "Piotrek Sz." <zumek.SKASUJ_at_nospam_gazeta.pl> napisał w wiadomości
news:crpjrt$lnb$1_at_nospam_inews.gazeta.pl...
Teres <teresUSUNTO_at_nospam_WYTNIJTOpoczta.fm> napisał(a):
..
Ale właściwie to timer ma zliczać czas tylko dla wysokiego stanu na
INT0,
stąd właśnie ma ustwione GATE=EXTERNAL
Niestety , nie ma takiej możliwości.Timer0 jest "bramkowany" stanem niskim
na
wej. INT0 .
Faktycznie, ale w chyba w 89s52 jest wejscie ~INT0 takze sygnał jest
negowany juz na wejsciu i w efekcie wszystko sie zgadza, stan wysoki z
generatora to stan niski na wejsciu uC. Nastepnie na generatorze stan niski
i wywołujemy obsługę INT0
"Tmp3=Counter0" ,
a potem "Shift Tmp3,Left,1" zamiast matematyki ?
Nie wiedziałem, że coś takiego jest.
To zajmuje mniej pamięci programu i jest szybsze.
Zapamietam
Szczerze mówiąc to nie wiem czy powinienem używać instrukcji start i
stop
timer.
Nie musisz , wystarczy raz wystartować.
Poza tym czy po instrukcji stop timer, a nastepnie start zaczyna od
nowa zliczac od 0 ??
Jedynie reset sprzętowy zeruje liczniki lub zapisanie zer do liczników.
Czyli powinienem zapisywac zera do liczników, racja ??
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 ;).
Właściwie to tylko mam zasymulować użycie uC jako miernika częstotliwości.
Sam sobie dobieram częstotliwość kwarcu, a co za tym idzie maksymalną
częstotliwość do zmierzenia.
Co do tego mierzenia z uzyciem INT1, to jednak chyba mi sie nie przyda, bo
jak pisałem wejścia INT0 i INT1 są zanegowane w uC, także mierze długość
trwania stanu wysokiego, no ew. zeby jeszcze patrzyć na czas zanegowanego
sygnału na INT1, a potem je dodać. Tylko że wtedy musiałbym chyba zrobić
założenie że sygnał zawsze zaczyna sie od stanu wysokiego podawanego na
~INT0.
> Pozdrawiam
Piotrek Sz.
Pozdrawiam,
Terespl
From: "Piotrek Sz." <zumek.SKASUJ_at_nospam_gazeta.pl>
Subject: Re: Pomiar czestotliwosc - Bascom
Date: Sat, 8 Jan 2005 23:53:54 +0000 (UTC)
Teres <teresUSUNTO_at_nospam_WYTNIJTOpoczta.fm> napisał(a):
Faktycznie, ale w chyba w 89s52 jest wejscie ~INT0 takze sygnał jest
negowany juz na wejsciu i w efekcie wszystko sie zgadza, stan wysoki z
generatora to stan niski na wejsciu uC. Nastepnie na generatorze stan niski
i wywołujemy obsługę INT0
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".
Co do tego mierzenia z uzyciem INT1, to jednak chyba mi sie nie przyda, bo
jak pisałem wejścia INT0 i INT1 są zanegowane w uC, także mierze długość
trwania stanu wysokiego, no ew. zeby jeszcze patrzyć na czas zanegowanego
sygnału na INT1, a potem je dodać. Tylko że wtedy musiałbym chyba zrobić
założenie że sygnał zawsze zaczyna sie od stanu wysokiego podawanego na
~INT0.
Nie zrozumiałeś o co mi chodzi :(
Przerwanie INT1 nie ma nic mierzyc , tylko odczytać Timer0.
Pozdrawiam
Piotrek Sz.
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
From: "Teres" <teresUSUNTO_at_nospam_WYTNIJTOpoczta.fm>
Subject: Re: Pomiar czestotliwosc - Bascom
Date: Sun, 9 Jan 2005 16:25:42 +0100
Użytkownik "Piotrek Sz." <zumek.SKASUJ_at_nospam_gazeta.pl> napisał w wiadomości
news:crprqi$jvb$1_at_nospam_inews.gazeta.pl...
Teres <teresUSUNTO_at_nospam_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".
Tak jest w pdf:
GATE When TRx (in TCON) is set and GATE = 1, TIMER/COUNTERx will run only
while INTx pin is high (hardware control).
When GATE = 0, TIMER/COUNTERx will run only while TRx = 1 (software
control).
A tak na innej stronie:
GATE0 When this bit is set the timer will only run when INT0 (P3.2) is high.
When this bit is clear the timer will run regardless of the state of INT0.
Więc wynika z tego że przy Gate=External timer działa tylko przy INT0 =
high.
Co do tego mierzenia z uzyciem INT1, to jednak chyba mi sie nie przyda,
bo
jak pisałem wejścia INT0 i INT1 są zanegowane w uC, także mierze długość
trwania stanu wysokiego, no ew. zeby jeszcze patrzyć na czas
zanegowanego
sygnału na INT1, a potem je dodać. Tylko że wtedy musiałbym chyba zrobić
założenie że sygnał zawsze zaczyna sie od stanu wysokiego podawanego na
~INT0.
Nie zrozumiałeś o co mi chodzi :(
Przerwanie INT1 nie ma nic mierzyc , tylko odczytać Timer0.
Hmm sam nie wiem, moze faktycznie nie zakapowałem, w sumie wyobrazalem sobie
to tez tak:
stan wysoki na INT0 , zanegowany na INT1 - licznik T0 zlicza czas
stan sie zmienia
stan niski na INT0, stan wysoki na INT1 - licznik T1 zaczyna zliczac, T0
przestał
..... bez sensu ;-)
Hmm czyli zostaje taka opcja mierzenie czasu trwania stanu wysokiego na INT0
(TR0) a potem INT1 do wywołania przerwania, tylko wydaje mi się że to
przerwanie można spokojnie robić przy pomocy INT0.
Pozdrawiam
Piotrek Sz.
Pozdrawiam,
Teres
From: "Piotrek Sz." <zumek.SKASUJ_at_nospam_gazeta.pl>
Subject: Re: Pomiar czestotliwosc - Bascom
Date: Sun, 9 Jan 2005 18:49:26 +0000 (UTC)
Teres <teresUSUNTO_at_nospam_WYTNIJTOpoczta.fm> napisał(a):
..
Więc wynika z tego że przy Gate=External timer działa tylko przy INT0 =
high.
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
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
From: "Teres" <teresUSUNTO_at_nospam_WYTNIJTOpoczta.fm>
Subject: Re: Pomiar czestotliwosc - Bascom
Date: Sun, 9 Jan 2005 20:18:20 +0100
Użytkownik "Piotrek Sz." <zumek.SKASUJ_at_nospam_gazeta.pl> napisał w wiadomości
news:crrubm$c2d$1_at_nospam_inews.gazeta.pl...
Teres <teresUSUNTO_at_nospam_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ć ;)
Pewnie literówka w książce, zdarza sie czasem
By odkupić winy ...
..
Dzieki, prawie sobie poradziłem, tylko nie wiedziałem ze licznik trzeba od
nowa startować
Start Timer0 'trzeba wystartować Timer ,ponieważ przy operacjach na
Counter0
'licznik jest zatrzymywany
Return
Myślę , że powinno być OK.
Jeszcze raz dzięki, program napisany.
Pozdrawiam
Piotrek
Pozdrawiam,
Teres