Быстрый ШИМ с Arduino, входы-выходы не работают

Привет сообществу!

Я использую ATTINY85 и программирую его через AVRISP с помощью Arduino UNO.

Вот код, который я использую :

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

void setup() {
    PORTB = 0;        //Сброс значений на порту B

    // После настройки счетчика таймера
    // установите направление портов для вывода
    DDRB |= (1<<PB1) | (1<<PB0) | (1<<PB3); // PB0, PB1 and PB3

    // PLLCSR - PLL control and status register:
    // PLL-это тактовый множитель
    // - умножает систему 8 МГц на 8 до 64 МГц
    // PLL включен, когда включен бит: PLLE,
    // Предохранитель CKSEL запрограммирован на 0001.  Эти часы
    // выключены в спящем режиме!
    PLLCSR |= (1<<PLLE);    // PLL вкл

    // Подождите, пока бит PLOCK не будет включен
    // прежде чем разрешить включение PCK
    //WaitForPLOCK();
    //unsigned int i = 0;

    while ((PLLCSR & (1<<PLOCK)) == 0x00)
    {
        // Ничего не делайте до тех пор, пока не будет установлен бит plock
    }

    // Включить асинхронный режим, установить источник тактовых импульсов ШИМ
    PLLCSR |= (1<<PCKE);

    TCCR1 = (1<<CTC1)    | // включить PWM
            (1<<PWM1A)   | // Установить источник в pck
            (0<<(CS13))  |
            (0<<(CS12))  |
            (1<<(CS11))  |
            (1<<(CS10))  | // Clear the pin when match with ocr1x
            (1<<COM1A1);
    GTCCR = (1<<PWM1B) | (1<<COM1B1);

    // Set PWM TOP value - счетчик будет отсчитываться и сбрасываться
    // после достижения этого значения
    // OCR1C
    // 100 кГц 159
    // 80 кГц 199
    OCR1C = 199;

    // Enable Timer1 OVF interrupt
    TIMSK = (1<<OCIE1A) | (1<<TOIE1);

    sei();

    OCR1A = 190;  //chaning th FR
}

void loop() {
    PORTB |= (1 << PB3);
    delay(500);
    PORTB &= ~(1 << PB3);
    delay(500);
}

проблема в том, что при использовании ШИМ мои остальные выходы не работают . Есть идеи, почему это происходит?

Я использую библиотеку ATTINY CORE от Spence Konde.

, 👍1


1 ответ


5

Эта строка:

TIMSK = (1<<OCIE1A) | (1<<TOIE1);

включает пару прерываний генерируемых таймером 1. Всякий раз, когда вы включаете источник прерывания, вы должны убедиться, что соответствующий ISR был определен. В противном случае запрос прерывания направляется в __bad_interrupt (), который по умолчанию переходит к вектору сброса , тем самым сбрасывая вашу программу.

,

Потрясающе!! Спасибо! Это сработало!, @Johny Arduino