ATtiny2313+енкодер

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Аватара пользователя
Сообщения: 118
Зарегистрирован: Вт апр 21, 2020 07:44:24
Откуда: Сумы, Украина

Сообщение 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;
        }
        
        
    };
}
Хочется всё и сразу, а получаешь нихрена и постепенно...
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

подозреваю, что таймер настроен неправильно... и/или его прерывания.
кстати для генерации прерываний и 8битного таймера хватит...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение 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.
OKF
Это не хвост, это антенна
Сообщения: 1405
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

Если вы только осваиваетесь, сделайте без прерываний сначала. Просто вставьте 1-мс делай в основном цикле в котором будет крутиться ваш код. Обкатайте, а потом уже переносите в прерывание.
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Аватара пользователя
Сообщения: 118
Зарегистрирован: Вт апр 21, 2020 07:44:24
Откуда: Сумы, Украина

Сообщение Alek_von_German »

Всем спасибо огромное, сейчас в отъезде по работе. Какивернусь- сразу же отпишусь о результатах.
Хочется всё и сразу, а получаешь нихрена и постепенно...
Реклама
Ответить

Вернуться в «AVR»