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.

[LPC1114] uruchomienie TIMERA 16B

michal.golabek 06 Lip 2012 14:40 1927 9
  • #1 06 Lip 2012 14:40
    michal.golabek
    Poziom 2  

    Cześć, uczę się właśnie obsługi ARM-ów i mam problem z LPC1114 z uruchomieniem układu sterującego diodą za pomocą TIMER-a 16B0. Nie wiem czy problem leży w inicjalizacji timera czy w obsłudze przerwania... Poniżej jest kod. Będę wdzięczny za pomoc i ewentualne sugestie.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Pozdrawiam,
    Michał

    EDIT....

    ok działa. Nie wiem co było nie tak... Napisałem to od nowa i działa. Poniżej poprawny kod

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 9
  • #2 06 Lip 2012 18:47
    wujcio24
    Poziom 13  

    Mój fragment kodu odpowiedzialny za inicjacje timera wygląda podobnie(w kwestii idei bo pisze w asemblerze) różnice są tylko w tym że ja tylko ustawiam bit CEN w rejestrze TMR16B0TCR i wpisuje wartość zero do rejestru TMR16B0CTCR która to i tak tyle wynosi domyślnie. Jedyne co w tej sytuacji możesz zrobić to użyć debugera i obejrzeć jak zachowuje się twój kod lub przejrzeć instrukcje w asemblerze i zerknąć czy wektor w tabeli przerwań jest prawidłowy.

    0
  • #3 06 Lip 2012 18:54
    Freddie Chopin
    Specjalista - Mikrokontrolery

    michal.golabek napisał:
    Nie wiem czy problem leży w inicjalizacji timera czy w obsłudze przerwania...

    My nawet nie wiemy jaki jest problem, bo nie napisałeś...

    Nie mówiąc już o tak nieistotnych szczegółach jak kompilator, startup, tablica wektorów, skrypt linkera itd.

    4\/3!!

    0
  • #4 07 Lip 2012 08:46
    michal.golabek
    Poziom 2  

    Problem był taki że program się nie wykonywał. Kompilator GCC, biblioteki CMSIS 1.3. Ale już działa... Poprawny kod w pierwszym poście po edycji.

    0
  • #5 16 Wrz 2012 12:58
    h0nza
    Poziom 14  

    Dzień dobry

    ponieważ mam identyczny problem podczepię się do tematu :-)
    Kod niemalże identyczny z przedstawionym przez pana Michała

    program skacze do przerwania ale do niego nie dociera, i idzie w las
    objaśnienie:
    2 diody migają jednocześnie do momentu wywołania przerwania - w przerwaniu 1 powinna zostać zapalona a 2 zgaszona - po wyjściu z przerwania powinny migać na zmianę

    objawy są takie że 2 diody migają i po czasie wymaganym do wywołania przerwania program przestaje reagować

    Proszę na przyszłość używać tagu [syntax=C] do wklejania kodu...[/syntax], bez zaznaczania opcji "Wyłącz BBCode w tym poście".
    Poprawiłem, LordBlick



    Kod: C
    Zaloguj się, aby zobaczyć kod


    Program jest przerobionym przykładem Freddiego lpc1114_blink_led-1.2.1-120108
    który pracuje na jego toolchain'ie
    eclipse w wersji: 20090920-1017
    wersji GCC nie potrafię znaleźć (ale jest conajmniej 1,5 roczna)
    cały projekt w załączniku

    Dziękuję za pomoc

    0
  • #6 18 Wrz 2012 22:02
    h0nza
    Poziom 14  

    problem rozwiązany
    w pliku*.ld są 2 rodzaje stosów:

    __main_stack_size = 0;
    __process_stack_size = 1024;

    przerwanie najwidoczniej korzysta ze stosu main bo po zwiększeniu do 1024 bajtów przerwanie ruszyło

    Muszę doczytać który stos do czego służy :-)

    0
  • #7 25 Wrz 2012 21:15
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Przecież powyżej tych dwóch definicji pisze który stos do czego służy - specjalnie to napisałem, bo sam nie pamiętam [;

    4\/3!!

    0
  • #8 26 Wrz 2012 15:20
    h0nza
    Poziom 14  

    Przeczytałem to oczywiście :-)
    mi bardziej chodziło o doczytanie że process stack powinno się wykorzystywać przy pracy z os'em
    tak samo czy kompilator korzysta ze stosu tylko przy przekazywaniu wartości w funkcjach i przerwaniach - czy jakoś dodatkowo go wykorzystuje
    mimowolnie doczytałem też że stos idzie od góry na dół więc wiem że program najpierw się wysypie nie nadpisując żadnych zmiennych w przypadku przepełnienia - co jest łatwiejsze do wykrycia itp.

    0
  • #9 26 Wrz 2012 16:30
    Freddie Chopin
    Specjalista - Mikrokontrolery

    h0nza napisał:
    mi bardziej chodziło o doczytanie że process stack powinno się wykorzystywać przy pracy z os'em

    No ale czemu "powinno"? Jeśli w ogóle można, to decyzja o wykorzystaniu lub nie dwóch stosów jest generalnie mało istotna moim zdaniem...

    h0nza napisał:
    tak samo czy kompilator korzysta ze stosu tylko przy przekazywaniu wartości w funkcjach i przerwaniach - czy jakoś dodatkowo go wykorzystuje

    Parametry do/z funkcji to akurat przekazywane są przez rejestry głównie...

    h0nza napisał:
    mimowolnie doczytałem też że stos idzie od góry na dół więc wiem że program najpierw się wysypie nie nadpisując żadnych zmiennych w przypadku przepełnienia - co jest łatwiejsze do wykrycia itp.

    Ciekawa teoria, biorąc pod uwagę fakt, że zwykle stos jest "nad" zmiennymi globalnymi, a do tego jeszcze jeden stos może wjechać na drugi...

    4\/3!!

    0
  • #10 27 Wrz 2012 10:00
    h0nza
    Poziom 14  

    Witaj Freddie

    to że powinno się korzystać z 2 stosów przy OS'ie - wyczytałem z noty katalogowej (mam wrażenie że łatwiej o kontrolę tego stosu jak OS śle swoje dane na jeden stos a przerwania na drugi) co do istotności masz rację, zawsze korzystałem (od 8-9 lat robi to za mnie kompilator) z 1 stosu i nie stwarzało to problemu

    Sprzęt z którego się przesiadłem (8 bit 8 rejestrów) przy większej ilości zmiennych przekazywał dane do funkcji przez stos (w sumie co się dziwić, na moim poprzednim sprzęcie można było wykorzystać tylko 64 bity teraz mam do dyspozycji 13*32= 416 )
    dobrze wiedzieć że kompilator mi stosu nie zapełni bez potrzeby

    co do stosów i nadpisywania się ich, dobrze że napisałeś słowo 'zwykle' , bo sam wiesz że przy jednym stosie i jego odpowiednim umieszczeniu wystąpi sytuacja jaką opisałem która eliminuje nadpisywanie się danych (wkurzające to jest)

    0