Skocz do zawartości

Problem z timerem [AVR]


Pomocna odpowiedź

Okres przerwań od timera jest równy 28 okresów (bo 27 jest wartością końcową plus stan 0). Niestety nie znamy częstotliwości zegara więc trudno coś mówić o czasach. Impuls wyjściowy powinien mieć około (bo to przecież obsługa programowa - czasem nie będzie równo) 28 okresów timera i przerwa tyle samo.

Moim zdaniem niepotrzebnie odblokowałeś przerwania od komparacji z OCR1B. To powoduje, że procesor próbuje wykonać obsługę (co jest w OCR1B? pewnie 0) i skacze do miejsca gdzie kompilator wstawił skok do adresu 0x0000 czyli restartu procesora i programu. Nigdy nie odblokowuj nieobsługiwanych przerwań.

Nie ma "Zmieniłem tak jak mówisz". Pokaż nowy kod. Nie wrzucaj gdzieś tam tylko wstaw tu w posta. Masz znaczniki Code.

Znaczy z jednej zrobiły się trzy? Czy chodzi o rozstrojenie? Nie słyszałem o takim przypadku. To już bardziej oscyloskop. Co tam masz, pokaż zrzut z ekranu. Może rozciągnięta podstawa czasu (sweep uncal w analogowych) albo jakaś lupa włączona? A jak _delay_ms(1000) zrobisz to masz 1 sekundę na diodzie LED?

dla delay(1000)ms mam impuls długości 10 sekund;/ dla delay(100)s mam długośc jednej skeundy. rzutu z oscyloskopu nie zrobie bo nie mam teraz jak tego zrobić, ale to raczej nie winna oscyloskopu:) potrafie sie nim obsługiwać, i zawsze dawał mi poprawne pomiary. Załączam kod;

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

int main (void)
{
DDRB |= (1 << PB2);
TCCR1B|=(1 << WGM12);
OCR1A=27;
TCCR1B|=(1 << CS10);
TIMSK |= (1 << OCIE1A);


sei();




while(1)
{



}}

 ISR(TIMER1_COMPA_vect)
{
PORTB ^= (1<<PB2); }

No to masz jakąś ogólną kaszanę z zegarami. Najpierw timer chodzi 2 razy za wolno a teraz procek aż 10 razy za wolno 🤯 Najpierw ogarnij sam procesor. Sprawdź fuse bity, przede wszystkim "fuse low byte" - wczytaj programatorem i napisz a potem sprawdź ustawienia kompilatora - symbol F_CPU. Te dwie rzeczy muszą się zgadzać, tj. rzeczywista częstotliwość zegara procesora i wartość F_CPU. Jak rozumiem założyłeś taktowanie z surowego stanu fabrycznego - wewnętrzny generator RC 1MHz, czy tak?

Mam nadzieję, że resztę jakoś zrobiłeś poprawnie, czyli nie jest to kłębek drutu bez żadnych kondensatorów itp, no ale wiadomo, zapytać trzeba.

Czy LED testowałeś w pustym kodzie z wyłączonymi wszystkimi przerwaniami czy dołączyłeś do tego z timerem? Bo pracujące przerwania bardzo zaburzają pomiary czasu delay'ami a tu masz niezwykle częste obsługi jak na taktowanie z 1MHz.

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...