Aktyw Forum
Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.
Sprawdź punkty Zarejestruj sięTimery. Programik.
Moderatorzy:Jacek Bogusz, robertw, k.pawliczak, Moderatorzy
Słuchajcie. Mam dwa problemy,których wyjaśnienie dużo mi pomoże. Otóż piszę taki oto programik:
On TIMER1 Timer_1_int
Config TIMER1 = timer , gate = internal , mode = 1
enable TIMER1
enable INTERRUPTS
do
Debounce P1.0 , 0 , beep , sub
loop
beep:
reset P1.1
start TIMER1
return
'return
Timer_1_int:
set P1.1
return
W trybie(mode=2) załącza mi się wyjście P1.1 na czas zliczenia Timer1. W trybie(mode=1) wogóle nie generuje mi się przerwanie a przecież powinno po zliczeniu do coś około 65536. Jeszcze takie drugie pytanko: czy jeśli jest rozpoczęte zliczanie timera i ja w czasie jego zliczania drugi raz go uruchomię to on zacznie liczyć od początku, zignoruje ten rozkaz czy zacznie znowu liczyć jak skończy obecne zliczanie? Bardzo proszę o pomoc. Wydawało mi się, że timery nie sprawią mi kłopotów, ale w pewnych aplikacjach może tutaj popełniam błędy. Z góry dziękuję.
On TIMER1 Timer_1_int
Config TIMER1 = timer , gate = internal , mode = 1
enable TIMER1
enable INTERRUPTS
do
Debounce P1.0 , 0 , beep , sub
loop
beep:
reset P1.1
start TIMER1
return
'return
Timer_1_int:
set P1.1
return
W trybie(mode=2) załącza mi się wyjście P1.1 na czas zliczenia Timer1. W trybie(mode=1) wogóle nie generuje mi się przerwanie a przecież powinno po zliczeniu do coś około 65536. Jeszcze takie drugie pytanko: czy jeśli jest rozpoczęte zliczanie timera i ja w czasie jego zliczania drugi raz go uruchomię to on zacznie liczyć od początku, zignoruje ten rozkaz czy zacznie znowu liczyć jak skończy obecne zliczanie? Bardzo proszę o pomoc. Wydawało mi się, że timery nie sprawią mi kłopotów, ale w pewnych aplikacjach może tutaj popełniam błędy. Z góry dziękuję.
Re: Timery. Programik.
W sumie to nie widzę oczywistego błędu. Moze istotna jest kolejność poleceń a może brakuje zerowania Timera żeby wiedzial od czego liczyć. Dlaczego działa dla Mode=2 tego nie wiem. Może dlatego, że jest przeładowywany automatycznie po każdym przerwaniu.
Config TIMER1 = timer , gate = internal , mode = 1
On TIMER1 Timer_1_int
enable INTERRUPTS
enable TIMER1
do
Debounce P1.0 , 0 , beep , sub
loop
beep:
reset P1.1
Counter1=0 '<<<<<<< tu byl błąd. wcześniej wpisalem tu Counter0
start TIMER1
return
Timer_1_int:
set P1.1
return
PC
Config TIMER1 = timer , gate = internal , mode = 1
On TIMER1 Timer_1_int
enable INTERRUPTS
enable TIMER1
do
Debounce P1.0 , 0 , beep , sub
loop
beep:
reset P1.1
Counter1=0 '<<<<<<< tu byl błąd. wcześniej wpisalem tu Counter0
start TIMER1
return
Timer_1_int:
set P1.1
return
Jeżeli odpowiedni rejestr ma ustawiony bit na 1 bo timer chodzi to jak wpiszesz w niego znowu jeden to chyba nic się nie zmnieniJeszcze takie drugie pytanko: czy jeśli jest rozpoczęte zliczanie timera i ja w czasie jego zliczania drugi raz go uruchomię to on zacznie liczyć od początku, zignoruje ten rozkaz czy zacznie znowu liczyć jak skończy obecne zliczanie? Bardzo proszę o pomoc. Wydawało mi się, że timery nie sprawią mi kłopotów, ale w pewnych aplikacjach może tutaj popełniam błędy. Z góry dziękuję.
PC
Ostatnio zmieniony 5 sty 2005, o 19:51 przez pch, łącznie zmieniany 1 raz.
pch >> wpisywanie nowej wartosci do timera powinno sie odbywać procedurze jego przerwania. Aby generować dzwięk to raczej tu ma być TOGGLE.
Timer_1_int:
Counter1 = 65500
'sktócimy licznik do 36 cykli
Start Timer1
Toggle P1.1
Return
lukas >> Sprawdzałes na symulatorze czy działa? Moim zdaniem jest tu błąd w konstrukcji całego programu.
Timer_1_int:
Counter1 = 65500
'sktócimy licznik do 36 cykli
Start Timer1
Toggle P1.1
Return
lukas >> Sprawdzałes na symulatorze czy działa? Moim zdaniem jest tu błąd w konstrukcji całego programu.
Ostatnio zmieniony 5 sty 2005, o 19:57 przez ZbeeGin, łącznie zmieniany 2 razy.
Nie do końca się zgodzę z tym. Tu chodzi o skrócenie cyklu licznika.
Program trzeba przekonstruować. Jeśli naciśnie to start licznika, teraz jak trzymie klawisz to licznik działa i generuje przerwania - dzwięk. Po puszczeniu klawisza ma się licznik zatrzymać. Chyba, że kolega lukas chce by to był przycisk bistabilny.
Program trzeba przekonstruować. Jeśli naciśnie to start licznika, teraz jak trzymie klawisz to licznik działa i generuje przerwania - dzwięk. Po puszczeniu klawisza ma się licznik zatrzymać. Chyba, że kolega lukas chce by to był przycisk bistabilny.
Mi się wydawało, ze chodzi o wygenerowanie jednego dżwięku trwającego jeden cykl Timera. To, że potem timer się kręci to fakt należałoby go zatrzymać. W każdym razie podstawianie wartości do timera poza przerwaniem ma, moim zdaniem, kluczowe znaczenie choćby z tego powodu, że ustalamy stały odcinek czasu, po którym dźwięk ucichnie. Uzyskujemy w ten sposób dźwiek o okreslonej, stałej długości.
PC
PC
Właśnie. Próbowałem taki oto program. Zakładam, że używany jest zewnętrzny buzzer:
Na symulatorze prawie działa. Jest jednak małe ale. Instrukcja Debounce chyba używa TIMER1 do generacji opóźnień, gdyż stan licznika zmienia się ni z tąd ni z owąd. Wypada mi tylko sprawdzić jak wygląda wygenerowany kod w assemblerze.
Tym czasem proponuję zmienić TIMER1 na TIMER0 i spróbować ponownie.
Kod: Zaznacz cały
Config Timer1 = Timer , Gate = Internal , Mode = 1
On Timer1 Timer_1_int
Enable Timer1
Enable Interrupts
Do
Debounce P1.0 , 0 , Beep , Sub
Loop
Beep:
Reset P1.1
Timer1 = 65000
'skracam by nie czekać na symulacji :-)
Start Timer1
Return
'return
Timer_1_int:
Stop Timer1
Set P1.1
Return
Tym czasem proponuję zmienić TIMER1 na TIMER0 i spróbować ponownie.
Kod: Zaznacz cały
Config Timer1 = Timer , Gate = Internal , Mode = 1
On Timer1 Timer_1_int
Enable Timer1
Enable Interrupts
Do
Debounce P1.0 , 0 , Beep , Sub
Loop
Beep:
Reset P1.1
Counter1=0 '<<<<< tu zerowanie Timera1
Start Timer1
Return
'return
Timer_1_int:
Stop Timer1
Set P1.1
Return
PC
Właśnie. Próbowałem taki oto program. Zakładam, że używany jest zewnętrzny buzzer:
Na symulatorze prawie działa. Jest jednak małe ale. Instrukcja Debounce chyba używa TIMER1 do generacji opóźnień, gdyż stan licznika zmienia się ni z tąd ni z owąd. Wypada mi tylko sprawdzić jak wygląda wygenerowany kod w assemblerze.Kod: Zaznacz cały
Config Timer1 = Timer , Gate = Internal , Mode = 1 On Timer1 Timer_1_int Enable Timer1 Enable Interrupts Do Debounce P1.0 , 0 , Beep , Sub Loop Beep: Reset P1.1 Timer1 = 65000 'skracam by nie czekać na symulacji :-) Start Timer1 Return 'return Timer_1_int: Stop Timer1 Set P1.1 Return
Tym czasem proponuję zmienić TIMER1 na TIMER0 i spróbować ponownie.
Ludzie!! Jesteście beznadziejni!! Logiczną rzeczą jest i wie o tym nawet przedszkolak , że albo korzystasz z "gotowych" funkcji, jak np. "Beep" i nie dotykasz TIMER'ów albo bawisz się ręcznie na TIMER'ach.
Gdybyś pomyślał logicznie, to widziałbyś, że funcja Beep nie dziala w powietrzu, tylko musi na czymś się opierać. Prawda?
Więc nie wiem skąd się u Ciebie bierze zdziwnie, ze nagle zmienia się wartoś TIMER'a
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 5 gości