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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.