czy przez rezystor wywołam przerwanie?

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!
Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

czy przez rezystor wywołam przerwanie?

Post autor: matrix » 19 paź 2009, 9:13

mam takie pytanie. jest układ A na wyjściu którego jest poziom niski, a stanem aktywnym jest poziom wysoki, raczej 12V. wyjście to ma mi wywołać przerwanie INT0.
czy podpinając ten układ do procesora tiny 2313 powinienem zastosować konwerter napięcia w postaci jak na rysunku B?
(to by było raczej logiczne żeby nie skotłować procka)

czy raczej powiniem skonfigurować wejście INT0 żeby reagowało na poziom wysoki?

Kod: Zaznacz cały

Config Int0 = High Level
czy rezystor w obwodzie kolektora tranzystora w układzie B wywoła mi przerwanie?
czy przerwaniem musi być "czysty" poziom niski?
Załączniki
rezystor a przerwanie.JPG

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

Post autor: snow » 19 paź 2009, 10:45

Na pewno musisz przejść na 5V. INT0 i tak musisz ustawić na reagowanie albo na zbocze albo na poziom więc nie bardzo rozumiem pytanie:
matrix pisze:czy raczej powiniem skonfigurować wejście INT0 żeby reagowało na poziom wysoki?

alaris
Użytkownik
Posty: 530
Rejestracja: 21 lut 2006, 14:56
Lokalizacja: Gorzow/Poznan

Post autor: alaris » 19 paź 2009, 10:51

Na pewno musisz przejść na 5V
Niekoniecznie. Porty AVR maja diody zabezpieczajace, a napiecie 12V jest podawane przez rezystor 10k, ktory znaczaco ograniczy prad. Powinno dzialac. Jednakze nie jest to rozwiazanie zgodne z regulami sztuki i powinno byc jakies dodatkowe zabezpieczenie. Jezeli dolaczysz Zenerke 5V1 do portu uK to bedzie OK.

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 19 paź 2009, 11:32

snow pisze:INT0 i tak musisz ustawić na reagowanie albo na zbocze albo na poziom więc nie bardzo rozumiem pytanie:
a co za różnica? zwykle przerwanie reaguje na poziom niski więc dla mnie nie ma to znaczenia czy poziom czy zbocze. a jak to rozróżnić? jaka jest dyrektywa ustawiania przerwania zboczem lub poziomem? jak to wygląda?

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

Post autor: snow » 19 paź 2009, 12:26

Zboczem wyzwoli raz w momencie jego wystąpienia. Poziomem jeżeli będzie dany poziom panował dłużej niż obsługa przerwania to będzie przerwanie wykonywane kilka razy. Przykładowo jak chcesz w przerwaniu zwiększać zmienną to dopóki będziesz miał dany stan to będzie stale zwiększana, natomiast przy wyzwoleniu zboczem (np. naciśnięcie przycisku i jego przytrzymanie) jedynie raz.

Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 19 paź 2009, 12:39

Cześć To zależy bo jak ustawisz na poziom niski to przerwanie będzie generowane tak długo jak ten stan niski tam występuje. a jak zboczem no to raz chyba ze sygnał się znowu zmieni.

W bascomie piszesz config int0 lub int1=falling czyli opadające lub rising rosnące.
Sa to bity w rejestrze MCUCR dla int0 to bit 0 do bit 1 nazwa ISC00 i drugi to ISC01
Dla int1 to bity ISC10 i ISC11

Popatrz na to mam nadzieje ze lin działa to jest najlepsze wytłumaczenie szkoda ze stary typ procków: AT90S2313
http://web.archive.org/web/200502110826 ... yinta.html
Po prawej jak najedziesz na additional expenation będziesz maił dokładnie opisane jakie warunki muszą być spełnione.
Zobacz na stronę 63 PDF-a od attiny 2313.
Widzę snow że mnie wyprzedziłeś

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 19 paź 2009, 16:40

a jeśli program będzie skonstruowany w ten sposób? nazwa licznik będzie przypisana do wyprowadzenia portu B.7, czyli jak na B.7 podam stan niski to program wywoła tylko raz etykietę wybór przy nacisnięciu przycisku? nadmienię tylko że w dalszej części wywoływane są etykiety które mają kilkusekundowe opóźnienia, więc nawet jeśli przycisk podpięty do portu B.7 będzie naciskany dłużej niż 1s to nie będzie miało to znaczenia dla programu?

wspomnę tylko że cały program to soft do sterowania bramą wjazdową, drzwiami garażowymi itp. posiada on wiele funkcji, między innymi zabezpieczające przed zamknięciem się bramy gdy stoi w niej pojazd.

Kod: Zaznacz cały

do
      if licznik = 0 then
        call wybor
      end if
    loop

wybor:                     'zlicza ile razy nacisnieto przycisk na pilocie
incr x
set licznik
        if x = 1 then      'jesli raz to wezwij program do zamykania bramy
         call otwieram
        end if
        if x = 2 then      'jesli drugi raz nacisnieto to zatrzymuje brame
         call stopuje
        end if
        if x = 3 then      'jesli nacisnieto trzeci raz to wzywam podprogram zamykania beamy
         call zamykam
        end if
        if x = 4 then      'jesli przycisk nacisniety poraz czwarty to zatrzymuje brame
         set spza
         set slza
         x = 0
        end if
return

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

Post autor: snow » 19 paź 2009, 17:02

Przerwania są nadrzędne nad programem.

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 19 paź 2009, 17:07

snow pisze:Przerwania są nadrzędne nad programem.
tak to wiem, ale o co innego biega. powiedzmy że do portu B.7 mam podpięty przycisk który zwiera mi ten pin do masy. a pętla główna programu wygląda jak wyżej. to spełnienie warunku

Kod: Zaznacz cały

if PINB.7 = 0 then
        call wybor
      end if
wywoła mi tylko raz etykietę WYBÓR? choć procek w teorii sprawdził by wyprowadzenie portu B.7 tysiące razy, ale wezwanie etykiety WYBÓR na to nie pozwoli, bo w dalszej części są opóźnienia rzędu kilku sekund. w symulacji wszystko działa.

a na marginesie jak zwolnić trochę symulację? bo gubi mi linie programu.

[ Dodano: 2009-10-19, 18:28 ]
Pikczu pisze:Wykona się wszytko na raz popatrz na to jak na PB.7 będzie stan niski to skacze do call wybór -> potem jest incr x i teraz ustawiasz licznik na set czyli znowu zaczynasz od nowa jak byś miał na PB.7 stan 0 wiec x sie zwiększy kolejny raz itd.
a ja to widzę inaczej i symulacja pokazuje mi to tak jak widzę to ja, czyli tak:

naciskam przycisk podpięty do PB.7, skaczę do WYBÓR, w wyborze zwiększam wartość zmiennej pomocniczej X z 0 na 1 i dalej program sprawdza mi ile wynosi wartość zmiennej X i po raz kolejny skacze dalej. dalej w etykiecie OTWIERAM jest kilka opóźnień o łącznej wartości 1sek. przy czym w etykiecie b]OTWIERAM[/b] jest pętla DO...LOOP która nie pozwala mi wyjść do póki nie nacisnę ponownie przycisku podpiętego do PB.7 albo nie spełni mi warunku gdzie na innych wyprowadzeniach procka pojawi się stan niski.

Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 19 paź 2009, 17:50

Pisałem w odniesieniu do tego co pisałeś ze licznik = pinb.7 a potem miałeś set licznik ale to ustawiało portb.7 =1 ale to to samo co robiły pull up i znowu się zapętlało.
Później post usunąłem bo ty zmieniłeś to na if pinb.7=0

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 19 paź 2009, 17:55

Pikczu pisze:post usunąłem bo ty zmieniłeś to na if pinb.7=0
bo chciałem żeby było jasniej. a jeśli przy konfiguracji napiszę:

Kod: Zaznacz cały

licznik alias pinb.7
a później:

Kod: Zaznacz cały

if licznik=0 then
call wybor
end if
to będzie żle?

Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 19 paź 2009, 18:12

Będzie dobrze ale nie wiem czy nie lepiej dać debounce będziesz miał pewność co do drgania styków.

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 19 paź 2009, 18:21

Pikczu pisze:nie wiem czy nie lepiej dać debounce będziesz miał pewność co do drgania styków
dobra to jak pokaże trochę więcej kodu to zobaczysz że nie potrzebna eliminacja drgania styków.
wyjaśnię tylko że skrót CLOT to czujka lewej połowy zwiera mi wyprowadzenie procka do masy jak otworzy się lewa połowa bramy i analogicznie CLZA to czujka która zwiera mi wyprowadzenie procka jak połówka bramy się zamknie.

zauważ że w etykiecie OTWIERAM jest kolejna pętla DO...LOOP która pozwoli mi na wyjście z niej jak spęłnię określone warunki, więc w pętli głównej programu procek tylko raz zareaguje mi na naciśnięcie przycisku.

Kod: Zaznacz cały

do
      if licznik = 0 then 'jesli nacisne przycisk to
        call wybor          'wzywam podprogram wybor
      end if
    loop

wybor:                     'zlicza ile razy nacisnieto przycisk na pilocie
incr x
set licznik
        if x = 1 then      'jesli raz to wezwij program do zamykania bramy
         call otwieram
        end if
        if x = 2 then      'jesli drugi raz nacisnieto to zatrzymuje brame
         call stopuje
        end if
        if x = 3 then      'jesli nacisnieto trzeci raz to wzywam podprogram zamykania 
         call zamykam
        end if
        if x = 4 then      'jesli przycisk nacisniety poraz czwarty to zatrzymuje brame
         set spza
         set slza            'i resetuje zmienna pomocnicza X
         x = 0
        end if
return


otwieram:          'poprogram otwierania bramy
set slot
set spot
set slza
set spza
do
 if clot = 0 then  'sprawdzam czy lewa połowa bramy otworzyla sie
  set slot            'wylaczam otwieranie lewej polowy
   else
  reset slot          'w przeciwnym razie zalaczam go
 end if
 if cpot = 0 then  'sprawdzam czy prawa polowa otworzyla sie
  set spot            'i wylaczam otwieranie prawej polowy
   else
  wait 1
  reset spot          'w przeciwnym razie zalaczam otwieranie
 end if
 if licznik = 0 then 'jesli nacisnieto przycisk nr1 na pilocie
  call wybor           'licz ile razy?
  exit do
 end if
  set clza               'ustawiam czujki zamknietej bramy do odczytu
  set cpza
 if clot = 0 then      'jesli obie polowy bramy otworzyly sie to
  if cpot = 0 then
   set slot               'wylaczam silniki otwierania
   set spot
   incr x
   exit do                'wychodze z petli
  end if
 end if
loop
return
Ostatnio zmieniony 19 paź 2009, 19:00 przez matrix, łącznie zmieniany 1 raz.

Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 19 paź 2009, 18:35

Najlepiej zaprogramój i testuj.
A zwolnic symulację możesz klikaj na step in to code albo F8.


Czekaj skompiluje ten twój kod ale muszę go najpierw dostosować żeby ruszył.

************dodane po czasie *******************
A gdzie tam jest początek tej drugiej pętli brakuje DO.
Załączniki
bas.jpg

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 19 paź 2009, 18:51

Pikczu, ale ja nie mam czegoś takiego. nie wyświetla mi się tak. juz wim, trzeba je wpisać samemu.
Pikczu pisze:A gdzie tam jest początek tej drugiej pętli brakuje DO
usunęło się jak edytowałem żeby to było bardziej przejrzyste, juz dodaję.
chcesz cały soft do sprawdzenia?

ODPOWIEDZ