Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Kategoria: Kamery IP / Alarmy / Automatyka Bram
Montersi
Kategoria: Akumulatorki / Baterie / Ładowarki

Dziwne zachowanie ATmegi 128

biedron2006 21 Maj 2011 11:54
  • #1 21 Maj 2011 11:54
    biedron2006
    Poziom 9  

    Witam wszystkich!
    Nurtuje mnie pewien problem z moją ATmegą. Mianowicie, wykonuje projekcik z ATmegą128 w roli głównej na płytce stykowej. Ze względu na dużą ilość Pinów, ATmega jest wlutowana w przejściówkę i poprzez goldpiny a następnie skrętkę podpięta do płytki stykowej, na której składam elektronikę. W związku z tym przewody od mikrokontrolera do płytki stykowej mają długość niecałe 40cm. Na płytce stykowej na której są wetknięte kable od pinów, znajdują się m.in. kondensatory 100nF (zasilanie AVR), szyna zasilająca przez stabilizator 5V.
    Całość działa na 8MHz, bo taki jest praktyczny maks dla płytek stykowych i o dziwo (takiego pająka jakiego stworzyłem) cały układ i program testowany jak dotąd działa, z tym, że są pewne niepokojące mnie objawy takie jak:
    1) wyobraźmy sobie tradycyjne przerwanie od INT2 (wyzwalane poziomem niskim) - jak na płytce wykonam zwarcie pinu z masą, aby wzbudzić przerwanie wówczas (średnio raz na 10 wykonanych takich powtórzeń) procesor się zawiesza, resetuje, albo wyrzuca krzaki na wyświetlacz LCD,
    2) inną ciekawą dolegliwością jest to, że jak wcisnę dowolny przycisk na klawiaturze 4x4 który wykonuje jakąś pętlę (czyli np. po przytrzymaniu klawisza "1" ma mi wracać w to samo miejsce, czyli na wyświetlaczu tylko widzimy migotanie, przez odświeżanie wyświetlacza) to po stałej czasowej zawsze się resetuje (zawsze po ok 5s) - zaznaczam, że mam wyłączonego watchdoga i JTAGA.
    3) ostatnią dziwną rzeczą jest to, że jak na klawiaturze 4x4 ( z czytywana przez skanowanie w pętli while() ) kilka razy wcisnę przycisk w dowolnej kolumnie inny niż bym chciał to mi wejdzie do podprogramu zdefiniowanego dla zupełnie innego przycisku ( zaznaczam, że tylko w obrębie tej samej kolumny, czyli np. w menu1 mam podprogramy dla przycisku 1 i 4 a będę wciskać wielokrotnie 7, to mi w końcu wskoczy w podprogram dla klawisza 1). Tu też nie wiem co jest powodem. Klawiaturę połączyłem tradycyjnie poprzez microswitche i jest podpięta do portu C.

    Projektuje właśnie PCB i z wiedzy teoretycznej wnioskuje, że przy równo rozłożonej masie ( a nie jak na płytce stykowej, gdzie jest kilka szyn GND połączone drucikiem) oraz bliskości AVR z innymi elementami elektronicznymi (chodzi mi głównie o kondensatory, które powinny być bardzo blisko pinów zasilających) powinny moje dolegliwości zniknąć (głównie z myślą o problemie 1). Tylko czy oby na pewno??

  • #2 21 Maj 2011 12:03
    Fredy
    Poziom 27  

    Jeśli kwarc masz też na kablach długości 40cm to się wogóle dziwię że to działa. Zwróć uwagę, że pojemności koło kwarca to około 22pF, a pojemność twoich kabli jest dużo większa i co gorsza zmienna. Także i tak dziwnę że to jakość działa.
    Spróbuj dać kwarc z kondenstaorami wprost przy procku, dodać kondensator na zasilanie i reset wprost na nogi i powinno się poprawić znacznie.
    Przerwanie lepiej przerób jako reagujące na zbocze.

  • #3 21 Maj 2011 12:03
    lukasz_elektronika
    Poziom 12  

    kondensatory powinny byc jak najbliżej pinów zasilających procesor. temat nieraz był wałkowany na elektrodzie. Dodatkowo reset podpięty przez rezystor do plusa zasilania i kondensator. Ja w swoim projekcie mam krańcówki podpięte na 2m przewodach i zawsze reaguje normalnie

  • #4 21 Maj 2011 12:07
    biedron2006
    Poziom 9  

    Korzystam z wewnętrznego zegara 8MHz, resety i wszystkie nóżki są podpięte standardowo czyli przez kondensatory i reset też oczywiście przez rezystor do zasilania. Kwestia tej odległości. Pewnie to jest problem z tym, że się krzaczy tak przy przerwaniach. Jak myślicie? Tak czysto teoretycznie?

  • #5 21 Maj 2011 12:12
    lukasz_elektronika
    Poziom 12  

    daj to wszystko najpierw jak najbliżej ATMEGI a potem projektuj płytkę a jesli nie możesz to kup moduł propoxu z ATMEGĄ128 na pokładzie tam wszystko jest możliwie najbliżej. Zaoszczędzi Ci to sporo zachodu i późniejszych problemów

  • #6 21 Maj 2011 12:17
    biedron2006
    Poziom 9  

    Dobra, to przetestuje jak się uda z kondensatorami przy ATmedze i zobaczę jakie dało to efekty. A co może być przyczyną tego, że się resetuje przy zwarciu przycisku??

  • #7 21 Maj 2011 12:25
    lukasz_elektronika
    Poziom 12  

    cięzko powiedzieć nie widząc jak to masz wszystko podłączone. Byc moze ze względu na impulsowy pobór prądu przez mikroprocesor i brak odsprzęgania uruchamia sie zabezpieczenie układu. A napięcie na zasilaniu po wciśnieciu przycisku nie spada Ci poniżej wartości ustawionej w fusach w sekcji BOD?

  • #8 21 Maj 2011 12:28
    biedron2006
    Poziom 9  

    A na zbocze to nie bardzo mogę, bo mi układ nie działa tak jak bym chciał, ze względu na to, że mam kontaktrony podłączone do przerwań INT1-INT3 jako sygnalizatory i jak wzbudzi mi przerwanie wówczas musi być zmiana stanu, żeby znowu działały tak jak powinne. Więc jak kontaktrony się rozewrzą i wzbudzą przerwanie to kolejne uruchomienie przerwania, gdy kontaktrony dalej będą rozwarte już mi nie wzbudzą ponownego przerwania, co jest błędem w moim programie.

    Dodano po 2 [minuty]:

    BOD jest wyłączony

  • #9 21 Maj 2011 12:29
    lukasz_elektronika
    Poziom 12  

    przerób zgodnie z podpowiedziami i daj znać czy pomogło

  • #10 21 Maj 2011 12:31
    biedron2006
    Poziom 9  

    Dobra to też sprawdzę przy poprawieniu parametrów elektrycznych ATmegi.
    A ten ostatni problem, że jak wcisnę w kolumnie inny przycisk to wchodzi mi do podprogramu zdefiniowanego dla zupełnie innego przycisku. Może to też wina pojemności na stykach i jak zestawie to ładnie na płytce PCB to będzie już dobrze?

    Dodano po 40 [sekundy]:

    Dobra to przerabiam teraz i dam znać później.

  • #11 21 Maj 2011 13:45
    dondu
    Moderator Mikrokontrolery Projektowanie

    biedron2006 napisał:
    Całość działa na 8MHz, bo taki jest praktyczny maks dla płytek stykowych ...

    A skąd taki wniosek?
    Nie ma przeszkód z działaniem na wyższych zegarach, jeżeli zachowujesz podstawowe zasady tworzenia projektów.

    biedron2006 napisał:
    W związku z tym przewody od mikrokontrolera do płytki stykowej mają długość niecałe 40cm.

    Faktycznie trochę długie, ale żeby zaraz robić PCB? Skróć je.

    Dziwne zachowanie ATmegi 128

    biedron2006 napisał:
    ... jak na płytce wykonam zwarcie pinu z masą, aby wzbudzić przerwanie wówczas (średnio raz na 10 wykonanych takich powtórzeń) procesor się zawiesza, resetuje, albo wyrzuca krzaki na wyświetlacz LCD,...

    A czym to zwarcie rozbisz?


    biedron2006 napisał:
    ... inną ciekawą dolegliwością jest to, że jak wcisnę dowolny przycisk na klawiaturze 4x4 który wykonuje jakąś pętlę (czyli np. po przytrzymaniu klawisza "1" ma mi wracać w to samo miejsce, czyli na wyświetlaczu tylko widzimy migotanie, przez odświeżanie wyświetlacza) to po stałej czasowej zawsze się resetuje (zawsze po ok 5s)

    Obstawiam, że przyczyną jest program, którego nie załączasz więc nie mamy możliwości Ci pomóc.


    biedron2006 napisał:
    ... 3) ostatnią dziwną rzeczą jest to, że jak na klawiaturze 4x4 ( z czytywana przez skanowanie w pętli while() ) kilka razy wcisnę przycisk w dowolnej kolumnie inny niż bym chciał to mi wejdzie do podprogramu zdefiniowanego dla zupełnie innego przycisku ( zaznaczam, że tylko w obrębie tej samej kolumny, czyli np. w menu1 mam podprogramy dla przycisku 1 i 4 a będę wciskać wielokrotnie 7, to mi w końcu wskoczy w podprogram dla klawisza 1). Tu też nie wiem co jest powodem. Klawiaturę połączyłem tradycyjnie poprzez microswitche i jest podpięta do portu C.

    Tak jak poprzednio program, lub sposób podłączenia klawiatury, ale nie raczyłeś podać schematu, więc ... wróżkami nie jesteśmy.


    biedron2006 napisał:
    Projektuje właśnie PCB ...

    Należysz do grona osób, które pracę zaczynają od końca, a potem się drapią po głowie, bo PCB nadaje się do wyrzucenia lub do przeróbek typu, tnij ścieżki i lutuj druciki. Najpierw uruchom swój projekt na tej stykówce którą masz, ale jeżeli lubisz tracić czas .... choć z drugiej strony doświadczenie w wyrzucaniu płytek do kosza jest także potrzebne.


    biedron2006 napisał:
    .... z wiedzy teoretycznej wnioskuje, że przy równo rozłożonej masie .... Tylko czy oby na pewno??

    Oczywiście w pewnym zakresie tak. Ale ten projekt na stykówce musi działać. Więc zastanów się jeszcze raz nad tym co robisz i przeczytaj:

    http://mikrokontrolery.blogspot.com/2011/04/fora-dyskusyjne-sa-bardzo-pomocne.html
    http://mikrokontrolery.blogspot.com/2011/04/zasilanie-mikrokontrolera.html
    http://mikrokontrolery.blogspot.com/2011/04/zakocenia-w-pracy-mikrokontrolerow.html
    http://mikrokontrolery.blogspot.com/2011/04/przycisk-drgania-stykow-debouncing.html

  • #12 21 Maj 2011 18:14
    biedron2006
    Poziom 9  

    Efekty mojej dzisiejszej przeróbki są takie, że skróciłem przewody do ok 15 cm i dałem kondensatory większej pojemności, dla testów. Odpowiadając na pytania "dondu" - zwarcie wykonuje zwierając VCC z GND ( stykając ze sobą 2 przewody - nie dotykając ich przy tym ;] ); Nie zaczynam projektu od końca bo teraz jestem już w fazie testów, kiedy odkryłem te dolegliwości i stwierdziłem, że normalna płytka PCB wszystko załatwi, gdyż ogólnie program działa tak jak sobie założyłem. Sprawą klawiatury narazie się nie będę przejmować, bo przetestuje to jeszcze jak przyjdzie gotowa, nowa klawiaturka wykonana przez producenta (może moja płytka klawiatury lub te tanie microswitche powodują takie dolegliwości-drgania, pojemności itp., że jak naciskam inny przycisk kilkukrotnie to włącza się podprogram z pod innego przycisku-tylko dla kolumny jak opisywałem wyżej).
    I teraz tak... Już prawie uwierzyłem w sukces przeróbek, po tym jak przez 2 minuty bez przerwy zwierałem VCC z GND wywołując przerwanie. Było całkiem ok ( lepiej niż poprzednio), ale w końcu jednak się znowu wysypał.
    Na wyświetlaczu pojawiły się krzaki a po chwili się zresetował i program uruchomił się na nowo. Jak wcześniej podłączyłem kondki zaraz przy pinach VCC uP to było to samo...Wydaje mi się dalej, że to płytka stykowa, problemy z GND i zasilaniem. Układ mojego zasilania wygląda jak na obrazku.

    Dodano po 1 [minuty]:

    Dziwne zachowanie ATmegi 128

  • #13 21 Maj 2011 21:12
    dondu
    Moderator Mikrokontrolery Projektowanie

    biedron2006 napisał:
    ... zwarcie wykonuje zwierając VCC z GND ( stykając ze sobą 2 przewody - nie dotykając ich przy tym ;] );
    ....
    I teraz tak... Już prawie uwierzyłem w sukces przeróbek, po tym jak przez 2 minuty bez przerwy zwierałem VCC z GND wywołując przerwanie.


    Odnoszę wrażenie, że :
    - albo niewłaściwie opisujesz, to co robisz,
    - albo z elektroniką nie masz nic wspólnego.

    biedron2006 napisał:
    ...Wydaje mi się dalej, że to płytka stykowa, problemy z GND i zasilaniem.

    Tutaj masz rację. Wydaje Ci się.

    Rób jak uważasz, ale też nie oczekuj, że że efekty pojawią się prędko i bezboleśnie.
    Na siłę, za uszy ciągnąć Ciebie nie będę :)
    Powodzenia (będzie Ci potrzebne)!

    PS. W nagrodę nominacja do Złotych Myśli

  • #14 22 Maj 2011 10:50
    biedron2006
    Poziom 9  

    Nie masz mnie za uszy ciągnąć, tylko podpowiedzieć co robię źle albo co zrobić, żeby było dobrze. Tobie na płytce stykowej wszystko dobrze działa.
    Mi nie chce, bo się czasem krzaczy, dlaczego?
    Do przerwania mam podłączoną m.in. zwykłą czujkę zalania zbudowaną na tranzystorkach taka jak tutaj :
    http://www.elektroda.pl/rtvforum/topic203646.html (ten na BC548)
    wywołuje przerwanie przez zwieranie w wodzie.
    Dlaczego raz na jakiś czas się krzaczy AVR przez wyrzucanie błędów na LCD, resetowanie czy zawieszenie??

  • #16 22 Maj 2011 11:08
    biedron2006
    Poziom 9  

    Jeszcze jedno pytanie na przyszłość...czy jak używam AVR do sterowania przekaźnikami poprzez tranzystory sterujące, to oprócz diody podłączonej równolegle, niezbędne jest zastosowanie do zasilania cewki osobnego stabilizatora??

    Dodano po 1 [minuty]:

    Racze, racze - czytałem co mi podesłałeś i jestem za to wdzięczny, tylko pytanie, czy jak wykonam płytkę PCB zgodnie z zaleceniami to problem zginie?? Czy też Ci się wydaje, że to może być problem płytki stykowej?

    Dodano po 14 [minuty]:

    a to zwieranie odbywało się okresowo - raz po razie w fazie testów więc, nie rób ze mnie... i miło mi, że mogę być w tych twoich złotych myślach, bo widzę, że sprawiłem Ci tym frajdę... Doszukujesz się tylko atrakcji w przekręconych sformułowaniach zamiast pomóc i starać się zrozumieć co się do Ciebie pisze... dzięki za porady...

  • #17 22 Maj 2011 11:08
    dondu
    Moderator Mikrokontrolery Projektowanie

    Gdybyś czytał, to już dawno zrobiłbyś to, co jest napisane czerwonym tekstem na początku strony z pierwszego linku.
    Odnoszę także wrażenie, ze nie rozumiesz tekstu pisanego przeze mnie, w szczególności dot. ostatnich Twoich pytań. Ale to chyba moja wina, widocznie piszę zbyt skomplikowanie.

    Na tym koniec z mojej strony. Może ktoś inny będzie miał więcej cierpliwości.
    Powodzenia.

  • #18 22 Maj 2011 11:31
    zumek
    Poziom 39  

    biedron2006 napisał:
    ... zaznaczam, że mam wyłączonego watchdoga i JTAGA.
    A co z M103C :?:

  • #19 22 Maj 2011 12:18
    biedron2006
    Poziom 9  

    zgodność z M103C jest również wyłączona

    Dodano po 4 [minuty]:

    Dziwne zachowanie ATmegi 128
    ustawienie fusów

    Dodano po 30 [minuty]:

    Podstawa programowa do obsługi tego przerwania wygląda wydaje mi się standardowo.

    Kod: c
    Zaloguj się, aby zobaczyć kod
    [/code]

    Dodano po 2 [minuty]:

    Schemat czujki podałem wyżej.
    http://www.elektroda.pl/rtvforum/topic203646.html

  • #20 22 Maj 2011 13:32
    percol
    Poziom 10  

    1. Zamiast kombinowania z zewnętrznymi rezystorami wykorzystaj pull-upy (od tego są!) + możesz dodać niewielki C do resetu (np. 100..1000 pF)

    2. Obecnie nie używa się SIGNAL() do obsługi przerwania! Poczytaj dokumentację Atmela, od tego jest ISR().

    3. Nieużywane piny daj jako wejście i ustal ich stan na H pull-upami

    4. Jeśli masz wątpliwości co do klawiaturki, użyj innego sterowania (np. stanami pinów, najwyżej z części funkcji trzeba będzie chwilowo zrezygnować - przetestuj w ten sposób ich wszystkie kombinacje).

    Powodzenia!

  • #21 22 Maj 2011 14:57
    janbernat
    Poziom 38  

    Czyli tak- wchodzimy w przerwanie, wewnątrz przerwania zezwalamy na globalną obsługę przerwań po czym wywołujemy alarm() w której jest _delay_ms(1000).
    Wewnątrz wywołujemy (menu) w której nie wiadomo czy nie ma opóźnienia.
    Gdzie ponownie ustawiamy zezwolenie na obsługę przerwania INT3- nie wiadomo.
    Po co kasujemy wewnątrz przerwania flagę przerwania- nie wiadomo.
    To musi pójść w maliny.

  • #22 22 Maj 2011 15:55
    biedron2006
    Poziom 9  

    Przerwanie napisałem w taki sposób, bo zawsze w głowie mi siedziało, że musi ono być jak najkrótsze, a że potrzebuje sygnalizacji o wykryciu przerwania to mi czas w wektorze przerwań się znacznie wydłuża do ponad 1s. Dlatego też skacze sobie z przerwania do funkcji alarmującej a stamtąd do menu() w którym jest wyświetlana godzina. Po drodze dlatego kasuje za sobą flagi.

    Dodano po 2 [minuty]:

    ustawianie ponowne przerwania jest w wyborze w menu programu - jak podprogram uruchamiający czujkę i jest pod wartością "1" - tak jak zaczyna się powyższy fragment kodu

    Dodano po 11 [minuty]:

    Ponadto, wcześniej jak miałem bardziej rozbudowanego pająka (opisywanego w pierwszy poście tematu) to jak w pozycji neutralnej programu, w której była wyświetlana godzina, wykonałem przerwanie bez skakania do innych funkcji (czyli normalne przerwanie pod czas którego po zakończeniu obsługi przerwania powinien wychodzi z wektora i dalej robić swoje), to się od razu zawieszał.
    Teraz faktycznie tego nie ma, więc optymalizacja pająka się opłaciła...i widzę, że program bez skakania z przerwania do innych funkcji działa dobrze i się nie krzaczy. Więc skakanie z przerwania do podfunkcji jest dość istotnym błędem. Tylko czy można wykonywać dłuższe instrukcje w wektorze obsługi przerwań? zależy mi na sygnalizacji ponad 1s.

  • #23 22 Maj 2011 16:03
    janbernat
    Poziom 38  

    No ale jak najkrótsze skoro wywołujesz w nim funkcję wykonującą się 1s?
    W przerwaniu ustaw tylko flagę a w głównej pętli ją sprawdzaj.

    Można w przerwaniu robić długą obsługę jeśli masz pewność że zakończy się ona przed następnym przerwaniem- jakimkolwiek przerwaniem.
    Wadą tego jest to że jak Ci przyjdzie do głowy rozbudować program i dodać jakiegoś RS czy timer- to wszystko musisz robić od nowa.

  • #24 22 Maj 2011 18:51
    biedron2006
    Poziom 9  

    Dobra już chyba wiem w czym tkwi problem... Jak będę miał wątpliwości to napisze... Pozdrawiam i dziękuję, bo trochę mi się to poukładało.

    Dodano po 2 [godziny] 33 [minuty]:

    Z krzakami i zawieszaniem już sobie poradziłem, tylko męczy mnie ta ostatni rzecz, mianowicie jak wg załączonego fragmentu kodu:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dziwne zachowanie ATmegi 128

    błędy są takie, że jak kilkukrotnie wcisnę "0" (w ogóle nie biorące udział w odczycie w menu()) na klawiaturze które na schemacie jest jako przycisk S30 to w końcu mi wejdzie do opcji1() pod "1",

    Chciałem się jeszcze zapytać tak czysto teoretycznie dlaczego jak przytrzymam przycisk 5 zapętlający się w menu() to po stałej czasowej resetuje mi się AVR. Zawsze po ok 5s, gdzie rozkład fusów wygląda jak pokazałem w jednym z poprzednich postów?

  • #25 22 Maj 2011 20:14
    lukasz_elektronika
    Poziom 12  

    Nie wiem czy dobrze myślę, ale wciskając cały czas przycisk 5 wchodzisz do funkcji menu ale nigdy z niej nie wychodzisz. Dane z miejsca w którym aktualnie jestes przed wejściem do funkcji menu zapisane są na stos. W pewnym momencie może go poprostu zabraknąc.

  • #26 22 Maj 2011 21:48
    janbernat
    Poziom 38  

    Sensowne menu to zrobił tadzik85.
    Jest tu:
    25 Paź 2010 09:48pomocny post - solucja
    Re: [ATMEGA32][C]Jak zrobić proste menu na LCD ? koncepcja
    Odpowiedz z cytatem
    Przepraszam że tak- nie potrafię wkleić linka do konkretnej odpowiedzi.
    biedron2006- kup sobie książkę- będziesz robił tylko błedy- a tak to się szarpiesz z podstawowymi koncepcjami.
    Raz to stos jak napisał lukasz_elektronika.
    Dwa to wszelkie delay() wpuszczają w maliny.
    No i while() w funkcji- to trzeba naprawdę ostrożnie.

  • #27 22 Maj 2011 22:00
    biedron2006
    Poziom 9  

    Dobra zamykam temat i dzięki za wszelkie wskazówki.
    Pozdrawiam!

  Szukaj w 4mln produktów
Przeglądaj produkty