eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaavr i C - kto nie rozumie: kompilator, procesor czy ja? › avr i C - kto nie rozumie: kompilator, procesor czy ja?
  • Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.
    atman.pl!.POSTED!not-for-mail
    From: Jakub Rakus <s...@o...pl>
    Newsgroups: pl.misc.elektronika
    Subject: avr i C - kto nie rozumie: kompilator, procesor czy ja?
    Date: Sun, 06 Jan 2013 15:15:46 +0100
    Organization: ATMAN - ATM S.A.
    Lines: 74
    Message-ID: <kcc0uj$9sa$1@node1.news.atman.pl>
    NNTP-Posting-Host: user-31-175-58-196.play-internet.pl
    Mime-Version: 1.0
    Content-Type: text/plain; charset=UTF-8; format=flowed
    Content-Transfer-Encoding: 8bit
    X-Trace: node1.news.atman.pl 1357481748 10122 31.175.58.196 (6 Jan 2013 14:15:48 GMT)
    X-Complaints-To: u...@a...pl
    NNTP-Posting-Date: Sun, 6 Jan 2013 14:15:48 +0000 (UTC)
    User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/17.0 Thunderbird/17.0
    Xref: news-archive.icm.edu.pl pl.misc.elektronika:640403
    [ ukryj nagłówki ]

    Witajcie,

    Ostatnie moje problemy (tu na grupie poruszane) z obsługą uarta na
    atmelkach stały się moim gwoździem do trumny bascoma i w końcu się
    zawziąłem na C, choć zabierałem się do tego już od roku jak pies do
    jeża. No to na początek, standardowo pomrugamy diodą. Ot taki programik:

    #define F_CPU 16000000UL
    #include <avr/io.h>
    #include <util/delay.h>
    int main(void)
    {
    DDRD = 0xFF;
    PORTD = 0x00;
    while(1)
    {
    PORTD ^= _BV(0);
    _delay_ms(500);
    }
    }

    I zonk, na porcie ciągle stan wysoki. Podejrzałem plik .lss i niby
    wszystko ok, jak patrzę na instrukcję asemblera to powinno działać:

    00000038 <main>:
    38: 8f ef ldi r24, 0xFF
    3a: 81 bb out 0x11, r24
    3c: 12 ba out 0x12, r1
    3e: 91 e0 ldi r25, 0x01
    40: 82 b3 in r24, 0x12
    42: 89 27 eor r24, r25
    44: 82 bb out 0x12, r24
    46: ef ef ldi r30, 0xFF
    48: ff e3 ldi r31, 0x3F
    4a: 31 97 sbiw r30, 0x01
    4c: f1 f7 brne .-4
    4e: 00 c0 rjmp .+0
    50: f7 cf rjmp .-18

    Ale niestety nie działa, stan na porcie zmienia się bez opóźnienia. A
    teraz ciekawostka, zamiast wykorzystywać funkcję _delay_ms wstawiłem swoją:

    void delay(void)
    {
    uint16_t i;
    for (i=0;i<15000;i++);
    }

    Patrzę na plik .lss, a tu:

    00000038 <delay>:
    38: 88 e9 ldi r24, 0x98
    3a: 9a e3 ldi r25, 0x3A
    3c: 01 97 sbiw r24, 0x01
    3e: f1 f7 brne .-4
    40: 08 95 ret
    00000042 <main>:
    42: 8f ef ldi r24, 0xFF
    44: 81 bb out 0x11, r24
    46: 12 ba out 0x12, r1
    48: 91 e0 ldi r25, 0x01
    4a: 82 b3 in r24, 0x12
    4c: 89 27 eor r24, r25
    4e: 82 bb out 0x12, r24
    50: fc cf rjmp .-8

    Wychodzi na to, że po przełączeniu bitu PD0 w ogóle nie wywołuje funkcji
    delay() - no i port tak właśnie się zachowuje, w kółko się przełącza.

    Obstawiam opcję, że ja czegoś nie rozumie, ale może ktoś mnie oświeci.

    --
    Pozdrawiam
    Jakub Rakus

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: