Skocz do zawartości

Błąd w opóźnieniu [C]


ziober

Pomocna odpowiedź

Hej, mam taki problem, że ucze się jeżyka C w poradnika Pana Teodora Otulaka, niestety dioda zamiast zapalać się i gasnąć co 1s zapala się i gasi co około 5s... 🙁 Zmieniałem fusebity na zewnętrzny kwarc (lfuse: 0xEC, hfuse: 0x99), więc mógłby mi ktos powiedzieć co tu jeszcze schrzaniłem?

#include <avr/io.h> 

// trzebabyło zdefiniować bo to jzu nie jest obsługiwane
#define sbi(add,bit) add |= _BV(bit);   
#define cbi(add,bit) add &= ~_BV(bit); 

/******************************************************
                  Definicje stałych
*******************************************************/
#define F_CPU         4000000L                            /* 4MHz zegar procesora, zmieniałem, normalnie było wpisane dla 1 */
#define CYCLES_PER_US ((F_CPU+500000)/1000000) /* cpu cycles per microsecond */
/**************************************************************
                               Koniec definicji stałych
**************************************************************/
//definiujemy stany portu sterującego diodą LED
#define LED_ON sbi(DDRB,PB1);sbi(PORTB,PB1) 
#define LED_OFF sbi(DDRB,PB1);cbi(PORTB,PB1) 
// Piszemy procedury opóźnienia czasowego
void delay(unsigned int us) 
{ 
  unsigned int delay_loops; 
  register unsigned int i; 
  delay_loops = (us+3)/5*CYCLES_PER_US; // +3 for rounding up (dirty) 
  for (i=0; i < delay_loops; i++) {}; 
} 
void delayms(unsigned int ms) 
{ 
        unsigned int i; 
        for (i=0;i<ms;i++) 
                { 
                delay(999); 
                asm volatile ( 
                "WDR"::); 
                               } 
} 
int main (void) 
{ 
    for (;;) 
             { 
                LED_ON; 
                delayms(1000); 
                LED_OFF; 
                delayms(1000); 
             } 
  return (0); 
} 
Link do komentarza
Share on other sites

Trochę modyfikując kod z kursu C, którego pisze abxyz, zrobiłem takie coś:

/* "led.c" - programik do testowania środowiska WinAVR */
/* układ ATmega 1MHz */
/* PB0 - dioda LED */

#define F_CPU 1000000L
#include <avr/io.h> 
#include <util/delay.h>                

int main(void) 
{ 
   DDRB  = 0x01; 
PORTB = 0x00; 


   unsigned char i,n; 

   while (1) 
   { 
       PORTB ^=_BV(0); 
	for(unsigned int i=0; i<100; i++) _delay_ms(10); 
   } 
   return 0; 
} 

JEDNAK MUSISZ PAMIĘTAĆ!!! To jest napisane dla AVR. Nie znam tego kursu i nie wiem czy o to ci chodzi. Steruje diodą podłączoną do PB0. Pewnie nie jest to idealny kod ale u mnie działa.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.