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.

lukas
-
-
Posty:22
Rejestracja:5 maja 2004, o 09:50
Timery. Programik.

Postautor: lukas » 3 sty 2005, o 11:11

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ę.

pch
-
-
Posty:23
Rejestracja:27 maja 2003, o 06:56
Lokalizacja:Gdańsk
Kontaktowanie:

Re: Timery. Programik.

Postautor: pch » 4 sty 2005, o 14:07

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

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ę.
Jeżeli odpowiedni rejestr ma ustawiony bit na 1 bo timer chodzi to jak wpiszesz w niego znowu jeden to chyba nic się nie zmnieni :wink:

PC
Ostatnio zmieniony 5 sty 2005, o 19:51 przez pch, łącznie zmieniany 1 raz.

Awatar użytkownika
ZbeeGin
-
-
Posty:170
Rejestracja:3 kwie 2003, o 10:10
Lokalizacja:Metropolia Katowice

Postautor: ZbeeGin » 5 sty 2005, o 19:47

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.
Ostatnio zmieniony 5 sty 2005, o 19:57 przez ZbeeGin, łącznie zmieniany 2 razy.

pch
-
-
Posty:23
Rejestracja:27 maja 2003, o 06:56
Lokalizacja:Gdańsk
Kontaktowanie:

Postautor: pch » 5 sty 2005, o 19:50

Nie ma znaczenia, gdzie się wpisuje wartość do timera za pomocą stuktury CounterX ponieważ zawiera ona w sobie polecenie zatrzymania tegoż timera.

PC

Awatar użytkownika
ZbeeGin
-
-
Posty:170
Rejestracja:3 kwie 2003, o 10:10
Lokalizacja:Metropolia Katowice

Postautor: ZbeeGin » 5 sty 2005, o 19:56

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.

pch
-
-
Posty:23
Rejestracja:27 maja 2003, o 06:56
Lokalizacja:Gdańsk
Kontaktowanie:

Postautor: pch » 5 sty 2005, o 20:01

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

Awatar użytkownika
ZbeeGin
-
-
Posty:170
Rejestracja:3 kwie 2003, o 10:10
Lokalizacja:Metropolia Katowice

Postautor: ZbeeGin » 5 sty 2005, o 20:07

Chyba się niezrozumieliśmy. Ty myślisz o sterowaniu zewmętrznego buzera, a ja myślę o generowaniu dźwięku przez mikrokontroler. Kolega lukas zapomniał podać założeń wstępnych tego programu. :|
Dlatego Trash in Trash out... :D

pch
-
-
Posty:23
Rejestracja:27 maja 2003, o 06:56
Lokalizacja:Gdańsk
Kontaktowanie:

Postautor: pch » 5 sty 2005, o 20:10

Wlasnie po napisaniu ostatniego posta uświadomiłem sobie to samo :lol: Ja się skupiłem na tym BEEP. Przyjąłem, że chodzi o sterowanie zewnętrznego buzzera.

PC

Awatar użytkownika
ZbeeGin
-
-
Posty:170
Rejestracja:3 kwie 2003, o 10:10
Lokalizacja:Metropolia Katowice

Postautor: ZbeeGin » 7 sty 2005, o 19:02

Właśnie. Próbowałem taki oto program. Zakładam, że używany jest zewnętrzny buzzer:

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
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.

pch
-
-
Posty:23
Rejestracja:27 maja 2003, o 06:56
Lokalizacja:Gdańsk
Kontaktowanie:

Postautor: pch » 7 sty 2005, o 19:07

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
Z tego co się orientuję to Debounce nie używa Timerów natomiast w Twoim programie brakuje zerowania Timera. Poprawiłem listing.

PC

Awatar użytkownika
ZbeeGin
-
-
Posty:170
Rejestracja:3 kwie 2003, o 10:10
Lokalizacja:Metropolia Katowice

Postautor: ZbeeGin » 7 sty 2005, o 19:12

Po co zerujesz? Ja chcę aby licnzik odliczył 536 impulsów i wygenerował przerwanie.
Jak go wyzerujesz to odliczy całe 65536 cykli!

pch
-
-
Posty:23
Rejestracja:27 maja 2003, o 06:56
Lokalizacja:Gdańsk
Kontaktowanie:

Postautor: pch » 7 sty 2005, o 19:15

Piszesz, że ci dziala chaotycznie. To wpisz jakąś wartość wtedy będzie działał powtarzalnie. Ja wpisałem 0 a ty możesz sobie wpisać co chcesz.

PC

Billy
-
-
Posty:25
Rejestracja:28 lis 2004, o 17:45
Lokalizacja:Wronki
Kontaktowanie:

Postautor: Billy » 14 sty 2005, o 22:52

Właśnie. Próbowałem taki oto program. Zakładam, że używany jest zewnętrzny buzzer:

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
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.

Ludzie!! Jesteście beznadziejni!! Logiczną rzeczą jest i wie o tym nawet przedszkolak :562: , ż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 :569:

pch
-
-
Posty:23
Rejestracja:27 maja 2003, o 06:56
Lokalizacja:Gdańsk
Kontaktowanie:

Postautor: pch » 15 sty 2005, o 09:03

Super, że ty jesteś taki zajebisty. Niestety w Bascomie nie ma funkcji BEEP!!. Lepiej przeczytaj 8x o czym jest ten post zamiast robić z siebie błazna.

PC

Awatar użytkownika
ZbeeGin
-
-
Posty:170
Rejestracja:3 kwie 2003, o 10:10
Lokalizacja:Metropolia Katowice

Postautor: ZbeeGin » 15 sty 2005, o 09:09

Beep może i niema ale jest Sound. Ale z nas Gandony... 8)

pch
-
-
Posty:23
Rejestracja:27 maja 2003, o 06:56
Lokalizacja:Gdańsk
Kontaktowanie:

Postautor: pch » 15 sty 2005, o 09:13

Wiem, że jest sound ale tu chyba jednak chodziło o sterowanie buzzera. Ty próbujesz wygenerować coś a'la sound a dla mnie to buzzer. Niestety autor wątku chyba zaginął.

PC

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 38 gości