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.

[ATmega16][ATmega8][AVR Studio][IDE Simulator] Symulacja timer0

puradawid 18 Lut 2012 16:55 2139 14
  • #1 18 Lut 2012 16:55
    puradawid
    Poziom 7  

    Witam serdecznie, chciałbym zapytać się o problem który natrafiłem ćwicząc sobie możliwości timingu w ATmegach.
    Mam taki kod przykładowy:

    Code:
    [syntax=c]
    

    #include <stdio.h>

    #include <avr/io.h>

    #include <avr/sfr_defs.h>

    #include <avr/interrupt.h>

    int main()
    {
       //GICR = 0xC0;
       TIMSK |= _BV(TOIE0);
       TCNT0=1;
       TCCR0 |= _BV(CS00);
       DDRB=0xFF;
       sei();
       while(1)
       {
       }
    }
    ISR(TIMER0_OVF_vect)
    {
       cli();
       PORTB=~PORTB;
       sei();
    }

    [/syntax]


    Działa to normalnie w AVR Simulator samego AVR Studio4, po skompilowaniu jednak za Chiny Ludowe nie chce inkrementować się rejestr TCNT0, ani to w normalnym już chipie, ani to w IDE Simulator... Czy ktoś wie jaki problem, być może nie znam się dobrze na czytaniu dokumentacji (którą przewertowałem parę razy) i nie mogę znaleźć, czy potrzebny jest jeszcze jakiś jeden rejestr aktywowany, reset tutaj TOV0 nic nie pomaga i jest raczej zbędny niesamowicie, SREG normalnie włącza się (co widać pod makrem sei()). Nie mam pojęcia, proszę o pomoc.

    0 14
  • #2 18 Lut 2012 18:29
    dondu
    Moderator Mikrokontrolery Projektowanie

    1. wywal cli() i sei() z ISR().
    2. W jaki sposób stwierdzasz, że:

    puradawid napisał:
    ... po skompilowaniu jednak za Chiny Ludowe nie chce inkrementować się rejestr TCNT0, ani to w normalnym już chipie, ...

    0
  • #3 19 Lut 2012 00:22
    puradawid
    Poziom 7  

    No to oczywiste, że w symulatorze widzę. A na chipie widzę bo działoby się cokolwiek, na oscyloskopie byłoby a tu nic. Czy ktoś miał podobny problem?

    0
  • #4 19 Lut 2012 07:03
    pimpuk
    Poziom 22  

    Możesz kolego informatyku, wyjaśnić założenia swego programu?
    Bo sugestie dondu są chyba jasne.

    Dondu na swym blogu napisał:

    Cytat:

    BŁĄD:Włączanie przerwań w funkcji obsługującej przerwanie

    To jeden z największych błędów jakie może popełnić początkujący programista robiąc tak:


    Kod: c
    Zaloguj się, aby zobaczyć kod

    Dlaczego? Ponieważ:
    Odblokowanie przerwań, podczas wykonywania procedury obsługi przerwania, bardzo często prowadzi do nieprzewidywalnego działania programu, przez co ciężko jest ustalić przyczynę błędów.
    Wiele kolejnych nie zakończonych przerwań może doprowadzić do przepełnienia stosu i pewnie jeszcze wiele innych problemów

    0
  • #5 20 Lut 2012 11:00
    puradawid
    Poziom 7  

    No to jest oczywiste ale tutaj zastosowanie zamknięcia flagi przerwań w SREG na czas trwania przerwania jest raczej bardziej oczywiste ( :) ), tu nie leży problem w kodzie tylko w którymś miejscu z obsługą jeszcze jakiegokolwiek dodatkowego rejestru, muszę po prostu ogarnąć przerwanie, pracowałem nad normalnym kodem (o wiele większym bardziej rozbudowanym i tak dalej) ale wystąpiły problemy z URUCHOMIENIEM w ogóle przerwań, oczywiście nie stosuje przerwań jako jakichś specjalnych elementów kodu jedynie do zmieniania flag lub inkrementacji zmiennych "czasowych". Czy ktoś zetknął się serio z tym problemem i czy potrafi mi pomóc w jakikolwiek sposób? (prawdopodobnie problem leży gdzieś po stronie kompilatora, ale głowy sobie uciąć nie dam)

    Kod: xml
    Zaloguj się, aby zobaczyć kod


    Takie flagi kompilacji, wydaje się wszystko ok ale nie wiem może rzeczywiście jest coś nie tak, proszę naprawdę o poradę bo stoję w miejscu i nie wiem jak to rozegrać (przeszukuje publikacje i w ogóle i nic nie mogę znaleźć odnośnie takiego błędu/problemu)

    0
  • #6 20 Lut 2012 16:31
    dondu
    Moderator Mikrokontrolery Projektowanie

    puradawid napisał:
    No to jest oczywiste ale tutaj zastosowanie zamknięcia flagi przerwań w SREG na czas trwania przerwania jest raczej bardziej oczywiste ( :) )

    1. Zbędne, ponieważ wejście w procedurę obsługi przerwania blokuje przerwania, na czas obsługi przerwania (do rozkazu RETI), czytaj datasheety:

    Atmega datasheet napisał:
    The I-bit is cleared by hardware after an interrupt has occurred, and is set by the RETI instruction to enable subsequent interrupts.


    2. Problematyczne ponieważ:

    Kod: asm
    Zaloguj się, aby zobaczyć kod



    puradawid napisał:
    ... prawdopodobnie problem leży gdzieś po stronie kompilatora, ale głowy sobie uciąć nie dam) ...

    To dobrze że nie dasz, ponieważ mógłbyś ją stracić.

    Najpierw popraw co opisałem wcześniej i odpowiedz na pytanie, które zadałem Ci w poprzednim poście, to może nie będziesz:

    puradawid napisał:
    ... bo stoję w miejscu ...

    0
  • #7 20 Lut 2012 19:06
    puradawid
    Poziom 7  

    Ok, moje błędy, niemniej wcale mi to nie pomogło, mówię, widzę brak inkrementacji z IDE Simulator po prostu.

    0
  • #9 20 Lut 2012 20:31
    puradawid
    Poziom 7  

    Kod się nie wykonuje.

    0
  • #10 20 Lut 2012 20:41
    tmf
    Moderator Mikrokontrolery Projektowanie

    puradawid napisał:
    Ok, moje błędy, niemniej wcale mi to nie pomogło, mówię, widzę brak inkrementacji z IDE Simulator po prostu.


    A to dziwne, bo sobie wkleiłem twój kod, wywaliłem to cli/sei z przerwania i wszystko działa ok. Co znaczy, że nie widzisz brak inkrementacji? U mnie wchodząc w przerwanie TCNT0 jest równy 8, potem 12 i 15, bo tak jest kompilowana obsługa przerwania. Ponieważ wchodzimy w nie kiedy TCNT0=0 więc tak ma być. Jak sobie breakpointa wrzucisz na symulatorze tam gdzie jest while(1) co wymaga wejścia w okno assemblera, to będziesz widział jak się TCNT0 inkrementuje.

    0
  • #11 20 Lut 2012 21:31
    puradawid
    Poziom 7  

    W AVR studio ok wszystko jest autentycznie działa, w oddzielnym symulatorze już nie. No nic, będę radził sobie sam, dzięki za porady

    0
  • #13 20 Lut 2012 22:00
    puradawid
    Poziom 7  

    Ja nie prosiłem o dogłębną analizę urządzenia, prosiłem tylko o problem przewań, a takich odzywek to sobie nie życzę

    0
  • #14 20 Lut 2012 22:05
    dondu
    Moderator Mikrokontrolery Projektowanie

    Prosisz o pomoc w rozwiązaniu problemu. Nie odpowiadasz na pytania, a na ponowną prośbę odpowiadasz czterema słowami. Zdecyduj się więc czy pomocy chcesz, a jeżeli nie to nie korzystaj z forum.

    Skoro działa w symulatorze kol TMF, a nie działa Ci po zaprogramowaniu mikrokontrolera, to pytanie o schemat jest zasadne. Ale jeżeli nadal uważasz, że nasze pytania są bezzasadne, to zawsze możesz temat zamknąć.

    Ale zanim to zrobisz zastanów się czy z instrukcjami sei() i cli() miałeś rację i wyciągnij właściwe wnioski, co do stanu swojej wiedzy na temat mikrokontrolerów, i czy czasem nie warto zaufać nieco bardziej doświadczonym osobom, by nie stać na jednym ze stopni Piekła początkujących

    0
  • #15 20 Lut 2012 22:17
    puradawid
    Poziom 7  

    Bo przecież trzeba być bardzo niesprytnym żeby pod hasłem "kod nie wykonuje się" nie rozumieć "nie widzę na oscyloskopie nic na porcie B", a schemat jaki może być tego urządzenia posiadającego taki kod? Mógłbym narysować na biegu jakiś zapalający diodę ale po co - przecież wiadomo, o co chodzi. Dlatego nie wiem skąd takie pytania. O ile rzeczywiście nie wiedzialem że ISR od razu wyłącza przerwania (ważna rzeczy), ale to tylko ze względu na to że wiele sampli jest tak napisanych. Zamykam temat bo nie ma o czym już gadać, sam do tego dojdę, widocznie to wina winavr. Dzięki za serdeczną pomoc, nie starcie się na siłę być mądrzejsi :)

    0