Страница 1 из 1

ATtiny2313+енкодер

Добавлено: Вс май 03, 2020 15:03:36
Alek_von_German
Доброго времени всем! Пока выходные, решил штудировать книги по МК на С. Захотелось с енкодером поиграться, схему собрал, программу по книгам написал, но не работает.
Подскажите, пожалуйста, где ошибка?
Спойлер

Код: Выделить всё

#define  F_CPU 8000000UL


#include <avr/io.h>
#include <util/delay.h>
int NewState,OldState,Vol,upState,downState;

#include <avr/interrupt.h>

ISR(TIMER1_COMPA_vect)
{
    NewState=PIND & 0b0000011;
    if(NewState!=OldState)
    {
        switch(OldState)
        {
            case 2:
            {
                if(NewState == 3) upState++;
                if(NewState == 0) downState++;
                break;
            }
            
            case 0:
            {
                if(NewState == 2) upState++;
                if(NewState == 1) downState++;
                break;
            }
            case 1:
            {
                if(NewState == 0) upState++;
                if(NewState == 3) downState++;
                break;
            }
            case 3:
            {
                if(NewState == 1) upState++;
                if(NewState == 2) downState++;
                break;
            }
        }
        OldState=NewState;
    }
    TCNT1H=0x00;
    TCNT1L=0x00;
}

int main(void)
{
    
    
    PORTD=0x03;
    DDRD=0x00;
    DDRB=0x01;
    PORTB=0x00;
    
    TCCR1A=0x00;
    TCCR1B=0x0A;
    
    OCR1AH=0x03;
    OCR1AL=0xE8;
    
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    
    asm("sei");
    // Global enable interrupts
    
    
    while (1)
    {
        if (upState >= 4)
        {
           PORTB|=0x01;
        }
        if (downState >= 4)
        {
           PORTB&=~0x01;
        }
        
        
    };
}

Re: ATtiny2313+енкодер

Добавлено: Вс май 03, 2020 16:06:26
Ivanoff-iv
подозреваю, что таймер настроен неправильно... и/или его прерывания.
кстати для генерации прерываний и 8битного таймера хватит...

Re: ATtiny2313+енкодер

Добавлено: Вс май 03, 2020 17:06:00
NStorm
// Timer(s)/Counter(s) Interrupt(s) initialization
И? Где тут код? Где-то тут вы TIMSK должны были установить, чтобы включить прерывание.

Добавлено after 7 minutes 37 seconds:
TIMSK = 1 << OCIE1A;

И еще - переменные, которые меняются в прерывании, должны быть объявлены как volatile. Иначе компилятор просто выкинет их при оптимизации, т.к. не в курсе, что они там могут поменяться. С его точки зрения код в прерывание не заходит сам, а значит меняться они не будут.

Добавлено after 9 minutes 10 seconds:
PS: А еще откройте режим таймера CTC. TCCR1A = 1<<WGM12; и не надо сбрасывать TCNT1 в прерывании. МК сам будет сбрасывать каждый раз по достижению OCR1A.

Re: ATtiny2313+енкодер

Добавлено: Пн май 04, 2020 16:12:19
OKF
Если вы только осваиваетесь, сделайте без прерываний сначала. Просто вставьте 1-мс делай в основном цикле в котором будет крутиться ваш код. Обкатайте, а потом уже переносите в прерывание.

Re: ATtiny2313+енкодер

Добавлено: Вт май 05, 2020 11:22:40
Alek_von_German
Всем спасибо огромное, сейчас в отъезде по работе. Какивернусь- сразу же отпишусь о результатах.