• 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

Object Storage Arubacloud
0 głosów
131 wizyt
pytanie zadane 7 grudnia 2020 w C i C++ przez tonn204 Mądrala (7,440 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 (344,860 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,440 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 (344,860 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 (344,860 p.)
komentarz 8 grudnia 2020 przez tonn204 Mądrala (7,440 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 (344,860 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,440 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ź 311 wizyt
0 głosów
1 odpowiedź 334 wizyt
0 głosów
0 odpowiedzi 196 wizyt
pytanie zadane 31 grudnia 2020 w C i C++ przez tonn204 Mądrala (7,440 p.)

92,576 zapytań

141,426 odpowiedzi

319,651 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!

...