AVR: obsluga LCD zakloca INT2

Nov 24, 2004 11 Replies

Witam,



Mam procesor Atmel AVR ATmega16. Na INT0, INT1 i INT2 podawane sa sygnaly synchronizacyjne. Procedura obslugi kazdego z przerwan inkrementuje liczniki. Liczniki dla INT0 i INT1 chodza ok. 2 razy wolniej niz dla INT2. Wszystkie przerwania powstaja po wykryciu zbocza rosnacego. Zauwazylem, ze prace INT2 zakloca obsluga wyswietlacza LCD. INT2 to PB2. LCD wykorzystuje PB1, PB3, PB4, PB5, PB6, PB7. Gdy w programie glownym, zrobie zmienna, ktorej wartosc jest zwiekszana i dopiero po osiagnieciu pewnej jej wartosci LCD jest odswiezany, licznik dla INT2 pokazuje wartosc zblizona do pozostalych - generalnie, im rzadziej odswiezam zawartosc LCD, tym licznik dla INT2 dziala podobniej do pozostalych. W mojej bibliotece obslugi LCD uzywam wylacznie sbi i cbi -- nie odwoluje sie do portu poprzez PORTB=, PORTB|=, PORTB&=~, itp.



Co moze byc przyczyna takiego zachowania?



Vicky.



U¿ytkownik "Vicky" snipped-for-privacy@hotmail.com napisa³ w wiadomo¶ci news:co2qr0$r95$ snipped-for-privacy@nemesis.news.tpi.pl...

INT2 dzia³a asynchronicznie (w przeciwieñstwie do pozosta³ych). Jak± impedancjê wyj¶ciow± ma ¼ród³o, z którego sterujesz tym wej¶ciem? Byæ mo¿e indukuj± Ci siê tam wystarczaj±co d³ugie (50ns) zak³ócenia. A mo¿e cbi i sbi tak ¶miesznie dzia³a? Spróbuj zast±piæ je bezpo¶rednim zapisem portów.

Pzdr, Raf.

Co do zrodla, to raczej to nie jest problemem. Uzywalem dwoch roznych generatorow i na obu to samo (jeden z nich byl na innym procesorze AVR). Poprzednio pisalem do LCD poprzez bezposredni zapis do portow (PORTB=, PORTB|=, PORTB&=). Mialem takie same problemy. Pomyslalem, ze to moze byc przyczyna, dlatego zrobilem biblioteke z sbi i cbi -- nic nie pomoglo. Gdy odswiezam LCD raz na 2 sek. wszystkie liczniki dzialaja identycznie. Im szybciej odswiezam LCD, tym gozej (trzeci licznik przyspiesza). Nie mam pojecia co jest przyczyna. Chyba przeniose LCD na inny port.

Vicky.

U¿ytkownik "Vicky" snipped-for-privacy@hotmail.com napisa³ w wiadomo¶ci news:co320v$bqr$ snipped-for-privacy@atlantis.news.tpi.pl...

A próbowa³e¶ mo¿e na innym egzemplarzu? Je¶li to nie wina Twojego uk³adu, to musi byæ w oprogramowaniu. Sprawdzi³em ni¿ej do³±czony program (na ATmega16) i dzia³a poprawnie (liczy³em impulsy zegarowe klawiatury PS/2).

Pzdr, Raf.

.ORG 0x00 jmp Reset .ORG INT2addr jmp Int2_handler

Reset: ldi R17, high(RAMEND) ldi R16, low(RAMEND) out SPH, R17 out SPL, R16

rcall Ini_LCD rcall Czysc_LCD

in R16, GICR sbr R16, (1<<INT2) out GICR, R16

ldi R16, (1<<INTF2) out GIFR, R16

ldi R16, ~(1<<2) out DDRB, R16

clr R20

sei

Petla: ldi R18, 200 Petla_czekaj: ldi R16, 100 rcall Czekaj_us ; t = 1 ms

in R16, PORTB ldi R17, ~(1<<2) eor R16, R17 out PORTB, R16

dec R18 brne Petla_czekaj

rcall Czysc_LCD mov R16, R20 rcall Pokaz_bajt_LCD

rjmp Petla

Int2_handler: push R16 in R16, SREG push R16

inc R20

pop R16 out SREG, R16 pop R16 reti

Wed, 24 Nov 2004 23:29:19 +0100, na pl.misc.elektronika, Vicky napisał(a):

BTW - czy to avrgcc ? Z włączoną optymalizacją -Os kompilator robi Ci to sam :

PORTB |= _BV(PB1); 8: c1 9a sbi 0x18, 1 ; 24 PORTB &= ~_BV(PB1); a: c1 98 cbi 0x18, 1 ; 24

Probowalem tez na innym egzemplarzu - efekt podobny. Dzis jakos inaczej to dziala niz wczoraj. Czasem po wlaczeniu zasilania liczniki ida tak samo (mimo, ze wyswietlacz jest odswiezany non-stop), a czasem trzeci dziala nieznacznie szybciej.

Vicky.

Zrobilem w generatorze opoznienie - po wlaczeniu odczekuje ok. 3 sek. i dopiero potem generuje impulsy. Zauwazylem, ze po wlaczeniu zasilania (mimo, ze generator jeszcze nie zaczal nic generowac) licznik od INT2 ma jakas wartosc (na ogol 0, ale czasem ok. 30, 700, 900 - roznie). Stad potem pewnie te rozbieznosci we wskazaniach. Ale jeszcze nie wiem, skad to sie bierze -- jakies zaklocenia.

Vicky.

Problem chyba rozwiazany. Gdy podlacze oscyloskop do PB2, dziala wszystko idealnie. Gdy odlacze oscyloskop, od razu wariuje. Zatem trzeba jakis kondensator podpinac. Na razie moj uklad, to pajak. Dlatego tez moga powstawac zaklocenia (dlugie kable, byle jak podlaczone).

Vicky.

Vicky snipped-for-privacy@hotmail.com napisał(a):

A włączyłeś pullup-a na PB2 ???

Pzdr. Piotrek Sz.

Thu, 25 Nov 2004 10:37:42 +0100, na pl.misc.elektronika, Vicky napisał(a):

-O2 jeszcze optymalizuje. Dopiero przy wyłączonej (-O0) przestaje :

PORTB |= _BV(PB1); 8: 80 91 38 00 lds r24, 0x0038 c: 82 60 ori r24, 0x02 ; 2 e: 80 93 38 00 sts 0x0038, r24 PORTB &= ~_BV(PB1); 12: 80 91 38 00 lds r24, 0x0038 16: 8d 7f andi r24, 0xFD ; 253 18: 80 93 38 00 sts 0x0038, r24

Jak to uzyskac?

Ustawic PB2 jako wejscie i zrobic sbi(PORTB, PB2)?

Vicky.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required