Dron Kosher

Непонятка с счетчиком прерываний

7 сообщений в этой теме

Dron Kosher    0

Привет ребята. никак не могу понять в чем дело.

при включении значение counter устанавливается в 1... т.е. ДО получения прерывания оно где то увеличивается на 1...

далее всё работает как задумывалось.

вот такой код:
 

#define F_CPU 9600000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "1637.h"

#define IR_PIN 1

volatile uint16_t counter = 0;

ISR(INT0_vect) {

    counter++;

}
    
    
int main(void)
{
    
    //------ прерывание по INT0 ----------------------------------------
    PORTB &=~(1<<IR_PIN); // установим низкий уровень на ножку
    DDRB &= ~(1<<IR_PIN); // настроим ножку на вход
    
    
    GIMSK |=(1<<INT0); // включаем обработчик прерываний INT0
    
    MCUCR |=(1<<ISC01); // Возрастающий фронт INT0
    MCUCR |=(1<<ISC00); // генерирует запрос прерывания.
    
    sei(); // включить прерывания глобально
    //------------------------------------------------------------------


    while (1)
    {
        indication(counter);
    }
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
Dron Kosher    0

в железе эта фигня еще и плавающая т.е. один раз есть, другой раз нет...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
GOR23    30

Как смотришь что установилось в один? Если прерывания не включать вообще ноль остаётся? Нога int0 подтянута или в воздухе болтается?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Dron Kosher    0

смотрю по индикатору  на который выводится значение counter

выключил перывания - остается 0 т.е. это перывание срабатывает при включении...

Нога прерывания подтянута к земле через 10к резистор, прерывание шлю через кнопку

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
GOR23    30

Чёто у меня похожее было когда то давно, не помню как поборол... Какой контроллер?

Как вариант, попробуй перед настройкой прерывания влепить задержку миллисекунд 50 (значение с потолка). То есть сразу настроил порт, подождал настроил прерывания. Не уверен что поможет, ну а вдруг...

Ещё попробуй флаг прерывания сбросить перед включением (перед sei()). GIFR |= 1<<INTF0;

GIMSK |=(1<<INT0);

Вот это я бы поставил тоже перед sei(). Скорей всего в нём и причина...

Изменено пользователем GOR23
  • Лайк 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Dron Kosher    0

attiny13

задержка не помогает, это первое что я начал крутить :)

GIFR |= 1<<INTF0;  - помогло!

 

GIMSK |=(1<<INT0); у меня и так есть

 

спасибо, пойду почитаю что это за регистры такие

 

вот как выглядит теперь кусок настройки

	PORTB &=~(1<<IR_PIN); // установим низкий уровень на ножку
	DDRB &= ~(1<<IR_PIN); // настроим ножку на вход
	

	
	GIMSK |=(1<<INT0); // включаем обработчик прерываний INT0
	
	MCUCR |=(1<<ISC01); // Возрастающий фронт INT0
	MCUCR |=(1<<ISC00); // генерирует запрос прерывания.
	
	GIFR |= 1<<INTF0; 
	
	sei(); // включить прерывания глобально

 

 

Изменено пользователем Dron Kosher

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Dron Kosher    0

понял наконец, что вы имели ввиду :)

 

	PORTB &=~(1<<IR_PIN); // установим низкий уровень на ножку
	DDRB &= ~(1<<IR_PIN); // настроим ножку на вход
	
	
	MCUCR |=(1<<ISC01); // Возрастающий фронт INT0
	MCUCR |=(1<<ISC00); // генерирует запрос прерывания.
	
	GIMSK |=(1<<INT0); // включаем обработчик прерываний INT0
	
	sei(); // включить прерывания глобально

 

перенес разрешение прерываний в конец и проблема ушла  без GIFR |= 1<<INTF0;

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сообщения

    • Была стиралка LG WD8014 (может ошибаюсь, сейчас далеко - не могу посмотреть). Дважды выходила из строя по причине, так сказать, отгорания контакта реле, которое подавало питания на ТЭН (выгорал припой и немного дорожки на плате). После первого ремонта (просто пропайка контакта реле) проработала еще лет пять. Потом второй раз пропаял. Пошла на отдых из-за проблем с балансировкой. Разбираться не стали по причине того что новая Samsung стояла без работы. Пошла в гараж отработав лет 15. Конечно за это время менялись ТЭН, амортизаторы, подшипники. Но отработала на  5+++++++. 
    • Сложно ответить на этот вопрос, предполагаю что сгорел он уже давно а на температуру воды внимание жена не обращала.. Хотя сам тэн не проверяли, визуально сгорел, есть черная часть на тэне примерно 3-4 см, и в этой части он немного вогнут..
    • @niva622 , скорее, получите второе: "вообще ее спалить...". Но вполне вероятно, что уже сгорело.
      Нужно проверять цепи, из-за которых дорожка сгорела. ТЭН не подключается к этой дорожке. Он подключается через реле или симистор. Поэтому он мог быть лишь катализатором.
    • Обычно Бош в том месте залит лаком. Это не влага. Как старый тэн сгорел. (На корпус или обрыв?) 
    • Да, Вы правы, на макетке еще был конденсатор С5. На плате же будет стабилизатор 7810 со своими конденсаторы. Сейчас я его не показываю. Спасибо.
    • Зачем же так, обычные плоские светодиоды-кирпичики удобнее в монтаже наверное. По крайней мере у них всего по 2 ноги.
    • У меня вся конструкция гибрид нескольких схем. Вся на современных транзисторах. Поет.