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.

ATtiny24 AVR Studio 5 opóźnienie za szybkie delay.h

Suchy 11 Mar 2011 13:10 1772 3
  • #1 11 Mar 2011 13:10
    Suchy
    Poziom 17  

    Witam zaczynam zabawę z AVR GCC w AVR Studio 5.
    Wcześniej programowałem trochę w assemblerze i w C dla procesorów PIC.
    Zdecydowałem pobawić się trochę AVR Studio 5 bo ma wbudowany kompilator.

    Napisałem/zmodyfikowałem program z jakiegoś tutoriala online.
    Program ma na celu zapalać i gasić diodę na linii 0 portu B co określony czas.
    LED jest podłączony do uC bezpośrednio i aktywnym stanem jest 0.

    Po kompilacji i uruchomieniu programu LED owszem mruga ale o 8 razy za szybko (obliczyłem na oscyloskopie że stan niski i wysoki trwają po 12ms).

    Zauważyłem że jak zaznaczę w fuse bit CKDIV/8 że ma podzielić zegar przez 8 to czas jest ok, ale przecież wtedy mój procesor pracuje 8 razy wolniej czyż nie ?

    W projekcie ustawiam Optymalizację na -02 nie wiem czy dobrze, czy nie szczerze mówiąc. Jeśli istnieje jakiś tutorial odnośnie pisania w AVR GCC to chętnie poczytam bo nie wiem skąd wziąć zestaw komend i funkcji. W CSS dla PIC jest świetny PDF który tłumaczy wszystko nie znalazłem natomiast za dużo informacji dotyczących AVR-kó.

    Z góry bardzo dziękuję i będę wdzięczny za pomoc.
    Pozdrawiam,
    Michał.

    Używam załączonej biblioteki avr/delay.h i oto mój kod:

    Code:

    /*
     * Pierwszy_C.c
     *
     * Created: 11/03/2011 10:10:22
     *  Author: Michal.Swic
     */


    #include <avr/io.h>
    #include <util/delay.h>


    // Functions prototype
    int set_PORTB_bit(int line, int state);




    // Program always starts from main
    int main(void)
    {   
       // Set port B0 as a output - binary 1
       // PORTB bit 0 psychical pin POTRB0 (pin2) LED - active low
       
       // PORT settings , set PORTB.0 as a output 1 all other as input DDRB = 00000001
       // PORTB.0 output - LED
       
       DDRB = 00000001;   // PORTB.0 output

       set_PORTB_bit(0,0);
       
       
       
       // Forever loop   
        while(1)
        {
       
       set_PORTB_bit(0,0);
       _delay_ms(100);
       set_PORTB_bit(0,1);
       _delay_ms(100);      
             
        }
    }


    int set_PORTB_bit (int line, int state)
    {
       if (state == 0) {PORTB &= ~(1<<line);}   // If specified state is 0 then clear the portb line - specified   
       else {PORTB |= (1<<line);}            // If specified state is 1 set portb line - specified
    }

    0 3
  • #3 11 Mar 2011 14:47
    Suchy
    Poziom 17  

    Dziękuję za pomoc wpisałem kwarc 8000000 i poszło pięknie opóźnienia są ok.
    Dzięki jeszcze raz.

    Myślałem że wystarczy ustawić fuse bity a jednak jeszcze trzeba sprecyzować w kodzie.

    Pozdrawiam,
    Michał

    0