• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Jak mogę zrobić żeby przepełnienie timera występowało co 1 sekundę?

VPS Starter Arubacloud
0 głosów
278 wizyt
pytanie zadane 26 grudnia 2020 w C i C++ przez tonn204 Mądrala (7,470 p.)
zamknięte 25 stycznia 2021 przez tonn204

Cześć, chcę aby dioda migała co 1 sekundę  czyli, żeby przepełnienie timery występowało co 1 sekundę? Jak to zrobić bo próbowałem już wiele razy korzystałem z tego kalkulatora, ale to nic mi nie pomagała. Na Atmedze8A i timerze 0 jest to w ogóle możliwe? Widziałem w poradnikach, że ludzie zmieniają wartość rejestru OCR0 na wyliczoną w kalkulatorze, ale Atmega8A nie ma tego rejestru.  Dodam jeszcze taktowanie mam ustawione na 8000000Hz. Dlaczego ten kod nie działa jak chcę?

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

ISR(INT0_vect)
{
    if(!(PIND & (1 << PIND2)))
    {
        PORTB |= (1 << PB1);
    }
    else
    {
        PORTB &= ~(1 << PB1);
    }
}

ISR(TIMER0_OVF_vect)
{
    PORTB ^= (1 << PB0);
}

int main(void)
{

    DDRD &= ~(1 << PD2);
    DDRB |= (1 << PB0);
    DDRB |= (1 << PB1);

    PORTD |= (1 << PD2);
    PORTB |= (1 << PB0);

    MCUCR |= (1 << ISC00);
    GICR |= (1 << INT0);

    TIMSK |= (1 << TOIE0);
    TCCR0 |= (1 << CS02) | (1 << CS00);
    TIFR  |= (1 << TOV0);

    sei();

    while(1);

    return 0;
}

 

komentarz zamknięcia: Problem został rozwiązany
komentarz 26 grudnia 2020 przez adrian17 Ekspert (349,960 p.)

Na Atmedze8A i timerze 0 jest to w ogóle możliwe?

A patrzyłeś na to, co podlinkowałem Ci prawie miesiąc temu? Bo AFAIK dokładnie to robi.

https://mikrokontrolery.blogspot.com/2011/03/led-sterowany-przez-timer.html

OCR0 na wyliczoną w kalkulatorze, ale Atmega8A nie ma tego rejestru

No... tak, bo w tej atmedze timer0 nie ma opcji porównania (timer1/2 mają); ale za to można rozpocząć odliczanie od innej początkowej wartości TCNT0 - dokładnie to robią na podlinkowanej stronie.

komentarz 26 grudnia 2020 przez tonn204 Mądrala (7,470 p.)
Próbowałem, ale jak mam to wyliczyć z kalkulatora. W sensie skąd mam wiedzieć od jakiej wartości zacząć liczyć, żeby przerwanie występowało co sekundę?
komentarz 26 grudnia 2020 przez adrian17 Ekspert (349,960 p.)

Jeszcze raz:

A patrzyłeś na to, co podlinkowałem Ci prawie miesiąc temu?

https://mikrokontrolery.blogspot.com/2011/03/led-sterowany-przez-timer.html

Bo ta strona to liczy.

komentarz 27 grudnia 2020 przez tonn204 Mądrala (7,470 p.)
edycja 27 grudnia 2020 przez tonn204

Tak jak napisałem próbowałem, ale  nie wychodzi mi. Zmieniam wartość rejestru TCNT0 poprzedzając to obliczeniami ale cały czas nigdzie nie wychodzi mi, że dioda będzie migać co sekundę. Muszę zmienić taktowanie mikrokontrolera? Jak zmieniam wartość tego rejestru to nie widzę żadnej różnicy.

 

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

ISR(INT0_vect)
{
    if(!(PIND & (1 << PIND2)))
    {
        PORTB |= (1 << PB1);
    }
    else
    {
        PORTB &= ~(1 << PB1);
    }
}

ISR(TIMER0_OVF_vect)
{
    PORTB ^= (1 << PB0);
}

int main(void)
{

    DDRD &= ~(1 << PD2);
    DDRB |= (1 << PB0);
    DDRB |= (1 << PB1);

    PORTD |= (1 << PD2);
    PORTB |= (1 << PB0);

    MCUCR |= (1 << ISC00);
    GICR |= (1 << INT0);

    TCNT0 = 30;
    TIMSK |= (1 << TOIE0);
    TCCR0 |= (1 << CS02) | (1 << CS00);

    sei();

    while(1);

    return 0;
}

 

komentarz 28 grudnia 2020 przez tonn204 Mądrala (7,470 p.)

@adrian17, Wiesz jak mam to zrobić?

komentarz 28 grudnia 2020 przez adrian17 Ekspert (349,960 p.)
Dobra, a na początek... próbowałeś po prostu przekopiować ten kod z linku, który powinien "po prostu zadziałać" przy częstotliwości 1MHz? Jeśli chcesz 8MHz, no to można w kodzie możesz wykonywać kod co 8-my raz. Albo się przerzucić na 16-bitowy timer (bo 8-bitowy umie mało, jak sam widzisz), albo w ogóle podpiąć kwarc który da Ci możliwość odliczania dokładnie 1-sekundowego niezależnie od zegara samej atmegi...
komentarz 28 grudnia 2020 przez tonn204 Mądrala (7,470 p.)
Ok, za pomoc chyba się przerzucę na 16 bitowy.

Podobne pytania

0 głosów
0 odpowiedzi 74 wizyt
pytanie zadane 30 stycznia 2021 w C i C++ przez tonn204 Mądrala (7,470 p.)
0 głosów
0 odpowiedzi 156 wizyt
pytanie zadane 7 grudnia 2020 w C i C++ przez tonn204 Mądrala (7,470 p.)
+1 głos
1 odpowiedź 138 wizyt

93,025 zapytań

141,990 odpowiedzi

321,293 komentarzy

62,374 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...