logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

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

Suchy 11 Mar 2011 13:10 2105 3
  • #1 9263155
    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:

    
    /*
     * 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
    }
    
  • #2 9263484
    memek
    Poziom 17  
    Dodaj na początku linijkę: #define F_CPU 16000000UL określającą częstotliwość kwarcu o ile nie ustawiłeś tego w ustawieniach. Spróbuj też z inną optymalizacją np. -0s. Tutaj masz kurs dla początkujących http://hobby.abxyz.bplaced.net/index.php?pid=4&cid=1
  • #3 9263519
    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ł
REKLAMA