eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikazamulający program na AVR › Re: zamulający program na AVR
  • Path: news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!.P
    OSTED!not-for-mail
    From: badworm <n...@p...pl>
    Newsgroups: pl.misc.elektronika
    Subject: Re: zamulający program na AVR
    Date: Thu, 7 Apr 2016 17:37:01 +0200
    Organization: ATMAN - ATM S.A.
    Lines: 62
    Message-ID: <g...@b...pl>
    References: <p...@b...pl>
    <57067701$0$22840$65785112@news.neostrada.pl>
    NNTP-Posting-Host: ip-5-172-247-213.free.aero2.net.pl
    Mime-Version: 1.0
    Content-Type: text/plain; charset="iso-8859-2"
    Content-Transfer-Encoding: 8bit
    X-Trace: node1.news.atman.pl 1460043487 3917 5.172.247.213 (7 Apr 2016 15:38:07 GMT)
    X-Complaints-To: u...@a...pl
    NNTP-Posting-Date: Thu, 7 Apr 2016 15:38:07 +0000 (UTC)
    User-Agent: 40tude_Dialog/2.0.15.1pl Hamster/2.0.0.1
    Xref: news-archive.icm.edu.pl pl.misc.elektronika:698012
    [ ukryj nagłówki ]

    Dnia Thu, 7 Apr 2016 17:04:31 +0200, szod napisał(a):

    > To sprawdź ustawienia bitów konfiguracyjnych uC - na jakim oscylatorze
    > pracuje.

    Kompilator do fusebitów raczej dostępu nie ma. Przed chwilą porównałem
    prędkość zegara I2C dla wsadów z obu kompilatorów. Różnica jest
    kolosalna - dla nowego GCC to zaledwie 5kHz, dla starego ponad 80kHz.
    Kod generujący opóźnienia dla tej magistrali wygląda tak:

    #include <avr\io.h>
    #include <inttypes.h>

    #include "harddef.h"
    #include "makra.h"
    #include "i2c.h"

    // Wyliczenie czasu opóźnienia połówkowego i ćwiartkowego (cykle)
    #define I2C_nhalf (F_CPU/I2C_SPEED/2)

    // Funkcja dłuższych opóźnień
    #if I2C_nhalf < 3
    // Nic
    #elif I2C_nhalf < 8
    static void i2c_xdelay(void)
    {
    NOP();
    }
    #else
    #define I2C_delayloops (1+(I2C_nhalf-8)/3)
    #if I2C_delayloops > 255
    #error Przyspiesz - bo sie nie wyrabiam ;)
    #endif
    static void i2c_xdelay(void)
    {
    asm volatile( \
    "delayus8_loop%=: \n\t"\
    "dec %[ticks] \n\t"\
    "brne delayus8_loop%= \n\t"\
    : :[ticks]"r"(I2C_delayloops) );
    }
    #endif //I2C_nhalf >= 3

    // Opóźnienia dla I2C
    static inline void i2c_hdelay(void)
    {
    #if I2C_nhalf < 1
    return; // To jest funkcja inline, jeśli składa się tylko z "return"
    jest usuwana podczas optymalizacji
    #elif I2C_nhalf < 2
    NOP();
    #elif I2C_nhalf < 3
    asm volatile(
    "rjmp exit%=\n\t"
    "exit%=:\n\t"::);
    #else
    i2c_xdelay();
    #endif
    }
    --
    Pozdrawiam Bad Worm badworm[maupa]post{kropek}pl
    GG#2400455 ICQ#320399066

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: