Skocz do zawartości

Attiny2313, Licznik impulsów i Bascom


Pomocna odpowiedź

Witam! Pracuję nad podobnym projektem, w moim przypadku zachodzi potrzeba mierzenia częstotliwości sygnałów z hallotronu. Pierwotnie chciałem mierzyć zbocze z czujnika szerokopasmowego za pomocą Timer1 ale okazało się, że czujnik ma zbyt dużą bezwładność i nie nadaje się do pomiarów częstotliwości. Muszę użyć czujnika dwustanowego a Timera0 nie można "wytaktować" poprzez Low Level.

czy komuś udało się zrobić miernik częstotliwości na INT0?

wydaje mi się, że pomiar za pomocą INT0 (Low Level) jest z góry skazany na niepowodzenie, ponieważ utrzymywanie niskiego stanu na INT0 będzie interpretowane jako polecenie ciągłego wykonywania przerwania (przy szerokich przerwach w impulsach przerwanie nie wykona się tylko podczas zmiany stanu na niski a wykona się kilkakrotnie podczas jednego okresu gdy sygnał będzie w stanie niskim). Inaczej jest ze zboczami, gdzie przerwanie zostanie wykonane raz, podczas zmiany stanu.

Po skoku do programu zatrzymać przerwanie INTx (disable)i odczytać ilość zliczonych impulsów z enkodera i zerować zmienną a nastepnie puścić go znowu(enable)

Mówisz o podprogramie obsługi przerwania? a po co w nim blokować przerwania skoro mikrokontroler sam zeruje flagę globalnego zezwolenia na przerwania?

Znalazłem brak w kodzie programu , a dokładnie nie skonfigurowane wyjście INT0.

Program nie działa jeszcze prawidłowo.

Może ktoś sprawdzi ten program na swoim uC .

Kompilator nie widzi żadnych błędów w poprawności składni , lecz program nie działa.

11,0592 Mhz

Dla czego ATTiny2313 taktujesz takim dziwacznym zegarem, spokojnie to na 8MHz zrobić się (F impulsów ~480KHz MAX, znaczy się 480K obrotów/sek).

Inna sprawa, jak to zrobić? Jeżeli nie musisz dekodować kierunku obrotów (w lewo czy prawo) to wystarczy ci zwykły miernik częstotliwości zrobiony na Timer 1, ale powinien on dokonywać pomiaru co 1/4 sek, a to dla tego aby wynik aktualizował się w miarę sensownie. 1sek to jednak strasznie dużo jak na pomiar obrotów, a zakładam że chcesz mieś w miarę dynamiczny pomiar wraz ze zmianą obrotów. Może się okazać że nawet trzeba będzie robić 10 pomiarów na sek.

Ja robiłem licznik impulsów na Tiny2313, ale do maszyny i na LEDach, a konkretnie przerabiałem kit Jabola.

To już jest moja wersja softu, oryginał i tak się do niczego nie nadawał.

Do zliczania ma być używany timer0 i wejscie INT0 lub INT1.

O ile pamiętam to ten układ posiada wewnętrzny rezonator 8MHz wiec można go użyć zamiast 11,0592 MHz. Z preskalerem 64 i wpisywaną wartością 231 wyjdzie przerwanie co 0,2 ms.

Po sprawdzeniu problem nie leży w timerze0 ani w kwarcu tylko w zliczaniu impulsów INT0.

Napisałem prosty program:

Config Lcdpin = Pin , Db7 = Portd.0 , Db6 = Portd.1 , Db5 = Portd.2 , Db4 = Portd.4 , E = Portd.5 , Rs = Portd.6
Config Int1 = Falling
Config Pind.3 = Input

Dim A As Integer
Dim Wynik As Integer

On Int1 Licz
Enable Interrupts
Enable Int1

Wynik = 0
Cls
     Do

     Incr A
         If A = 1000 Then
         Disable Int1
         Lcd Wynik
         Waitms 500
         Wynik = 0
         Cls
         Enable Int1
         End If


  Loop

Licz:
Disable Int1
Incr Wynik
Enable Int1
Return


End

Program zlicza lecz znowu niewłaściwie. Częstotliwość podawanego sygnały zawierała się w przedziale 1 hz do 10 khz. Zmieniałem także szerokość impulsów szukając tam przyczyny.

Wątpię czy w ten sposób to zrobisz, lepiej jednak do tego użyć dodatkowy Timer, który będzie ci zliczał impulsy z zewnątrz w zadanym czasie. Chodzi o to że przerwanie INT może być podatne na zakłócenia (szczególnie w trybie wyzwalania zboczem), możesz popróbować jeszcze go po konfigurować, bo może on reagować na zbocze, lub na stan.

Spróbuj między GND a wejście INT dodać kondensator, taki 10-100pF.

Ostatecznie jeżeli nie możesz użyć do pomiaru innego pinu CPU to użyj Timer0 jako generator do próbkowania programowego tego pinu (portu gdzie jest INT0) z częstotliwością MIN 2,5x większą niż MAX F mierzone, wtedy będziesz mógł wykrywać i zliczać impulsy w miarę pewny sposób.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...