Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[PIC16F887] Mikrokontroler restartuje się w przerwaniu.

smokeing 27 Cze 2011 12:18 1970 18
  • #1 27 Cze 2011 12:18
    smokeing
    Poziom 12  

    Witam.

    Mam 2 problemy:
    1) Nie udało mi się włączyć rezystorów podciągających na porcie B. Są one podpięte do wyjścia zegara typu OC i chcąc zminimalizować ilość elementów na płytce wpadłem na pomysł włączenia tych wewnętrznych.

    2) Nie wiem dlaczego gdy na RB0 wystąpi zbocze opadające (czyli wtedy kiedy powinno nastąpić przerwanie) uC restartuje się.

    Oto mój kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Z góry dziękuję za pomoc
    smokeing

    0 18
  • #2 27 Cze 2011 12:28
    dondu
    Moderator Mikrokontrolery Projektowanie

    Na początek dwa pytania:
    1. jaki kompilator C?
    2. Masz schemat?

    0
  • #3 27 Cze 2011 12:32
    smokeing
    Poziom 12  

    Kompilator Hi-Tech C.

    Wszystko jest podpięte na płytce ZL5PIC.
    Urządzenia z wyjściem OC na razie nie podpinałem bo skoro nie działa samo przerwanie to po co.
    Przerwanie testuję guziczkiem który jest na płyce. Po wciśnięciu wyświetlacz zamiast wyświetlić TEST LCD wyświetla krzaki, potem nic a potem START. Co ciekawe programy demonstracyjne do tej płytki działają bez problemu co wyklucza uszkodzenie MCU.

    0
  • #4 27 Cze 2011 12:36
    dondu
    Moderator Mikrokontrolery Projektowanie

    smokeing napisał:
    Urządzenia z wyjściem OC na razie nie podpinałem bo skoro nie działa samo przerwanie to po co.

    OK

    smokeing napisał:
    Przerwanie testuję guziczkiem który jest na płyce. Po wciśnięciu wyświetlacz zamiast wyświetlić TEST LCD wyświetla krzaki, potem nic a potem START.

    Wiesz co to drgania styków przycisku? Zastanów się jaki mają wpływ na testowanie Twojego programu.
    http://mikrokontrolery.blogspot.com/2011/04/przycisk-drgania-stykow-debouncing.html


    smokeing napisał:
    Co ciekawe programy demonstracyjne do tej płytki działają bez problemu co wyklucza uszkodzenie MCU.

    Po takim stwierdzeniu widać, że masz niewielkie doświadczenie - tylko się nie obraź :)
    Wbrew pozorom, mikrokontrolery nie tak łatwo uszkodzić.
    Takie myśli pozostaw zawsze na sam koniec.

    0
  • #5 27 Cze 2011 12:44
    smokeing
    Poziom 12  

    Przyznaję że mam niewielkie doświadczenie więc się nie obrażam.

    Wiem co to są drgania zestyku, ale myślałem że po prostu przerwanie wykona się kilka razy, a nie że uC zacznie świrować.

    Może ja coś źle robię? Czy po zaprogramowaniu uC powinienem odłączyć programator?
    Czasami jest problem z włączeniem programu. Nie wiem czy to ma jakiekolwiek znaczenie, ale nigdzie nie widziałem żeby urządzneia tak działały. Żeby program mi się włączył i pokazał START trzeba trzymać RESET kilka razy aż w końcu "zaskoczy".

    0
  • #6 27 Cze 2011 13:01
    dondu
    Moderator Mikrokontrolery Projektowanie

    smokeing napisał:
    ... więc się nie obrażam.

    Kamień z serca ... :)

    smokeing napisał:
    Wiem co to są drgania zestyku, ale myślałem że po prostu przerwanie wykona się kilka razy, a nie że uC zacznie świrować.

    No tak - masz rację.

    smokeing napisał:
    Może ja coś źle robię?

    Zapominasz o volatile.

    Co to jest?
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Nie masz żadnych warningów i błędów kompilacji?



    smokeing napisał:
    Czy po zaprogramowaniu uC powinienem odłączyć programator?

    Nie znam tej ZL5PIC, ja nie mam problemów, z PICKit3 - zawsze mam podłączony, choć w niektórych specyficznych przypadkach, gdy wykorzystuję piny programujące, trzeba go odłączyć.


    smokeing napisał:
    Czasami jest problem z włączeniem programu. Nie wiem czy to ma jakiekolwiek znaczenie, ale nigdzie nie widziałem żeby urządzneia tak działały. Żeby program mi się włączył i pokazał START trzeba trzymać RESET kilka razy aż w końcu "zaskoczy".

    Przydałby się schemat.

    0
  • #7 27 Cze 2011 13:07
    94075
    Użytkownik usunął konto  
  • #8 27 Cze 2011 13:15
    smokeing
    Poziom 12  

    Błędów kompilacji nie ma.
    nRBPU jest to po prostu RBPU tylko że (przynajmniej tak się domyślam) tak jak w specyfikacji jest nie-RBPU tak tu dali sobie not-RBPU :D
    W każdym razie sprawdzałem w nagłówku PIC16f887.h i wskazuje on na 7 bit w rejestrze OPTION_REG czyli ten który chcę. Ustawiając go na 0 chcę włączyć rezystory podciągające na PorcieB.

    http://www.kamami.pl/dl/zl5pic.pdf
    Tutaj jest specyfikacja ZL5PIC.

    Zrobiłem sobie symulację w proteusie i nawet pullupy działają nie mówiąc o przerwaniu :/

    Na płytce porty są połączone dokładnie tak jak tu:
    [PIC16F887] Mikrokontroler restartuje się w przerwaniu.

    Zastanawiam się czy te kondensatory elektrolityczne na płytce nie podtrzymują mi uC. W sensie ja robię tak, że jak chcę coś zmienić to wyłączam zasilanie i zmieniam kabelki. Tylko czy te pojemności nie przeszkadzają?

    Teraz muszę wyjść, więc za kilka godzin jak wrócę myślę że na 100% powinny się rozładować i wtedy spróbuję

    Pozdrawiam

    0
  • #9 27 Cze 2011 13:47
    dondu
    Moderator Mikrokontrolery Projektowanie

    smokeing napisał:
    nRBPU jest to po prostu RBPU tylko że (przynajmniej tak się domyślam) tak jak w specyfikacji jest nie-RBPU tak tu dali sobie not-RBPU :D
    W każdym razie sprawdzałem w nagłówku PIC16f887.h i wskazuje on na 7 bit w rejestrze OPTION_REG czyli ten który chcę.

    Także używam HI-Techa-a i właśnie się czegoś nowego dowiedziałem :D


    A co z pinem resetu MCLR?

    0
  • #10 27 Cze 2011 17:46
    zmyslonyy
    Poziom 26  

    Jeśli nie używasz MCLR do resetowania to powinieneś wyłączyć jego działanie w lini konfiguracyjnej. Nie wiem jak jest to w HI-Techu bo programuje w asemblerze ale na pierwszy rzut oka z tego co widze to nie masz wyłączony reset na linii MCLR a według schematu nie masz też podciągniętego wyprowadzenie MCLR rezystorem do plusa zasilania. To może być przyczyną różnych dziwnych stanów na wyprowadzeniu MCLR które mogą powodować restarty.

    0
  • #11 27 Cze 2011 18:29
    wzk
    Poziom 19  

    Spotkałem się kiedyś z kłopotami przy obsłudze LCD z jednego portu mikrokontrolera. Tak dla ciekawości - czy mógłbyś pokazać HEX programu z pierwszego postu?

    0
  • #12 27 Cze 2011 21:50
    smokeing
    Poziom 12  

    Na płytce jest podciągnięty 10k rezystorem i oczywiście guzik który zwiera MCLR do masy.
    W symulacji nie dałem tego z czystego lenistwa bo dziala.


    Załączam plik HEX.

    Odnośnie sterowania z jednego portu to wykorzystałem bibliotekę z demka dla ZL5PIC. Tutaj link do demek:
    http://www.kamami.pl/dl/zl5pic_c_examples.zip

    Myślę nad jszcze jedną ewentualnością. Niedawno zaczynając zabawę z uC nie miałem jeszcze tej świadomości że rezonator kwarcowy jest podpięty do pinów z portu A i chciałem je wykorzystać. Może tutaj też jest taki problem, ale muszę jeszcze to zbadać. Wrzuciłem bowiem program (trochę przerobiony) do PIC16F628A którego podpiąłem na płytce stykowej i działa bardzo stabilnie.

    0
  • #13 28 Cze 2011 00:27
    smokeing
    Poziom 12  

    Nie wiem dlaczego ale zaczęło działać.
    Włączyłem debugger i skompilowałem program w trybie DEBUG. Dałem Run i DZIAŁA.
    Dla pewności spróbowałem w Release i teraz działa.
    Nie wiem dlaczego wcześniej nie chciało. Bardzo dziwna sprawa.

    Umie ktoś znaleźć racjonalne wytłumaczenie?

    0
  • #14 28 Cze 2011 09:01
    63404
    Użytkownik usunął konto  
  • #15 28 Cze 2011 09:22
    wzk
    Poziom 19  

    Kompilator wygenerował HEX dla częstotliwości kwarcu 8MHz a mikrokontroler pracuje na domyślnym wewnetrznym generatorze RC. Sprawdź sobie w nocie katalogowej jaka jest domyślna częstotliwość wewnętrzna mikrokontrolera.
    Jeżeli procedury obsługi LCD mają sztywne czasy przejścia do następnych operacji z LCD, to może doprowadzić do głupienia sterownika LCD.
    Wniosek: zadeklaruj explicite pracę z generatorem kwarcowym 8 MHz.

    0
  • #16 28 Cze 2011 12:30
    smokeing
    Poziom 12  

    Bity konfiguracyjne były cały czas tak:

    [PIC16F887] Mikrokontroler restartuje się w przerwaniu.

    0
  • #17 28 Cze 2011 14:27
    wzk
    Poziom 19  

    Tylko szkopuł w tym, że w HEX są nieobecne albo moje oczy nie mogą ich dojrzeć. :wink:
    Sprawdź co się dzieje ze słowem konfiguracyjnym w mikrokontrolerze po zaprogramowaniu.

    0
  • #18 01 Lip 2011 19:21
    smokeing
    Poziom 12  

    A mógłbyś mi powiedzieć jak odczytałeś z HEX bity konfiguracyjne?
    W przyszłości mając podobny problem mógłbym sobie sam poradzić :D

    0
  • #19 10 Lip 2011 02:50
    wzk
    Poziom 19  

    Przykładowy zapis konfiguracji w pliku HEX:
    :02400E009C33E1
    czyli pod adresem 2007 (bajtowo 400E) zapisana jest konfiguracja 339C.
    Wszystko jest w dokumentacjach mikrokontrolerów i specyfikacji pliku INTELHEX.

    0