Sterowanie wyświetlacza VFD multipleksowo i RC5

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Awatar użytkownika
Tranzystor
Użytkownik
Posty: 889
Rejestracja: 28 sie 2005, 19:19
Lokalizacja: Świętochłowice
Kontakt:

Sterowanie wyświetlacza VFD multipleksowo i RC5

Post autor: Tranzystor » 27 lip 2008, 14:50

Witam,
mam problem z oprogramowaniem swojego zegara VFD w BASCOMie. Chodzi o to, że gdy procesor otrzymuje przerwanie z odbiornika podczerwieni i rozkodowuje kod przez polecenie Getrc5 to wyświetlacz chwilowo przestaje pracować. Zdarza się jednak, że przy dłuższym przytrzymaniu cały układ się zawiesza i pozostaje tylko go zresetować. Lampa VFD sterowana jest przez Timer0, a pilot RC5 przez INT0 i Timer2. Do układu dochodzi jeszcze przerwanie INT1, które wywoływane jest co 1 sekundę.

Czy ktoś spotkał się z podobnym problemem i wie jak go rozwiązać :?:

Pozdrawiam ;)

Awatar użytkownika
radzio
Użytkownik
Posty: 573
Rejestracja: 07 gru 2004, 23:06
Lokalizacja: Sosnowiec
Kontakt:

Post autor: radzio » 27 lip 2008, 15:39

Z jaką częstotliwością przełączasz cyfry wyświetlacza? Ramka RC5 trwa ok 25ms, być może na czas jej odbioru blokowane są pozostałe przerwania. Możesz popróbować zmienić częstotliwość multipleksowania?

Awatar użytkownika
Tranzystor
Użytkownik
Posty: 889
Rejestracja: 28 sie 2005, 19:19
Lokalizacja: Świętochłowice
Kontakt:

Post autor: Tranzystor » 27 lip 2008, 17:18

Wyświetlacz ma 9 cyfr i jedną linijkę diod LED, czyli 10 kolumn. Chciałbym, aby wszystko było odświeżane z częstotliwością 100Hz, a więc Timer0 jest ustawiony na ok. 1kHz. Szczerze mówiąc nie wiem co jest nie tak, ale twierdzę, że procedura odczytu kodu RC5 blokuje mi wszystkie przerwania. Wszystkie moje przerwania działają tak, że blokowane jest tylko przerwanie, które przed chwilą odebrano. Chciałbym podobnie zrobić w tej procedurze RC5, ale chyba nie jest to za bardzo możliwe.

Tylko czemu przy dłuższym przytrzymaniu zegar się blokuje :?: Dzieje się to tylko czasem, jednak denerwujące są błędy pojawiające się na wyświetlaczu, zamiast 2 pojawia się np. 6.

Pozdrawiam ;)

Jasam
Użytkownik
Posty: 422
Rejestracja: 27 mar 2007, 21:09

Post autor: Jasam » 27 lip 2008, 19:36

Może ten wyjątek z manuala Bascoma coś wyjaśni:
"W czasie działania funkcji używany jest licznik TIMER0 i związane z nim przerwanie. Licznik
ten jest służy do generacji wymaganych opóźnień podczas próbkowania sygnału. TIMER0 może być
dalej używany przez program, lecz należy się liczyć z wynikłymi opóźnieniami, gdy wykonywana
będzie funkcja GETRC5().
Jest tylko jeden warunek: przerwania licznika TIMER0 nie mogą być
używane."
Myślę, że właśnie o to chodzi. Też miałem z tym problemy. funkcja getrc5 jest "czasożerna" i zatrzymuje program na czas jej wykonywania o ile możemy się zorientować. Do VFD uzywasz też timera0, który jest wykorzystywany przez getrc5 więc musisz "liczyć się z opóźnieniami" jak piszą.

Awatar użytkownika
Tranzystor
Użytkownik
Posty: 889
Rejestracja: 28 sie 2005, 19:19
Lokalizacja: Świętochłowice
Kontakt:

Post autor: Tranzystor » 27 lip 2008, 20:22

Doczytaj dalej o GETRC5. Ja wcześniej skonfigurowałem GETRC5, aby wykorzystywał Timer2. Tak by w ogóle nic nie działało.

Pozdrawiam ;)

Jasam
Użytkownik
Posty: 422
Rejestracja: 27 mar 2007, 21:09

Post autor: Jasam » 27 lip 2008, 20:29

Możliwe, ale funkcja getrc5 przy każdym wywołaniu wprowadza opóźnienie, którego cięzko będzie uniknąć. Przy każdym wywołaniu funkcji nastąpi opóźnienie najwidoczniej spowodowane przerwaniami zegarowymi astosowanymi do odmierzania czasu. Nie mam na razie pomysłu jak to ominąć, ale pracuje teraz nad czymś podobnym i też chcę znaleśc wreszcie rozwiązanie. Co do źródła przerwań to wiedziałem, że może pracować także z timerem drugim bo też z niego korzystam. A nie sprecyzowałeś tego na wstępie.

Awatar użytkownika
Tranzystor
Użytkownik
Posty: 889
Rejestracja: 28 sie 2005, 19:19
Lokalizacja: Świętochłowice
Kontakt:

Post autor: Tranzystor » 27 lip 2008, 20:34

Oj jak nie jak tak?

Kod: Zaznacz cały

...pilot RC5 przez INT0 i Timer2...
Wiem, ze wprowadza opóźnienie. A raczej blokuje przerwania i tu jest problem, tzreba by było napisać całą procedurę od nowa. Z tym, że komu się chce :?: Będę jeszcze kombinował, ale co z tego wyjdzie to sam nie wiem...

Pozdrawiam :)

Jasam
Użytkownik
Posty: 422
Rejestracja: 27 mar 2007, 21:09

Post autor: Jasam » 27 lip 2008, 20:48

Właśnie dlatego getrc5 nie wydaje się takie przyjemne jak przy pierwszym użyciu. Myślałem, że łatwiej to będzie wyeliminować wtedy ale teraz już myślę inaczej niestety. Jeśli to zegar to nie możesz klasycznych przycisków zastosować?

Awatar użytkownika
Tranzystor
Użytkownik
Posty: 889
Rejestracja: 28 sie 2005, 19:19
Lokalizacja: Świętochłowice
Kontakt:

Post autor: Tranzystor » 27 lip 2008, 21:13

Klasyczne przyciski też są, ale pilot ma być uatrakcyjnieniem. Znam ludzi, którzy korzystają z budzika, a są schorowani i z łóżka nie wychodzą, jak oni mają takim budzikiem sterować :?: A właśnie robie ten zegar z myślą o tej osobie...

No cóż, najwyżej czeka mnie przygoda z asemblerem... Może samemu napiszę obsługę RC5, albo coś wykombinuję...

Pozdrawiam ;)

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 27 lip 2008, 21:44

Nie wiem co tu ma assembler do rzeczy, po prostu ci się priorytety przerwań gryzą, zobacz sobie w datasheetcie jakie przerwanie jaki ma priorytet.

Awatar użytkownika
Tranzystor
Użytkownik
Posty: 889
Rejestracja: 28 sie 2005, 19:19
Lokalizacja: Świętochłowice
Kontakt:

Post autor: Tranzystor » 27 lip 2008, 21:58

Nic mi się nie gryzie, bo jakoś trzy przerwania chodzą, dopiero jak GETRC5 wejdzie się wszystko psuje. Asembler mi pomoże, ponieważ napiszę obsługę bez blokowania przerwań. Wtedy zadziała...

ODPOWIEDZ