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

question-closed Wykorzystanie timera w mikrokontrolerze ATmega8A

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

Cześć. Próbuję zrobić wykorzystać timery i mam problem. Ustawiam timer tak, żeby liczył do 255, a potem się resetował. Gdy występuje przepełnienie dioda powinna się zaświecić. Dlaczego tak się nie dzieje? Coś robię źle?

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

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

ISR(TIMER0_OVR_vect)
{
    PORTB |= (1 << PB1);
    _delay_ms(3000);
}

int main(void)
{

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

    PORTD |= (1 << PD2);

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

    TIMSK |= (1 << TOIE0);
    TIFR  |= (1 << TOV0);

    sei();

    TCCR0 |= (1 << CS02);

    while(1)
    {
       
    }

    return 0;
}

 

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

Z takich ewidentnych:

ISR(TIMER0_OVR_vect)

Tutaj masz literówkę? Kompilator też powinien o tym ostrzec.

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

Poprawiłem literówkę, teraz dioda miga teraz co 3 sekundy. Dlaczego tak jest, bo przecież nie możliwe, że mikrokontroler tak szybko policzy do 255 i gdy przepełni się timer wykona funkcję, która obsługuje to odpowiednie przerwanie. O co chodzi?

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

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

ISR(TIMER0_OVF_vect)
{
    PORTB ^= (1 << PB1);
    _delay_ms(3000);
}

int main(void)
{

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

    PORTD |= (1 << PD2);

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

    TIMSK |= (1 << TOIE0);
    //TIFR  |= (1 << TOV0);

    sei();

    TCCR0 |= (1 << CS02);

    while(1)
    {

    }

    return 0;
}

 

komentarz 8 grudnia 2020 przez adrian17 Ekspert (349,960 p.)
Nie rozumiem... sam dodałeś sleep() na 3s (btw, obsługa przerwań nigdy nie powinna trwać długo, więc sleep() w przerwaniu jest be), więc co dziwnego w tym że dzieje się co 3s?
komentarz 8 grudnia 2020 przez adrian17 Ekspert (349,960 p.)
komentarz 8 grudnia 2020 przez tonn204 Mądrala (7,470 p.)

@adrian17, Chodzi mi o to, że dlaczego ten kod obsługi przerwania powinien wykonać się wtedy, gdy wystąpi przepełnienie licznika, a u mnie dioda cały czas świeci się i miga tak jakby to przepełnienie występowało cały czas.

komentarz 8 grudnia 2020 przez adrian17 Ekspert (349,960 p.)
w sensie, zakładając że nie ma _delay_ms?

Zakładając 16MHz, masz teraz ustawiony prescaler 256 i licznik liczy 256, więc licznik przepełnia się 244 razy na sekundę. Przy 1MHz zegarze, 15 razy na sekundę.

Poważnie, przeczytaj ten link ;)
komentarz 11 grudnia 2020 przez tonn204 Mądrala (7,470 p.)
edycja 12 grudnia 2020 przez tonn204

@adrian17, poczytałem trochę i teraz użyłem kalkulatora i chcę aby przepełnienie pojawiało się co sekundę. Tylko jak to zrealizować od strony kodu. Po widziałem w jednym poradniku, że autora ustawiał wartość jakiegoś rejestru na taką jaką jaka wychodzi w tym kalkulatorze w polu "Total Timer Ticks", ale nie mam pojęcia jak to zrobić na ATmedze8A. Poniżej screen z ustawieniami jakie sobie ustawiłem w kalkulatorze.

Podobne pytania

0 głosów
1 odpowiedź 384 wizyt
0 głosów
1 odpowiedź 362 wizyt
0 głosów
0 odpowiedzi 220 wizyt
pytanie zadane 31 grudnia 2020 w C i C++ przez tonn204 Mądrala (7,470 p.)

93,025 zapytań

141,990 odpowiedzi

321,292 komentarzy

62,371 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!

...