Skocz do zawartości

Problem z timerem [AVR]


Byciek94

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

Link do komentarza
Share on other sites

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?

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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); }
Link do komentarza
Share on other sites

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.

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!

Gość
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.