Attiny24A: Arduino IDE, прерывание int0 (прошу помощи)

Обсуждаем контроллеры компании Atmel.
Ответить
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 36
Зарегистрирован: Чт июн 25, 2015 20:53:36

Сообщение Browny »

Уважаемые коты, мяу!
Прошу вашей помощи. Пытаюсь программировать attiny24 в Arduino IDE.
low_fuses=0xe2
high_fuses=0xdf
extended_fuses=0xff
8 MHz, внутренний генератор.

Железо примерно такое: http://www.cyber-place.ru/showthread.ph ... 1#post3371

Программа тестовая, лапами не бейте! Максимально упростил код.

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

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

volatile uint8_t tic = 0;

void setup() 
{ 
  DDRA|= B00000010;
  DDRA&= B11111110;
  PORTA&= B11111101;

  attachInterrupt(0, detect_up, CHANGE);
}

void  detect_up()
{
  tic++;
  if (tic == 5) PORTA |= B00000010;
  if (tic == 10) PORTA &= B11111101;
  if (tic > 15) tic = 0;
}  

void loop() {
  
};
Снимаю осциллограмму с выхода оптрона FOD814 - есть пульсации на каждый переход синусоиды через ноль. Железо 100% рабочее (ранее управлялось arduino nano).
Теперь FOD814 "дёргает" ногу 13 (PA0), а контроллер должен менять состояние порта для 12 ножки (PA1).

Лампа, подключённая к симистору, хаотично мигает пару раз (осциллограф показывает изменение логического уровня на PA1), потом включается (уровень на PA1 == HIGH) и перестаёт моргать.
Возможно, я дал мало вводных - готов предоставить больше сведений. Признаю свою ошибку и прошу помощи.
Пока создаётся ложное ощущение, что контроллер перестаёт реагировать на изменение уровня сигнала.
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 36
Зарегистрирован: Чт июн 25, 2015 20:53:36

Сообщение Browny »

Разобрался. И - да, мне стыдно.. :oops:

wiring обёртка для прерываний обслуживает именно INT0 (выбрано макроопределение для регистров attiny24):

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

MCUCR = (MCUCR & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00);
GIMSK |= (1 << INT0);
Я же ждал сигнала с ноги №13 (PA0), которая обслуживается PCINT0.
Если ногу не менять, то вот так работать будет:

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

MCUCR = (MCUCR & ~((1 << ISC00) | (1 << ISC01))) | (CHANGE << ISC00);
        GIMSK|= ( 1 << PCIE0);
        PCMSK0|= ( 1 << PCINT0);
Но в моём случае, надо менять ногу, т.к. мне не нужна массовая обработка с многих ножек, а требуется прерывание по конкретной ножке.

Видимо, вопрос закрыт :)
Реклама
Ответить

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