• 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ę?

Object Storage Arubacloud
0 głosów
231 wizyt
pytanie zadane 26 grudnia 2020 w C i C++ przez tonn204 Mądrala (7,440 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 (344,860 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,440 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 (344,860 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,440 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,440 p.)

@adrian17, Wiesz jak mam to zrobić?

komentarz 28 grudnia 2020 przez adrian17 Ekspert (344,860 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,440 p.)
Ok, za pomoc chyba się przerzucę na 16 bitowy.

Podobne pytania

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

92,576 zapytań

141,426 odpowiedzi

319,650 komentarzy

61,961 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...