Vicky
Guest
Wed Nov 24, 2004 8:19 pm
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.
Rafal Baranowski
Guest
Wed Nov 24, 2004 8:56 pm
Użytkownik "Vicky" <vickyBADMAIL@hotmail.com> napisał w wiadomości
news:co2qr0$r95$1@nemesis.news.tpi.pl...
Quote:
(...)
Co moze byc przyczyna takiego zachowania?
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.
Vicky
Guest
Wed Nov 24, 2004 10:29 pm
Quote:
Co moze byc przyczyna takiego zachowania?
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.
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.
Rafal Baranowski
Guest
Thu Nov 25, 2004 12:38 am
Użytkownik "Vicky" <vickyBADMAIL@hotmail.com> napisał w wiadomości
news:co320v$bqr$1@atlantis.news.tpi.pl...
Quote:
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.
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
Jurek Szczesiul
Guest
Thu Nov 25, 2004 7:01 am
Wed, 24 Nov 2004 23:29:19 +0100, na pl.misc.elektronika, Vicky napisał(a):
Quote:
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.
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
--
Pozdrowienia
Jurek Szczesiul
Vicky
Guest
Thu Nov 25, 2004 9:37 am
Quote:
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
Mam WinAVR z opcja O2.
Vicky.
Vicky
Guest
Thu Nov 25, 2004 10:56 am
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.
Vicky
Guest
Thu Nov 25, 2004 11:38 am
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.
Vicky
Guest
Thu Nov 25, 2004 12:03 pm
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.
Piotrek Sz.
Guest
Thu Nov 25, 2004 3:01 pm
Vicky <vickyBADMAIL@hotmail.com> napisał(a):
Quote:
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.
A włączyłeś pullup-a na PB2 ???
Pzdr.
Piotrek Sz.
--
Wysłano z serwisu Usenet w portalu Gazeta.pl ->
http://www.gazeta.pl/usenet/
Jurek Szczesiul
Guest
Thu Nov 25, 2004 3:59 pm
Thu, 25 Nov 2004 10:37:42 +0100, na pl.misc.elektronika, Vicky napisał(a):
Quote:
PORTB |= _BV(PB1);
8: c1 9a sbi 0x18, 1 ; 24
PORTB &= ~_BV(PB1);
a: c1 98 cbi 0x18, 1 ; 24
Mam WinAVR z opcja O2.
-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
--
Pozdrowienia
Jurek Szczesiul
Vicky
Guest
Thu Nov 25, 2004 9:06 pm
Quote:
A włączyłeś pullup-a na PB2 ???
Jak to uzyskac?
Ustawic PB2 jako wejscie i zrobic
sbi(PORTB, PB2)?
Vicky.