Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не выполняеться прерывание? 
V
    Опции темы
Ofer
Дата 8.7.2008, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 293
Регистрация: 15.10.2006
Где: КривбаСС

Репутация: 1
Всего: 5



Доброе время суток! У меня есть программа, которая должна через каждую секунду инвертировать вывод порта. Но когда происходит прерывание, таймер восстанавливает свои значения, то есть вроде бы прерывание обрабатывается, но значение на порте не меняется. Пишу на WinAVR.  В чем у меня ошибка?

h-файл
Код

#ifndef __USERDEF__
#define __USERDEF__
#ifdef F_CPU
#undef F_CPU
#endif
#define F_CPU 8000000UL
//Настройка таймеров(в программе не использовал, хотя можно)
#define TIME_INIT_MS 1000
#define TCNT16_TIME_INIT (uint16_t)(~((uint64_t)TIME_INIT_MS*(uint64_t)F_CPU/10240000)+1)
//Операции над битами
#define set_bit(port,mask) ((port) |= _BV(mask))
#define clear_bit(port,mask) ((port) &= ~_BV(mask))
#define invert_bit(port,mask) ((port) ^= _BV(mask))
#endif




с-файл
Код

#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include "main.h"

void init_io(void)
{
 DDRB = _BV(DDB1);//настройка линий
}

int main(void)
{
 cli();//запрет прерываний
 init_io();//инициализация портов
 TCCR1B = 1;//инициализация таймера
 TCNT1 = 64535;
 TIMSK = 4;
 SREG = 128;
 sei();//разрешение прерываний
 while(1);//цикл
 {
 }
}

INTERRUPT(SIG_OVERFLOW1)//обработчик таймера1
{
 TCNT1 = 64535;
 invert_bit(PORTB,PB1);
 TIFR = 0;
}


PM MAIL ICQ   Вверх
Mazzi
Дата 8.7.2008, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



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

Код

INTERRUPT(SIG_OVERFLOW1)//обработчик таймера1
{
 TCNT1 = 64535;
    PB1 = ~PB1;
 TIFR = 0;
}


Или попробуй инкрементировать 8-разр. переменную и полностью выводить в порт.
Сядь осциллографом на выводы и посмотри.

Удачи!


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
Ofer
Дата 8.7.2008, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 293
Регистрация: 15.10.2006
Где: КривбаСС

Репутация: 1
Всего: 5



После того, как произошло прерывание происходит переход в начало программы. В чем дело???

Цитата(Mazzi @  8.7.2008,  12:57 Найти цитируемый пост)
Сядь осциллографом на выводы и посмотри.

Это на все на эмуляторе. Физически устройства нет smile

Строка
    PB1 = ~PB1;

дает ошибку
main.c:30: error: lvalue required as left operand of assignment

Это сообщение отредактировал(а) Ofer - 8.7.2008, 13:38
PM MAIL ICQ   Вверх
Mazzi
Дата 8.7.2008, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



К сожалению у меня нет WINAVR. 

Если пришлёшь все файлы, могу попробовать в CVAVRStudio.


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
Ofer
Дата 8.7.2008, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 293
Регистрация: 15.10.2006
Где: КривбаСС

Репутация: 1
Всего: 5



Я как раз проверяю на AVRStudio 4. Все те же ошибки. А файлов то всего два. Весь исходный код в первом посте выложен.

Добавлено через 8 минут и 25 секунд
Правильно ли вообще у меня описан вызов прерывания?
Как кроме этого обработчика сделать обработчики на прерывания от совпадений и др.?
PM MAIL ICQ   Вверх
cardinal
Дата 8.7.2008, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 8
Всего: 99



Цитата(Ofer @  8.7.2008,  12:13 Найти цитируемый пост)
Строка
    PB1 = ~PB1;

дает ошибку

PORTB ^= 0x01


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Ofer
Дата 8.7.2008, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 293
Регистрация: 15.10.2006
Где: КривбаСС

Репутация: 1
Всего: 5



Все до ужаса просто. Запись

Цитата(Ofer @  8.7.2008,  12:44 Найти цитируемый пост)
INTERRUPT(SIG_OVERFLOW1)


"устаревшая" . Надо 
Код

  ISR(TIMER1_OVF_vect)


Благодарю всех за посильную помощь! Спасибо!
PM MAIL ICQ   Вверх
Masyanya
Дата 28.7.2008, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 30.6.2008

Репутация: нет
Всего: нет



Цитата(cardinal @ 8.7.2008,  19:09)
Цитата(Ofer @  8.7.2008,  12:13 Найти цитируемый пост)
Строка
    PB1 = ~PB1;

дает ошибку

PORTB ^= 0x01

Если PB1, то так:
PORTB ^= 0x02
PM MAIL   Вверх
cardinal
Дата 28.7.2008, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 8
Всего: 99



Masyanya, там важен принцип smile 


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Семен78
Дата 19.8.2008, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 31.3.2008
Где: Kazan

Репутация: нет
Всего: нет



Цитата(Ofer @  8.7.2008,  22:49 Найти цитируемый пост)
"устаревшая" . Надо код C++1:  ISR(TIMER1_OVF_vect)


  я тоже  с этим парился 
  подскажи где  узнать все новшества?
PM MAIL   Вверх
Mazzi
Дата 20.8.2008, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



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


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0784 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.